blob: ed7790cca795385b1910ff912413291d77cbf2f4 [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;
22import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
Wale Ogunwale65ebd952018-04-25 15:41:44 -070023import static android.Manifest.permission.MANAGE_ACTIVITY_STACKS;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070024import static android.Manifest.permission.READ_FRAME_BUFFER;
25import static android.Manifest.permission.REMOVE_TASKS;
26import static android.Manifest.permission.START_TASKS_FROM_RECENTS;
Wale Ogunwalea6191b42018-05-09 07:41:32 -070027import static android.Manifest.permission.STOP_APP_SWITCHES;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070028import static android.app.ActivityManager.LOCK_TASK_MODE_NONE;
Evan Rosky4505b352018-09-06 11:20:40 -070029import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY;
Yunfan Chen79b96062018-10-17 12:45:23 -070030import static android.app.ActivityTaskManager.INVALID_TASK_ID;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070031import static android.app.ActivityTaskManager.RESIZE_MODE_PRESERVE_WINDOW;
Wale Ogunwale65ebd952018-04-25 15:41:44 -070032import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
33import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070034import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
35import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
Wale Ogunwale65ebd952018-04-25 15:41:44 -070036import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
37import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070038import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
Wale Ogunwale65ebd952018-04-25 15:41:44 -070039import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
Wale Ogunwale31913b52018-10-13 08:29:31 -070040import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070041import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
Wale Ogunwale214f3482018-10-04 11:00:47 -070042import static android.content.pm.ApplicationInfo.FLAG_FACTORY_TEST;
Wale Ogunwale342fbe92018-10-09 08:44:10 -070043import static android.content.pm.ConfigurationInfo.GL_ES_VERSION_UNDEFINED;
Wale Ogunwalea6191b42018-05-09 07:41:32 -070044import static android.content.pm.PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS;
45import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT;
Evan Rosky4505b352018-09-06 11:20:40 -070046import static android.content.pm.PackageManager.FEATURE_PC;
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 Ogunwalea6191b42018-05-09 07:41:32 -070049import static android.content.res.Configuration.UI_MODE_TYPE_TELEVISION;
50import static android.os.Build.VERSION_CODES.N;
Wale Ogunwale214f3482018-10-04 11:00:47 -070051import static android.os.FactoryTest.FACTORY_TEST_HIGH_LEVEL;
52import static android.os.FactoryTest.FACTORY_TEST_LOW_LEVEL;
53import static android.os.FactoryTest.FACTORY_TEST_OFF;
Wale Ogunwale31913b52018-10-13 08:29:31 -070054import static android.os.Process.FIRST_APPLICATION_UID;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070055import static android.os.Process.SYSTEM_UID;
Evan Rosky4505b352018-09-06 11:20:40 -070056import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER;
Wale Ogunwalea6191b42018-05-09 07:41:32 -070057import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT;
58import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES;
59import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RTL;
Evan Rosky4505b352018-09-06 11:20:40 -070060import static android.provider.Settings.Global.HIDE_ERROR_DIALOGS;
61import static android.provider.Settings.System.FONT_SCALE;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070062import static android.service.voice.VoiceInteractionSession.SHOW_SOURCE_APPLICATION;
Alison Cichowlas3e340502018-08-07 17:15:01 -040063import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070064import static android.view.Display.DEFAULT_DISPLAY;
65import static android.view.Display.INVALID_DISPLAY;
Wale Ogunwale6767eae2018-05-03 15:52:51 -070066import static android.view.WindowManager.TRANSIT_NONE;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070067import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE;
Evan Rosky4505b352018-09-06 11:20:40 -070068
Yunfan Chen79b96062018-10-17 12:45:23 -070069import static com.android.server.am.ActivityManagerService.ANR_TRACE_DIR;
70import static com.android.server.am.ActivityManagerService.MY_PID;
71import static com.android.server.am.ActivityManagerService.STOCK_PM_FLAGS;
72import static com.android.server.am.ActivityManagerService.dumpStackTraces;
Wale Ogunwale31913b52018-10-13 08:29:31 -070073import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.CONFIG_WILL_CHANGE;
74import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.CONTROLLER;
75import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.CURRENT_TRACKER;
76import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.Controller.IS_A_MONKEY;
77import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.GLOBAL_CONFIGURATION;
78import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.GOING_TO_SLEEP;
79import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.HEAVY_WEIGHT_PROC;
80import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.HOME_PROC;
81import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.LAUNCHING_ACTIVITY;
82import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC;
Yunfan Chen279f5582018-12-12 15:24:50 -080083import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC_VISIBLE_TIME_MS;
Wale Ogunwale31913b52018-10-13 08:29:31 -070084import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.SCREEN_COMPAT_PACKAGES;
Yunfan Chen279f5582018-12-12 15:24:50 -080085import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage.MODE;
86import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage.PACKAGE;
Wale Ogunwale59507092018-10-29 09:00:30 -070087import static com.android.server.wm.ActivityStack.REMOVE_TASK_MODE_DESTROYING;
88import static com.android.server.wm.ActivityStackSupervisor.DEFER_RESUME;
Wale Ogunwale59507092018-10-29 09:00:30 -070089import static com.android.server.wm.ActivityStackSupervisor.ON_TOP;
90import static com.android.server.wm.ActivityStackSupervisor.PRESERVE_WINDOWS;
91import static com.android.server.wm.ActivityStackSupervisor.REMOVE_FROM_RECENTS;
92import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_ALL;
93import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_CONFIGURATION;
94import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_FOCUS;
95import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_IMMERSIVE;
96import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_LOCKTASK;
97import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_STACK;
98import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_SWITCH;
99import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_TASKS;
100import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_VISIBILITY;
101import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_CONFIGURATION;
102import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_FOCUS;
103import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_IMMERSIVE;
104import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_LOCKTASK;
105import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_STACK;
106import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_SWITCH;
107import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_VISIBILITY;
108import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM;
109import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME;
Evan Rosky4505b352018-09-06 11:20:40 -0700110import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_CONTENT;
111import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_DATA;
112import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_RECEIVER_EXTRAS;
113import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_STRUCTURE;
wilsonshihe7903ea2018-09-26 16:17:59 +0800114import static com.android.server.wm.ActivityTaskManagerService.H.REPORT_TIME_TRACKER_MSG;
115import static com.android.server.wm.ActivityTaskManagerService.UiHandler.DISMISS_DIALOG_UI_MSG;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700116import static com.android.server.wm.RecentsAnimationController.REORDER_KEEP_IN_PLACE;
117import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_ORIGINAL_POSITION;
Wale Ogunwaled32da472018-11-16 07:19:28 -0800118import static com.android.server.wm.RootActivityContainer.MATCH_TASK_IN_STACKS_ONLY;
119import static com.android.server.wm.RootActivityContainer.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS;
wilsonshihe7903ea2018-09-26 16:17:59 +0800120import static com.android.server.wm.TaskRecord.LOCK_TASK_AUTH_DONT_LOCK;
121import static com.android.server.wm.TaskRecord.REPARENT_KEEP_STACK_AT_FRONT;
122import static com.android.server.wm.TaskRecord.REPARENT_LEAVE_STACK_IN_PLACE;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700123
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700124import android.Manifest;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700125import android.annotation.NonNull;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700126import android.annotation.Nullable;
127import android.annotation.UserIdInt;
128import android.app.Activity;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700129import android.app.ActivityManager;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700130import android.app.ActivityManagerInternal;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700131import android.app.ActivityOptions;
132import android.app.ActivityTaskManager;
Wale Ogunwalef6733932018-06-27 05:14:34 -0700133import android.app.ActivityThread;
134import android.app.AlertDialog;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700135import android.app.AppGlobals;
Michal Karpinski15486842019-04-25 17:33:42 +0100136import android.app.AppOpsManager;
Evan Rosky4505b352018-09-06 11:20:40 -0700137import android.app.Dialog;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700138import android.app.IActivityController;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700139import android.app.IActivityTaskManager;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700140import android.app.IApplicationThread;
141import android.app.IAssistDataReceiver;
Wale Ogunwale53783742018-09-16 10:21:51 -0700142import android.app.INotificationManager;
Mark Renouf446251d2019-04-26 10:22:41 -0400143import android.app.IRequestFinishCallback;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700144import android.app.ITaskStackListener;
Wale Ogunwale53783742018-09-16 10:21:51 -0700145import android.app.Notification;
146import android.app.NotificationManager;
147import android.app.PendingIntent;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700148import android.app.PictureInPictureParams;
149import android.app.ProfilerInfo;
150import android.app.RemoteAction;
151import android.app.WaitResult;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700152import android.app.WindowConfiguration;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700153import android.app.admin.DevicePolicyCache;
154import android.app.assist.AssistContent;
155import android.app.assist.AssistStructure;
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700156import android.app.usage.UsageStatsManagerInternal;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700157import android.content.ActivityNotFoundException;
158import android.content.ComponentName;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700159import android.content.ContentResolver;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700160import android.content.Context;
Evan Rosky4505b352018-09-06 11:20:40 -0700161import android.content.DialogInterface;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700162import android.content.IIntentSender;
163import android.content.Intent;
164import android.content.pm.ActivityInfo;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700165import android.content.pm.ApplicationInfo;
Yunfan Chen75157d72018-07-27 14:47:21 +0900166import android.content.pm.ConfigurationInfo;
Evan Rosky4505b352018-09-06 11:20:40 -0700167import android.content.pm.IPackageManager;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700168import android.content.pm.PackageManager;
Evan Rosky4505b352018-09-06 11:20:40 -0700169import android.content.pm.PackageManagerInternal;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700170import android.content.pm.ParceledListSlice;
171import android.content.pm.ResolveInfo;
Wale Ogunwale53783742018-09-16 10:21:51 -0700172import android.content.res.CompatibilityInfo;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700173import android.content.res.Configuration;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700174import android.content.res.Resources;
Evan Rosky4505b352018-09-06 11:20:40 -0700175import android.database.ContentObserver;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700176import android.graphics.Bitmap;
177import android.graphics.Point;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700178import android.graphics.Rect;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700179import android.metrics.LogMaker;
180import android.net.Uri;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700181import android.os.Binder;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700182import android.os.Build;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700183import android.os.Bundle;
Wale Ogunwale214f3482018-10-04 11:00:47 -0700184import android.os.FactoryTest;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700185import android.os.FileUtils;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700186import android.os.Handler;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700187import android.os.IBinder;
Evan Rosky4505b352018-09-06 11:20:40 -0700188import android.os.IUserManager;
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700189import android.os.LocaleList;
Riddle Hsud93a6c42018-11-29 21:50:06 +0800190import android.os.Looper;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700191import android.os.Message;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700192import android.os.PersistableBundle;
Evan Rosky4505b352018-09-06 11:20:40 -0700193import android.os.PowerManager;
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700194import android.os.PowerManagerInternal;
Marvin Ramin830d4e32019-03-12 13:16:58 +0100195import android.os.Process;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700196import android.os.RemoteException;
Evan Rosky4505b352018-09-06 11:20:40 -0700197import android.os.ServiceManager;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700198import android.os.StrictMode;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700199import android.os.SystemClock;
200import android.os.SystemProperties;
Evan Rosky4505b352018-09-06 11:20:40 -0700201import android.os.Trace;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700202import android.os.UpdateLock;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700203import android.os.UserHandle;
Evan Rosky4505b352018-09-06 11:20:40 -0700204import android.os.UserManager;
205import android.os.WorkSource;
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700206import android.os.storage.IStorageManager;
207import android.os.storage.StorageManager;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700208import android.provider.Settings;
209import android.service.voice.IVoiceInteractionSession;
210import android.service.voice.VoiceInteractionManagerInternal;
Kiyoung Kim0fe161d2018-12-20 18:26:10 +0900211import android.sysprop.DisplayProperties;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700212import android.telecom.TelecomManager;
213import android.text.TextUtils;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700214import android.text.format.Time;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700215import android.util.ArrayMap;
216import android.util.EventLog;
217import android.util.Log;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700218import android.util.Slog;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700219import android.util.SparseArray;
Wale Ogunwale6767eae2018-05-03 15:52:51 -0700220import android.util.SparseIntArray;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700221import android.util.StatsLog;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700222import android.util.TimeUtils;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700223import android.util.proto.ProtoOutputStream;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700224import android.view.IRecentsAnimationRunner;
225import android.view.RemoteAnimationAdapter;
226import android.view.RemoteAnimationDefinition;
Evan Rosky4505b352018-09-06 11:20:40 -0700227import android.view.WindowManager;
lumark5df49512019-04-02 14:56:46 +0800228import android.view.inputmethod.InputMethodSystemProperty;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700229
Evan Rosky4505b352018-09-06 11:20:40 -0700230import com.android.internal.R;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700231import com.android.internal.annotations.VisibleForTesting;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700232import com.android.internal.app.AssistUtils;
Evan Rosky4505b352018-09-06 11:20:40 -0700233import com.android.internal.app.IAppOpsService;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700234import com.android.internal.app.IVoiceInteractor;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700235import com.android.internal.app.ProcessMap;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700236import com.android.internal.logging.MetricsLogger;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700237import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Wale Ogunwale53783742018-09-16 10:21:51 -0700238import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
239import com.android.internal.notification.SystemNotificationChannels;
Wale Ogunwale31913b52018-10-13 08:29:31 -0700240import com.android.internal.os.TransferPipe;
Evan Rosky4505b352018-09-06 11:20:40 -0700241import com.android.internal.os.logging.MetricsLoggerWrapper;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700242import com.android.internal.policy.IKeyguardDismissCallback;
243import com.android.internal.policy.KeyguardDismissCallback;
Wale Ogunwale31913b52018-10-13 08:29:31 -0700244import com.android.internal.util.ArrayUtils;
245import com.android.internal.util.FastPrintWriter;
Wale Ogunwale6767eae2018-05-03 15:52:51 -0700246import com.android.internal.util.Preconditions;
Wale Ogunwale53783742018-09-16 10:21:51 -0700247import com.android.internal.util.function.pooled.PooledLambda;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700248import com.android.server.AttributeCache;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700249import com.android.server.LocalServices;
250import com.android.server.SystemService;
Evan Rosky4505b352018-09-06 11:20:40 -0700251import com.android.server.SystemServiceManager;
Wale Ogunwale1f5e53d2018-11-05 05:12:46 -0800252import com.android.server.UiThread;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700253import com.android.server.Watchdog;
Wale Ogunwale59507092018-10-29 09:00:30 -0700254import com.android.server.am.ActivityManagerService;
255import com.android.server.am.ActivityManagerServiceDumpActivitiesProto;
256import com.android.server.am.ActivityManagerServiceDumpProcessesProto;
257import com.android.server.am.AppTimeTracker;
258import com.android.server.am.BaseErrorDialog;
259import com.android.server.am.EventLogTags;
260import com.android.server.am.PendingIntentController;
261import com.android.server.am.PendingIntentRecord;
262import com.android.server.am.UserState;
Kiyoung Kim0fe161d2018-12-20 18:26:10 +0900263import com.android.server.appop.AppOpsService;
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700264import com.android.server.firewall.IntentFirewall;
Evan Rosky4505b352018-09-06 11:20:40 -0700265import com.android.server.pm.UserManagerService;
Hai Zhangf4da9be2019-05-01 13:46:06 +0800266import com.android.server.policy.PermissionPolicyInternal;
Evan Rosky4505b352018-09-06 11:20:40 -0700267import com.android.server.uri.UriGrantsManagerInternal;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700268import com.android.server.vr.VrManagerInternal;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700269
Wale Ogunwale31913b52018-10-13 08:29:31 -0700270import java.io.BufferedReader;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700271import java.io.File;
Wale Ogunwale31913b52018-10-13 08:29:31 -0700272import java.io.FileDescriptor;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700273import java.io.FileOutputStream;
Wale Ogunwale31913b52018-10-13 08:29:31 -0700274import java.io.FileReader;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700275import java.io.IOException;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700276import java.io.PrintWriter;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700277import java.io.StringWriter;
Riddle Hsua0536432019-02-16 00:38:59 +0800278import java.lang.annotation.ElementType;
279import java.lang.annotation.Retention;
280import java.lang.annotation.RetentionPolicy;
281import java.lang.annotation.Target;
Wale Ogunwaleee6eca12018-09-19 20:37:53 -0700282import java.lang.ref.WeakReference;
Wale Ogunwale31913b52018-10-13 08:29:31 -0700283import java.text.DateFormat;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700284import java.util.ArrayList;
Wale Ogunwale27c48ae2018-10-25 19:01:01 -0700285import java.util.Arrays;
Wale Ogunwale31913b52018-10-13 08:29:31 -0700286import java.util.Date;
Alison Cichowlas3e340502018-08-07 17:15:01 -0400287import java.util.HashMap;
Wale Ogunwaleee6eca12018-09-19 20:37:53 -0700288import java.util.HashSet;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700289import java.util.List;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700290import java.util.Locale;
Wale Ogunwale31913b52018-10-13 08:29:31 -0700291import java.util.Map;
292import java.util.Set;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700293
294/**
295 * System service for managing activities and their containers (task, stacks, displays,... ).
296 *
297 * {@hide}
298 */
299public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
Wale Ogunwale98875612018-10-12 07:53:02 -0700300 private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityTaskManagerService" : TAG_ATM;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700301 private static final String TAG_STACK = TAG + POSTFIX_STACK;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700302 private static final String TAG_SWITCH = TAG + POSTFIX_SWITCH;
303 private static final String TAG_IMMERSIVE = TAG + POSTFIX_IMMERSIVE;
304 private static final String TAG_FOCUS = TAG + POSTFIX_FOCUS;
305 private static final String TAG_VISIBILITY = TAG + POSTFIX_VISIBILITY;
306 private static final String TAG_LOCKTASK = TAG + POSTFIX_LOCKTASK;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700307 private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700308
Wale Ogunwale906f9c62018-07-23 11:23:44 -0700309 // How long we wait until we timeout on key dispatching.
Wale Ogunwale51cc98a2018-10-15 10:41:05 -0700310 public static final int KEY_DISPATCHING_TIMEOUT_MS = 5 * 1000;
Wale Ogunwale906f9c62018-07-23 11:23:44 -0700311 // How long we wait until we timeout on key dispatching during instrumentation.
Wale Ogunwale51cc98a2018-10-15 10:41:05 -0700312 static final int INSTRUMENTATION_KEY_DISPATCHING_TIMEOUT_MS = 60 * 1000;
Michal Karpinskifc6872e2019-05-21 15:18:44 +0100313 // How long we permit background activity starts after an activity in the process
314 // started or finished.
315 static final long ACTIVITY_BG_START_GRACE_PERIOD_MS = 10 * 1000;
Wale Ogunwale906f9c62018-07-23 11:23:44 -0700316
Wale Ogunwale98875612018-10-12 07:53:02 -0700317 /** Used to indicate that an app transition should be animated. */
318 static final boolean ANIMATE = true;
319
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700320 /** Hardware-reported OpenGLES version. */
321 final int GL_ES_VERSION;
322
Wale Ogunwale31913b52018-10-13 08:29:31 -0700323 public static final String DUMP_ACTIVITIES_CMD = "activities" ;
324 public static final String DUMP_ACTIVITIES_SHORT_CMD = "a" ;
325 public static final String DUMP_LASTANR_CMD = "lastanr" ;
326 public static final String DUMP_LASTANR_TRACES_CMD = "lastanr-traces" ;
327 public static final String DUMP_STARTER_CMD = "starter" ;
328 public static final String DUMP_CONTAINERS_CMD = "containers" ;
329 public static final String DUMP_RECENTS_CMD = "recents" ;
330 public static final String DUMP_RECENTS_SHORT_CMD = "r" ;
331
Wale Ogunwale64258362018-10-16 15:13:37 -0700332 /** This activity is not being relaunched, or being relaunched for a non-resize reason. */
333 public static final int RELAUNCH_REASON_NONE = 0;
334 /** This activity is being relaunched due to windowing mode change. */
335 public static final int RELAUNCH_REASON_WINDOWING_MODE_RESIZE = 1;
336 /** This activity is being relaunched due to a free-resize operation. */
337 public static final int RELAUNCH_REASON_FREE_RESIZE = 2;
338
Wale Ogunwale16e505a2018-05-07 15:00:49 -0700339 Context mContext;
Wale Ogunwale64258362018-10-16 15:13:37 -0700340
Wale Ogunwalef6733932018-06-27 05:14:34 -0700341 /**
342 * This Context is themable and meant for UI display (AlertDialogs, etc.). The theme can
343 * change at runtime. Use mContext for non-UI purposes.
344 */
345 final Context mUiContext;
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700346 final ActivityThread mSystemThread;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700347 H mH;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700348 UiHandler mUiHandler;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700349 ActivityManagerInternal mAmInternal;
Wale Ogunwale6d50dcc2018-07-21 23:00:40 -0700350 UriGrantsManagerInternal mUgmInternal;
Wale Ogunwale906f9c62018-07-23 11:23:44 -0700351 private PackageManagerInternal mPmInternal;
Hai Zhangf4da9be2019-05-01 13:46:06 +0800352 private PermissionPolicyInternal mPermissionPolicyInternal;
Wale Ogunwaleb73f3962018-11-20 07:58:22 -0800353 @VisibleForTesting
354 final ActivityTaskManagerInternal mInternal;
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700355 PowerManagerInternal mPowerManagerInternal;
356 private UsageStatsManagerInternal mUsageStatsInternal;
357
Wale Ogunwaleee6eca12018-09-19 20:37:53 -0700358 PendingIntentController mPendingIntentController;
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700359 IntentFirewall mIntentFirewall;
360
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700361 /* Global service lock used by the package the owns this service. */
Wale Ogunwale1f5e53d2018-11-05 05:12:46 -0800362 final WindowManagerGlobalLock mGlobalLock = new WindowManagerGlobalLock();
Riddle Hsud7088f82019-01-30 13:04:50 +0800363 /**
364 * It is the same instance as {@link mGlobalLock}, just declared as a type that the
365 * locked-region-code-injection does't recognize it. It is used to skip wrapping priority
366 * booster for places that are already in the scope of another booster (e.g. computing oom-adj).
367 *
368 * @see WindowManagerThreadPriorityBooster
369 */
370 final Object mGlobalLockWithoutBoost = mGlobalLock;
Wale Ogunwale16e505a2018-05-07 15:00:49 -0700371 ActivityStackSupervisor mStackSupervisor;
Wale Ogunwaled32da472018-11-16 07:19:28 -0800372 RootActivityContainer mRootActivityContainer;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700373 WindowManagerService mWindowManager;
Wale Ogunwalef6733932018-06-27 05:14:34 -0700374 private UserManagerService mUserManager;
375 private AppOpsService mAppOpsService;
Wale Ogunwalebff2df42018-10-18 17:09:19 -0700376 /** All active uids in the system. */
Riddle Hsua0536432019-02-16 00:38:59 +0800377 private final MirrorActiveUids mActiveUids = new MirrorActiveUids();
Wale Ogunwale9de19442018-10-18 19:05:03 -0700378 private final SparseArray<String> mPendingTempWhitelist = new SparseArray<>();
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700379 /** All processes currently running that might have a window organized by name. */
380 final ProcessMap<WindowProcessController> mProcessNames = new ProcessMap<>();
Michal Karpinski2e0aad22019-04-12 16:22:55 +0100381 /** All processes we currently have running mapped by pid and uid */
382 final WindowProcessControllerMap mProcessMap = new WindowProcessControllerMap();
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700383 /** This is the process holding what we currently consider to be the "home" activity. */
384 WindowProcessController mHomeProcess;
Wale Ogunwale53783742018-09-16 10:21:51 -0700385 /** The currently running heavy-weight process, if any. */
386 WindowProcessController mHeavyWeightProcess = null;
Wale Ogunwale214f3482018-10-04 11:00:47 -0700387 boolean mHasHeavyWeightFeature;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700388 /**
389 * This is the process holding the activity the user last visited that is in a different process
390 * from the one they are currently in.
391 */
392 WindowProcessController mPreviousProcess;
393 /** The time at which the previous process was last visible. */
394 long mPreviousProcessVisibleTime;
395
Wale Ogunwale16e505a2018-05-07 15:00:49 -0700396 /** List of intents that were used to start the most recent tasks. */
397 private RecentTasks mRecentTasks;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700398 /** State of external calls telling us if the device is awake or asleep. */
399 private boolean mKeyguardShown = false;
400
401 // Wrapper around VoiceInteractionServiceManager
402 private AssistUtils mAssistUtils;
403
404 // VoiceInteraction session ID that changes for each new request except when
405 // being called for multi-window assist in a single session.
406 private int mViSessionId = 1000;
407
408 // How long to wait in getAssistContextExtras for the activity and foreground services
409 // to respond with the result.
410 private static final int PENDING_ASSIST_EXTRAS_TIMEOUT = 500;
411
412 // How long top wait when going through the modern assist (which doesn't need to block
413 // on getting this result before starting to launch its UI).
414 private static final int PENDING_ASSIST_EXTRAS_LONG_TIMEOUT = 2000;
415
416 // How long to wait in getAutofillAssistStructure() for the activity to respond with the result.
417 private static final int PENDING_AUTOFILL_ASSIST_STRUCTURE_TIMEOUT = 2000;
418
Alison Cichowlas3e340502018-08-07 17:15:01 -0400419 // Permission tokens are used to temporarily granted a trusted app the ability to call
420 // #startActivityAsCaller. A client is expected to dump its token after this time has elapsed,
421 // showing any appropriate error messages to the user.
422 private static final long START_AS_CALLER_TOKEN_TIMEOUT =
423 10 * MINUTE_IN_MILLIS;
424
425 // How long before the service actually expires a token. This is slightly longer than
426 // START_AS_CALLER_TOKEN_TIMEOUT, to provide a buffer so clients will rarely encounter the
427 // expiration exception.
428 private static final long START_AS_CALLER_TOKEN_TIMEOUT_IMPL =
429 START_AS_CALLER_TOKEN_TIMEOUT + 2 * 1000;
430
431 // How long the service will remember expired tokens, for the purpose of providing error
432 // messaging when a client uses an expired token.
433 private static final long START_AS_CALLER_TOKEN_EXPIRED_TIMEOUT =
434 START_AS_CALLER_TOKEN_TIMEOUT_IMPL + 20 * MINUTE_IN_MILLIS;
435
436 // Activity tokens of system activities that are delegating their call to
437 // #startActivityByCaller, keyed by the permissionToken granted to the delegate.
438 final HashMap<IBinder, IBinder> mStartActivitySources = new HashMap<>();
439
440 // Permission tokens that have expired, but we remember for error reporting.
441 final ArrayList<IBinder> mExpiredStartAsCallerTokens = new ArrayList<>();
442
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700443 private final ArrayList<PendingAssistExtras> mPendingAssistExtras = new ArrayList<>();
444
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700445 // Keeps track of the active voice interaction service component, notified from
446 // VoiceInteractionManagerService
447 ComponentName mActiveVoiceInteractionServiceComponent;
448
Michal Karpinskida34cd42019-04-02 19:46:52 +0100449 // A map userId and all its companion app uids
450 private final Map<Integer, Set<Integer>> mCompanionAppUidsMap = new ArrayMap<>();
Ricky Wai2452e2d2019-03-18 19:19:08 +0000451
Wale Ogunwalee2172292018-10-25 10:11:10 -0700452 VrController mVrController;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700453 KeyguardController mKeyguardController;
454 private final ClientLifecycleManager mLifecycleManager;
455 private TaskChangeNotificationController mTaskChangeNotificationController;
Wale Ogunwaled95c06b2018-05-08 10:35:38 -0700456 /** The controller for all operations related to locktask. */
457 private LockTaskController mLockTaskController;
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -0700458 private ActivityStartController mActivityStartController;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700459
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700460 boolean mSuppressResizeConfigChanges;
461
Shivam Agrawal1d3db652019-07-01 15:26:11 -0700462 final UpdateConfigurationResult mTmpUpdateConfigurationResult =
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700463 new UpdateConfigurationResult();
464
465 static final class UpdateConfigurationResult {
466 // Configuration changes that were updated.
467 int changes;
468 // If the activity was relaunched to match the new configuration.
469 boolean activityRelaunched;
470
471 void reset() {
472 changes = 0;
473 activityRelaunched = false;
474 }
475 }
476
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700477 /** Current sequencing integer of the configuration, for skipping old configurations. */
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700478 private int mConfigurationSeq;
479 // To cache the list of supported system locales
480 private String[] mSupportedSystemLocales = null;
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700481
482 /**
483 * Temp object used when global and/or display override configuration is updated. It is also
484 * sent to outer world instead of {@link #getGlobalConfiguration} because we don't trust
485 * anyone...
486 */
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700487 private Configuration mTempConfig = new Configuration();
488
Wale Ogunwalef6733932018-06-27 05:14:34 -0700489 /** Temporary to avoid allocations. */
490 final StringBuilder mStringBuilder = new StringBuilder(256);
491
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700492 // Amount of time after a call to stopAppSwitches() during which we will
493 // prevent further untrusted switches from happening.
494 private static final long APP_SWITCH_DELAY_TIME = 5 * 1000;
495
496 /**
497 * The time at which we will allow normal application switches again,
498 * after a call to {@link #stopAppSwitches()}.
499 */
Wale Ogunwalef6733932018-06-27 05:14:34 -0700500 private long mAppSwitchesAllowedTime;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700501 /**
502 * This is set to true after the first switch after mAppSwitchesAllowedTime
503 * is set; any switches after that will clear the time.
504 */
Wale Ogunwalef6733932018-06-27 05:14:34 -0700505 private boolean mDidAppSwitch;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700506
Ricky Wai906af482019-06-03 17:25:28 +0100507 /**
508 * Last stop app switches time, apps finished before this time cannot start background activity
509 * even if they are in grace period.
510 */
511 private long mLastStopAppSwitchesTime;
512
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700513 IActivityController mController = null;
514 boolean mControllerIsAMonkey = false;
515
Wale Ogunwale214f3482018-10-04 11:00:47 -0700516 final int mFactoryTest;
517
518 /** Used to control how we initialize the service. */
519 ComponentName mTopComponent;
520 String mTopAction = Intent.ACTION_MAIN;
521 String mTopData;
522
Wale Ogunwale1f5e53d2018-11-05 05:12:46 -0800523 /** Profiling app information. */
524 String mProfileApp = null;
525 WindowProcessController mProfileProc = null;
526 ProfilerInfo mProfilerInfo = null;
527
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700528 /**
Wale Ogunwale31913b52018-10-13 08:29:31 -0700529 * Dump of the activity state at the time of the last ANR. Cleared after
530 * {@link WindowManagerService#LAST_ANR_LIFETIME_DURATION_MSECS}
531 */
532 String mLastANRState;
533
534 /**
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700535 * Used to retain an update lock when the foreground activity is in
536 * immersive mode.
537 */
Wale Ogunwalef6733932018-06-27 05:14:34 -0700538 private final UpdateLock mUpdateLock = new UpdateLock("immersive");
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700539
540 /**
541 * Packages that are being allowed to perform unrestricted app switches. Mapping is
542 * User -> Type -> uid.
543 */
544 final SparseArray<ArrayMap<String, Integer>> mAllowAppSwitchUids = new SparseArray<>();
545
546 /** The dimensions of the thumbnails in the Recents UI. */
Wale Ogunwalef6733932018-06-27 05:14:34 -0700547 private int mThumbnailWidth;
548 private int mThumbnailHeight;
549 private float mFullscreenThumbnailScale;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700550
551 /**
552 * Flag that indicates if multi-window is enabled.
553 *
554 * For any particular form of multi-window to be enabled, generic multi-window must be enabled
555 * in {@link com.android.internal.R.bool#config_supportsMultiWindow} config or
556 * {@link Settings.Global#DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES} development option set.
557 * At least one of the forms of multi-window must be enabled in order for this flag to be
558 * initialized to 'true'.
559 *
560 * @see #mSupportsSplitScreenMultiWindow
561 * @see #mSupportsFreeformWindowManagement
562 * @see #mSupportsPictureInPicture
563 * @see #mSupportsMultiDisplay
564 */
565 boolean mSupportsMultiWindow;
566 boolean mSupportsSplitScreenMultiWindow;
567 boolean mSupportsFreeformWindowManagement;
568 boolean mSupportsPictureInPicture;
569 boolean mSupportsMultiDisplay;
570 boolean mForceResizableActivities;
571
572 final List<ActivityTaskManagerInternal.ScreenObserver> mScreenObservers = new ArrayList<>();
573
574 // VR Vr2d Display Id.
575 int mVr2dDisplayId = INVALID_DISPLAY;
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700576
Wale Ogunwalef6733932018-06-27 05:14:34 -0700577 /**
578 * Set while we are wanting to sleep, to prevent any
579 * activities from being started/resumed.
580 *
581 * TODO(b/33594039): Clarify the actual state transitions represented by mSleeping.
582 *
583 * Currently mSleeping is set to true when transitioning into the sleep state, and remains true
584 * while in the sleep state until there is a pending transition out of sleep, in which case
585 * mSleeping is set to false, and remains false while awake.
586 *
587 * Whether mSleeping can quickly toggled between true/false without the device actually
588 * display changing states is undefined.
589 */
590 private boolean mSleeping = false;
591
592 /**
593 * The process state used for processes that are running the top activities.
594 * This changes between TOP and TOP_SLEEPING to following mSleeping.
595 */
596 int mTopProcessState = ActivityManager.PROCESS_STATE_TOP;
597
598 // Whether we should show our dialogs (ANR, crash, etc) or just perform their default action
599 // automatically. Important for devices without direct input devices.
600 private boolean mShowDialogs = true;
601
602 /** Set if we are shutting down the system, similar to sleeping. */
603 boolean mShuttingDown = false;
604
605 /**
606 * We want to hold a wake lock while running a voice interaction session, since
607 * this may happen with the screen off and we need to keep the CPU running to
608 * be able to continue to interact with the user.
609 */
610 PowerManager.WakeLock mVoiceWakeLock;
611
612 /**
613 * Set while we are running a voice interaction. This overrides sleeping while it is active.
614 */
615 IVoiceInteractionSession mRunningVoice;
616
617 /**
618 * The last resumed activity. This is identical to the current resumed activity most
619 * of the time but could be different when we're pausing one activity before we resume
620 * another activity.
621 */
622 ActivityRecord mLastResumedActivity;
623
624 /**
625 * The activity that is currently being traced as the active resumed activity.
626 *
627 * @see #updateResumedAppTrace
628 */
629 private @Nullable ActivityRecord mTracedResumedActivity;
630
631 /** If non-null, we are tracking the time the user spends in the currently focused app. */
632 AppTimeTracker mCurAppTimeTracker;
633
Shivam Agrawal1d3db652019-07-01 15:26:11 -0700634 AppWarnings mAppWarnings;
Wale Ogunwale008163e2018-07-23 23:11:08 -0700635
Wale Ogunwale53783742018-09-16 10:21:51 -0700636 /**
637 * Packages that the user has asked to have run in screen size
638 * compatibility mode instead of filling the screen.
639 */
640 CompatModePackages mCompatModePackages;
641
Wale Ogunwalef6733932018-06-27 05:14:34 -0700642 private FontScaleSettingObserver mFontScaleSettingObserver;
643
Ricky Wai96f5c352019-04-10 18:40:17 +0100644 private int mDeviceOwnerUid = Process.INVALID_UID;
Michal Karpinski4026cae2019-02-12 11:51:47 +0000645
Wale Ogunwalef6733932018-06-27 05:14:34 -0700646 private final class FontScaleSettingObserver extends ContentObserver {
647 private final Uri mFontScaleUri = Settings.System.getUriFor(FONT_SCALE);
648 private final Uri mHideErrorDialogsUri = Settings.Global.getUriFor(HIDE_ERROR_DIALOGS);
649
650 public FontScaleSettingObserver() {
651 super(mH);
652 final ContentResolver resolver = mContext.getContentResolver();
653 resolver.registerContentObserver(mFontScaleUri, false, this, UserHandle.USER_ALL);
654 resolver.registerContentObserver(mHideErrorDialogsUri, false, this,
655 UserHandle.USER_ALL);
656 }
657
658 @Override
659 public void onChange(boolean selfChange, Uri uri, @UserIdInt int userId) {
660 if (mFontScaleUri.equals(uri)) {
661 updateFontScaleIfNeeded(userId);
662 } else if (mHideErrorDialogsUri.equals(uri)) {
663 synchronized (mGlobalLock) {
664 updateShouldShowDialogsLocked(getGlobalConfiguration());
665 }
666 }
667 }
668 }
669
Riddle Hsua0536432019-02-16 00:38:59 +0800670 /** Indicates that the method may be invoked frequently or is sensitive to performance. */
671 @Target(ElementType.METHOD)
672 @Retention(RetentionPolicy.SOURCE)
673 @interface HotPath {
674 int NONE = 0;
675 int OOM_ADJUSTMENT = 1;
676 int LRU_UPDATE = 2;
677 int PROCESS_CHANGE = 3;
678 int caller() default NONE;
679 }
680
Charles Chen8d98dd22018-12-26 17:36:54 +0800681 @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
682 public ActivityTaskManagerService(Context context) {
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700683 mContext = context;
Wale Ogunwale214f3482018-10-04 11:00:47 -0700684 mFactoryTest = FactoryTest.getMode();
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700685 mSystemThread = ActivityThread.currentActivityThread();
686 mUiContext = mSystemThread.getSystemUiContext();
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700687 mLifecycleManager = new ClientLifecycleManager();
Wale Ogunwaleb73f3962018-11-20 07:58:22 -0800688 mInternal = new LocalService();
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700689 GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version", GL_ES_VERSION_UNDEFINED);
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700690 }
691
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700692 public void onSystemReady() {
693 synchronized (mGlobalLock) {
694 mHasHeavyWeightFeature = mContext.getPackageManager().hasSystemFeature(
695 PackageManager.FEATURE_CANT_SAVE_STATE);
696 mAssistUtils = new AssistUtils(mContext);
697 mVrController.onSystemReady();
698 mRecentTasks.onSystemReadyLocked();
Garfield Tan891146c2018-10-09 12:14:00 -0700699 mStackSupervisor.onSystemReady();
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700700 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700701 }
702
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700703 public void onInitPowerManagement() {
704 synchronized (mGlobalLock) {
705 mStackSupervisor.initPowerManagement();
706 final PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
707 mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
708 mVoiceWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*voice*");
709 mVoiceWakeLock.setReferenceCounted(false);
710 }
Wale Ogunwalef6733932018-06-27 05:14:34 -0700711 }
712
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700713 public void installSystemProviders() {
Wale Ogunwalef6733932018-06-27 05:14:34 -0700714 mFontScaleSettingObserver = new FontScaleSettingObserver();
715 }
716
Wale Ogunwale59507092018-10-29 09:00:30 -0700717 public void retrieveSettings(ContentResolver resolver) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700718 final boolean freeformWindowManagement =
719 mContext.getPackageManager().hasSystemFeature(FEATURE_FREEFORM_WINDOW_MANAGEMENT)
720 || Settings.Global.getInt(
721 resolver, DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT, 0) != 0;
722
723 final boolean supportsMultiWindow = ActivityTaskManager.supportsMultiWindow(mContext);
724 final boolean supportsPictureInPicture = supportsMultiWindow &&
725 mContext.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE);
726 final boolean supportsSplitScreenMultiWindow =
727 ActivityTaskManager.supportsSplitScreenMultiWindow(mContext);
728 final boolean supportsMultiDisplay = mContext.getPackageManager()
729 .hasSystemFeature(FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS);
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700730 final boolean forceRtl = Settings.Global.getInt(resolver, DEVELOPMENT_FORCE_RTL, 0) != 0;
731 final boolean forceResizable = Settings.Global.getInt(
732 resolver, DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES, 0) != 0;
Garfield Tane0846042018-07-26 13:42:04 -0700733 final boolean isPc = mContext.getPackageManager().hasSystemFeature(FEATURE_PC);
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700734
735 // Transfer any global setting for forcing RTL layout, into a System Property
Kiyoung Kim0fe161d2018-12-20 18:26:10 +0900736 DisplayProperties.debug_force_rtl(forceRtl);
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700737
738 final Configuration configuration = new Configuration();
739 Settings.System.getConfiguration(resolver, configuration);
740 if (forceRtl) {
741 // This will take care of setting the correct layout direction flags
742 configuration.setLayoutDirection(configuration.locale);
743 }
744
745 synchronized (mGlobalLock) {
746 mForceResizableActivities = forceResizable;
747 final boolean multiWindowFormEnabled = freeformWindowManagement
748 || supportsSplitScreenMultiWindow
749 || supportsPictureInPicture
750 || supportsMultiDisplay;
751 if ((supportsMultiWindow || forceResizable) && multiWindowFormEnabled) {
752 mSupportsMultiWindow = true;
753 mSupportsFreeformWindowManagement = freeformWindowManagement;
754 mSupportsSplitScreenMultiWindow = supportsSplitScreenMultiWindow;
755 mSupportsPictureInPicture = supportsPictureInPicture;
756 mSupportsMultiDisplay = supportsMultiDisplay;
757 } else {
758 mSupportsMultiWindow = false;
759 mSupportsFreeformWindowManagement = false;
760 mSupportsSplitScreenMultiWindow = false;
761 mSupportsPictureInPicture = false;
762 mSupportsMultiDisplay = false;
763 }
764 mWindowManager.setForceResizableTasks(mForceResizableActivities);
765 mWindowManager.setSupportsPictureInPicture(mSupportsPictureInPicture);
Garfield Tane0846042018-07-26 13:42:04 -0700766 mWindowManager.setSupportsFreeformWindowManagement(mSupportsFreeformWindowManagement);
767 mWindowManager.setIsPc(isPc);
Garfield Tanb5910b42019-03-14 14:50:59 -0700768 mWindowManager.mRoot.onSettingsRetrieved();
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700769 // This happens before any activities are started, so we can change global configuration
770 // in-place.
771 updateConfigurationLocked(configuration, null, true);
772 final Configuration globalConfig = getGlobalConfiguration();
773 if (DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, "Initial config: " + globalConfig);
774
775 // Load resources only after the current configuration has been set.
776 final Resources res = mContext.getResources();
777 mThumbnailWidth = res.getDimensionPixelSize(
778 com.android.internal.R.dimen.thumbnail_width);
779 mThumbnailHeight = res.getDimensionPixelSize(
780 com.android.internal.R.dimen.thumbnail_height);
781
782 if ((globalConfig.uiMode & UI_MODE_TYPE_TELEVISION) == UI_MODE_TYPE_TELEVISION) {
783 mFullscreenThumbnailScale = (float) res
784 .getInteger(com.android.internal.R.integer.thumbnail_width_tv) /
785 (float) globalConfig.screenWidthDp;
786 } else {
787 mFullscreenThumbnailScale = res.getFraction(
788 com.android.internal.R.fraction.thumbnail_fullscreen_scale, 1, 1);
789 }
790 }
791 }
792
Wale Ogunwale1f5e53d2018-11-05 05:12:46 -0800793 public WindowManagerGlobalLock getGlobalLock() {
794 return mGlobalLock;
795 }
796
Yunfan Chen585f2932019-01-29 16:04:45 +0900797 /** For test purpose only. */
798 @VisibleForTesting
799 public ActivityTaskManagerInternal getAtmInternal() {
800 return mInternal;
801 }
802
Riddle Hsud93a6c42018-11-29 21:50:06 +0800803 public void initialize(IntentFirewall intentFirewall, PendingIntentController intentController,
804 Looper looper) {
805 mH = new H(looper);
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700806 mUiHandler = new UiHandler();
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700807 mIntentFirewall = intentFirewall;
Wale Ogunwale53783742018-09-16 10:21:51 -0700808 final File systemDir = SystemServiceManager.ensureSystemDir();
809 mAppWarnings = new AppWarnings(this, mUiContext, mH, mUiHandler, systemDir);
810 mCompatModePackages = new CompatModePackages(this, systemDir, mH);
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700811 mPendingIntentController = intentController;
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700812
813 mTempConfig.setToDefaults();
814 mTempConfig.setLocales(LocaleList.getDefault());
815 mConfigurationSeq = mTempConfig.seq = 1;
816 mStackSupervisor = createStackSupervisor();
Wale Ogunwaled32da472018-11-16 07:19:28 -0800817 mRootActivityContainer = new RootActivityContainer(this);
818 mRootActivityContainer.onConfigurationChanged(mTempConfig);
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700819
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700820 mTaskChangeNotificationController =
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700821 new TaskChangeNotificationController(mGlobalLock, mStackSupervisor, mH);
Wale Ogunwaled95c06b2018-05-08 10:35:38 -0700822 mLockTaskController = new LockTaskController(mContext, mStackSupervisor, mH);
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700823 mActivityStartController = new ActivityStartController(this);
Wale Ogunwale16e505a2018-05-07 15:00:49 -0700824 mRecentTasks = createRecentTasks();
825 mStackSupervisor.setRecentTasks(mRecentTasks);
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700826 mVrController = new VrController(mGlobalLock);
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700827 mKeyguardController = mStackSupervisor.getKeyguardController();
828 }
829
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700830 public void onActivityManagerInternalAdded() {
831 synchronized (mGlobalLock) {
832 mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
833 mUgmInternal = LocalServices.getService(UriGrantsManagerInternal.class);
834 }
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700835 }
836
Yunfan Chen75157d72018-07-27 14:47:21 +0900837 int increaseConfigurationSeqLocked() {
838 mConfigurationSeq = Math.max(++mConfigurationSeq, 1);
839 return mConfigurationSeq;
840 }
841
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700842 protected ActivityStackSupervisor createStackSupervisor() {
843 final ActivityStackSupervisor supervisor = new ActivityStackSupervisor(this, mH.getLooper());
844 supervisor.initialize();
845 return supervisor;
846 }
847
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700848 public void setWindowManager(WindowManagerService wm) {
849 synchronized (mGlobalLock) {
850 mWindowManager = wm;
851 mLockTaskController.setWindowManager(wm);
852 mStackSupervisor.setWindowManager(wm);
Wale Ogunwaled32da472018-11-16 07:19:28 -0800853 mRootActivityContainer.setWindowManager(wm);
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700854 }
Wale Ogunwale16e505a2018-05-07 15:00:49 -0700855 }
856
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700857 public void setUsageStatsManager(UsageStatsManagerInternal usageStatsManager) {
858 synchronized (mGlobalLock) {
859 mUsageStatsInternal = usageStatsManager;
860 }
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700861 }
862
Wale Ogunwalef6733932018-06-27 05:14:34 -0700863 UserManagerService getUserManager() {
864 if (mUserManager == null) {
865 IBinder b = ServiceManager.getService(Context.USER_SERVICE);
866 mUserManager = (UserManagerService) IUserManager.Stub.asInterface(b);
867 }
868 return mUserManager;
869 }
870
871 AppOpsService getAppOpsService() {
872 if (mAppOpsService == null) {
873 IBinder b = ServiceManager.getService(Context.APP_OPS_SERVICE);
874 mAppOpsService = (AppOpsService) IAppOpsService.Stub.asInterface(b);
875 }
876 return mAppOpsService;
877 }
878
879 boolean hasUserRestriction(String restriction, int userId) {
880 return getUserManager().hasUserRestriction(restriction, userId);
881 }
882
Michal Karpinski15486842019-04-25 17:33:42 +0100883 boolean hasSystemAlertWindowPermission(int callingUid, int callingPid, String callingPackage) {
884 final int mode = getAppOpsService().noteOperation(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
885 callingUid, callingPackage);
886 if (mode == AppOpsManager.MODE_DEFAULT) {
887 return checkPermission(Manifest.permission.SYSTEM_ALERT_WINDOW, callingPid, callingUid)
888 == PERMISSION_GRANTED;
889 }
890 return mode == AppOpsManager.MODE_ALLOWED;
891 }
892
Wale Ogunwale16e505a2018-05-07 15:00:49 -0700893 protected RecentTasks createRecentTasks() {
894 return new RecentTasks(this, mStackSupervisor);
895 }
896
897 RecentTasks getRecentTasks() {
898 return mRecentTasks;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700899 }
900
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700901 ClientLifecycleManager getLifecycleManager() {
902 return mLifecycleManager;
903 }
904
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -0700905 ActivityStartController getActivityStartController() {
906 return mActivityStartController;
907 }
908
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700909 TaskChangeNotificationController getTaskChangeNotificationController() {
910 return mTaskChangeNotificationController;
911 }
912
Wale Ogunwaled95c06b2018-05-08 10:35:38 -0700913 LockTaskController getLockTaskController() {
914 return mLockTaskController;
915 }
916
Yunfan Chen75157d72018-07-27 14:47:21 +0900917 /**
918 * Return the global configuration used by the process corresponding to the input pid. This is
919 * usually the global configuration with some overrides specific to that process.
920 */
921 Configuration getGlobalConfigurationForCallingPid() {
922 final int pid = Binder.getCallingPid();
Yunfan Chenc2ff6cf2018-12-04 16:56:21 -0800923 return getGlobalConfigurationForPid(pid);
924 }
925
926 /**
927 * Return the global configuration used by the process corresponding to the given pid.
928 */
929 Configuration getGlobalConfigurationForPid(int pid) {
Yunfan Chen75157d72018-07-27 14:47:21 +0900930 if (pid == MY_PID || pid < 0) {
931 return getGlobalConfiguration();
932 }
933 synchronized (mGlobalLock) {
Michal Karpinski2e0aad22019-04-12 16:22:55 +0100934 final WindowProcessController app = mProcessMap.getProcess(pid);
Yunfan Chen75157d72018-07-27 14:47:21 +0900935 return app != null ? app.getConfiguration() : getGlobalConfiguration();
936 }
937 }
938
939 /**
940 * Return the device configuration info used by the process corresponding to the input pid.
941 * The value is consistent with the global configuration for the process.
942 */
943 @Override
944 public ConfigurationInfo getDeviceConfigurationInfo() {
945 ConfigurationInfo config = new ConfigurationInfo();
946 synchronized (mGlobalLock) {
947 final Configuration globalConfig = getGlobalConfigurationForCallingPid();
948 config.reqTouchScreen = globalConfig.touchscreen;
949 config.reqKeyboardType = globalConfig.keyboard;
950 config.reqNavigation = globalConfig.navigation;
951 if (globalConfig.navigation == Configuration.NAVIGATION_DPAD
952 || globalConfig.navigation == Configuration.NAVIGATION_TRACKBALL) {
953 config.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV;
954 }
955 if (globalConfig.keyboard != Configuration.KEYBOARD_UNDEFINED
956 && globalConfig.keyboard != Configuration.KEYBOARD_NOKEYS) {
957 config.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD;
958 }
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700959 config.reqGlEsVersion = GL_ES_VERSION;
Yunfan Chen75157d72018-07-27 14:47:21 +0900960 }
961 return config;
962 }
963
Wale Ogunwale6767eae2018-05-03 15:52:51 -0700964 private void start() {
Wale Ogunwale53783742018-09-16 10:21:51 -0700965 LocalServices.addService(ActivityTaskManagerInternal.class, mInternal);
Wale Ogunwale6767eae2018-05-03 15:52:51 -0700966 }
967
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700968 public static final class Lifecycle extends SystemService {
969 private final ActivityTaskManagerService mService;
970
971 public Lifecycle(Context context) {
972 super(context);
973 mService = new ActivityTaskManagerService(context);
974 }
975
976 @Override
977 public void onStart() {
978 publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService);
Wale Ogunwale6767eae2018-05-03 15:52:51 -0700979 mService.start();
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700980 }
981
Garfield Tan891146c2018-10-09 12:14:00 -0700982 @Override
983 public void onUnlockUser(int userId) {
984 synchronized (mService.getGlobalLock()) {
Garfield Tan0d407f42019-03-07 11:47:01 -0800985 mService.mStackSupervisor.onUserUnlocked(userId);
Garfield Tan891146c2018-10-09 12:14:00 -0700986 }
987 }
988
989 @Override
990 public void onCleanupUser(int userId) {
991 synchronized (mService.getGlobalLock()) {
992 mService.mStackSupervisor.mLaunchParamsPersister.onCleanupUser(userId);
993 }
994 }
995
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700996 public ActivityTaskManagerService getService() {
997 return mService;
998 }
999 }
1000
1001 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001002 public final int startActivity(IApplicationThread caller, String callingPackage,
1003 Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
1004 int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
1005 return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
1006 resultWho, requestCode, startFlags, profilerInfo, bOptions,
1007 UserHandle.getCallingUserId());
1008 }
1009
1010 @Override
1011 public final int startActivities(IApplicationThread caller, String callingPackage,
1012 Intent[] intents, String[] resolvedTypes, IBinder resultTo, Bundle bOptions,
1013 int userId) {
1014 final String reason = "startActivities";
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001015 enforceNotIsolatedCaller(reason);
1016 userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, reason);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001017 // TODO: Switch to user app stacks here.
Michal Karpinski84d9ebd2019-01-17 18:28:59 +00001018 return getActivityStartController().startActivities(caller, -1, 0, -1, callingPackage,
1019 intents, resolvedTypes, resultTo, SafeActivityOptions.fromBundle(bOptions), userId,
1020 reason, null /* originatingPendingIntent */,
1021 false /* allowBackgroundActivityStart */);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001022 }
1023
1024 @Override
1025 public int startActivityAsUser(IApplicationThread caller, String callingPackage,
1026 Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
1027 int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {
1028 return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
1029 resultWho, requestCode, startFlags, profilerInfo, bOptions, userId,
1030 true /*validateIncomingUser*/);
1031 }
1032
1033 int startActivityAsUser(IApplicationThread caller, String callingPackage,
1034 Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
1035 int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId,
1036 boolean validateIncomingUser) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001037 enforceNotIsolatedCaller("startActivityAsUser");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001038
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001039 userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001040 Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
1041
1042 // TODO: Switch to user app stacks here.
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001043 return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001044 .setCaller(caller)
1045 .setCallingPackage(callingPackage)
1046 .setResolvedType(resolvedType)
1047 .setResultTo(resultTo)
1048 .setResultWho(resultWho)
1049 .setRequestCode(requestCode)
1050 .setStartFlags(startFlags)
1051 .setProfilerInfo(profilerInfo)
1052 .setActivityOptions(bOptions)
1053 .setMayWait(userId)
1054 .execute();
1055
1056 }
1057
1058 @Override
1059 public int startActivityIntentSender(IApplicationThread caller, IIntentSender target,
1060 IBinder whitelistToken, Intent fillInIntent, String resolvedType, IBinder resultTo,
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001061 String resultWho, int requestCode, int flagsMask, int flagsValues, Bundle bOptions) {
1062 enforceNotIsolatedCaller("startActivityIntentSender");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001063 // Refuse possible leaked file descriptors
1064 if (fillInIntent != null && fillInIntent.hasFileDescriptors()) {
1065 throw new IllegalArgumentException("File descriptors passed in Intent");
1066 }
1067
1068 if (!(target instanceof PendingIntentRecord)) {
1069 throw new IllegalArgumentException("Bad PendingIntent object");
1070 }
1071
1072 PendingIntentRecord pir = (PendingIntentRecord)target;
1073
1074 synchronized (mGlobalLock) {
1075 // If this is coming from the currently resumed activity, it is
1076 // effectively saying that app switches are allowed at this point.
Andrii Kulian5f750bc2018-07-17 08:57:23 -07001077 final ActivityStack stack = getTopDisplayFocusedStack();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001078 if (stack.mResumedActivity != null &&
1079 stack.mResumedActivity.info.applicationInfo.uid == Binder.getCallingUid()) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001080 mAppSwitchesAllowedTime = 0;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001081 }
1082 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001083 return pir.sendInner(0, fillInIntent, resolvedType, whitelistToken, null, null,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001084 resultTo, resultWho, requestCode, flagsMask, flagsValues, bOptions);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001085 }
1086
1087 @Override
1088 public boolean startNextMatchingActivity(IBinder callingActivity, Intent intent,
1089 Bundle bOptions) {
1090 // Refuse possible leaked file descriptors
1091 if (intent != null && intent.hasFileDescriptors()) {
1092 throw new IllegalArgumentException("File descriptors passed in Intent");
1093 }
1094 SafeActivityOptions options = SafeActivityOptions.fromBundle(bOptions);
1095
1096 synchronized (mGlobalLock) {
1097 final ActivityRecord r = ActivityRecord.isInStackLocked(callingActivity);
1098 if (r == null) {
1099 SafeActivityOptions.abort(options);
1100 return false;
1101 }
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001102 if (!r.attachedToProcess()) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001103 // The caller is not running... d'oh!
1104 SafeActivityOptions.abort(options);
1105 return false;
1106 }
1107 intent = new Intent(intent);
1108 // The caller is not allowed to change the data.
1109 intent.setDataAndType(r.intent.getData(), r.intent.getType());
1110 // And we are resetting to find the next component...
1111 intent.setComponent(null);
1112
1113 final boolean debug = ((intent.getFlags() & Intent.FLAG_DEBUG_LOG_RESOLUTION) != 0);
1114
1115 ActivityInfo aInfo = null;
1116 try {
1117 List<ResolveInfo> resolves =
1118 AppGlobals.getPackageManager().queryIntentActivities(
1119 intent, r.resolvedType,
1120 PackageManager.MATCH_DEFAULT_ONLY | STOCK_PM_FLAGS,
1121 UserHandle.getCallingUserId()).getList();
1122
1123 // Look for the original activity in the list...
1124 final int N = resolves != null ? resolves.size() : 0;
1125 for (int i=0; i<N; i++) {
1126 ResolveInfo rInfo = resolves.get(i);
1127 if (rInfo.activityInfo.packageName.equals(r.packageName)
1128 && rInfo.activityInfo.name.equals(r.info.name)) {
1129 // We found the current one... the next matching is
1130 // after it.
1131 i++;
1132 if (i<N) {
1133 aInfo = resolves.get(i).activityInfo;
1134 }
1135 if (debug) {
1136 Slog.v(TAG, "Next matching activity: found current " + r.packageName
1137 + "/" + r.info.name);
1138 Slog.v(TAG, "Next matching activity: next is " + ((aInfo == null)
1139 ? "null" : aInfo.packageName + "/" + aInfo.name));
1140 }
1141 break;
1142 }
1143 }
1144 } catch (RemoteException e) {
1145 }
1146
1147 if (aInfo == null) {
1148 // Nobody who is next!
1149 SafeActivityOptions.abort(options);
1150 if (debug) Slog.d(TAG, "Next matching activity: nothing found");
1151 return false;
1152 }
1153
1154 intent.setComponent(new ComponentName(
1155 aInfo.applicationInfo.packageName, aInfo.name));
1156 intent.setFlags(intent.getFlags()&~(
1157 Intent.FLAG_ACTIVITY_FORWARD_RESULT|
1158 Intent.FLAG_ACTIVITY_CLEAR_TOP|
1159 Intent.FLAG_ACTIVITY_MULTIPLE_TASK|
1160 FLAG_ACTIVITY_NEW_TASK));
1161
1162 // Okay now we need to start the new activity, replacing the currently running activity.
1163 // This is a little tricky because we want to start the new one as if the current one is
1164 // finished, but not finish the current one first so that there is no flicker.
1165 // And thus...
1166 final boolean wasFinishing = r.finishing;
1167 r.finishing = true;
1168
1169 // Propagate reply information over to the new activity.
1170 final ActivityRecord resultTo = r.resultTo;
1171 final String resultWho = r.resultWho;
1172 final int requestCode = r.requestCode;
1173 r.resultTo = null;
1174 if (resultTo != null) {
1175 resultTo.removeResultsLocked(r, resultWho, requestCode);
1176 }
1177
1178 final long origId = Binder.clearCallingIdentity();
1179 // TODO(b/64750076): Check if calling pid should really be -1.
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001180 final int res = getActivityStartController()
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001181 .obtainStarter(intent, "startNextMatchingActivity")
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001182 .setCaller(r.app.getThread())
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001183 .setResolvedType(r.resolvedType)
1184 .setActivityInfo(aInfo)
1185 .setResultTo(resultTo != null ? resultTo.appToken : null)
1186 .setResultWho(resultWho)
1187 .setRequestCode(requestCode)
1188 .setCallingPid(-1)
1189 .setCallingUid(r.launchedFromUid)
1190 .setCallingPackage(r.launchedFromPackage)
1191 .setRealCallingPid(-1)
1192 .setRealCallingUid(r.launchedFromUid)
1193 .setActivityOptions(options)
1194 .execute();
1195 Binder.restoreCallingIdentity(origId);
1196
1197 r.finishing = wasFinishing;
1198 if (res != ActivityManager.START_SUCCESS) {
1199 return false;
1200 }
1201 return true;
1202 }
1203 }
1204
1205 @Override
1206 public final WaitResult startActivityAndWait(IApplicationThread caller, String callingPackage,
1207 Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
1208 int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {
1209 final WaitResult res = new WaitResult();
1210 synchronized (mGlobalLock) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001211 enforceNotIsolatedCaller("startActivityAndWait");
1212 userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
1213 userId, "startActivityAndWait");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001214 // TODO: Switch to user app stacks here.
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001215 getActivityStartController().obtainStarter(intent, "startActivityAndWait")
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001216 .setCaller(caller)
1217 .setCallingPackage(callingPackage)
1218 .setResolvedType(resolvedType)
1219 .setResultTo(resultTo)
1220 .setResultWho(resultWho)
1221 .setRequestCode(requestCode)
1222 .setStartFlags(startFlags)
1223 .setActivityOptions(bOptions)
1224 .setMayWait(userId)
1225 .setProfilerInfo(profilerInfo)
1226 .setWaitResult(res)
1227 .execute();
1228 }
1229 return res;
1230 }
1231
1232 @Override
1233 public final int startActivityWithConfig(IApplicationThread caller, String callingPackage,
1234 Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
1235 int startFlags, Configuration config, Bundle bOptions, int userId) {
1236 synchronized (mGlobalLock) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001237 enforceNotIsolatedCaller("startActivityWithConfig");
1238 userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId,
1239 "startActivityWithConfig");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001240 // TODO: Switch to user app stacks here.
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001241 return getActivityStartController().obtainStarter(intent, "startActivityWithConfig")
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001242 .setCaller(caller)
1243 .setCallingPackage(callingPackage)
1244 .setResolvedType(resolvedType)
1245 .setResultTo(resultTo)
1246 .setResultWho(resultWho)
1247 .setRequestCode(requestCode)
1248 .setStartFlags(startFlags)
1249 .setGlobalConfiguration(config)
1250 .setActivityOptions(bOptions)
1251 .setMayWait(userId)
1252 .execute();
1253 }
1254 }
1255
Alison Cichowlas3e340502018-08-07 17:15:01 -04001256
1257 @Override
1258 public IBinder requestStartActivityPermissionToken(IBinder delegatorToken) {
1259 int callingUid = Binder.getCallingUid();
1260 if (UserHandle.getAppId(callingUid) != SYSTEM_UID) {
1261 throw new SecurityException("Only the system process can request a permission token, "
1262 + "received request from uid: " + callingUid);
1263 }
1264 IBinder permissionToken = new Binder();
1265 synchronized (mGlobalLock) {
1266 mStartActivitySources.put(permissionToken, delegatorToken);
1267 }
1268
1269 Message expireMsg = PooledLambda.obtainMessage(
1270 ActivityTaskManagerService::expireStartAsCallerTokenMsg, this, permissionToken);
1271 mUiHandler.sendMessageDelayed(expireMsg, START_AS_CALLER_TOKEN_TIMEOUT_IMPL);
1272
1273 Message forgetMsg = PooledLambda.obtainMessage(
1274 ActivityTaskManagerService::forgetStartAsCallerTokenMsg, this, permissionToken);
1275 mUiHandler.sendMessageDelayed(forgetMsg, START_AS_CALLER_TOKEN_EXPIRED_TIMEOUT);
1276
1277 return permissionToken;
1278 }
1279
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001280 @Override
1281 public final int startActivityAsCaller(IApplicationThread caller, String callingPackage,
1282 Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
Alison Cichowlas3e340502018-08-07 17:15:01 -04001283 int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, IBinder permissionToken,
1284 boolean ignoreTargetSecurity, int userId) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001285 // This is very dangerous -- it allows you to perform a start activity (including
Alison Cichowlas3e340502018-08-07 17:15:01 -04001286 // permission grants) as any app that may launch one of your own activities. So we only
1287 // allow this in two cases:
1288 // 1) The caller is an activity that is part of the core framework, and then only when it
1289 // is running as the system.
1290 // 2) The caller provides a valid permissionToken. Permission tokens are one-time use and
1291 // can only be requested by a system activity, which may then delegate this call to
1292 // another app.
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001293 final ActivityRecord sourceRecord;
1294 final int targetUid;
1295 final String targetPackage;
1296 final boolean isResolver;
1297 synchronized (mGlobalLock) {
1298 if (resultTo == null) {
1299 throw new SecurityException("Must be called from an activity");
1300 }
Alison Cichowlas3e340502018-08-07 17:15:01 -04001301 final IBinder sourceToken;
1302 if (permissionToken != null) {
1303 // To even attempt to use a permissionToken, an app must also have this signature
1304 // permission.
1305 mAmInternal.enforceCallingPermission(
1306 android.Manifest.permission.START_ACTIVITY_AS_CALLER,
1307 "startActivityAsCaller");
1308 // If called with a permissionToken, we want the sourceRecord from the delegator
1309 // activity that requested this token.
1310 sourceToken = mStartActivitySources.remove(permissionToken);
1311 if (sourceToken == null) {
1312 // Invalid permissionToken, check if it recently expired.
1313 if (mExpiredStartAsCallerTokens.contains(permissionToken)) {
1314 throw new SecurityException("Called with expired permission token: "
1315 + permissionToken);
1316 } else {
1317 throw new SecurityException("Called with invalid permission token: "
1318 + permissionToken);
1319 }
1320 }
1321 } else {
1322 // This method was called directly by the source.
1323 sourceToken = resultTo;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001324 }
Alison Cichowlas3e340502018-08-07 17:15:01 -04001325
Wale Ogunwaled32da472018-11-16 07:19:28 -08001326 sourceRecord = mRootActivityContainer.isInAnyStack(sourceToken);
Alison Cichowlas3e340502018-08-07 17:15:01 -04001327 if (sourceRecord == null) {
1328 throw new SecurityException("Called with bad activity token: " + sourceToken);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001329 }
1330 if (sourceRecord.app == null) {
1331 throw new SecurityException("Called without a process attached to activity");
1332 }
Alison Cichowlas3e340502018-08-07 17:15:01 -04001333
1334 // Whether called directly or from a delegate, the source activity must be from the
1335 // android package.
1336 if (!sourceRecord.info.packageName.equals("android")) {
1337 throw new SecurityException("Must be called from an activity that is "
1338 + "declared in the android package");
1339 }
1340
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001341 if (UserHandle.getAppId(sourceRecord.app.mUid) != SYSTEM_UID) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001342 // This is still okay, as long as this activity is running under the
1343 // uid of the original calling activity.
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001344 if (sourceRecord.app.mUid != sourceRecord.launchedFromUid) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001345 throw new SecurityException(
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001346 "Calling activity in uid " + sourceRecord.app.mUid
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001347 + " must be system uid or original calling uid "
1348 + sourceRecord.launchedFromUid);
1349 }
1350 }
1351 if (ignoreTargetSecurity) {
1352 if (intent.getComponent() == null) {
1353 throw new SecurityException(
1354 "Component must be specified with ignoreTargetSecurity");
1355 }
1356 if (intent.getSelector() != null) {
1357 throw new SecurityException(
1358 "Selector not allowed with ignoreTargetSecurity");
1359 }
1360 }
1361 targetUid = sourceRecord.launchedFromUid;
1362 targetPackage = sourceRecord.launchedFromPackage;
1363 isResolver = sourceRecord.isResolverOrChildActivity();
1364 }
1365
1366 if (userId == UserHandle.USER_NULL) {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001367 userId = UserHandle.getUserId(sourceRecord.app.mUid);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001368 }
1369
1370 // TODO: Switch to user app stacks here.
1371 try {
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001372 return getActivityStartController().obtainStarter(intent, "startActivityAsCaller")
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001373 .setCallingUid(targetUid)
1374 .setCallingPackage(targetPackage)
1375 .setResolvedType(resolvedType)
1376 .setResultTo(resultTo)
1377 .setResultWho(resultWho)
1378 .setRequestCode(requestCode)
1379 .setStartFlags(startFlags)
1380 .setActivityOptions(bOptions)
1381 .setMayWait(userId)
1382 .setIgnoreTargetSecurity(ignoreTargetSecurity)
1383 .setFilterCallingUid(isResolver ? 0 /* system */ : targetUid)
Alan Stokes2f4a4ed2019-05-08 16:56:45 +01001384 // The target may well be in the background, which would normally prevent it
1385 // from starting an activity. Here we definitely want the start to succeed.
1386 .setAllowBackgroundActivityStart(true)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001387 .execute();
1388 } catch (SecurityException e) {
1389 // XXX need to figure out how to propagate to original app.
1390 // A SecurityException here is generally actually a fault of the original
1391 // calling activity (such as a fairly granting permissions), so propagate it
1392 // back to them.
1393 /*
1394 StringBuilder msg = new StringBuilder();
1395 msg.append("While launching");
1396 msg.append(intent.toString());
1397 msg.append(": ");
1398 msg.append(e.getMessage());
1399 */
1400 throw e;
1401 }
1402 }
1403
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001404 int handleIncomingUser(int callingPid, int callingUid, int userId, String name) {
1405 return mAmInternal.handleIncomingUser(callingPid, callingUid, userId, false /* allowAll */,
1406 ALLOW_FULL_ONLY, name, null /* callerPackage */);
1407 }
1408
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001409 @Override
1410 public int startVoiceActivity(String callingPackage, int callingPid, int callingUid,
1411 Intent intent, String resolvedType, IVoiceInteractionSession session,
1412 IVoiceInteractor interactor, int startFlags, ProfilerInfo profilerInfo,
1413 Bundle bOptions, int userId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001414 mAmInternal.enforceCallingPermission(BIND_VOICE_INTERACTION, "startVoiceActivity()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001415 if (session == null || interactor == null) {
1416 throw new NullPointerException("null session or interactor");
1417 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001418 userId = handleIncomingUser(callingPid, callingUid, userId, "startVoiceActivity");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001419 // TODO: Switch to user app stacks here.
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001420 return getActivityStartController().obtainStarter(intent, "startVoiceActivity")
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001421 .setCallingUid(callingUid)
1422 .setCallingPackage(callingPackage)
1423 .setResolvedType(resolvedType)
1424 .setVoiceSession(session)
1425 .setVoiceInteractor(interactor)
1426 .setStartFlags(startFlags)
1427 .setProfilerInfo(profilerInfo)
1428 .setActivityOptions(bOptions)
1429 .setMayWait(userId)
Michal Karpinski85fa2022019-02-08 12:05:09 +00001430 .setAllowBackgroundActivityStart(true)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001431 .execute();
1432 }
1433
1434 @Override
1435 public int startAssistantActivity(String callingPackage, int callingPid, int callingUid,
1436 Intent intent, String resolvedType, Bundle bOptions, int userId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001437 mAmInternal.enforceCallingPermission(BIND_VOICE_INTERACTION, "startAssistantActivity()");
1438 userId = handleIncomingUser(callingPid, callingUid, userId, "startAssistantActivity");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001439
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001440 return getActivityStartController().obtainStarter(intent, "startAssistantActivity")
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001441 .setCallingUid(callingUid)
1442 .setCallingPackage(callingPackage)
1443 .setResolvedType(resolvedType)
1444 .setActivityOptions(bOptions)
1445 .setMayWait(userId)
Michal Karpinski85fa2022019-02-08 12:05:09 +00001446 .setAllowBackgroundActivityStart(true)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001447 .execute();
1448 }
1449
Riddle Hsu609a8e22019-06-27 16:46:29 -06001450 /**
1451 * Start the recents activity to perform the recents animation.
1452 *
1453 * @param intent The intent to start the recents activity.
1454 * @param recentsAnimationRunner Pass {@code null} to only preload the activity.
1455 */
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001456 @Override
Riddle Hsu609a8e22019-06-27 16:46:29 -06001457 public void startRecentsActivity(Intent intent, @Deprecated IAssistDataReceiver unused,
1458 @Nullable IRecentsAnimationRunner recentsAnimationRunner) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001459 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "startRecentsActivity()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001460 final int callingPid = Binder.getCallingPid();
1461 final long origId = Binder.clearCallingIdentity();
1462 try {
1463 synchronized (mGlobalLock) {
Wale Ogunwale16e505a2018-05-07 15:00:49 -07001464 final ComponentName recentsComponent = mRecentTasks.getRecentsComponent();
1465 final int recentsUid = mRecentTasks.getRecentsComponentUid();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001466
1467 // Start a new recents animation
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001468 final RecentsAnimation anim = new RecentsAnimation(this, mStackSupervisor,
Riddle Hsu609a8e22019-06-27 16:46:29 -06001469 getActivityStartController(), mWindowManager, intent, recentsComponent,
1470 recentsUid, callingPid);
1471 if (recentsAnimationRunner == null) {
1472 anim.preloadRecentsActivity();
1473 } else {
1474 anim.startRecentsActivity(recentsAnimationRunner);
1475 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001476 }
1477 } finally {
1478 Binder.restoreCallingIdentity(origId);
1479 }
1480 }
1481
1482 @Override
1483 public final int startActivityFromRecents(int taskId, Bundle bOptions) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001484 enforceCallerIsRecentsOrHasPermission(START_TASKS_FROM_RECENTS,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001485 "startActivityFromRecents()");
1486
1487 final int callingPid = Binder.getCallingPid();
1488 final int callingUid = Binder.getCallingUid();
1489 final SafeActivityOptions safeOptions = SafeActivityOptions.fromBundle(bOptions);
1490 final long origId = Binder.clearCallingIdentity();
1491 try {
1492 synchronized (mGlobalLock) {
1493 return mStackSupervisor.startActivityFromRecents(callingPid, callingUid, taskId,
1494 safeOptions);
1495 }
1496 } finally {
1497 Binder.restoreCallingIdentity(origId);
1498 }
1499 }
1500
1501 /**
Andrii Kulian2eb84b22018-12-13 18:18:54 -08001502 * Public API to check if the client is allowed to start an activity on specified display.
1503 *
1504 * If the target display is private or virtual, some restrictions will apply.
1505 *
1506 * @param displayId Target display id.
1507 * @param intent Intent used to launch the activity.
1508 * @param resolvedType The MIME type of the intent.
1509 * @param userId The id of the user for whom the call is made.
1510 * @return {@code true} if a call to start an activity on the target display should succeed and
1511 * no {@link SecurityException} will be thrown, {@code false} otherwise.
1512 */
1513 @Override
1514 public final boolean isActivityStartAllowedOnDisplay(int displayId, Intent intent,
1515 String resolvedType, int userId) {
1516 final int callingUid = Binder.getCallingUid();
1517 final int callingPid = Binder.getCallingPid();
1518 final long origId = Binder.clearCallingIdentity();
1519
1520 try {
1521 // Collect information about the target of the Intent.
1522 ActivityInfo aInfo = mStackSupervisor.resolveActivity(intent, resolvedType,
1523 0 /* startFlags */, null /* profilerInfo */, userId,
1524 ActivityStarter.computeResolveFilterUid(callingUid, callingUid,
1525 UserHandle.USER_NULL));
1526 aInfo = mAmInternal.getActivityInfoForUser(aInfo, userId);
1527
1528 synchronized (mGlobalLock) {
1529 return mStackSupervisor.canPlaceEntityOnDisplay(displayId, callingPid, callingUid,
1530 aInfo);
1531 }
1532 } finally {
1533 Binder.restoreCallingIdentity(origId);
1534 }
1535 }
1536
1537 /**
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001538 * This is the internal entry point for handling Activity.finish().
1539 *
1540 * @param token The Binder token referencing the Activity we want to finish.
1541 * @param resultCode Result code, if any, from this Activity.
1542 * @param resultData Result data (Intent), if any, from this Activity.
1543 * @param finishTask Whether to finish the task associated with this Activity.
1544 *
1545 * @return Returns true if the activity successfully finished, or false if it is still running.
1546 */
1547 @Override
1548 public final boolean finishActivity(IBinder token, int resultCode, Intent resultData,
1549 int finishTask) {
1550 // Refuse possible leaked file descriptors
1551 if (resultData != null && resultData.hasFileDescriptors()) {
1552 throw new IllegalArgumentException("File descriptors passed in Intent");
1553 }
1554
1555 synchronized (mGlobalLock) {
Wale Ogunwale586a8ee2019-06-04 13:44:14 +00001556 ActivityRecord r = ActivityRecord.isInStackLocked(token);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001557 if (r == null) {
1558 return true;
1559 }
1560 // Keep track of the root activity of the task before we finish it
Wale Ogunwale8b19de92018-11-29 19:58:26 -08001561 final TaskRecord tr = r.getTaskRecord();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001562 ActivityRecord rootR = tr.getRootActivity();
1563 if (rootR == null) {
1564 Slog.w(TAG, "Finishing task with all activities already finished");
1565 }
1566 // Do not allow task to finish if last task in lockTask mode. Launchable priv-apps can
1567 // finish.
Wale Ogunwaled95c06b2018-05-08 10:35:38 -07001568 if (getLockTaskController().activityBlockedFromFinish(r)) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001569 return false;
1570 }
1571
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001572 // TODO: There is a dup. of this block of code in ActivityStack.navigateUpToLocked
1573 // We should consolidate.
1574 if (mController != null) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001575 // Find the first activity that is not finishing.
Wale Ogunwale8b19de92018-11-29 19:58:26 -08001576 final ActivityRecord next = r.getActivityStack().topRunningActivityLocked(token, 0);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001577 if (next != null) {
1578 // ask watcher if this is allowed
1579 boolean resumeOK = true;
1580 try {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001581 resumeOK = mController.activityResuming(next.packageName);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001582 } catch (RemoteException e) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001583 mController = null;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001584 Watchdog.getInstance().setActivityController(null);
1585 }
1586
1587 if (!resumeOK) {
1588 Slog.i(TAG, "Not finishing activity because controller resumed");
1589 return false;
1590 }
1591 }
1592 }
Michal Karpinskifc6872e2019-05-21 15:18:44 +01001593
1594 // note down that the process has finished an activity and is in background activity
1595 // starts grace period
1596 if (r.app != null) {
1597 r.app.setLastActivityFinishTimeIfNeeded(SystemClock.uptimeMillis());
1598 }
1599
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001600 final long origId = Binder.clearCallingIdentity();
1601 try {
1602 boolean res;
1603 final boolean finishWithRootActivity =
1604 finishTask == Activity.FINISH_TASK_WITH_ROOT_ACTIVITY;
1605 if (finishTask == Activity.FINISH_TASK_WITH_ACTIVITY
1606 || (finishWithRootActivity && r == rootR)) {
1607 // If requested, remove the task that is associated to this activity only if it
1608 // was the root activity in the task. The result code and data is ignored
1609 // because we don't support returning them across task boundaries. Also, to
1610 // keep backwards compatibility we remove the task from recents when finishing
1611 // task with root activity.
1612 res = mStackSupervisor.removeTaskByIdLocked(tr.taskId, false,
1613 finishWithRootActivity, "finish-activity");
1614 if (!res) {
1615 Slog.i(TAG, "Removing task failed to finish activity");
1616 }
Garfield Tan2746ab52018-07-25 12:33:01 -07001617 // Explicitly dismissing the activity so reset its relaunch flag.
Wale Ogunwale64258362018-10-16 15:13:37 -07001618 r.mRelaunchReason = RELAUNCH_REASON_NONE;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001619 } else {
1620 res = tr.getStack().requestFinishActivityLocked(token, resultCode,
Wale Ogunwale586a8ee2019-06-04 13:44:14 +00001621 resultData, "app-request", true);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001622 if (!res) {
1623 Slog.i(TAG, "Failed to finish by app-request");
1624 }
1625 }
1626 return res;
1627 } finally {
1628 Binder.restoreCallingIdentity(origId);
1629 }
1630 }
1631 }
1632
1633 @Override
1634 public boolean finishActivityAffinity(IBinder token) {
1635 synchronized (mGlobalLock) {
1636 final long origId = Binder.clearCallingIdentity();
1637 try {
1638 ActivityRecord r = ActivityRecord.isInStackLocked(token);
1639 if (r == null) {
1640 return false;
1641 }
1642
1643 // Do not allow task to finish if last task in lockTask mode. Launchable priv-apps
1644 // can finish.
Wale Ogunwale8b19de92018-11-29 19:58:26 -08001645 final TaskRecord task = r.getTaskRecord();
Wale Ogunwaled95c06b2018-05-08 10:35:38 -07001646 if (getLockTaskController().activityBlockedFromFinish(r)) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001647 return false;
1648 }
1649 return task.getStack().finishActivityAffinityLocked(r);
1650 } finally {
1651 Binder.restoreCallingIdentity(origId);
1652 }
1653 }
1654 }
1655
1656 @Override
1657 public final void activityIdle(IBinder token, Configuration config, boolean stopProfiling) {
1658 final long origId = Binder.clearCallingIdentity();
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001659 try {
1660 WindowProcessController proc = null;
1661 synchronized (mGlobalLock) {
1662 ActivityStack stack = ActivityRecord.getStackLocked(token);
1663 if (stack == null) {
1664 return;
1665 }
1666 final ActivityRecord r = mStackSupervisor.activityIdleInternalLocked(token,
1667 false /* fromTimeout */, false /* processPausingActivities */, config);
1668 if (r != null) {
1669 proc = r.app;
1670 }
1671 if (stopProfiling && proc != null) {
1672 proc.clearProfilerIfNeeded();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001673 }
1674 }
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001675 } finally {
1676 Binder.restoreCallingIdentity(origId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001677 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001678 }
1679
1680 @Override
1681 public final void activityResumed(IBinder token) {
1682 final long origId = Binder.clearCallingIdentity();
1683 synchronized (mGlobalLock) {
1684 ActivityRecord.activityResumedLocked(token);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001685 mWindowManager.notifyAppResumedFinished(token);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001686 }
1687 Binder.restoreCallingIdentity(origId);
1688 }
1689
1690 @Override
Andrii Kulian86e70fc2019-02-12 11:04:10 +00001691 public final void activityTopResumedStateLost() {
1692 final long origId = Binder.clearCallingIdentity();
1693 synchronized (mGlobalLock) {
1694 mStackSupervisor.handleTopResumedStateReleased(false /* timeout */);
1695 }
1696 Binder.restoreCallingIdentity(origId);
1697 }
1698
1699 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001700 public final void activityPaused(IBinder token) {
1701 final long origId = Binder.clearCallingIdentity();
1702 synchronized (mGlobalLock) {
1703 ActivityStack stack = ActivityRecord.getStackLocked(token);
1704 if (stack != null) {
1705 stack.activityPausedLocked(token, false);
1706 }
1707 }
1708 Binder.restoreCallingIdentity(origId);
1709 }
1710
1711 @Override
1712 public final void activityStopped(IBinder token, Bundle icicle,
1713 PersistableBundle persistentState, CharSequence description) {
1714 if (DEBUG_ALL) Slog.v(TAG, "Activity stopped: token=" + token);
1715
1716 // Refuse possible leaked file descriptors
1717 if (icicle != null && icicle.hasFileDescriptors()) {
1718 throw new IllegalArgumentException("File descriptors passed in Bundle");
1719 }
1720
1721 final long origId = Binder.clearCallingIdentity();
1722
Riddle Hsu7b766fd2019-01-28 21:14:59 +08001723 String restartingName = null;
1724 int restartingUid = 0;
1725 final ActivityRecord r;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001726 synchronized (mGlobalLock) {
Riddle Hsu7b766fd2019-01-28 21:14:59 +08001727 r = ActivityRecord.isInStackLocked(token);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001728 if (r != null) {
Riddle Hsu7b766fd2019-01-28 21:14:59 +08001729 if (r.attachedToProcess()
1730 && r.isState(ActivityStack.ActivityState.RESTARTING_PROCESS)) {
1731 // The activity was requested to restart from
1732 // {@link #restartActivityProcessIfVisible}.
1733 restartingName = r.app.mName;
1734 restartingUid = r.app.mUid;
1735 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001736 r.activityStoppedLocked(icicle, persistentState, description);
1737 }
1738 }
1739
Riddle Hsu7b766fd2019-01-28 21:14:59 +08001740 if (restartingName != null) {
1741 // In order to let the foreground activity can be restarted with its saved state from
1742 // {@link android.app.Activity#onSaveInstanceState}, the kill operation is postponed
1743 // until the activity reports stopped with the state. And the activity record will be
1744 // kept because the record state is restarting, then the activity will be restarted
1745 // immediately if it is still the top one.
1746 mStackSupervisor.removeRestartTimeouts(r);
1747 mAmInternal.killProcess(restartingName, restartingUid, "restartActivityProcess");
1748 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001749 mAmInternal.trimApplications();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001750
1751 Binder.restoreCallingIdentity(origId);
1752 }
1753
1754 @Override
1755 public final void activityDestroyed(IBinder token) {
1756 if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "ACTIVITY DESTROYED: " + token);
1757 synchronized (mGlobalLock) {
1758 ActivityStack stack = ActivityRecord.getStackLocked(token);
1759 if (stack != null) {
1760 stack.activityDestroyedLocked(token, "activityDestroyed");
1761 }
1762 }
1763 }
1764
1765 @Override
1766 public final void activityRelaunched(IBinder token) {
1767 final long origId = Binder.clearCallingIdentity();
1768 synchronized (mGlobalLock) {
1769 mStackSupervisor.activityRelaunchedLocked(token);
1770 }
1771 Binder.restoreCallingIdentity(origId);
1772 }
1773
1774 public final void activitySlept(IBinder token) {
1775 if (DEBUG_ALL) Slog.v(TAG, "Activity slept: token=" + token);
1776
1777 final long origId = Binder.clearCallingIdentity();
1778
1779 synchronized (mGlobalLock) {
1780 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
1781 if (r != null) {
1782 mStackSupervisor.activitySleptLocked(r);
1783 }
1784 }
1785
1786 Binder.restoreCallingIdentity(origId);
1787 }
1788
1789 @Override
1790 public void setRequestedOrientation(IBinder token, int requestedOrientation) {
1791 synchronized (mGlobalLock) {
1792 ActivityRecord r = ActivityRecord.isInStackLocked(token);
1793 if (r == null) {
1794 return;
1795 }
1796 final long origId = Binder.clearCallingIdentity();
1797 try {
1798 r.setRequestedOrientation(requestedOrientation);
1799 } finally {
1800 Binder.restoreCallingIdentity(origId);
1801 }
1802 }
1803 }
1804
1805 @Override
1806 public int getRequestedOrientation(IBinder token) {
1807 synchronized (mGlobalLock) {
1808 ActivityRecord r = ActivityRecord.isInStackLocked(token);
1809 if (r == null) {
1810 return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
1811 }
Riddle Hsu0a343c32018-12-21 00:40:48 +08001812 return r.getOrientation();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001813 }
1814 }
1815
1816 @Override
1817 public void setImmersive(IBinder token, boolean immersive) {
1818 synchronized (mGlobalLock) {
1819 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
1820 if (r == null) {
1821 throw new IllegalArgumentException();
1822 }
1823 r.immersive = immersive;
1824
1825 // update associated state if we're frontmost
Andrii Kulian52d255c2018-07-13 11:32:19 -07001826 if (r.isResumedActivityOnDisplay()) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001827 if (DEBUG_IMMERSIVE) Slog.d(TAG_IMMERSIVE, "Frontmost changed immersion: "+ r);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001828 applyUpdateLockStateLocked(r);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001829 }
1830 }
1831 }
1832
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001833 void applyUpdateLockStateLocked(ActivityRecord r) {
1834 // Modifications to the UpdateLock state are done on our handler, outside
1835 // the activity manager's locks. The new state is determined based on the
1836 // state *now* of the relevant activity record. The object is passed to
1837 // the handler solely for logging detail, not to be consulted/modified.
1838 final boolean nextState = r != null && r.immersive;
1839 mH.post(() -> {
1840 if (mUpdateLock.isHeld() != nextState) {
1841 if (DEBUG_IMMERSIVE) Slog.d(TAG_IMMERSIVE,
1842 "Applying new update lock state '" + nextState + "' for " + r);
1843 if (nextState) {
1844 mUpdateLock.acquire();
1845 } else {
1846 mUpdateLock.release();
1847 }
1848 }
1849 });
1850 }
1851
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001852 @Override
1853 public boolean isImmersive(IBinder token) {
1854 synchronized (mGlobalLock) {
1855 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
1856 if (r == null) {
1857 throw new IllegalArgumentException();
1858 }
1859 return r.immersive;
1860 }
1861 }
1862
1863 @Override
1864 public boolean isTopActivityImmersive() {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001865 enforceNotIsolatedCaller("isTopActivityImmersive");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001866 synchronized (mGlobalLock) {
Andrii Kulian5f750bc2018-07-17 08:57:23 -07001867 final ActivityRecord r = getTopDisplayFocusedStack().topRunningActivityLocked();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001868 return (r != null) ? r.immersive : false;
1869 }
1870 }
1871
1872 @Override
1873 public void overridePendingTransition(IBinder token, String packageName,
1874 int enterAnim, int exitAnim) {
1875 synchronized (mGlobalLock) {
1876 ActivityRecord self = ActivityRecord.isInStackLocked(token);
1877 if (self == null) {
1878 return;
1879 }
1880
1881 final long origId = Binder.clearCallingIdentity();
1882
1883 if (self.isState(
1884 ActivityStack.ActivityState.RESUMED, ActivityStack.ActivityState.PAUSING)) {
Wale Ogunwale3a256e62018-12-06 14:41:18 -08001885 self.getDisplay().mDisplayContent.mAppTransition.overridePendingAppTransition(
lumark588a3e82018-07-20 18:53:54 +08001886 packageName, enterAnim, exitAnim, null);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001887 }
1888
1889 Binder.restoreCallingIdentity(origId);
1890 }
1891 }
1892
1893 @Override
1894 public int getFrontActivityScreenCompatMode() {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001895 enforceNotIsolatedCaller("getFrontActivityScreenCompatMode");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001896 synchronized (mGlobalLock) {
Andrii Kulian5f750bc2018-07-17 08:57:23 -07001897 final ActivityRecord r = getTopDisplayFocusedStack().topRunningActivityLocked();
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001898 if (r == null) {
1899 return ActivityManager.COMPAT_MODE_UNKNOWN;
1900 }
Wale Ogunwale53783742018-09-16 10:21:51 -07001901 return mCompatModePackages.computeCompatModeLocked(r.info.applicationInfo);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001902 }
1903 }
1904
1905 @Override
1906 public void setFrontActivityScreenCompatMode(int mode) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001907 mAmInternal.enforceCallingPermission(android.Manifest.permission.SET_SCREEN_COMPATIBILITY,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001908 "setFrontActivityScreenCompatMode");
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001909 ApplicationInfo ai;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001910 synchronized (mGlobalLock) {
Andrii Kulian5f750bc2018-07-17 08:57:23 -07001911 final ActivityRecord r = getTopDisplayFocusedStack().topRunningActivityLocked();
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001912 if (r == null) {
1913 Slog.w(TAG, "setFrontActivityScreenCompatMode failed: no top activity");
1914 return;
1915 }
1916 ai = r.info.applicationInfo;
Wale Ogunwale53783742018-09-16 10:21:51 -07001917 mCompatModePackages.setPackageScreenCompatModeLocked(ai, mode);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001918 }
1919 }
1920
1921 @Override
1922 public int getLaunchedFromUid(IBinder activityToken) {
1923 ActivityRecord srec;
1924 synchronized (mGlobalLock) {
1925 srec = ActivityRecord.forTokenLocked(activityToken);
1926 }
1927 if (srec == null) {
1928 return -1;
1929 }
1930 return srec.launchedFromUid;
1931 }
1932
1933 @Override
1934 public String getLaunchedFromPackage(IBinder activityToken) {
1935 ActivityRecord srec;
1936 synchronized (mGlobalLock) {
1937 srec = ActivityRecord.forTokenLocked(activityToken);
1938 }
1939 if (srec == null) {
1940 return null;
1941 }
1942 return srec.launchedFromPackage;
1943 }
1944
1945 @Override
1946 public boolean convertFromTranslucent(IBinder token) {
1947 final long origId = Binder.clearCallingIdentity();
1948 try {
1949 synchronized (mGlobalLock) {
1950 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
1951 if (r == null) {
1952 return false;
1953 }
1954 final boolean translucentChanged = r.changeWindowTranslucency(true);
1955 if (translucentChanged) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08001956 mRootActivityContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001957 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001958 mWindowManager.setAppFullscreen(token, true);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001959 return translucentChanged;
1960 }
1961 } finally {
1962 Binder.restoreCallingIdentity(origId);
1963 }
1964 }
1965
1966 @Override
1967 public boolean convertToTranslucent(IBinder token, Bundle options) {
1968 SafeActivityOptions safeOptions = SafeActivityOptions.fromBundle(options);
1969 final long origId = Binder.clearCallingIdentity();
1970 try {
1971 synchronized (mGlobalLock) {
1972 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
1973 if (r == null) {
1974 return false;
1975 }
Wale Ogunwale8b19de92018-11-29 19:58:26 -08001976 final TaskRecord task = r.getTaskRecord();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001977 int index = task.mActivities.lastIndexOf(r);
1978 if (index > 0) {
1979 ActivityRecord under = task.mActivities.get(index - 1);
1980 under.returningOptions = safeOptions != null ? safeOptions.getOptions(r) : null;
1981 }
1982 final boolean translucentChanged = r.changeWindowTranslucency(false);
1983 if (translucentChanged) {
Wale Ogunwale8b19de92018-11-29 19:58:26 -08001984 r.getActivityStack().convertActivityToTranslucent(r);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001985 }
Wale Ogunwaled32da472018-11-16 07:19:28 -08001986 mRootActivityContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001987 mWindowManager.setAppFullscreen(token, false);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001988 return translucentChanged;
1989 }
1990 } finally {
1991 Binder.restoreCallingIdentity(origId);
1992 }
1993 }
1994
1995 @Override
1996 public void notifyActivityDrawn(IBinder token) {
1997 if (DEBUG_VISIBILITY) Slog.d(TAG_VISIBILITY, "notifyActivityDrawn: token=" + token);
1998 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08001999 ActivityRecord r = mRootActivityContainer.isInAnyStack(token);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002000 if (r != null) {
Wale Ogunwale8b19de92018-11-29 19:58:26 -08002001 r.getActivityStack().notifyActivityDrawnLocked(r);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002002 }
2003 }
2004 }
2005
2006 @Override
2007 public void reportActivityFullyDrawn(IBinder token, boolean restoredFromBundle) {
2008 synchronized (mGlobalLock) {
2009 ActivityRecord r = ActivityRecord.isInStackLocked(token);
2010 if (r == null) {
2011 return;
2012 }
2013 r.reportFullyDrawnLocked(restoredFromBundle);
2014 }
2015 }
2016
2017 @Override
2018 public int getActivityDisplayId(IBinder activityToken) throws RemoteException {
2019 synchronized (mGlobalLock) {
2020 final ActivityStack stack = ActivityRecord.getStackLocked(activityToken);
2021 if (stack != null && stack.mDisplayId != INVALID_DISPLAY) {
2022 return stack.mDisplayId;
2023 }
2024 return DEFAULT_DISPLAY;
2025 }
2026 }
2027
2028 @Override
2029 public ActivityManager.StackInfo getFocusedStackInfo() throws RemoteException {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002030 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getStackInfo()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002031 long ident = Binder.clearCallingIdentity();
2032 try {
2033 synchronized (mGlobalLock) {
Andrii Kulian5f750bc2018-07-17 08:57:23 -07002034 ActivityStack focusedStack = getTopDisplayFocusedStack();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002035 if (focusedStack != null) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08002036 return mRootActivityContainer.getStackInfo(focusedStack.mStackId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002037 }
2038 return null;
2039 }
2040 } finally {
2041 Binder.restoreCallingIdentity(ident);
2042 }
2043 }
2044
2045 @Override
2046 public void setFocusedStack(int stackId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002047 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "setFocusedStack()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002048 if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "setFocusedStack: stackId=" + stackId);
2049 final long callingId = Binder.clearCallingIdentity();
2050 try {
2051 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08002052 final ActivityStack stack = mRootActivityContainer.getStack(stackId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002053 if (stack == null) {
2054 Slog.w(TAG, "setFocusedStack: No stack with id=" + stackId);
2055 return;
2056 }
2057 final ActivityRecord r = stack.topRunningActivityLocked();
Louis Chang19443452018-10-09 12:10:21 +08002058 if (r != null && r.moveFocusableActivityToTop("setFocusedStack")) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08002059 mRootActivityContainer.resumeFocusedStacksTopActivities();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002060 }
2061 }
2062 } finally {
2063 Binder.restoreCallingIdentity(callingId);
2064 }
2065 }
2066
2067 @Override
2068 public void setFocusedTask(int taskId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002069 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "setFocusedTask()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002070 if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "setFocusedTask: taskId=" + taskId);
2071 final long callingId = Binder.clearCallingIdentity();
2072 try {
2073 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08002074 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId,
Riddle Hsu090ac6f2018-10-31 12:55:29 +08002075 MATCH_TASK_IN_STACKS_ONLY);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002076 if (task == null) {
2077 return;
2078 }
2079 final ActivityRecord r = task.topRunningActivityLocked();
Louis Chang19443452018-10-09 12:10:21 +08002080 if (r != null && r.moveFocusableActivityToTop("setFocusedTask")) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08002081 mRootActivityContainer.resumeFocusedStacksTopActivities();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002082 }
2083 }
2084 } finally {
2085 Binder.restoreCallingIdentity(callingId);
2086 }
2087 }
2088
2089 @Override
Riddle Hsu7b766fd2019-01-28 21:14:59 +08002090 public void restartActivityProcessIfVisible(IBinder activityToken) {
2091 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "restartActivityProcess()");
2092 final long callingId = Binder.clearCallingIdentity();
2093 try {
2094 synchronized (mGlobalLock) {
2095 final ActivityRecord r = ActivityRecord.isInStackLocked(activityToken);
2096 if (r == null) {
2097 return;
2098 }
2099 r.restartProcessIfVisible();
2100 }
2101 } finally {
2102 Binder.restoreCallingIdentity(callingId);
2103 }
2104 }
2105
2106 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002107 public boolean removeTask(int taskId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002108 enforceCallerIsRecentsOrHasPermission(REMOVE_TASKS, "removeTask()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002109 synchronized (mGlobalLock) {
2110 final long ident = Binder.clearCallingIdentity();
2111 try {
2112 return mStackSupervisor.removeTaskByIdLocked(taskId, true, REMOVE_FROM_RECENTS,
2113 "remove-task");
2114 } finally {
2115 Binder.restoreCallingIdentity(ident);
2116 }
2117 }
2118 }
2119
2120 @Override
Winson Chunge6439102018-07-30 15:48:01 -07002121 public void removeAllVisibleRecentTasks() {
2122 enforceCallerIsRecentsOrHasPermission(REMOVE_TASKS, "removeAllVisibleRecentTasks()");
2123 synchronized (mGlobalLock) {
2124 final long ident = Binder.clearCallingIdentity();
2125 try {
Winson Chung42fa21f2019-04-02 16:23:46 -07002126 getRecentTasks().removeAllVisibleTasks(mAmInternal.getCurrentUserId());
Winson Chunge6439102018-07-30 15:48:01 -07002127 } finally {
2128 Binder.restoreCallingIdentity(ident);
2129 }
2130 }
2131 }
2132
2133 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002134 public boolean shouldUpRecreateTask(IBinder token, String destAffinity) {
2135 synchronized (mGlobalLock) {
2136 final ActivityRecord srec = ActivityRecord.forTokenLocked(token);
2137 if (srec != null) {
Wale Ogunwale8b19de92018-11-29 19:58:26 -08002138 return srec.getActivityStack().shouldUpRecreateTaskLocked(srec, destAffinity);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002139 }
2140 }
2141 return false;
2142 }
2143
2144 @Override
2145 public boolean navigateUpTo(IBinder token, Intent destIntent, int resultCode,
2146 Intent resultData) {
Wale Ogunwale586a8ee2019-06-04 13:44:14 +00002147
Jeff Sharkey344ce7c2019-05-29 14:52:59 -06002148 synchronized (mGlobalLock) {
Wale Ogunwale586a8ee2019-06-04 13:44:14 +00002149 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
2150 if (r != null) {
2151 return r.getActivityStack().navigateUpToLocked(
2152 r, destIntent, resultCode, resultData);
Jeff Sharkey344ce7c2019-05-29 14:52:59 -06002153 }
Wale Ogunwale586a8ee2019-06-04 13:44:14 +00002154 return false;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002155 }
2156 }
2157
2158 /**
2159 * Attempts to move a task backwards in z-order (the order of activities within the task is
2160 * unchanged).
2161 *
2162 * There are several possible results of this call:
2163 * - if the task is locked, then we will show the lock toast
2164 * - if there is a task behind the provided task, then that task is made visible and resumed as
2165 * this task is moved to the back
2166 * - otherwise, if there are no other tasks in the stack:
2167 * - if this task is in the pinned stack, then we remove the stack completely, which will
2168 * have the effect of moving the task to the top or bottom of the fullscreen stack
2169 * (depending on whether it is visible)
2170 * - otherwise, we simply return home and hide this task
2171 *
2172 * @param token A reference to the activity we wish to move
2173 * @param nonRoot If false then this only works if the activity is the root
2174 * of a task; if true it will work for any activity in a task.
2175 * @return Returns true if the move completed, false if not.
2176 */
2177 @Override
2178 public boolean moveActivityTaskToBack(IBinder token, boolean nonRoot) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002179 enforceNotIsolatedCaller("moveActivityTaskToBack");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002180 synchronized (mGlobalLock) {
2181 final long origId = Binder.clearCallingIdentity();
2182 try {
2183 int taskId = ActivityRecord.getTaskForActivityLocked(token, !nonRoot);
Wale Ogunwaled32da472018-11-16 07:19:28 -08002184 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002185 if (task != null) {
2186 return ActivityRecord.getStackLocked(token).moveTaskToBackLocked(taskId);
2187 }
2188 } finally {
2189 Binder.restoreCallingIdentity(origId);
2190 }
2191 }
2192 return false;
2193 }
2194
2195 @Override
2196 public Rect getTaskBounds(int taskId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002197 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "getTaskBounds()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002198 long ident = Binder.clearCallingIdentity();
2199 Rect rect = new Rect();
2200 try {
2201 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08002202 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002203 MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
2204 if (task == null) {
2205 Slog.w(TAG, "getTaskBounds: taskId=" + taskId + " not found");
2206 return rect;
2207 }
2208 if (task.getStack() != null) {
2209 // Return the bounds from window manager since it will be adjusted for various
2210 // things like the presense of a docked stack for tasks that aren't resizeable.
2211 task.getWindowContainerBounds(rect);
2212 } else {
2213 // Task isn't in window manager yet since it isn't associated with a stack.
2214 // Return the persist value from activity manager
2215 if (!task.matchParentBounds()) {
2216 rect.set(task.getBounds());
2217 } else if (task.mLastNonFullscreenBounds != null) {
2218 rect.set(task.mLastNonFullscreenBounds);
2219 }
2220 }
2221 }
2222 } finally {
2223 Binder.restoreCallingIdentity(ident);
2224 }
2225 return rect;
2226 }
2227
2228 @Override
2229 public ActivityManager.TaskDescription getTaskDescription(int id) {
2230 synchronized (mGlobalLock) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002231 enforceCallerIsRecentsOrHasPermission(
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002232 MANAGE_ACTIVITY_STACKS, "getTaskDescription()");
Wale Ogunwaled32da472018-11-16 07:19:28 -08002233 final TaskRecord tr = mRootActivityContainer.anyTaskForId(id,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002234 MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
2235 if (tr != null) {
2236 return tr.lastTaskDescription;
2237 }
2238 }
2239 return null;
2240 }
2241
2242 @Override
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002243 public void setTaskWindowingMode(int taskId, int windowingMode, boolean toTop) {
2244 if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) {
2245 setTaskWindowingModeSplitScreenPrimary(taskId, SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT,
2246 toTop, ANIMATE, null /* initialBounds */, true /* showRecents */);
2247 return;
2248 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002249 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "setTaskWindowingMode()");
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002250 synchronized (mGlobalLock) {
2251 final long ident = Binder.clearCallingIdentity();
2252 try {
Wale Ogunwaled32da472018-11-16 07:19:28 -08002253 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId,
Riddle Hsu090ac6f2018-10-31 12:55:29 +08002254 MATCH_TASK_IN_STACKS_ONLY);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002255 if (task == null) {
2256 Slog.w(TAG, "setTaskWindowingMode: No task for id=" + taskId);
2257 return;
2258 }
2259
2260 if (DEBUG_STACK) Slog.d(TAG_STACK, "setTaskWindowingMode: moving task=" + taskId
2261 + " to windowingMode=" + windowingMode + " toTop=" + toTop);
2262
2263 if (!task.isActivityTypeStandardOrUndefined()) {
2264 throw new IllegalArgumentException("setTaskWindowingMode: Attempt to move"
2265 + " non-standard task " + taskId + " to windowing mode="
2266 + windowingMode);
2267 }
2268
2269 final ActivityStack stack = task.getStack();
2270 if (toTop) {
2271 stack.moveToFront("setTaskWindowingMode", task);
2272 }
2273 stack.setWindowingMode(windowingMode);
2274 } finally {
2275 Binder.restoreCallingIdentity(ident);
2276 }
2277 }
2278 }
2279
2280 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002281 public String getCallingPackage(IBinder token) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002282 synchronized (mGlobalLock) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002283 ActivityRecord r = getCallingRecordLocked(token);
2284 return r != null ? r.info.packageName : null;
2285 }
2286 }
2287
2288 @Override
2289 public ComponentName getCallingActivity(IBinder token) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002290 synchronized (mGlobalLock) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002291 ActivityRecord r = getCallingRecordLocked(token);
2292 return r != null ? r.intent.getComponent() : null;
2293 }
2294 }
2295
2296 private ActivityRecord getCallingRecordLocked(IBinder token) {
2297 ActivityRecord r = ActivityRecord.isInStackLocked(token);
2298 if (r == null) {
2299 return null;
2300 }
2301 return r.resultTo;
2302 }
2303
2304 @Override
2305 public void unhandledBack() {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002306 mAmInternal.enforceCallingPermission(android.Manifest.permission.FORCE_BACK, "unhandledBack()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002307
2308 synchronized (mGlobalLock) {
2309 final long origId = Binder.clearCallingIdentity();
2310 try {
Andrii Kulian5f750bc2018-07-17 08:57:23 -07002311 getTopDisplayFocusedStack().unhandledBackLocked();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002312 } finally {
2313 Binder.restoreCallingIdentity(origId);
2314 }
2315 }
2316 }
2317
Mark Renouf446251d2019-04-26 10:22:41 -04002318 @Override
2319 public void onBackPressedOnTaskRoot(IBinder token, IRequestFinishCallback callback) {
2320 synchronized (mGlobalLock) {
2321 ActivityRecord r = ActivityRecord.isInStackLocked(token);
2322 if (r == null) {
2323 return;
2324 }
2325 ActivityStack stack = r.getActivityStack();
2326 if (stack != null && stack.isSingleTaskInstance()) {
2327 // Single-task stacks are used for activities which are presented in floating
2328 // windows above full screen activities. Instead of directly finishing the
2329 // task, a task change listener is used to notify SystemUI so the action can be
2330 // handled specially.
2331 final TaskRecord task = r.getTaskRecord();
2332 mTaskChangeNotificationController
2333 .notifyBackPressedOnTaskRoot(task.getTaskInfo());
2334 } else {
2335 try {
2336 callback.requestFinish();
2337 } catch (RemoteException e) {
2338 Slog.e(TAG, "Failed to invoke request finish callback", e);
2339 }
2340 }
2341 }
2342 }
2343
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002344 /**
2345 * TODO: Add mController hook
2346 */
2347 @Override
Ricky Waiaca8a772019-04-04 16:01:06 +01002348 public void moveTaskToFront(IApplicationThread appThread, String callingPackage, int taskId,
2349 int flags, Bundle bOptions) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002350 mAmInternal.enforceCallingPermission(android.Manifest.permission.REORDER_TASKS, "moveTaskToFront()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002351
2352 if (DEBUG_STACK) Slog.d(TAG_STACK, "moveTaskToFront: moving taskId=" + taskId);
2353 synchronized (mGlobalLock) {
Ricky Waiaca8a772019-04-04 16:01:06 +01002354 moveTaskToFrontLocked(appThread, callingPackage, taskId, flags,
2355 SafeActivityOptions.fromBundle(bOptions), false /* fromRecents */);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002356 }
2357 }
2358
Ricky Waiaca8a772019-04-04 16:01:06 +01002359 void moveTaskToFrontLocked(@Nullable IApplicationThread appThread,
2360 @Nullable String callingPackage, int taskId, int flags, SafeActivityOptions options,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002361 boolean fromRecents) {
2362
Ricky Waiaca8a772019-04-04 16:01:06 +01002363 final int callingPid = Binder.getCallingPid();
2364 final int callingUid = Binder.getCallingUid();
2365 if (!isSameApp(callingUid, callingPackage)) {
2366 String msg = "Permission Denial: moveTaskToFrontLocked() from pid="
2367 + Binder.getCallingPid() + " as package " + callingPackage;
2368 Slog.w(TAG, msg);
2369 throw new SecurityException(msg);
2370 }
2371 if (!checkAppSwitchAllowedLocked(callingPid, callingUid, -1, -1, "Task to front")) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002372 SafeActivityOptions.abort(options);
2373 return;
2374 }
2375 final long origId = Binder.clearCallingIdentity();
Ricky Waiaca8a772019-04-04 16:01:06 +01002376 WindowProcessController callerApp = null;
2377 if (appThread != null) {
2378 callerApp = getProcessController(appThread);
2379 }
2380 final ActivityStarter starter = getActivityStartController().obtainStarter(
2381 null /* intent */, "moveTaskToFront");
2382 if (starter.shouldAbortBackgroundActivityStart(callingUid, callingPid, callingPackage, -1,
2383 -1, callerApp, null, false, null)) {
Alan Stokes9e245762019-05-21 14:54:28 +01002384 if (!isBackgroundActivityStartsEnabled()) {
Ricky Waiaca8a772019-04-04 16:01:06 +01002385 return;
2386 }
2387 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002388 try {
Wale Ogunwaled32da472018-11-16 07:19:28 -08002389 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002390 if (task == null) {
2391 Slog.d(TAG, "Could not find task for id: "+ taskId);
Winson Chungd0243682018-09-25 18:11:54 -07002392 SafeActivityOptions.abort(options);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002393 return;
2394 }
Wale Ogunwaled95c06b2018-05-08 10:35:38 -07002395 if (getLockTaskController().isLockTaskModeViolation(task)) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002396 Slog.e(TAG, "moveTaskToFront: Attempt to violate Lock Task Mode");
Winson Chungd0243682018-09-25 18:11:54 -07002397 SafeActivityOptions.abort(options);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002398 return;
2399 }
2400 ActivityOptions realOptions = options != null
2401 ? options.getOptions(mStackSupervisor)
2402 : null;
2403 mStackSupervisor.findTaskToMoveToFront(task, flags, realOptions, "moveTaskToFront",
2404 false /* forceNonResizable */);
2405
2406 final ActivityRecord topActivity = task.getTopActivity();
2407 if (topActivity != null) {
2408
2409 // We are reshowing a task, use a starting window to hide the initial draw delay
2410 // so the transition can start earlier.
2411 topActivity.showStartingWindow(null /* prev */, false /* newTask */,
2412 true /* taskSwitch */, fromRecents);
2413 }
2414 } finally {
2415 Binder.restoreCallingIdentity(origId);
2416 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002417 }
2418
Ricky Waiaca8a772019-04-04 16:01:06 +01002419 /**
2420 * Return true if callingUid is system, or packageName belongs to that callingUid.
2421 */
2422 boolean isSameApp(int callingUid, @Nullable String packageName) {
2423 try {
2424 if (callingUid != 0 && callingUid != SYSTEM_UID) {
2425 if (packageName == null) {
2426 return false;
2427 }
2428 final int uid = AppGlobals.getPackageManager().getPackageUid(packageName,
2429 PackageManager.MATCH_DEBUG_TRIAGED_MISSING,
2430 UserHandle.getUserId(callingUid));
2431 return UserHandle.isSameApp(callingUid, uid);
2432 }
2433 } catch (RemoteException e) {
2434 // Should not happen
2435 }
2436 return true;
2437 }
2438
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002439 boolean checkAppSwitchAllowedLocked(int sourcePid, int sourceUid,
2440 int callingPid, int callingUid, String name) {
2441 if (mAppSwitchesAllowedTime < SystemClock.uptimeMillis()) {
2442 return true;
2443 }
2444
2445 if (getRecentTasks().isCallerRecents(sourceUid)) {
2446 return true;
2447 }
2448
2449 int perm = checkComponentPermission(STOP_APP_SWITCHES, sourcePid, sourceUid, -1, true);
2450 if (perm == PackageManager.PERMISSION_GRANTED) {
2451 return true;
2452 }
2453 if (checkAllowAppSwitchUid(sourceUid)) {
2454 return true;
2455 }
2456
2457 // If the actual IPC caller is different from the logical source, then
2458 // also see if they are allowed to control app switches.
2459 if (callingUid != -1 && callingUid != sourceUid) {
2460 perm = checkComponentPermission(STOP_APP_SWITCHES, callingPid, callingUid, -1, true);
2461 if (perm == PackageManager.PERMISSION_GRANTED) {
2462 return true;
2463 }
2464 if (checkAllowAppSwitchUid(callingUid)) {
2465 return true;
2466 }
2467 }
2468
2469 Slog.w(TAG, name + " request from " + sourceUid + " stopped");
2470 return false;
2471 }
2472
2473 private boolean checkAllowAppSwitchUid(int uid) {
2474 ArrayMap<String, Integer> types = mAllowAppSwitchUids.get(UserHandle.getUserId(uid));
2475 if (types != null) {
2476 for (int i = types.size() - 1; i >= 0; i--) {
2477 if (types.valueAt(i).intValue() == uid) {
2478 return true;
2479 }
2480 }
2481 }
2482 return false;
2483 }
2484
2485 @Override
2486 public void setActivityController(IActivityController controller, boolean imAMonkey) {
2487 mAmInternal.enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER,
2488 "setActivityController()");
2489 synchronized (mGlobalLock) {
2490 mController = controller;
2491 mControllerIsAMonkey = imAMonkey;
2492 Watchdog.getInstance().setActivityController(controller);
2493 }
2494 }
2495
Wale Ogunwale387b34c2018-10-25 19:59:40 -07002496 public boolean isControllerAMonkey() {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002497 synchronized (mGlobalLock) {
2498 return mController != null && mControllerIsAMonkey;
2499 }
2500 }
2501
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002502 @Override
2503 public int getTaskForActivity(IBinder token, boolean onlyRoot) {
2504 synchronized (mGlobalLock) {
2505 return ActivityRecord.getTaskForActivityLocked(token, onlyRoot);
2506 }
2507 }
2508
2509 @Override
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002510 public List<ActivityManager.RunningTaskInfo> getTasks(int maxNum) {
2511 return getFilteredTasks(maxNum, ACTIVITY_TYPE_UNDEFINED, WINDOWING_MODE_UNDEFINED);
2512 }
2513
2514 @Override
2515 public List<ActivityManager.RunningTaskInfo> getFilteredTasks(int maxNum,
2516 @WindowConfiguration.ActivityType int ignoreActivityType,
2517 @WindowConfiguration.WindowingMode int ignoreWindowingMode) {
2518 final int callingUid = Binder.getCallingUid();
2519 ArrayList<ActivityManager.RunningTaskInfo> list = new ArrayList<>();
2520
2521 synchronized (mGlobalLock) {
2522 if (DEBUG_ALL) Slog.v(TAG, "getTasks: max=" + maxNum);
2523
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002524 final boolean allowed = isGetTasksAllowed("getTasks", Binder.getCallingPid(),
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002525 callingUid);
Wale Ogunwaled32da472018-11-16 07:19:28 -08002526 mRootActivityContainer.getRunningTasks(maxNum, list, ignoreActivityType,
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002527 ignoreWindowingMode, callingUid, allowed);
2528 }
2529
2530 return list;
2531 }
2532
2533 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002534 public final void finishSubActivity(IBinder token, String resultWho, int requestCode) {
2535 synchronized (mGlobalLock) {
2536 final long origId = Binder.clearCallingIdentity();
2537 ActivityRecord r = ActivityRecord.isInStackLocked(token);
2538 if (r != null) {
Wale Ogunwale8b19de92018-11-29 19:58:26 -08002539 r.getActivityStack().finishSubActivityLocked(r, resultWho, requestCode);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002540 }
2541 Binder.restoreCallingIdentity(origId);
2542 }
2543 }
2544
2545 @Override
2546 public boolean willActivityBeVisible(IBinder token) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002547 synchronized (mGlobalLock) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002548 ActivityStack stack = ActivityRecord.getStackLocked(token);
2549 if (stack != null) {
2550 return stack.willActivityBeVisibleLocked(token);
2551 }
2552 return false;
2553 }
2554 }
2555
2556 @Override
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002557 public void moveTaskToStack(int taskId, int stackId, boolean toTop) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002558 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "moveTaskToStack()");
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002559 synchronized (mGlobalLock) {
2560 final long ident = Binder.clearCallingIdentity();
2561 try {
Wale Ogunwaled32da472018-11-16 07:19:28 -08002562 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002563 if (task == null) {
2564 Slog.w(TAG, "moveTaskToStack: No task for id=" + taskId);
2565 return;
2566 }
2567
2568 if (DEBUG_STACK) Slog.d(TAG_STACK, "moveTaskToStack: moving task=" + taskId
2569 + " to stackId=" + stackId + " toTop=" + toTop);
2570
Wale Ogunwaled32da472018-11-16 07:19:28 -08002571 final ActivityStack stack = mRootActivityContainer.getStack(stackId);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002572 if (stack == null) {
2573 throw new IllegalStateException(
2574 "moveTaskToStack: No stack for stackId=" + stackId);
2575 }
2576 if (!stack.isActivityTypeStandardOrUndefined()) {
2577 throw new IllegalArgumentException("moveTaskToStack: Attempt to move task "
2578 + taskId + " to stack " + stackId);
2579 }
2580 if (stack.inSplitScreenPrimaryWindowingMode()) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002581 mWindowManager.setDockedStackCreateState(
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002582 SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT, null /* initialBounds */);
2583 }
2584 task.reparent(stack, toTop, REPARENT_KEEP_STACK_AT_FRONT, ANIMATE, !DEFER_RESUME,
2585 "moveTaskToStack");
2586 } finally {
2587 Binder.restoreCallingIdentity(ident);
2588 }
2589 }
2590 }
2591
2592 @Override
2593 public void resizeStack(int stackId, Rect destBounds, boolean allowResizeInDockedMode,
2594 boolean preserveWindows, boolean animate, int animationDuration) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002595 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "resizeStack()");
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002596
2597 final long ident = Binder.clearCallingIdentity();
2598 try {
2599 synchronized (mGlobalLock) {
2600 if (animate) {
Yunfan Chen279f5582018-12-12 15:24:50 -08002601 final ActivityStack stack = mRootActivityContainer.getStack(stackId);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002602 if (stack == null) {
2603 Slog.w(TAG, "resizeStack: stackId " + stackId + " not found.");
2604 return;
2605 }
2606 if (stack.getWindowingMode() != WINDOWING_MODE_PINNED) {
2607 throw new IllegalArgumentException("Stack: " + stackId
2608 + " doesn't support animated resize.");
2609 }
2610 stack.animateResizePinnedStack(null /* sourceHintBounds */, destBounds,
2611 animationDuration, false /* fromFullscreen */);
2612 } else {
Wale Ogunwaled32da472018-11-16 07:19:28 -08002613 final ActivityStack stack = mRootActivityContainer.getStack(stackId);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002614 if (stack == null) {
2615 Slog.w(TAG, "resizeStack: stackId " + stackId + " not found.");
2616 return;
2617 }
Wale Ogunwaled32da472018-11-16 07:19:28 -08002618 mRootActivityContainer.resizeStack(stack, destBounds,
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002619 null /* tempTaskBounds */, null /* tempTaskInsetBounds */,
2620 preserveWindows, allowResizeInDockedMode, !DEFER_RESUME);
2621 }
2622 }
2623 } finally {
2624 Binder.restoreCallingIdentity(ident);
2625 }
2626 }
2627
wilsonshih5c4cf522019-01-25 09:03:47 +08002628 @Override
2629 public void offsetPinnedStackBounds(int stackId, Rect compareBounds, int xOffset, int yOffset,
2630 int animationDuration) {
2631 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "offsetPinnedStackBounds()");
2632
2633 final long ident = Binder.clearCallingIdentity();
2634 try {
2635 synchronized (mGlobalLock) {
2636 if (xOffset == 0 && yOffset == 0) {
2637 return;
2638 }
2639 final ActivityStack stack = mRootActivityContainer.getStack(stackId);
2640 if (stack == null) {
2641 Slog.w(TAG, "offsetPinnedStackBounds: stackId " + stackId + " not found.");
2642 return;
2643 }
2644 if (stack.getWindowingMode() != WINDOWING_MODE_PINNED) {
2645 throw new IllegalArgumentException("Stack: " + stackId
2646 + " doesn't support animated resize.");
2647 }
2648 final Rect destBounds = new Rect();
2649 stack.getAnimationOrCurrentBounds(destBounds);
wilsonshiha6e408c2019-02-19 17:30:03 +08002650 if (destBounds.isEmpty() || !destBounds.equals(compareBounds)) {
wilsonshih5c4cf522019-01-25 09:03:47 +08002651 Slog.w(TAG, "The current stack bounds does not matched! It may be obsolete.");
2652 return;
2653 }
2654 destBounds.offset(xOffset, yOffset);
2655 stack.animateResizePinnedStack(null /* sourceHintBounds */, destBounds,
2656 animationDuration, false /* fromFullscreen */);
2657 }
2658 } finally {
2659 Binder.restoreCallingIdentity(ident);
2660 }
2661 }
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002662 /**
2663 * Moves the specified task to the primary-split-screen stack.
2664 *
2665 * @param taskId Id of task to move.
2666 * @param createMode The mode the primary split screen stack should be created in if it doesn't
2667 * exist already. See
2668 * {@link android.app.ActivityTaskManager#SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT}
2669 * and
2670 * {@link android.app.ActivityTaskManager#SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT}
2671 * @param toTop If the task and stack should be moved to the top.
2672 * @param animate Whether we should play an animation for the moving the task.
2673 * @param initialBounds If the primary stack gets created, it will use these bounds for the
2674 * stack. Pass {@code null} to use default bounds.
2675 * @param showRecents If the recents activity should be shown on the other side of the task
2676 * going into split-screen mode.
2677 */
2678 @Override
2679 public boolean setTaskWindowingModeSplitScreenPrimary(int taskId, int createMode,
2680 boolean toTop, boolean animate, Rect initialBounds, boolean showRecents) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002681 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002682 "setTaskWindowingModeSplitScreenPrimary()");
2683 synchronized (mGlobalLock) {
2684 final long ident = Binder.clearCallingIdentity();
2685 try {
Wale Ogunwaled32da472018-11-16 07:19:28 -08002686 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId,
Riddle Hsu090ac6f2018-10-31 12:55:29 +08002687 MATCH_TASK_IN_STACKS_ONLY);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002688 if (task == null) {
2689 Slog.w(TAG, "setTaskWindowingModeSplitScreenPrimary: No task for id=" + taskId);
2690 return false;
2691 }
2692 if (DEBUG_STACK) Slog.d(TAG_STACK,
2693 "setTaskWindowingModeSplitScreenPrimary: moving task=" + taskId
2694 + " to createMode=" + createMode + " toTop=" + toTop);
2695 if (!task.isActivityTypeStandardOrUndefined()) {
2696 throw new IllegalArgumentException("setTaskWindowingMode: Attempt to move"
2697 + " non-standard task " + taskId + " to split-screen windowing mode");
2698 }
2699
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002700 mWindowManager.setDockedStackCreateState(createMode, initialBounds);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002701 final int windowingMode = task.getWindowingMode();
2702 final ActivityStack stack = task.getStack();
2703 if (toTop) {
2704 stack.moveToFront("setTaskWindowingModeSplitScreenPrimary", task);
2705 }
2706 stack.setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, animate, showRecents,
Evan Roskyc5abbd82018-10-05 16:02:19 -07002707 false /* enteringSplitScreenMode */, false /* deferEnsuringVisibility */,
2708 false /* creating */);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002709 return windowingMode != task.getWindowingMode();
2710 } finally {
2711 Binder.restoreCallingIdentity(ident);
2712 }
2713 }
2714 }
2715
2716 /**
2717 * Removes stacks in the input windowing modes from the system if they are of activity type
2718 * ACTIVITY_TYPE_STANDARD or ACTIVITY_TYPE_UNDEFINED
2719 */
2720 @Override
2721 public void removeStacksInWindowingModes(int[] windowingModes) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002722 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002723 "removeStacksInWindowingModes()");
2724
2725 synchronized (mGlobalLock) {
2726 final long ident = Binder.clearCallingIdentity();
2727 try {
Wale Ogunwaled32da472018-11-16 07:19:28 -08002728 mRootActivityContainer.removeStacksInWindowingModes(windowingModes);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002729 } finally {
2730 Binder.restoreCallingIdentity(ident);
2731 }
2732 }
2733 }
2734
2735 @Override
2736 public void removeStacksWithActivityTypes(int[] activityTypes) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002737 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002738 "removeStacksWithActivityTypes()");
2739
2740 synchronized (mGlobalLock) {
2741 final long ident = Binder.clearCallingIdentity();
2742 try {
Wale Ogunwaled32da472018-11-16 07:19:28 -08002743 mRootActivityContainer.removeStacksWithActivityTypes(activityTypes);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002744 } finally {
2745 Binder.restoreCallingIdentity(ident);
2746 }
2747 }
2748 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002749
2750 @Override
2751 public ParceledListSlice<ActivityManager.RecentTaskInfo> getRecentTasks(int maxNum, int flags,
2752 int userId) {
2753 final int callingUid = Binder.getCallingUid();
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002754 userId = handleIncomingUser(Binder.getCallingPid(), callingUid, userId, "getRecentTasks");
2755 final boolean allowed = isGetTasksAllowed("getRecentTasks", Binder.getCallingPid(),
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002756 callingUid);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002757 final boolean detailed = checkGetTasksPermission(
2758 android.Manifest.permission.GET_DETAILED_TASKS, Binder.getCallingPid(),
2759 UserHandle.getAppId(callingUid))
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002760 == PackageManager.PERMISSION_GRANTED;
2761
2762 synchronized (mGlobalLock) {
Wale Ogunwale16e505a2018-05-07 15:00:49 -07002763 return mRecentTasks.getRecentTasks(maxNum, flags, allowed, detailed, userId,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002764 callingUid);
2765 }
2766 }
2767
2768 @Override
2769 public List<ActivityManager.StackInfo> getAllStackInfos() {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002770 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getAllStackInfos()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002771 long ident = Binder.clearCallingIdentity();
2772 try {
2773 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08002774 return mRootActivityContainer.getAllStackInfos();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002775 }
2776 } finally {
2777 Binder.restoreCallingIdentity(ident);
2778 }
2779 }
2780
2781 @Override
2782 public ActivityManager.StackInfo getStackInfo(int windowingMode, int activityType) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002783 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getStackInfo()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002784 long ident = Binder.clearCallingIdentity();
2785 try {
2786 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08002787 return mRootActivityContainer.getStackInfo(windowingMode, activityType);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002788 }
2789 } finally {
2790 Binder.restoreCallingIdentity(ident);
2791 }
2792 }
2793
2794 @Override
2795 public void cancelRecentsAnimation(boolean restoreHomeStackPosition) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002796 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "cancelRecentsAnimation()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002797 final long callingUid = Binder.getCallingUid();
2798 final long origId = Binder.clearCallingIdentity();
2799 try {
2800 synchronized (mGlobalLock) {
2801 // Cancel the recents animation synchronously (do not hold the WM lock)
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002802 mWindowManager.cancelRecentsAnimationSynchronously(restoreHomeStackPosition
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002803 ? REORDER_MOVE_TO_ORIGINAL_POSITION
2804 : REORDER_KEEP_IN_PLACE, "cancelRecentsAnimation/uid=" + callingUid);
2805 }
2806 } finally {
2807 Binder.restoreCallingIdentity(origId);
2808 }
2809 }
2810
2811 @Override
2812 public void startLockTaskModeByToken(IBinder token) {
2813 synchronized (mGlobalLock) {
2814 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
2815 if (r == null) {
2816 return;
2817 }
Wale Ogunwale8b19de92018-11-29 19:58:26 -08002818 startLockTaskModeLocked(r.getTaskRecord(), false /* isSystemCaller */);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002819 }
2820 }
2821
2822 @Override
Riddle Hsu090ac6f2018-10-31 12:55:29 +08002823 public void startSystemLockTaskMode(int taskId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002824 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "startSystemLockTaskMode");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002825 // This makes inner call to look as if it was initiated by system.
2826 long ident = Binder.clearCallingIdentity();
2827 try {
2828 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08002829 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId,
Riddle Hsu090ac6f2018-10-31 12:55:29 +08002830 MATCH_TASK_IN_STACKS_ONLY);
2831 if (task == null) {
2832 return;
2833 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002834
2835 // When starting lock task mode the stack must be in front and focused
2836 task.getStack().moveToFront("startSystemLockTaskMode");
2837 startLockTaskModeLocked(task, true /* isSystemCaller */);
2838 }
2839 } finally {
2840 Binder.restoreCallingIdentity(ident);
2841 }
2842 }
2843
2844 @Override
2845 public void stopLockTaskModeByToken(IBinder token) {
2846 synchronized (mGlobalLock) {
2847 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
2848 if (r == null) {
2849 return;
2850 }
Wale Ogunwale8b19de92018-11-29 19:58:26 -08002851 stopLockTaskModeInternal(r.getTaskRecord(), false /* isSystemCaller */);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002852 }
2853 }
2854
2855 /**
2856 * This API should be called by SystemUI only when user perform certain action to dismiss
2857 * lock task mode. We should only dismiss pinned lock task mode in this case.
2858 */
2859 @Override
2860 public void stopSystemLockTaskMode() throws RemoteException {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002861 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "stopSystemLockTaskMode");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002862 stopLockTaskModeInternal(null, true /* isSystemCaller */);
2863 }
2864
2865 private void startLockTaskModeLocked(@Nullable TaskRecord task, boolean isSystemCaller) {
2866 if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, "startLockTaskModeLocked: " + task);
2867 if (task == null || task.mLockTaskAuth == LOCK_TASK_AUTH_DONT_LOCK) {
2868 return;
2869 }
2870
Wale Ogunwaled32da472018-11-16 07:19:28 -08002871 final ActivityStack stack = mRootActivityContainer.getTopDisplayFocusedStack();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002872 if (stack == null || task != stack.topTask()) {
2873 throw new IllegalArgumentException("Invalid task, not in foreground");
2874 }
2875
2876 // {@code isSystemCaller} is used to distinguish whether this request is initiated by the
2877 // system or a specific app.
2878 // * System-initiated requests will only start the pinned mode (screen pinning)
2879 // * App-initiated requests
2880 // - will put the device in fully locked mode (LockTask), if the app is whitelisted
2881 // - will start the pinned mode, otherwise
2882 final int callingUid = Binder.getCallingUid();
2883 long ident = Binder.clearCallingIdentity();
2884 try {
2885 // When a task is locked, dismiss the pinned stack if it exists
Wale Ogunwaled32da472018-11-16 07:19:28 -08002886 mRootActivityContainer.removeStacksInWindowingModes(WINDOWING_MODE_PINNED);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002887
Wale Ogunwaled95c06b2018-05-08 10:35:38 -07002888 getLockTaskController().startLockTaskMode(task, isSystemCaller, callingUid);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002889 } finally {
2890 Binder.restoreCallingIdentity(ident);
2891 }
2892 }
2893
2894 private void stopLockTaskModeInternal(@Nullable TaskRecord task, boolean isSystemCaller) {
2895 final int callingUid = Binder.getCallingUid();
2896 long ident = Binder.clearCallingIdentity();
2897 try {
2898 synchronized (mGlobalLock) {
Wale Ogunwaled95c06b2018-05-08 10:35:38 -07002899 getLockTaskController().stopLockTaskMode(task, isSystemCaller, callingUid);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002900 }
2901 // Launch in-call UI if a call is ongoing. This is necessary to allow stopping the lock
2902 // task and jumping straight into a call in the case of emergency call back.
2903 TelecomManager tm = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
2904 if (tm != null) {
2905 tm.showInCallScreen(false);
2906 }
2907 } finally {
2908 Binder.restoreCallingIdentity(ident);
2909 }
2910 }
2911
2912 @Override
Wale Ogunwale27c48ae2018-10-25 19:01:01 -07002913 public void updateLockTaskPackages(int userId, String[] packages) {
2914 final int callingUid = Binder.getCallingUid();
2915 if (callingUid != 0 && callingUid != SYSTEM_UID) {
2916 mAmInternal.enforceCallingPermission(Manifest.permission.UPDATE_LOCK_TASK_PACKAGES,
2917 "updateLockTaskPackages()");
2918 }
2919 synchronized (this) {
2920 if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, "Whitelisting " + userId + ":"
2921 + Arrays.toString(packages));
2922 getLockTaskController().updateLockTaskPackages(userId, packages);
2923 }
2924 }
2925
2926 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002927 public boolean isInLockTaskMode() {
2928 return getLockTaskModeState() != LOCK_TASK_MODE_NONE;
2929 }
2930
2931 @Override
2932 public int getLockTaskModeState() {
2933 synchronized (mGlobalLock) {
Wale Ogunwaled95c06b2018-05-08 10:35:38 -07002934 return getLockTaskController().getLockTaskModeState();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002935 }
2936 }
2937
2938 @Override
2939 public void setTaskDescription(IBinder token, ActivityManager.TaskDescription td) {
2940 synchronized (mGlobalLock) {
2941 ActivityRecord r = ActivityRecord.isInStackLocked(token);
2942 if (r != null) {
2943 r.setTaskDescription(td);
Wale Ogunwale8b19de92018-11-29 19:58:26 -08002944 final TaskRecord task = r.getTaskRecord();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002945 task.updateTaskDescription();
Mark Renoufc808f062019-02-07 15:20:37 -05002946 mTaskChangeNotificationController.notifyTaskDescriptionChanged(task.getTaskInfo());
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002947 }
2948 }
2949 }
2950
2951 @Override
2952 public Bundle getActivityOptions(IBinder token) {
2953 final long origId = Binder.clearCallingIdentity();
2954 try {
2955 synchronized (mGlobalLock) {
2956 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
2957 if (r != null) {
Jorim Jaggi346702a2019-05-08 17:49:33 +02002958 final ActivityOptions activityOptions = r.takeOptionsLocked(
2959 true /* fromClient */);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002960 return activityOptions == null ? null : activityOptions.toBundle();
2961 }
2962 return null;
2963 }
2964 } finally {
2965 Binder.restoreCallingIdentity(origId);
2966 }
2967 }
2968
2969 @Override
2970 public List<IBinder> getAppTasks(String callingPackage) {
2971 int callingUid = Binder.getCallingUid();
2972 long ident = Binder.clearCallingIdentity();
2973 try {
2974 synchronized (mGlobalLock) {
Wale Ogunwale16e505a2018-05-07 15:00:49 -07002975 return mRecentTasks.getAppTasksList(callingUid, callingPackage);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002976 }
2977 } finally {
2978 Binder.restoreCallingIdentity(ident);
2979 }
2980 }
2981
2982 @Override
2983 public void finishVoiceTask(IVoiceInteractionSession session) {
2984 synchronized (mGlobalLock) {
2985 final long origId = Binder.clearCallingIdentity();
2986 try {
2987 // TODO: VI Consider treating local voice interactions and voice tasks
2988 // differently here
Wale Ogunwaled32da472018-11-16 07:19:28 -08002989 mRootActivityContainer.finishVoiceTask(session);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002990 } finally {
2991 Binder.restoreCallingIdentity(origId);
2992 }
2993 }
2994
2995 }
2996
2997 @Override
2998 public boolean isTopOfTask(IBinder token) {
2999 synchronized (mGlobalLock) {
3000 ActivityRecord r = ActivityRecord.isInStackLocked(token);
Wale Ogunwale8b19de92018-11-29 19:58:26 -08003001 return r != null && r.getTaskRecord().getTopActivity() == r;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003002 }
3003 }
3004
3005 @Override
3006 public void notifyLaunchTaskBehindComplete(IBinder token) {
3007 mStackSupervisor.scheduleLaunchTaskBehindComplete(token);
3008 }
3009
3010 @Override
3011 public void notifyEnterAnimationComplete(IBinder token) {
Wale Ogunwaled0412b32018-05-08 09:25:50 -07003012 mH.post(() -> {
3013 synchronized (mGlobalLock) {
3014 ActivityRecord r = ActivityRecord.forTokenLocked(token);
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07003015 if (r != null && r.attachedToProcess()) {
Wale Ogunwaled0412b32018-05-08 09:25:50 -07003016 try {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07003017 r.app.getThread().scheduleEnterAnimationComplete(r.appToken);
Wale Ogunwaled0412b32018-05-08 09:25:50 -07003018 } catch (RemoteException e) {
3019 }
3020 }
3021 }
3022
3023 });
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003024 }
3025
3026 /** Called from an app when assist data is ready. */
3027 @Override
3028 public void reportAssistContextExtras(IBinder token, Bundle extras, AssistStructure structure,
3029 AssistContent content, Uri referrer) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003030 PendingAssistExtras pae = (PendingAssistExtras) token;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003031 synchronized (pae) {
3032 pae.result = extras;
3033 pae.structure = structure;
3034 pae.content = content;
3035 if (referrer != null) {
3036 pae.extras.putParcelable(Intent.EXTRA_REFERRER, referrer);
3037 }
3038 if (structure != null) {
Winson Chung48b25652018-10-22 14:04:30 -07003039 // Pre-fill the task/activity component for all assist data receivers
Wale Ogunwale8b19de92018-11-29 19:58:26 -08003040 structure.setTaskId(pae.activity.getTaskRecord().taskId);
3041 structure.setActivityComponent(pae.activity.mActivityComponent);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003042 structure.setHomeActivity(pae.isHome);
3043 }
3044 pae.haveResult = true;
3045 pae.notifyAll();
3046 if (pae.intent == null && pae.receiver == null) {
3047 // Caller is just waiting for the result.
3048 return;
3049 }
3050 }
3051 // We are now ready to launch the assist activity.
3052 IAssistDataReceiver sendReceiver = null;
3053 Bundle sendBundle = null;
3054 synchronized (mGlobalLock) {
3055 buildAssistBundleLocked(pae, extras);
3056 boolean exists = mPendingAssistExtras.remove(pae);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003057 mUiHandler.removeCallbacks(pae);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003058 if (!exists) {
3059 // Timed out.
3060 return;
3061 }
3062
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003063 if ((sendReceiver = pae.receiver) != null) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003064 // Caller wants result sent back to them.
3065 sendBundle = new Bundle();
Sunny Goyald40c3452019-03-20 12:46:55 -07003066 sendBundle.putInt(ActivityTaskManagerInternal.ASSIST_TASK_ID,
3067 pae.activity.getTaskRecord().taskId);
3068 sendBundle.putBinder(ActivityTaskManagerInternal.ASSIST_ACTIVITY_ID,
3069 pae.activity.assistToken);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003070 sendBundle.putBundle(ASSIST_KEY_DATA, pae.extras);
3071 sendBundle.putParcelable(ASSIST_KEY_STRUCTURE, pae.structure);
3072 sendBundle.putParcelable(ASSIST_KEY_CONTENT, pae.content);
3073 sendBundle.putBundle(ASSIST_KEY_RECEIVER_EXTRAS, pae.receiverExtras);
3074 }
3075 }
3076 if (sendReceiver != null) {
3077 try {
3078 sendReceiver.onHandleAssistData(sendBundle);
3079 } catch (RemoteException e) {
3080 }
3081 return;
3082 }
3083
3084 final long ident = Binder.clearCallingIdentity();
3085 try {
3086 if (TextUtils.equals(pae.intent.getAction(),
3087 android.service.voice.VoiceInteractionService.SERVICE_INTERFACE)) {
Galia Peychevabffbfc32019-06-18 10:11:35 +02003088 // Start voice interaction through VoiceInteractionManagerService.
3089 mAssistUtils.showSessionForActiveService(sendBundle, SHOW_SOURCE_APPLICATION,
3090 null, null);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003091 } else {
3092 pae.intent.replaceExtras(pae.extras);
3093 pae.intent.setFlags(FLAG_ACTIVITY_NEW_TASK
3094 | Intent.FLAG_ACTIVITY_SINGLE_TOP
3095 | Intent.FLAG_ACTIVITY_CLEAR_TOP);
Wale Ogunwale31913b52018-10-13 08:29:31 -07003096 mInternal.closeSystemDialogs("assist");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003097
3098 try {
3099 mContext.startActivityAsUser(pae.intent, new UserHandle(pae.userHandle));
3100 } catch (ActivityNotFoundException e) {
3101 Slog.w(TAG, "No activity to handle assist action.", e);
3102 }
3103 }
3104 } finally {
3105 Binder.restoreCallingIdentity(ident);
3106 }
3107 }
3108
3109 @Override
3110 public int addAppTask(IBinder activityToken, Intent intent,
3111 ActivityManager.TaskDescription description, Bitmap thumbnail) throws RemoteException {
3112 final int callingUid = Binder.getCallingUid();
3113 final long callingIdent = Binder.clearCallingIdentity();
3114
3115 try {
3116 synchronized (mGlobalLock) {
3117 ActivityRecord r = ActivityRecord.isInStackLocked(activityToken);
3118 if (r == null) {
3119 throw new IllegalArgumentException("Activity does not exist; token="
3120 + activityToken);
3121 }
3122 ComponentName comp = intent.getComponent();
3123 if (comp == null) {
3124 throw new IllegalArgumentException("Intent " + intent
3125 + " must specify explicit component");
3126 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003127 if (thumbnail.getWidth() != mThumbnailWidth
3128 || thumbnail.getHeight() != mThumbnailHeight) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003129 throw new IllegalArgumentException("Bad thumbnail size: got "
3130 + thumbnail.getWidth() + "x" + thumbnail.getHeight() + ", require "
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003131 + mThumbnailWidth + "x" + mThumbnailHeight);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003132 }
3133 if (intent.getSelector() != null) {
3134 intent.setSelector(null);
3135 }
3136 if (intent.getSourceBounds() != null) {
3137 intent.setSourceBounds(null);
3138 }
3139 if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0) {
3140 if ((intent.getFlags()&Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS) == 0) {
3141 // The caller has added this as an auto-remove task... that makes no
3142 // sense, so turn off auto-remove.
3143 intent.addFlags(Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS);
3144 }
3145 }
3146 final ActivityInfo ainfo = AppGlobals.getPackageManager().getActivityInfo(comp,
3147 STOCK_PM_FLAGS, UserHandle.getUserId(callingUid));
3148 if (ainfo.applicationInfo.uid != callingUid) {
3149 throw new SecurityException(
3150 "Can't add task for another application: target uid="
3151 + ainfo.applicationInfo.uid + ", calling uid=" + callingUid);
3152 }
3153
Wale Ogunwale8b19de92018-11-29 19:58:26 -08003154 final ActivityStack stack = r.getActivityStack();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003155 final TaskRecord task = stack.createTaskRecord(
Wale Ogunwale8b19de92018-11-29 19:58:26 -08003156 mStackSupervisor.getNextTaskIdForUserLocked(r.mUserId), ainfo, intent,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003157 null /* voiceSession */, null /* voiceInteractor */, !ON_TOP);
Wale Ogunwale16e505a2018-05-07 15:00:49 -07003158 if (!mRecentTasks.addToBottom(task)) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003159 // The app has too many tasks already and we can't add any more
3160 stack.removeTask(task, "addAppTask", REMOVE_TASK_MODE_DESTROYING);
3161 return INVALID_TASK_ID;
3162 }
3163 task.lastTaskDescription.copyFrom(description);
3164
3165 // TODO: Send the thumbnail to WM to store it.
3166
3167 return task.taskId;
3168 }
3169 } finally {
3170 Binder.restoreCallingIdentity(callingIdent);
3171 }
3172 }
3173
3174 @Override
3175 public Point getAppTaskThumbnailSize() {
3176 synchronized (mGlobalLock) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003177 return new Point(mThumbnailWidth, mThumbnailHeight);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003178 }
3179 }
3180
3181 @Override
3182 public void setTaskResizeable(int taskId, int resizeableMode) {
3183 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08003184 final TaskRecord task = mRootActivityContainer.anyTaskForId(
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003185 taskId, MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
3186 if (task == null) {
3187 Slog.w(TAG, "setTaskResizeable: taskId=" + taskId + " not found");
3188 return;
3189 }
3190 task.setResizeMode(resizeableMode);
3191 }
3192 }
3193
3194 @Override
3195 public void resizeTask(int taskId, Rect bounds, int resizeMode) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003196 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "resizeTask()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003197 long ident = Binder.clearCallingIdentity();
3198 try {
3199 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08003200 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId,
Riddle Hsu090ac6f2018-10-31 12:55:29 +08003201 MATCH_TASK_IN_STACKS_ONLY);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003202 if (task == null) {
3203 Slog.w(TAG, "resizeTask: taskId=" + taskId + " not found");
3204 return;
3205 }
3206 // Place the task in the right stack if it isn't there already based on
3207 // the requested bounds.
3208 // The stack transition logic is:
3209 // - a null bounds on a freeform task moves that task to fullscreen
3210 // - a non-null bounds on a non-freeform (fullscreen OR docked) task moves
3211 // that task to freeform
3212 // - otherwise the task is not moved
3213 ActivityStack stack = task.getStack();
3214 if (!task.getWindowConfiguration().canResizeTask()) {
3215 throw new IllegalArgumentException("resizeTask not allowed on task=" + task);
3216 }
3217 if (bounds == null && stack.getWindowingMode() == WINDOWING_MODE_FREEFORM) {
3218 stack = stack.getDisplay().getOrCreateStack(
3219 WINDOWING_MODE_FULLSCREEN, stack.getActivityType(), ON_TOP);
3220 } else if (bounds != null && stack.getWindowingMode() != WINDOWING_MODE_FREEFORM) {
3221 stack = stack.getDisplay().getOrCreateStack(
3222 WINDOWING_MODE_FREEFORM, stack.getActivityType(), ON_TOP);
3223 }
3224
3225 // Reparent the task to the right stack if necessary
3226 boolean preserveWindow = (resizeMode & RESIZE_MODE_PRESERVE_WINDOW) != 0;
3227 if (stack != task.getStack()) {
3228 // Defer resume until the task is resized below
3229 task.reparent(stack, ON_TOP, REPARENT_KEEP_STACK_AT_FRONT, ANIMATE,
3230 DEFER_RESUME, "resizeTask");
3231 preserveWindow = false;
3232 }
3233
3234 // After reparenting (which only resizes the task to the stack bounds), resize the
3235 // task to the actual bounds provided
3236 task.resize(bounds, resizeMode, preserveWindow, !DEFER_RESUME);
3237 }
3238 } finally {
3239 Binder.restoreCallingIdentity(ident);
3240 }
3241 }
3242
3243 @Override
3244 public boolean releaseActivityInstance(IBinder token) {
3245 synchronized (mGlobalLock) {
3246 final long origId = Binder.clearCallingIdentity();
3247 try {
3248 ActivityRecord r = ActivityRecord.isInStackLocked(token);
3249 if (r == null) {
3250 return false;
3251 }
Wale Ogunwale8b19de92018-11-29 19:58:26 -08003252 return r.getActivityStack().safelyDestroyActivityLocked(r, "app-req");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003253 } finally {
3254 Binder.restoreCallingIdentity(origId);
3255 }
3256 }
3257 }
3258
3259 @Override
3260 public void releaseSomeActivities(IApplicationThread appInt) {
3261 synchronized (mGlobalLock) {
3262 final long origId = Binder.clearCallingIdentity();
3263 try {
Wale Ogunwale342fbe92018-10-09 08:44:10 -07003264 final WindowProcessController app = getProcessController(appInt);
Wale Ogunwaled32da472018-11-16 07:19:28 -08003265 mRootActivityContainer.releaseSomeActivitiesLocked(app, "low-mem");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003266 } finally {
3267 Binder.restoreCallingIdentity(origId);
3268 }
3269 }
3270 }
3271
3272 @Override
wilsonshih177261f2019-02-22 12:02:18 +08003273 public void setLockScreenShown(boolean keyguardShowing, boolean aodShowing) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003274 if (checkCallingPermission(android.Manifest.permission.DEVICE_POWER)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003275 != PackageManager.PERMISSION_GRANTED) {
3276 throw new SecurityException("Requires permission "
3277 + android.Manifest.permission.DEVICE_POWER);
3278 }
3279
3280 synchronized (mGlobalLock) {
3281 long ident = Binder.clearCallingIdentity();
3282 if (mKeyguardShown != keyguardShowing) {
3283 mKeyguardShown = keyguardShowing;
Wale Ogunwale342fbe92018-10-09 08:44:10 -07003284 final Message msg = PooledLambda.obtainMessage(
3285 ActivityManagerInternal::reportCurKeyguardUsageEvent, mAmInternal,
3286 keyguardShowing);
3287 mH.sendMessage(msg);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003288 }
3289 try {
wilsonshih177261f2019-02-22 12:02:18 +08003290 mKeyguardController.setKeyguardShown(keyguardShowing, aodShowing);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003291 } finally {
3292 Binder.restoreCallingIdentity(ident);
3293 }
3294 }
3295
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003296 mH.post(() -> {
3297 for (int i = mScreenObservers.size() - 1; i >= 0; i--) {
3298 mScreenObservers.get(i).onKeyguardStateChanged(keyguardShowing);
3299 }
3300 });
3301 }
3302
Wale Ogunwale387b34c2018-10-25 19:59:40 -07003303 public void onScreenAwakeChanged(boolean isAwake) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003304 mH.post(() -> {
3305 for (int i = mScreenObservers.size() - 1; i >= 0; i--) {
3306 mScreenObservers.get(i).onAwakeStateChanged(isAwake);
3307 }
3308 });
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003309 }
3310
3311 @Override
3312 public Bitmap getTaskDescriptionIcon(String filePath, int userId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003313 userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
3314 userId, "getTaskDescriptionIcon");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003315
3316 final File passedIconFile = new File(filePath);
3317 final File legitIconFile = new File(TaskPersister.getUserImagesDir(userId),
3318 passedIconFile.getName());
3319 if (!legitIconFile.getPath().equals(filePath)
3320 || !filePath.contains(ActivityRecord.ACTIVITY_ICON_SUFFIX)) {
3321 throw new IllegalArgumentException("Bad file path: " + filePath
3322 + " passed for userId " + userId);
3323 }
Wale Ogunwale16e505a2018-05-07 15:00:49 -07003324 return mRecentTasks.getTaskDescriptionIcon(filePath);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003325 }
3326
3327 @Override
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003328 public void startInPlaceAnimationOnFrontMostApplication(Bundle opts) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003329 final SafeActivityOptions safeOptions = SafeActivityOptions.fromBundle(opts);
3330 final ActivityOptions activityOptions = safeOptions != null
3331 ? safeOptions.getOptions(mStackSupervisor)
3332 : null;
3333 if (activityOptions == null
3334 || activityOptions.getAnimationType() != ActivityOptions.ANIM_CUSTOM_IN_PLACE
3335 || activityOptions.getCustomInPlaceResId() == 0) {
3336 throw new IllegalArgumentException("Expected in-place ActivityOption " +
3337 "with valid animation");
3338 }
lumark588a3e82018-07-20 18:53:54 +08003339 // Get top display of front most application.
3340 final ActivityStack focusedStack = getTopDisplayFocusedStack();
3341 if (focusedStack != null) {
Wale Ogunwale3a256e62018-12-06 14:41:18 -08003342 final DisplayContent dc = focusedStack.getDisplay().mDisplayContent;
3343 dc.prepareAppTransition(TRANSIT_TASK_IN_PLACE, false);
3344 dc.mAppTransition.overrideInPlaceAppTransition(activityOptions.getPackageName(),
lumark588a3e82018-07-20 18:53:54 +08003345 activityOptions.getCustomInPlaceResId());
Wale Ogunwale3a256e62018-12-06 14:41:18 -08003346 dc.executeAppTransition();
lumark588a3e82018-07-20 18:53:54 +08003347 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003348 }
3349
3350 @Override
3351 public void removeStack(int stackId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003352 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "removeStack()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003353 synchronized (mGlobalLock) {
3354 final long ident = Binder.clearCallingIdentity();
3355 try {
Wale Ogunwaled32da472018-11-16 07:19:28 -08003356 final ActivityStack stack = mRootActivityContainer.getStack(stackId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003357 if (stack == null) {
3358 Slog.w(TAG, "removeStack: No stack with id=" + stackId);
3359 return;
3360 }
3361 if (!stack.isActivityTypeStandardOrUndefined()) {
3362 throw new IllegalArgumentException(
3363 "Removing non-standard stack is not allowed.");
3364 }
3365 mStackSupervisor.removeStack(stack);
3366 } finally {
3367 Binder.restoreCallingIdentity(ident);
3368 }
3369 }
3370 }
3371
3372 @Override
3373 public void moveStackToDisplay(int stackId, int displayId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003374 mAmInternal.enforceCallingPermission(INTERNAL_SYSTEM_WINDOW, "moveStackToDisplay()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003375
3376 synchronized (mGlobalLock) {
3377 final long ident = Binder.clearCallingIdentity();
3378 try {
3379 if (DEBUG_STACK) Slog.d(TAG_STACK, "moveStackToDisplay: moving stackId=" + stackId
3380 + " to displayId=" + displayId);
Wale Ogunwaled32da472018-11-16 07:19:28 -08003381 mRootActivityContainer.moveStackToDisplay(stackId, displayId, ON_TOP);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003382 } finally {
3383 Binder.restoreCallingIdentity(ident);
3384 }
3385 }
3386 }
3387
3388 @Override
Yunfan Chend967af82019-01-17 18:30:18 +09003389 public void toggleFreeformWindowingMode(IBinder token) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003390 synchronized (mGlobalLock) {
3391 long ident = Binder.clearCallingIdentity();
3392 try {
3393 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
3394 if (r == null) {
3395 throw new IllegalArgumentException(
Yunfan Chend967af82019-01-17 18:30:18 +09003396 "toggleFreeformWindowingMode: No activity record matching token="
3397 + token);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003398 }
3399
Wale Ogunwale8b19de92018-11-29 19:58:26 -08003400 final ActivityStack stack = r.getActivityStack();
Yunfan Chend967af82019-01-17 18:30:18 +09003401 if (stack == null) {
3402 throw new IllegalStateException("toggleFreeformWindowingMode: the activity "
3403 + "doesn't have a stack");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003404 }
3405
Yunfan Chend967af82019-01-17 18:30:18 +09003406 if (!stack.inFreeformWindowingMode()
3407 && stack.getWindowingMode() != WINDOWING_MODE_FULLSCREEN) {
3408 throw new IllegalStateException("toggleFreeformWindowingMode: You can only "
3409 + "toggle between fullscreen and freeform.");
3410 }
3411
3412 if (stack.inFreeformWindowingMode()) {
3413 stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
Yunfan Chene9c1c312019-04-18 14:49:15 +09003414 } else if (stack.getParent().inFreeformWindowingMode()) {
3415 // If the window is on a freeform display, set it to undefined. It will be
3416 // resolved to freeform and it can adjust windowing mode when the display mode
3417 // changes in runtime.
3418 stack.setWindowingMode(WINDOWING_MODE_UNDEFINED);
Yunfan Chend967af82019-01-17 18:30:18 +09003419 } else {
3420 stack.setWindowingMode(WINDOWING_MODE_FREEFORM);
3421 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003422 } finally {
3423 Binder.restoreCallingIdentity(ident);
3424 }
3425 }
3426 }
3427
3428 /** Sets the task stack listener that gets callbacks when a task stack changes. */
3429 @Override
3430 public void registerTaskStackListener(ITaskStackListener listener) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003431 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003432 "registerTaskStackListener()");
Wale Ogunwaled0412b32018-05-08 09:25:50 -07003433 mTaskChangeNotificationController.registerTaskStackListener(listener);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003434 }
3435
3436 /** Unregister a task stack listener so that it stops receiving callbacks. */
3437 @Override
3438 public void unregisterTaskStackListener(ITaskStackListener listener) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003439 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003440 "unregisterTaskStackListener()");
Wale Ogunwaled0412b32018-05-08 09:25:50 -07003441 mTaskChangeNotificationController.unregisterTaskStackListener(listener);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003442 }
3443
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003444 @Override
3445 public boolean requestAssistContextExtras(int requestType, IAssistDataReceiver receiver,
3446 Bundle receiverExtras, IBinder activityToken, boolean focused, boolean newSessionId) {
3447 return enqueueAssistContext(requestType, null, null, receiver, receiverExtras,
3448 activityToken, focused, newSessionId, UserHandle.getCallingUserId(), null,
3449 PENDING_ASSIST_EXTRAS_LONG_TIMEOUT, 0) != null;
3450 }
3451
3452 @Override
3453 public boolean requestAutofillData(IAssistDataReceiver receiver, Bundle receiverExtras,
3454 IBinder activityToken, int flags) {
3455 return enqueueAssistContext(ActivityManager.ASSIST_CONTEXT_AUTOFILL, null, null,
3456 receiver, receiverExtras, activityToken, true, true, UserHandle.getCallingUserId(),
3457 null, PENDING_AUTOFILL_ASSIST_STRUCTURE_TIMEOUT, flags) != null;
3458 }
3459
3460 @Override
3461 public boolean launchAssistIntent(Intent intent, int requestType, String hint, int userHandle,
3462 Bundle args) {
3463 return enqueueAssistContext(requestType, intent, hint, null, null, null,
3464 true /* focused */, true /* newSessionId */, userHandle, args,
3465 PENDING_ASSIST_EXTRAS_TIMEOUT, 0) != null;
3466 }
3467
3468 @Override
3469 public Bundle getAssistContextExtras(int requestType) {
3470 PendingAssistExtras pae = enqueueAssistContext(requestType, null, null, null,
3471 null, null, true /* focused */, true /* newSessionId */,
3472 UserHandle.getCallingUserId(), null, PENDING_ASSIST_EXTRAS_TIMEOUT, 0);
3473 if (pae == null) {
3474 return null;
3475 }
3476 synchronized (pae) {
3477 while (!pae.haveResult) {
3478 try {
3479 pae.wait();
3480 } catch (InterruptedException e) {
3481 }
3482 }
3483 }
3484 synchronized (mGlobalLock) {
3485 buildAssistBundleLocked(pae, pae.result);
3486 mPendingAssistExtras.remove(pae);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003487 mUiHandler.removeCallbacks(pae);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003488 }
3489 return pae.extras;
3490 }
3491
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003492 /**
3493 * Binder IPC calls go through the public entry point.
3494 * This can be called with or without the global lock held.
3495 */
3496 private static int checkCallingPermission(String permission) {
3497 return checkPermission(
3498 permission, Binder.getCallingPid(), UserHandle.getAppId(Binder.getCallingUid()));
3499 }
3500
3501 /** This can be called with or without the global lock held. */
Wale Ogunwale214f3482018-10-04 11:00:47 -07003502 private void enforceCallerIsRecentsOrHasPermission(String permission, String func) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003503 if (!getRecentTasks().isCallerRecents(Binder.getCallingUid())) {
3504 mAmInternal.enforceCallingPermission(permission, func);
3505 }
3506 }
3507
3508 @VisibleForTesting
3509 int checkGetTasksPermission(String permission, int pid, int uid) {
3510 return checkPermission(permission, pid, uid);
3511 }
3512
3513 static int checkPermission(String permission, int pid, int uid) {
3514 if (permission == null) {
3515 return PackageManager.PERMISSION_DENIED;
3516 }
3517 return checkComponentPermission(permission, pid, uid, -1, true);
3518 }
3519
Wale Ogunwale214f3482018-10-04 11:00:47 -07003520 public static int checkComponentPermission(String permission, int pid, int uid,
3521 int owningUid, boolean exported) {
3522 return ActivityManagerService.checkComponentPermission(
3523 permission, pid, uid, owningUid, exported);
3524 }
3525
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003526 boolean isGetTasksAllowed(String caller, int callingPid, int callingUid) {
3527 if (getRecentTasks().isCallerRecents(callingUid)) {
3528 // Always allow the recents component to get tasks
3529 return true;
3530 }
3531
3532 boolean allowed = checkGetTasksPermission(android.Manifest.permission.REAL_GET_TASKS,
3533 callingPid, callingUid) == PackageManager.PERMISSION_GRANTED;
3534 if (!allowed) {
3535 if (checkGetTasksPermission(android.Manifest.permission.GET_TASKS,
3536 callingPid, callingUid) == PackageManager.PERMISSION_GRANTED) {
3537 // Temporary compatibility: some existing apps on the system image may
3538 // still be requesting the old permission and not switched to the new
3539 // one; if so, we'll still allow them full access. This means we need
3540 // to see if they are holding the old permission and are a system app.
3541 try {
3542 if (AppGlobals.getPackageManager().isUidPrivileged(callingUid)) {
3543 allowed = true;
3544 if (DEBUG_TASKS) Slog.w(TAG, caller + ": caller " + callingUid
3545 + " is using old GET_TASKS but privileged; allowing");
3546 }
3547 } catch (RemoteException e) {
3548 }
3549 }
3550 if (DEBUG_TASKS) Slog.w(TAG, caller + ": caller " + callingUid
3551 + " does not hold REAL_GET_TASKS; limiting output");
3552 }
3553 return allowed;
3554 }
3555
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003556 private PendingAssistExtras enqueueAssistContext(int requestType, Intent intent, String hint,
3557 IAssistDataReceiver receiver, Bundle receiverExtras, IBinder activityToken,
3558 boolean focused, boolean newSessionId, int userHandle, Bundle args, long timeout,
3559 int flags) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003560 mAmInternal.enforceCallingPermission(android.Manifest.permission.GET_TOP_ACTIVITY_INFO,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003561 "enqueueAssistContext()");
3562
3563 synchronized (mGlobalLock) {
Andrii Kulian5f750bc2018-07-17 08:57:23 -07003564 ActivityRecord activity = getTopDisplayFocusedStack().getTopActivity();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003565 if (activity == null) {
3566 Slog.w(TAG, "getAssistContextExtras failed: no top activity");
3567 return null;
3568 }
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07003569 if (!activity.attachedToProcess()) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003570 Slog.w(TAG, "getAssistContextExtras failed: no process for " + activity);
3571 return null;
3572 }
3573 if (focused) {
3574 if (activityToken != null) {
3575 ActivityRecord caller = ActivityRecord.forTokenLocked(activityToken);
3576 if (activity != caller) {
3577 Slog.w(TAG, "enqueueAssistContext failed: caller " + caller
3578 + " is not current top " + activity);
3579 return null;
3580 }
3581 }
3582 } else {
3583 activity = ActivityRecord.forTokenLocked(activityToken);
3584 if (activity == null) {
3585 Slog.w(TAG, "enqueueAssistContext failed: activity for token=" + activityToken
3586 + " couldn't be found");
3587 return null;
3588 }
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07003589 if (!activity.attachedToProcess()) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003590 Slog.w(TAG, "enqueueAssistContext failed: no process for " + activity);
3591 return null;
3592 }
3593 }
3594
3595 PendingAssistExtras pae;
3596 Bundle extras = new Bundle();
3597 if (args != null) {
3598 extras.putAll(args);
3599 }
3600 extras.putString(Intent.EXTRA_ASSIST_PACKAGE, activity.packageName);
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07003601 extras.putInt(Intent.EXTRA_ASSIST_UID, activity.app.mUid);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003602
3603 pae = new PendingAssistExtras(activity, extras, intent, hint, receiver, receiverExtras,
3604 userHandle);
3605 pae.isHome = activity.isActivityTypeHome();
3606
3607 // Increment the sessionId if necessary
3608 if (newSessionId) {
3609 mViSessionId++;
3610 }
3611 try {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07003612 activity.app.getThread().requestAssistContextExtras(activity.appToken, pae,
3613 requestType, mViSessionId, flags);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003614 mPendingAssistExtras.add(pae);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003615 mUiHandler.postDelayed(pae, timeout);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003616 } catch (RemoteException e) {
3617 Slog.w(TAG, "getAssistContextExtras failed: crash calling " + activity);
3618 return null;
3619 }
3620 return pae;
3621 }
3622 }
3623
3624 private void buildAssistBundleLocked(PendingAssistExtras pae, Bundle result) {
3625 if (result != null) {
3626 pae.extras.putBundle(Intent.EXTRA_ASSIST_CONTEXT, result);
3627 }
3628 if (pae.hint != null) {
3629 pae.extras.putBoolean(pae.hint, true);
3630 }
3631 }
3632
3633 private void pendingAssistExtrasTimedOut(PendingAssistExtras pae) {
3634 IAssistDataReceiver receiver;
3635 synchronized (mGlobalLock) {
3636 mPendingAssistExtras.remove(pae);
3637 receiver = pae.receiver;
3638 }
3639 if (receiver != null) {
3640 // Caller wants result sent back to them.
3641 Bundle sendBundle = new Bundle();
3642 // At least return the receiver extras
3643 sendBundle.putBundle(ASSIST_KEY_RECEIVER_EXTRAS, pae.receiverExtras);
3644 try {
3645 pae.receiver.onHandleAssistData(sendBundle);
3646 } catch (RemoteException e) {
3647 }
3648 }
3649 }
3650
3651 public class PendingAssistExtras extends Binder implements Runnable {
3652 public final ActivityRecord activity;
3653 public boolean isHome;
3654 public final Bundle extras;
3655 public final Intent intent;
3656 public final String hint;
3657 public final IAssistDataReceiver receiver;
3658 public final int userHandle;
3659 public boolean haveResult = false;
3660 public Bundle result = null;
3661 public AssistStructure structure = null;
3662 public AssistContent content = null;
3663 public Bundle receiverExtras;
3664
3665 public PendingAssistExtras(ActivityRecord _activity, Bundle _extras, Intent _intent,
3666 String _hint, IAssistDataReceiver _receiver, Bundle _receiverExtras,
3667 int _userHandle) {
3668 activity = _activity;
3669 extras = _extras;
3670 intent = _intent;
3671 hint = _hint;
3672 receiver = _receiver;
3673 receiverExtras = _receiverExtras;
3674 userHandle = _userHandle;
3675 }
3676
3677 @Override
3678 public void run() {
3679 Slog.w(TAG, "getAssistContextExtras failed: timeout retrieving from " + activity);
3680 synchronized (this) {
3681 haveResult = true;
3682 notifyAll();
3683 }
3684 pendingAssistExtrasTimedOut(this);
3685 }
3686 }
3687
3688 @Override
3689 public boolean isAssistDataAllowedOnCurrentActivity() {
3690 int userId;
3691 synchronized (mGlobalLock) {
Andrii Kulian5f750bc2018-07-17 08:57:23 -07003692 final ActivityStack focusedStack = getTopDisplayFocusedStack();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003693 if (focusedStack == null || focusedStack.isActivityTypeAssistant()) {
3694 return false;
3695 }
3696
3697 final ActivityRecord activity = focusedStack.getTopActivity();
3698 if (activity == null) {
3699 return false;
3700 }
Wale Ogunwale8b19de92018-11-29 19:58:26 -08003701 userId = activity.mUserId;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003702 }
3703 return !DevicePolicyCache.getInstance().getScreenCaptureDisabled(userId);
3704 }
3705
3706 @Override
3707 public boolean showAssistFromActivity(IBinder token, Bundle args) {
3708 long ident = Binder.clearCallingIdentity();
3709 try {
3710 synchronized (mGlobalLock) {
3711 ActivityRecord caller = ActivityRecord.forTokenLocked(token);
Andrii Kulian5f750bc2018-07-17 08:57:23 -07003712 ActivityRecord top = getTopDisplayFocusedStack().getTopActivity();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003713 if (top != caller) {
3714 Slog.w(TAG, "showAssistFromActivity failed: caller " + caller
3715 + " is not current top " + top);
3716 return false;
3717 }
3718 if (!top.nowVisible) {
3719 Slog.w(TAG, "showAssistFromActivity failed: caller " + caller
3720 + " is not visible");
3721 return false;
3722 }
3723 }
3724 return mAssistUtils.showSessionForActiveService(args, SHOW_SOURCE_APPLICATION, null,
3725 token);
3726 } finally {
3727 Binder.restoreCallingIdentity(ident);
3728 }
3729 }
3730
3731 @Override
3732 public boolean isRootVoiceInteraction(IBinder token) {
3733 synchronized (mGlobalLock) {
3734 ActivityRecord r = ActivityRecord.isInStackLocked(token);
3735 if (r == null) {
3736 return false;
3737 }
3738 return r.rootVoiceInteraction;
3739 }
3740 }
3741
Wale Ogunwalef6733932018-06-27 05:14:34 -07003742 private void onLocalVoiceInteractionStartedLocked(IBinder activity,
3743 IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor) {
3744 ActivityRecord activityToCallback = ActivityRecord.forTokenLocked(activity);
3745 if (activityToCallback == null) return;
3746 activityToCallback.setVoiceSessionLocked(voiceSession);
3747
3748 // Inform the activity
3749 try {
3750 activityToCallback.app.getThread().scheduleLocalVoiceInteractionStarted(activity,
3751 voiceInteractor);
3752 long token = Binder.clearCallingIdentity();
3753 try {
Andrii Kulianeceebbf2019-06-26 17:36:51 -07003754 startRunningVoiceLocked(voiceSession, activityToCallback.info.applicationInfo.uid);
Wale Ogunwalef6733932018-06-27 05:14:34 -07003755 } finally {
3756 Binder.restoreCallingIdentity(token);
3757 }
3758 // TODO: VI Should we cache the activity so that it's easier to find later
3759 // rather than scan through all the stacks and activities?
3760 } catch (RemoteException re) {
3761 activityToCallback.clearVoiceSessionLocked();
3762 // TODO: VI Should this terminate the voice session?
3763 }
3764 }
3765
3766 private void startRunningVoiceLocked(IVoiceInteractionSession session, int targetUid) {
3767 Slog.d(TAG, "<<< startRunningVoiceLocked()");
3768 mVoiceWakeLock.setWorkSource(new WorkSource(targetUid));
3769 if (mRunningVoice == null || mRunningVoice.asBinder() != session.asBinder()) {
3770 boolean wasRunningVoice = mRunningVoice != null;
3771 mRunningVoice = session;
3772 if (!wasRunningVoice) {
3773 mVoiceWakeLock.acquire();
3774 updateSleepIfNeededLocked();
3775 }
3776 }
3777 }
3778
3779 void finishRunningVoiceLocked() {
3780 if (mRunningVoice != null) {
3781 mRunningVoice = null;
3782 mVoiceWakeLock.release();
3783 updateSleepIfNeededLocked();
3784 }
3785 }
3786
3787 @Override
3788 public void setVoiceKeepAwake(IVoiceInteractionSession session, boolean keepAwake) {
3789 synchronized (mGlobalLock) {
3790 if (mRunningVoice != null && mRunningVoice.asBinder() == session.asBinder()) {
3791 if (keepAwake) {
3792 mVoiceWakeLock.acquire();
3793 } else {
3794 mVoiceWakeLock.release();
3795 }
3796 }
3797 }
3798 }
3799
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003800 @Override
3801 public ComponentName getActivityClassForToken(IBinder token) {
3802 synchronized (mGlobalLock) {
3803 ActivityRecord r = ActivityRecord.isInStackLocked(token);
3804 if (r == null) {
3805 return null;
3806 }
3807 return r.intent.getComponent();
3808 }
3809 }
3810
3811 @Override
3812 public String getPackageForToken(IBinder token) {
3813 synchronized (mGlobalLock) {
3814 ActivityRecord r = ActivityRecord.isInStackLocked(token);
3815 if (r == null) {
3816 return null;
3817 }
3818 return r.packageName;
3819 }
3820 }
3821
3822 @Override
3823 public void showLockTaskEscapeMessage(IBinder token) {
3824 synchronized (mGlobalLock) {
3825 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
3826 if (r == null) {
3827 return;
3828 }
Wale Ogunwaled95c06b2018-05-08 10:35:38 -07003829 getLockTaskController().showLockTaskToast();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003830 }
3831 }
3832
3833 @Override
3834 public void keyguardGoingAway(int flags) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003835 enforceNotIsolatedCaller("keyguardGoingAway");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003836 final long token = Binder.clearCallingIdentity();
3837 try {
3838 synchronized (mGlobalLock) {
Wale Ogunwaled0412b32018-05-08 09:25:50 -07003839 mKeyguardController.keyguardGoingAway(flags);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003840 }
3841 } finally {
3842 Binder.restoreCallingIdentity(token);
3843 }
3844 }
3845
3846 /**
3847 * Try to place task to provided position. The final position might be different depending on
3848 * current user and stacks state. The task will be moved to target stack if it's currently in
3849 * different stack.
3850 */
3851 @Override
3852 public void positionTaskInStack(int taskId, int stackId, int position) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003853 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "positionTaskInStack()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003854 synchronized (mGlobalLock) {
3855 long ident = Binder.clearCallingIdentity();
3856 try {
3857 if (DEBUG_STACK) Slog.d(TAG_STACK, "positionTaskInStack: positioning task="
3858 + taskId + " in stackId=" + stackId + " at position=" + position);
Wale Ogunwaled32da472018-11-16 07:19:28 -08003859 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003860 if (task == null) {
3861 throw new IllegalArgumentException("positionTaskInStack: no task for id="
3862 + taskId);
3863 }
3864
Wale Ogunwaled32da472018-11-16 07:19:28 -08003865 final ActivityStack stack = mRootActivityContainer.getStack(stackId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003866
3867 if (stack == null) {
3868 throw new IllegalArgumentException("positionTaskInStack: no stack for id="
3869 + stackId);
3870 }
3871 if (!stack.isActivityTypeStandardOrUndefined()) {
3872 throw new IllegalArgumentException("positionTaskInStack: Attempt to change"
3873 + " the position of task " + taskId + " in/to non-standard stack");
3874 }
3875
3876 // TODO: Have the callers of this API call a separate reparent method if that is
3877 // what they intended to do vs. having this method also do reparenting.
3878 if (task.getStack() == stack) {
3879 // Change position in current stack.
3880 stack.positionChildAt(task, position);
3881 } else {
3882 // Reparent to new stack.
3883 task.reparent(stack, position, REPARENT_LEAVE_STACK_IN_PLACE, !ANIMATE,
3884 !DEFER_RESUME, "positionTaskInStack");
3885 }
3886 } finally {
3887 Binder.restoreCallingIdentity(ident);
3888 }
3889 }
3890 }
3891
3892 @Override
3893 public void reportSizeConfigurations(IBinder token, int[] horizontalSizeConfiguration,
3894 int[] verticalSizeConfigurations, int[] smallestSizeConfigurations) {
3895 if (DEBUG_CONFIGURATION) Slog.v(TAG, "Report configuration: " + token + " "
Yuichiro Hanadae7e930b2019-06-06 19:07:21 +09003896 + Arrays.toString(horizontalSizeConfiguration) + " "
3897 + Arrays.toString(verticalSizeConfigurations));
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003898 synchronized (mGlobalLock) {
3899 ActivityRecord record = ActivityRecord.isInStackLocked(token);
3900 if (record == null) {
3901 throw new IllegalArgumentException("reportSizeConfigurations: ActivityRecord not "
3902 + "found for: " + token);
3903 }
3904 record.setSizeConfigurations(horizontalSizeConfiguration,
3905 verticalSizeConfigurations, smallestSizeConfigurations);
3906 }
3907 }
3908
3909 /**
3910 * Dismisses split-screen multi-window mode.
3911 * @param toTop If true the current primary split-screen stack will be placed or left on top.
3912 */
3913 @Override
3914 public void dismissSplitScreenMode(boolean toTop) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003915 enforceCallerIsRecentsOrHasPermission(
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003916 MANAGE_ACTIVITY_STACKS, "dismissSplitScreenMode()");
3917 final long ident = Binder.clearCallingIdentity();
3918 try {
3919 synchronized (mGlobalLock) {
3920 final ActivityStack stack =
Wale Ogunwaled32da472018-11-16 07:19:28 -08003921 mRootActivityContainer.getDefaultDisplay().getSplitScreenPrimaryStack();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003922 if (stack == null) {
3923 Slog.w(TAG, "dismissSplitScreenMode: primary split-screen stack not found.");
3924 return;
3925 }
3926
3927 if (toTop) {
3928 // Caller wants the current split-screen primary stack to be the top stack after
3929 // it goes fullscreen, so move it to the front.
3930 stack.moveToFront("dismissSplitScreenMode");
JinsungKim6e7fd3e2019-06-17 18:31:28 +09003931 } else {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003932 // In this case the current split-screen primary stack shouldn't be the top
JinsungKim6e7fd3e2019-06-17 18:31:28 +09003933 // stack after it goes fullscreen, so we move the focus to the top-most
3934 // split-screen secondary stack next to it.
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003935 final ActivityStack otherStack = stack.getDisplay().getTopStackInWindowingMode(
3936 WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
3937 if (otherStack != null) {
3938 otherStack.moveToFront("dismissSplitScreenMode_other");
3939 }
3940 }
3941
Evan Rosky10475742018-09-05 19:02:48 -07003942 stack.setWindowingMode(WINDOWING_MODE_UNDEFINED);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003943 }
3944 } finally {
3945 Binder.restoreCallingIdentity(ident);
3946 }
3947 }
3948
3949 /**
3950 * Dismisses Pip
3951 * @param animate True if the dismissal should be animated.
3952 * @param animationDuration The duration of the resize animation in milliseconds or -1 if the
3953 * default animation duration should be used.
3954 */
3955 @Override
3956 public void dismissPip(boolean animate, int animationDuration) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003957 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "dismissPip()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003958 final long ident = Binder.clearCallingIdentity();
3959 try {
3960 synchronized (mGlobalLock) {
Yunfan Chen279f5582018-12-12 15:24:50 -08003961 final ActivityStack stack =
Wale Ogunwaled32da472018-11-16 07:19:28 -08003962 mRootActivityContainer.getDefaultDisplay().getPinnedStack();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003963 if (stack == null) {
3964 Slog.w(TAG, "dismissPip: pinned stack not found.");
3965 return;
3966 }
3967 if (stack.getWindowingMode() != WINDOWING_MODE_PINNED) {
3968 throw new IllegalArgumentException("Stack: " + stack
3969 + " doesn't support animated resize.");
3970 }
3971 if (animate) {
3972 stack.animateResizePinnedStack(null /* sourceHintBounds */,
3973 null /* destBounds */, animationDuration, false /* fromFullscreen */);
3974 } else {
3975 mStackSupervisor.moveTasksToFullscreenStackLocked(stack, true /* onTop */);
3976 }
3977 }
3978 } finally {
3979 Binder.restoreCallingIdentity(ident);
3980 }
3981 }
3982
3983 @Override
3984 public void suppressResizeConfigChanges(boolean suppress) throws RemoteException {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003985 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "suppressResizeConfigChanges()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003986 synchronized (mGlobalLock) {
3987 mSuppressResizeConfigChanges = suppress;
3988 }
3989 }
3990
3991 /**
3992 * NOTE: For the pinned stack, this method is usually called after the bounds animation has
3993 * animated the stack to the fullscreen, but can also be called if we are relaunching an
3994 * activity and clearing the task at the same time.
3995 */
3996 @Override
3997 // TODO: API should just be about changing windowing modes...
3998 public void moveTasksToFullscreenStack(int fromStackId, boolean onTop) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003999 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004000 "moveTasksToFullscreenStack()");
4001 synchronized (mGlobalLock) {
4002 final long origId = Binder.clearCallingIdentity();
4003 try {
Wale Ogunwaled32da472018-11-16 07:19:28 -08004004 final ActivityStack stack = mRootActivityContainer.getStack(fromStackId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004005 if (stack != null){
4006 if (!stack.isActivityTypeStandardOrUndefined()) {
4007 throw new IllegalArgumentException(
4008 "You can't move tasks from non-standard stacks.");
4009 }
4010 mStackSupervisor.moveTasksToFullscreenStackLocked(stack, onTop);
4011 }
4012 } finally {
4013 Binder.restoreCallingIdentity(origId);
4014 }
4015 }
4016 }
4017
4018 /**
4019 * Moves the top activity in the input stackId to the pinned stack.
4020 *
4021 * @param stackId Id of stack to move the top activity to pinned stack.
4022 * @param bounds Bounds to use for pinned stack.
4023 *
4024 * @return True if the top activity of the input stack was successfully moved to the pinned
4025 * stack.
4026 */
4027 @Override
4028 public boolean moveTopActivityToPinnedStack(int stackId, Rect bounds) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004029 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004030 "moveTopActivityToPinnedStack()");
4031 synchronized (mGlobalLock) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004032 if (!mSupportsPictureInPicture) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004033 throw new IllegalStateException("moveTopActivityToPinnedStack:"
4034 + "Device doesn't support picture-in-picture mode");
4035 }
4036
4037 long ident = Binder.clearCallingIdentity();
4038 try {
Wale Ogunwaled32da472018-11-16 07:19:28 -08004039 return mRootActivityContainer.moveTopStackActivityToPinnedStack(stackId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004040 } finally {
4041 Binder.restoreCallingIdentity(ident);
4042 }
4043 }
4044 }
4045
4046 @Override
4047 public boolean isInMultiWindowMode(IBinder token) {
4048 final long origId = Binder.clearCallingIdentity();
4049 try {
4050 synchronized (mGlobalLock) {
4051 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
4052 if (r == null) {
4053 return false;
4054 }
4055 // An activity is consider to be in multi-window mode if its task isn't fullscreen.
4056 return r.inMultiWindowMode();
4057 }
4058 } finally {
4059 Binder.restoreCallingIdentity(origId);
4060 }
4061 }
4062
4063 @Override
4064 public boolean isInPictureInPictureMode(IBinder token) {
4065 final long origId = Binder.clearCallingIdentity();
4066 try {
4067 synchronized (mGlobalLock) {
4068 return isInPictureInPictureMode(ActivityRecord.forTokenLocked(token));
4069 }
4070 } finally {
4071 Binder.restoreCallingIdentity(origId);
4072 }
4073 }
4074
4075 private boolean isInPictureInPictureMode(ActivityRecord r) {
Wale Ogunwale8b19de92018-11-29 19:58:26 -08004076 if (r == null || r.getActivityStack() == null || !r.inPinnedWindowingMode()
4077 || r.getActivityStack().isInStackLocked(r) == null) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004078 return false;
4079 }
4080
4081 // If we are animating to fullscreen then we have already dispatched the PIP mode
4082 // changed, so we should reflect that check here as well.
Yunfan Chen279f5582018-12-12 15:24:50 -08004083 final TaskStack taskStack = r.getActivityStack().getTaskStack();
4084 return !taskStack.isAnimatingBoundsToFullscreen();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004085 }
4086
4087 @Override
4088 public boolean enterPictureInPictureMode(IBinder token, final PictureInPictureParams params) {
4089 final long origId = Binder.clearCallingIdentity();
4090 try {
4091 synchronized (mGlobalLock) {
4092 final ActivityRecord r = ensureValidPictureInPictureActivityParamsLocked(
4093 "enterPictureInPictureMode", token, params);
4094
4095 // If the activity is already in picture in picture mode, then just return early
4096 if (isInPictureInPictureMode(r)) {
4097 return true;
4098 }
4099
4100 // Activity supports picture-in-picture, now check that we can enter PiP at this
4101 // point, if it is
4102 if (!r.checkEnterPictureInPictureState("enterPictureInPictureMode",
4103 false /* beforeStopping */)) {
4104 return false;
4105 }
4106
4107 final Runnable enterPipRunnable = () -> {
Wale Ogunwalef276a6f2018-06-15 08:26:07 -07004108 synchronized (mGlobalLock) {
4109 // Only update the saved args from the args that are set
4110 r.pictureInPictureArgs.copyOnlySet(params);
4111 final float aspectRatio = r.pictureInPictureArgs.getAspectRatio();
4112 final List<RemoteAction> actions = r.pictureInPictureArgs.getActions();
4113 // Adjust the source bounds by the insets for the transition down
4114 final Rect sourceBounds = new Rect(
4115 r.pictureInPictureArgs.getSourceRectHint());
Wale Ogunwaled32da472018-11-16 07:19:28 -08004116 mRootActivityContainer.moveActivityToPinnedStack(
Wale Ogunwalef276a6f2018-06-15 08:26:07 -07004117 r, sourceBounds, aspectRatio, "enterPictureInPictureMode");
Yunfan Chen279f5582018-12-12 15:24:50 -08004118 final ActivityStack stack = r.getActivityStack();
Wale Ogunwalef276a6f2018-06-15 08:26:07 -07004119 stack.setPictureInPictureAspectRatio(aspectRatio);
4120 stack.setPictureInPictureActions(actions);
Andrii Kulianeceebbf2019-06-26 17:36:51 -07004121 MetricsLoggerWrapper.logPictureInPictureEnter(mContext,
4122 r.info.applicationInfo.uid, r.shortComponentName,
4123 r.supportsEnterPipOnTaskSwitch);
Wale Ogunwalef276a6f2018-06-15 08:26:07 -07004124 logPictureInPictureArgs(params);
4125 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004126 };
4127
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004128 if (isKeyguardLocked()) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004129 // If the keyguard is showing or occluded, then try and dismiss it before
4130 // entering picture-in-picture (this will prompt the user to authenticate if the
4131 // device is currently locked).
4132 dismissKeyguard(token, new KeyguardDismissCallback() {
4133 @Override
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004134 public void onDismissSucceeded() {
4135 mH.post(enterPipRunnable);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004136 }
4137 }, null /* message */);
4138 } else {
4139 // Enter picture in picture immediately otherwise
4140 enterPipRunnable.run();
4141 }
4142 return true;
4143 }
4144 } finally {
4145 Binder.restoreCallingIdentity(origId);
4146 }
4147 }
4148
4149 @Override
4150 public void setPictureInPictureParams(IBinder token, final PictureInPictureParams params) {
4151 final long origId = Binder.clearCallingIdentity();
4152 try {
4153 synchronized (mGlobalLock) {
4154 final ActivityRecord r = ensureValidPictureInPictureActivityParamsLocked(
4155 "setPictureInPictureParams", token, params);
4156
4157 // Only update the saved args from the args that are set
4158 r.pictureInPictureArgs.copyOnlySet(params);
4159 if (r.inPinnedWindowingMode()) {
4160 // If the activity is already in picture-in-picture, update the pinned stack now
4161 // if it is not already expanding to fullscreen. Otherwise, the arguments will
4162 // be used the next time the activity enters PiP
Yunfan Chen279f5582018-12-12 15:24:50 -08004163 final ActivityStack stack = r.getActivityStack();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004164 if (!stack.isAnimatingBoundsToFullscreen()) {
4165 stack.setPictureInPictureAspectRatio(
4166 r.pictureInPictureArgs.getAspectRatio());
4167 stack.setPictureInPictureActions(r.pictureInPictureArgs.getActions());
4168 }
4169 }
4170 logPictureInPictureArgs(params);
4171 }
4172 } finally {
4173 Binder.restoreCallingIdentity(origId);
4174 }
4175 }
4176
4177 @Override
4178 public int getMaxNumPictureInPictureActions(IBinder token) {
4179 // Currently, this is a static constant, but later, we may change this to be dependent on
4180 // the context of the activity
4181 return 3;
4182 }
4183
4184 private void logPictureInPictureArgs(PictureInPictureParams params) {
4185 if (params.hasSetActions()) {
4186 MetricsLogger.histogram(mContext, "tron_varz_picture_in_picture_actions_count",
4187 params.getActions().size());
4188 }
4189 if (params.hasSetAspectRatio()) {
4190 LogMaker lm = new LogMaker(MetricsEvent.ACTION_PICTURE_IN_PICTURE_ASPECT_RATIO_CHANGED);
4191 lm.addTaggedData(MetricsEvent.PICTURE_IN_PICTURE_ASPECT_RATIO, params.getAspectRatio());
4192 MetricsLogger.action(lm);
4193 }
4194 }
4195
4196 /**
4197 * Checks the state of the system and the activity associated with the given {@param token} to
4198 * verify that picture-in-picture is supported for that activity.
4199 *
4200 * @return the activity record for the given {@param token} if all the checks pass.
4201 */
4202 private ActivityRecord ensureValidPictureInPictureActivityParamsLocked(String caller,
4203 IBinder token, PictureInPictureParams params) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004204 if (!mSupportsPictureInPicture) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004205 throw new IllegalStateException(caller
4206 + ": Device doesn't support picture-in-picture mode.");
4207 }
4208
4209 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
4210 if (r == null) {
4211 throw new IllegalStateException(caller
4212 + ": Can't find activity for token=" + token);
4213 }
4214
4215 if (!r.supportsPictureInPicture()) {
4216 throw new IllegalStateException(caller
4217 + ": Current activity does not support picture-in-picture.");
4218 }
4219
4220 if (params.hasSetAspectRatio()
Wale Ogunwale8b19de92018-11-29 19:58:26 -08004221 && !mWindowManager.isValidPictureInPictureAspectRatio(
4222 r.getActivityStack().mDisplayId, params.getAspectRatio())) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004223 final float minAspectRatio = mContext.getResources().getFloat(
4224 com.android.internal.R.dimen.config_pictureInPictureMinAspectRatio);
4225 final float maxAspectRatio = mContext.getResources().getFloat(
4226 com.android.internal.R.dimen.config_pictureInPictureMaxAspectRatio);
4227 throw new IllegalArgumentException(String.format(caller
4228 + ": Aspect ratio is too extreme (must be between %f and %f).",
4229 minAspectRatio, maxAspectRatio));
4230 }
4231
4232 // Truncate the number of actions if necessary
4233 params.truncateActions(getMaxNumPictureInPictureActions(token));
4234
4235 return r;
4236 }
4237
4238 @Override
4239 public IBinder getUriPermissionOwnerForActivity(IBinder activityToken) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004240 enforceNotIsolatedCaller("getUriPermissionOwnerForActivity");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004241 synchronized (mGlobalLock) {
4242 ActivityRecord r = ActivityRecord.isInStackLocked(activityToken);
4243 if (r == null) {
4244 throw new IllegalArgumentException("Activity does not exist; token="
4245 + activityToken);
4246 }
Wale Ogunwale6d50dcc2018-07-21 23:00:40 -07004247 return r.getUriPermissionsLocked().getExternalToken();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004248 }
4249 }
4250
4251 @Override
4252 public void resizeDockedStack(Rect dockedBounds, Rect tempDockedTaskBounds,
4253 Rect tempDockedTaskInsetBounds,
4254 Rect tempOtherTaskBounds, Rect tempOtherTaskInsetBounds) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004255 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "resizeDockedStack()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004256 long ident = Binder.clearCallingIdentity();
4257 try {
4258 synchronized (mGlobalLock) {
4259 mStackSupervisor.resizeDockedStackLocked(dockedBounds, tempDockedTaskBounds,
4260 tempDockedTaskInsetBounds, tempOtherTaskBounds, tempOtherTaskInsetBounds,
4261 PRESERVE_WINDOWS);
4262 }
4263 } finally {
4264 Binder.restoreCallingIdentity(ident);
4265 }
4266 }
4267
4268 @Override
4269 public void setSplitScreenResizing(boolean resizing) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004270 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "setSplitScreenResizing()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004271 final long ident = Binder.clearCallingIdentity();
4272 try {
4273 synchronized (mGlobalLock) {
4274 mStackSupervisor.setSplitScreenResizing(resizing);
4275 }
4276 } finally {
4277 Binder.restoreCallingIdentity(ident);
4278 }
4279 }
4280
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004281 /**
4282 * Check that we have the features required for VR-related API calls, and throw an exception if
4283 * not.
4284 */
Wale Ogunwale59507092018-10-29 09:00:30 -07004285 public void enforceSystemHasVrFeature() {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004286 if (!mContext.getPackageManager().hasSystemFeature(
4287 PackageManager.FEATURE_VR_MODE_HIGH_PERFORMANCE)) {
4288 throw new UnsupportedOperationException("VR mode not supported on this device!");
4289 }
4290 }
4291
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004292 @Override
4293 public int setVrMode(IBinder token, boolean enabled, ComponentName packageName) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004294 enforceSystemHasVrFeature();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004295
4296 final VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class);
4297
4298 ActivityRecord r;
4299 synchronized (mGlobalLock) {
4300 r = ActivityRecord.isInStackLocked(token);
4301 }
4302
4303 if (r == null) {
4304 throw new IllegalArgumentException();
4305 }
4306
4307 int err;
Wale Ogunwale8b19de92018-11-29 19:58:26 -08004308 if ((err = vrService.hasVrPackage(packageName, r.mUserId)) !=
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004309 VrManagerInternal.NO_ERROR) {
4310 return err;
4311 }
4312
4313 // Clear the binder calling uid since this path may call moveToTask().
4314 final long callingId = Binder.clearCallingIdentity();
4315 try {
4316 synchronized (mGlobalLock) {
4317 r.requestedVrComponent = (enabled) ? packageName : null;
4318
4319 // Update associated state if this activity is currently focused
Andrii Kulian52d255c2018-07-13 11:32:19 -07004320 if (r.isResumedActivityOnDisplay()) {
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004321 applyUpdateVrModeLocked(r);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004322 }
4323 return 0;
4324 }
4325 } finally {
4326 Binder.restoreCallingIdentity(callingId);
4327 }
4328 }
4329
4330 @Override
4331 public void startLocalVoiceInteraction(IBinder callingActivity, Bundle options) {
4332 Slog.i(TAG, "Activity tried to startLocalVoiceInteraction");
4333 synchronized (mGlobalLock) {
Andrii Kulian5f750bc2018-07-17 08:57:23 -07004334 ActivityRecord activity = getTopDisplayFocusedStack().getTopActivity();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004335 if (ActivityRecord.forTokenLocked(callingActivity) != activity) {
4336 throw new SecurityException("Only focused activity can call startVoiceInteraction");
4337 }
Wale Ogunwale8b19de92018-11-29 19:58:26 -08004338 if (mRunningVoice != null || activity.getTaskRecord().voiceSession != null
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004339 || activity.voiceSession != null) {
4340 Slog.w(TAG, "Already in a voice interaction, cannot start new voice interaction");
4341 return;
4342 }
4343 if (activity.pendingVoiceInteractionStart) {
4344 Slog.w(TAG, "Pending start of voice interaction already.");
4345 return;
4346 }
4347 activity.pendingVoiceInteractionStart = true;
4348 }
4349 LocalServices.getService(VoiceInteractionManagerInternal.class)
4350 .startLocalVoiceInteraction(callingActivity, options);
4351 }
4352
4353 @Override
4354 public void stopLocalVoiceInteraction(IBinder callingActivity) {
4355 LocalServices.getService(VoiceInteractionManagerInternal.class)
4356 .stopLocalVoiceInteraction(callingActivity);
4357 }
4358
4359 @Override
4360 public boolean supportsLocalVoiceInteraction() {
4361 return LocalServices.getService(VoiceInteractionManagerInternal.class)
4362 .supportsLocalVoiceInteraction();
4363 }
4364
4365 /** Notifies all listeners when the pinned stack animation starts. */
4366 @Override
4367 public void notifyPinnedStackAnimationStarted() {
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004368 mTaskChangeNotificationController.notifyPinnedStackAnimationStarted();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004369 }
4370
4371 /** Notifies all listeners when the pinned stack animation ends. */
4372 @Override
4373 public void notifyPinnedStackAnimationEnded() {
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004374 mTaskChangeNotificationController.notifyPinnedStackAnimationEnded();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004375 }
4376
4377 @Override
4378 public void resizePinnedStack(Rect pinnedBounds, Rect tempPinnedTaskBounds) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004379 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "resizePinnedStack()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004380 final long ident = Binder.clearCallingIdentity();
4381 try {
4382 synchronized (mGlobalLock) {
4383 mStackSupervisor.resizePinnedStackLocked(pinnedBounds, tempPinnedTaskBounds);
4384 }
4385 } finally {
4386 Binder.restoreCallingIdentity(ident);
4387 }
4388 }
4389
4390 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004391 public boolean updateConfiguration(Configuration values) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004392 mAmInternal.enforceCallingPermission(CHANGE_CONFIGURATION, "updateConfiguration()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004393
4394 synchronized (mGlobalLock) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004395 if (values == null && mWindowManager != null) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004396 // sentinel: fetch the current configuration from the window manager
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004397 values = mWindowManager.computeNewConfiguration(DEFAULT_DISPLAY);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004398 }
4399
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004400 if (mWindowManager != null) {
Wale Ogunwale342fbe92018-10-09 08:44:10 -07004401 final Message msg = PooledLambda.obtainMessage(
4402 ActivityManagerInternal::updateOomLevelsForDisplay, mAmInternal,
4403 DEFAULT_DISPLAY);
4404 mH.sendMessage(msg);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004405 }
4406
4407 final long origId = Binder.clearCallingIdentity();
4408 try {
4409 if (values != null) {
4410 Settings.System.clearConfiguration(values);
4411 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004412 updateConfigurationLocked(values, null, false, false /* persistent */,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004413 UserHandle.USER_NULL, false /* deferResume */,
4414 mTmpUpdateConfigurationResult);
4415 return mTmpUpdateConfigurationResult.changes != 0;
4416 } finally {
4417 Binder.restoreCallingIdentity(origId);
4418 }
4419 }
4420 }
4421
4422 @Override
4423 public void dismissKeyguard(IBinder token, IKeyguardDismissCallback callback,
4424 CharSequence message) {
4425 if (message != null) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004426 mAmInternal.enforceCallingPermission(
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004427 Manifest.permission.SHOW_KEYGUARD_MESSAGE, "dismissKeyguard()");
4428 }
4429 final long callingId = Binder.clearCallingIdentity();
4430 try {
4431 synchronized (mGlobalLock) {
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004432 mKeyguardController.dismissKeyguard(token, callback, message);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004433 }
4434 } finally {
4435 Binder.restoreCallingIdentity(callingId);
4436 }
4437 }
4438
4439 @Override
4440 public void cancelTaskWindowTransition(int taskId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004441 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004442 "cancelTaskWindowTransition()");
4443 final long ident = Binder.clearCallingIdentity();
4444 try {
4445 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08004446 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004447 MATCH_TASK_IN_STACKS_ONLY);
4448 if (task == null) {
4449 Slog.w(TAG, "cancelTaskWindowTransition: taskId=" + taskId + " not found");
4450 return;
4451 }
4452 task.cancelWindowTransition();
4453 }
4454 } finally {
4455 Binder.restoreCallingIdentity(ident);
4456 }
4457 }
4458
4459 @Override
4460 public ActivityManager.TaskSnapshot getTaskSnapshot(int taskId, boolean reducedResolution) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004461 enforceCallerIsRecentsOrHasPermission(READ_FRAME_BUFFER, "getTaskSnapshot()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004462 final long ident = Binder.clearCallingIdentity();
4463 try {
Jorim Jaggi925bb3c2019-06-04 19:51:45 +02004464 return getTaskSnapshot(taskId, reducedResolution, true /* restoreFromDisk */);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004465 } finally {
4466 Binder.restoreCallingIdentity(ident);
4467 }
4468 }
4469
Jorim Jaggi925bb3c2019-06-04 19:51:45 +02004470 private ActivityManager.TaskSnapshot getTaskSnapshot(int taskId, boolean reducedResolution,
4471 boolean restoreFromDisk) {
4472 final TaskRecord task;
4473 synchronized (mGlobalLock) {
4474 task = mRootActivityContainer.anyTaskForId(taskId,
4475 MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
4476 if (task == null) {
4477 Slog.w(TAG, "getTaskSnapshot: taskId=" + taskId + " not found");
4478 return null;
4479 }
4480 }
4481 // Don't call this while holding the lock as this operation might hit the disk.
4482 return task.getSnapshot(reducedResolution, restoreFromDisk);
4483 }
4484
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004485 @Override
4486 public void setDisablePreviewScreenshots(IBinder token, boolean disable) {
4487 synchronized (mGlobalLock) {
4488 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
4489 if (r == null) {
4490 Slog.w(TAG, "setDisablePreviewScreenshots: Unable to find activity for token="
4491 + token);
4492 return;
4493 }
4494 final long origId = Binder.clearCallingIdentity();
4495 try {
4496 r.setDisablePreviewScreenshots(disable);
4497 } finally {
4498 Binder.restoreCallingIdentity(origId);
4499 }
4500 }
4501 }
4502
4503 /** Return the user id of the last resumed activity. */
4504 @Override
4505 public @UserIdInt
4506 int getLastResumedActivityUserId() {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004507 mAmInternal.enforceCallingPermission(
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004508 Manifest.permission.INTERACT_ACROSS_USERS_FULL, "getLastResumedActivityUserId()");
4509 synchronized (mGlobalLock) {
Wale Ogunwalef6733932018-06-27 05:14:34 -07004510 if (mLastResumedActivity == null) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004511 return getCurrentUserId();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004512 }
Wale Ogunwale8b19de92018-11-29 19:58:26 -08004513 return mLastResumedActivity.mUserId;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004514 }
4515 }
4516
4517 @Override
4518 public void updateLockTaskFeatures(int userId, int flags) {
4519 final int callingUid = Binder.getCallingUid();
4520 if (callingUid != 0 && callingUid != SYSTEM_UID) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004521 mAmInternal.enforceCallingPermission(android.Manifest.permission.UPDATE_LOCK_TASK_PACKAGES,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004522 "updateLockTaskFeatures()");
4523 }
4524 synchronized (mGlobalLock) {
4525 if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, "Allowing features " + userId + ":0x" +
4526 Integer.toHexString(flags));
Wale Ogunwaled95c06b2018-05-08 10:35:38 -07004527 getLockTaskController().updateLockTaskFeatures(userId, flags);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004528 }
4529 }
4530
4531 @Override
4532 public void setShowWhenLocked(IBinder token, boolean showWhenLocked) {
4533 synchronized (mGlobalLock) {
4534 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
4535 if (r == null) {
4536 return;
4537 }
4538 final long origId = Binder.clearCallingIdentity();
4539 try {
4540 r.setShowWhenLocked(showWhenLocked);
4541 } finally {
4542 Binder.restoreCallingIdentity(origId);
4543 }
4544 }
4545 }
4546
4547 @Override
Issei Suzuki74e1eb22018-12-20 17:42:52 +01004548 public void setInheritShowWhenLocked(IBinder token, boolean inheritShowWhenLocked) {
4549 synchronized (mGlobalLock) {
4550 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
4551 if (r == null) {
4552 return;
4553 }
4554 final long origId = Binder.clearCallingIdentity();
4555 try {
4556 r.setInheritShowWhenLocked(inheritShowWhenLocked);
4557 } finally {
4558 Binder.restoreCallingIdentity(origId);
4559 }
4560 }
4561 }
4562
4563 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004564 public void setTurnScreenOn(IBinder token, boolean turnScreenOn) {
4565 synchronized (mGlobalLock) {
4566 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
4567 if (r == null) {
4568 return;
4569 }
4570 final long origId = Binder.clearCallingIdentity();
4571 try {
4572 r.setTurnScreenOn(turnScreenOn);
4573 } finally {
4574 Binder.restoreCallingIdentity(origId);
4575 }
4576 }
4577 }
4578
4579 @Override
4580 public void registerRemoteAnimations(IBinder token, RemoteAnimationDefinition definition) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004581 mAmInternal.enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004582 "registerRemoteAnimations");
4583 definition.setCallingPid(Binder.getCallingPid());
4584 synchronized (mGlobalLock) {
4585 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
4586 if (r == null) {
4587 return;
4588 }
4589 final long origId = Binder.clearCallingIdentity();
4590 try {
4591 r.registerRemoteAnimations(definition);
4592 } finally {
4593 Binder.restoreCallingIdentity(origId);
4594 }
4595 }
4596 }
4597
4598 @Override
4599 public void registerRemoteAnimationForNextActivityStart(String packageName,
4600 RemoteAnimationAdapter adapter) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004601 mAmInternal.enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004602 "registerRemoteAnimationForNextActivityStart");
4603 adapter.setCallingPid(Binder.getCallingPid());
4604 synchronized (mGlobalLock) {
4605 final long origId = Binder.clearCallingIdentity();
4606 try {
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07004607 getActivityStartController().registerRemoteAnimationForNextActivityStart(
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004608 packageName, adapter);
4609 } finally {
4610 Binder.restoreCallingIdentity(origId);
4611 }
4612 }
4613 }
4614
Evan Rosky966759f2019-01-15 10:33:58 -08004615 @Override
4616 public void registerRemoteAnimationsForDisplay(int displayId,
4617 RemoteAnimationDefinition definition) {
4618 mAmInternal.enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS,
4619 "registerRemoteAnimations");
4620 definition.setCallingPid(Binder.getCallingPid());
4621 synchronized (mGlobalLock) {
4622 final ActivityDisplay display = mRootActivityContainer.getActivityDisplay(displayId);
4623 if (display == null) {
4624 Slog.e(TAG, "Couldn't find display with id: " + displayId);
4625 return;
4626 }
4627 final long origId = Binder.clearCallingIdentity();
4628 try {
4629 display.mDisplayContent.registerRemoteAnimations(definition);
4630 } finally {
4631 Binder.restoreCallingIdentity(origId);
4632 }
4633 }
4634 }
4635
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004636 /** @see android.app.ActivityManager#alwaysShowUnsupportedCompileSdkWarning */
4637 @Override
4638 public void alwaysShowUnsupportedCompileSdkWarning(ComponentName activity) {
4639 synchronized (mGlobalLock) {
4640 final long origId = Binder.clearCallingIdentity();
4641 try {
Wale Ogunwale008163e2018-07-23 23:11:08 -07004642 mAppWarnings.alwaysShowUnsupportedCompileSdkWarning(activity);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004643 } finally {
4644 Binder.restoreCallingIdentity(origId);
4645 }
4646 }
4647 }
Wale Ogunwale6767eae2018-05-03 15:52:51 -07004648
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004649 @Override
4650 public void setVrThread(int tid) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004651 enforceSystemHasVrFeature();
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004652 synchronized (mGlobalLock) {
Wale Ogunwale342fbe92018-10-09 08:44:10 -07004653 final int pid = Binder.getCallingPid();
Michal Karpinski2e0aad22019-04-12 16:22:55 +01004654 final WindowProcessController wpc = mProcessMap.getProcess(pid);
Wale Ogunwale342fbe92018-10-09 08:44:10 -07004655 mVrController.setVrThreadLocked(tid, pid, wpc);
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004656 }
4657 }
4658
4659 @Override
4660 public void setPersistentVrThread(int tid) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004661 if (checkCallingPermission(Manifest.permission.RESTRICTED_VR_ACCESS)
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004662 != PERMISSION_GRANTED) {
4663 final String msg = "Permission Denial: setPersistentVrThread() from pid="
4664 + Binder.getCallingPid()
4665 + ", uid=" + Binder.getCallingUid()
4666 + " requires " + Manifest.permission.RESTRICTED_VR_ACCESS;
4667 Slog.w(TAG, msg);
4668 throw new SecurityException(msg);
4669 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004670 enforceSystemHasVrFeature();
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004671 synchronized (mGlobalLock) {
Wale Ogunwale342fbe92018-10-09 08:44:10 -07004672 final int pid = Binder.getCallingPid();
Michal Karpinski2e0aad22019-04-12 16:22:55 +01004673 final WindowProcessController proc = mProcessMap.getProcess(pid);
Wale Ogunwale342fbe92018-10-09 08:44:10 -07004674 mVrController.setPersistentVrThreadLocked(tid, pid, proc);
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004675 }
4676 }
4677
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004678 @Override
4679 public void stopAppSwitches() {
4680 enforceCallerIsRecentsOrHasPermission(STOP_APP_SWITCHES, "stopAppSwitches");
4681 synchronized (mGlobalLock) {
4682 mAppSwitchesAllowedTime = SystemClock.uptimeMillis() + APP_SWITCH_DELAY_TIME;
Ricky Wai906af482019-06-03 17:25:28 +01004683 mLastStopAppSwitchesTime = SystemClock.uptimeMillis();
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004684 mDidAppSwitch = false;
4685 getActivityStartController().schedulePendingActivityLaunches(APP_SWITCH_DELAY_TIME);
4686 }
4687 }
4688
4689 @Override
4690 public void resumeAppSwitches() {
4691 enforceCallerIsRecentsOrHasPermission(STOP_APP_SWITCHES, "resumeAppSwitches");
4692 synchronized (mGlobalLock) {
4693 // Note that we don't execute any pending app switches... we will
4694 // let those wait until either the timeout, or the next start
4695 // activity request.
4696 mAppSwitchesAllowedTime = 0;
4697 }
4698 }
4699
Ricky Wai906af482019-06-03 17:25:28 +01004700 long getLastStopAppSwitchesTime() {
4701 return mLastStopAppSwitchesTime;
4702 }
4703
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004704 void onStartActivitySetDidAppSwitch() {
4705 if (mDidAppSwitch) {
4706 // This is the second allowed switch since we stopped switches, so now just generally
4707 // allow switches. Use case:
4708 // - user presses home (switches disabled, switch to home, mDidAppSwitch now true);
4709 // - user taps a home icon (coming from home so allowed, we hit here and now allow
4710 // anyone to switch again).
4711 mAppSwitchesAllowedTime = 0;
4712 } else {
4713 mDidAppSwitch = true;
4714 }
4715 }
4716
4717 /** @return whether the system should disable UI modes incompatible with VR mode. */
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004718 boolean shouldDisableNonVrUiLocked() {
4719 return mVrController.shouldDisableNonVrUiLocked();
4720 }
4721
Wale Ogunwale53783742018-09-16 10:21:51 -07004722 private void applyUpdateVrModeLocked(ActivityRecord r) {
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004723 // 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 +00004724 // itself, but isn't on the main display, then move it there before enabling VR Mode.
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004725 if (r.requestedVrComponent != null && r.getDisplayId() != DEFAULT_DISPLAY) {
Wale Ogunwaleb8e6b632019-06-28 15:19:25 +00004726 Slog.i(TAG, "Moving " + r.shortComponentName + " from display " + r.getDisplayId()
4727 + " to main display for VR");
4728 mRootActivityContainer.moveStackToDisplay(
4729 r.getStackId(), DEFAULT_DISPLAY, true /* toTop */);
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004730 }
4731 mH.post(() -> {
4732 if (!mVrController.onVrModeChanged(r)) {
4733 return;
4734 }
4735 synchronized (mGlobalLock) {
4736 final boolean disableNonVrUi = mVrController.shouldDisableNonVrUiLocked();
4737 mWindowManager.disableNonVrUi(disableNonVrUi);
4738 if (disableNonVrUi) {
4739 // If we are in a VR mode where Picture-in-Picture mode is unsupported,
4740 // then remove the pinned stack.
Wale Ogunwaled32da472018-11-16 07:19:28 -08004741 mRootActivityContainer.removeStacksInWindowingModes(WINDOWING_MODE_PINNED);
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004742 }
4743 }
4744 });
4745 }
4746
Wale Ogunwale53783742018-09-16 10:21:51 -07004747 @Override
4748 public int getPackageScreenCompatMode(String packageName) {
4749 enforceNotIsolatedCaller("getPackageScreenCompatMode");
4750 synchronized (mGlobalLock) {
4751 return mCompatModePackages.getPackageScreenCompatModeLocked(packageName);
4752 }
4753 }
4754
4755 @Override
4756 public void setPackageScreenCompatMode(String packageName, int mode) {
4757 mAmInternal.enforceCallingPermission(android.Manifest.permission.SET_SCREEN_COMPATIBILITY,
4758 "setPackageScreenCompatMode");
4759 synchronized (mGlobalLock) {
4760 mCompatModePackages.setPackageScreenCompatModeLocked(packageName, mode);
4761 }
4762 }
4763
4764 @Override
4765 public boolean getPackageAskScreenCompat(String packageName) {
4766 enforceNotIsolatedCaller("getPackageAskScreenCompat");
4767 synchronized (mGlobalLock) {
4768 return mCompatModePackages.getPackageAskCompatModeLocked(packageName);
4769 }
4770 }
4771
4772 @Override
4773 public void setPackageAskScreenCompat(String packageName, boolean ask) {
4774 mAmInternal.enforceCallingPermission(android.Manifest.permission.SET_SCREEN_COMPATIBILITY,
4775 "setPackageAskScreenCompat");
4776 synchronized (mGlobalLock) {
4777 mCompatModePackages.setPackageAskCompatModeLocked(packageName, ask);
4778 }
4779 }
4780
Wale Ogunwale64258362018-10-16 15:13:37 -07004781 public static String relaunchReasonToString(int relaunchReason) {
4782 switch (relaunchReason) {
4783 case RELAUNCH_REASON_WINDOWING_MODE_RESIZE:
4784 return "window_resize";
4785 case RELAUNCH_REASON_FREE_RESIZE:
4786 return "free_resize";
4787 default:
4788 return null;
4789 }
4790 }
4791
Andrii Kulian5f750bc2018-07-17 08:57:23 -07004792 ActivityStack getTopDisplayFocusedStack() {
Wale Ogunwaled32da472018-11-16 07:19:28 -08004793 return mRootActivityContainer.getTopDisplayFocusedStack();
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004794 }
4795
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004796 /** Pokes the task persister. */
4797 void notifyTaskPersisterLocked(TaskRecord task, boolean flush) {
4798 mRecentTasks.notifyTaskPersisterLocked(task, flush);
4799 }
4800
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004801 boolean isKeyguardLocked() {
4802 return mKeyguardController.isKeyguardLocked();
4803 }
4804
Garfield Tan01548632018-11-27 10:15:48 -08004805 /**
4806 * Clears launch params for the given package.
4807 * @param packageNames the names of the packages of which the launch params are to be cleared
4808 */
4809 @Override
4810 public void clearLaunchParamsForPackages(List<String> packageNames) {
4811 mAmInternal.enforceCallingPermission(Manifest.permission.MANAGE_ACTIVITY_STACKS,
4812 "clearLaunchParamsForPackages");
4813 synchronized (mGlobalLock) {
4814 for (int i = 0; i < packageNames.size(); ++i) {
4815 mStackSupervisor.mLaunchParamsPersister.removeRecordForPackage(packageNames.get(i));
4816 }
4817 }
4818 }
4819
Wale Ogunwale9e737db2018-12-17 15:42:37 -08004820 /**
4821 * Makes the display with the given id a single task instance display. I.e the display can only
4822 * contain one task.
4823 */
4824 @Override
4825 public void setDisplayToSingleTaskInstance(int displayId) {
4826 mAmInternal.enforceCallingPermission(Manifest.permission.MANAGE_ACTIVITY_STACKS,
4827 "setDisplayToSingleTaskInstance");
4828 final long origId = Binder.clearCallingIdentity();
4829 try {
4830 final ActivityDisplay display =
4831 mRootActivityContainer.getActivityDisplayOrCreate(displayId);
4832 if (display != null) {
4833 display.setDisplayToSingleTaskInstance();
4834 }
4835 } finally {
4836 Binder.restoreCallingIdentity(origId);
4837 }
4838 }
4839
Wale Ogunwale31913b52018-10-13 08:29:31 -07004840 void dumpLastANRLocked(PrintWriter pw) {
4841 pw.println("ACTIVITY MANAGER LAST ANR (dumpsys activity lastanr)");
4842 if (mLastANRState == null) {
4843 pw.println(" <no ANR has occurred since boot>");
4844 } else {
4845 pw.println(mLastANRState);
4846 }
4847 }
4848
4849 void dumpLastANRTracesLocked(PrintWriter pw) {
4850 pw.println("ACTIVITY MANAGER LAST ANR TRACES (dumpsys activity lastanr-traces)");
4851
4852 final File[] files = new File(ANR_TRACE_DIR).listFiles();
4853 if (ArrayUtils.isEmpty(files)) {
4854 pw.println(" <no ANR has occurred since boot>");
4855 return;
4856 }
4857 // Find the latest file.
4858 File latest = null;
4859 for (File f : files) {
4860 if ((latest == null) || (latest.lastModified() < f.lastModified())) {
4861 latest = f;
Wale Ogunwalef6733932018-06-27 05:14:34 -07004862 }
Wale Ogunwale31913b52018-10-13 08:29:31 -07004863 }
4864 pw.print("File: ");
4865 pw.print(latest.getName());
4866 pw.println();
4867 try (BufferedReader in = new BufferedReader(new FileReader(latest))) {
4868 String line;
4869 while ((line = in.readLine()) != null) {
4870 pw.println(line);
4871 }
4872 } catch (IOException e) {
4873 pw.print("Unable to read: ");
4874 pw.print(e);
4875 pw.println();
4876 }
4877 }
4878
4879 void dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, String[] args,
4880 int opti, boolean dumpAll, boolean dumpClient, String dumpPackage) {
4881 dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage,
4882 "ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)");
4883 }
4884
4885 void dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, String[] args,
4886 int opti, boolean dumpAll, boolean dumpClient, String dumpPackage, String header) {
4887 pw.println(header);
4888
Wale Ogunwaled32da472018-11-16 07:19:28 -08004889 boolean printedAnything = mRootActivityContainer.dumpActivities(fd, pw, dumpAll, dumpClient,
Wale Ogunwale31913b52018-10-13 08:29:31 -07004890 dumpPackage);
4891 boolean needSep = printedAnything;
4892
4893 boolean printed = ActivityStackSupervisor.printThisActivity(pw,
Wale Ogunwaled32da472018-11-16 07:19:28 -08004894 mRootActivityContainer.getTopResumedActivity(), dumpPackage, needSep,
Wale Ogunwale31913b52018-10-13 08:29:31 -07004895 " ResumedActivity: ");
4896 if (printed) {
4897 printedAnything = true;
4898 needSep = false;
4899 }
4900
4901 if (dumpPackage == null) {
4902 if (needSep) {
4903 pw.println();
4904 }
4905 printedAnything = true;
4906 mStackSupervisor.dump(pw, " ");
4907 }
4908
4909 if (!printedAnything) {
4910 pw.println(" (nothing)");
4911 }
4912 }
4913
4914 void dumpActivityContainersLocked(PrintWriter pw) {
Jeff Changde322732019-07-12 12:16:23 +08004915 pw.println("ACTIVITY MANAGER CONTAINERS (dumpsys activity containers)");
Wale Ogunwaled32da472018-11-16 07:19:28 -08004916 mRootActivityContainer.dumpChildrenNames(pw, " ");
Wale Ogunwale31913b52018-10-13 08:29:31 -07004917 pw.println(" ");
4918 }
4919
4920 void dumpActivityStarterLocked(PrintWriter pw, String dumpPackage) {
4921 pw.println("ACTIVITY MANAGER STARTER (dumpsys activity starter)");
4922 getActivityStartController().dump(pw, "", dumpPackage);
4923 }
4924
4925 /**
4926 * There are three things that cmd can be:
4927 * - a flattened component name that matches an existing activity
4928 * - the cmd arg isn't the flattened component name of an existing activity:
4929 * dump all activity whose component contains the cmd as a substring
4930 * - A hex number of the ActivityRecord object instance.
4931 *
4932 * @param dumpVisibleStacksOnly dump activity with {@param name} only if in a visible stack
4933 * @param dumpFocusedStackOnly dump activity with {@param name} only if in the focused stack
4934 */
4935 protected boolean dumpActivity(FileDescriptor fd, PrintWriter pw, String name, String[] args,
4936 int opti, boolean dumpAll, boolean dumpVisibleStacksOnly, boolean dumpFocusedStackOnly) {
4937 ArrayList<ActivityRecord> activities;
4938
4939 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08004940 activities = mRootActivityContainer.getDumpActivities(name, dumpVisibleStacksOnly,
Wale Ogunwale31913b52018-10-13 08:29:31 -07004941 dumpFocusedStackOnly);
4942 }
4943
4944 if (activities.size() <= 0) {
4945 return false;
4946 }
4947
4948 String[] newArgs = new String[args.length - opti];
4949 System.arraycopy(args, opti, newArgs, 0, args.length - opti);
4950
4951 TaskRecord lastTask = null;
4952 boolean needSep = false;
4953 for (int i = activities.size() - 1; i >= 0; i--) {
4954 ActivityRecord r = activities.get(i);
4955 if (needSep) {
4956 pw.println();
4957 }
4958 needSep = true;
4959 synchronized (mGlobalLock) {
Wale Ogunwale8b19de92018-11-29 19:58:26 -08004960 final TaskRecord task = r.getTaskRecord();
Wale Ogunwale31913b52018-10-13 08:29:31 -07004961 if (lastTask != task) {
4962 lastTask = task;
4963 pw.print("TASK "); pw.print(lastTask.affinity);
4964 pw.print(" id="); pw.print(lastTask.taskId);
4965 pw.print(" userId="); pw.println(lastTask.userId);
4966 if (dumpAll) {
4967 lastTask.dump(pw, " ");
4968 }
4969 }
4970 }
4971 dumpActivity(" ", fd, pw, activities.get(i), newArgs, dumpAll);
4972 }
4973 return true;
4974 }
4975
4976 /**
4977 * Invokes IApplicationThread.dumpActivity() on the thread of the specified activity if
4978 * there is a thread associated with the activity.
4979 */
4980 private void dumpActivity(String prefix, FileDescriptor fd, PrintWriter pw,
4981 final ActivityRecord r, String[] args, boolean dumpAll) {
4982 String innerPrefix = prefix + " ";
4983 synchronized (mGlobalLock) {
4984 pw.print(prefix); pw.print("ACTIVITY "); pw.print(r.shortComponentName);
4985 pw.print(" "); pw.print(Integer.toHexString(System.identityHashCode(r)));
4986 pw.print(" pid=");
4987 if (r.hasProcess()) pw.println(r.app.getPid());
4988 else pw.println("(not running)");
4989 if (dumpAll) {
4990 r.dump(pw, innerPrefix);
4991 }
4992 }
4993 if (r.attachedToProcess()) {
4994 // flush anything that is already in the PrintWriter since the thread is going
4995 // to write to the file descriptor directly
4996 pw.flush();
4997 try {
4998 TransferPipe tp = new TransferPipe();
4999 try {
5000 r.app.getThread().dumpActivity(tp.getWriteFd(),
5001 r.appToken, innerPrefix, args);
5002 tp.go(fd);
5003 } finally {
5004 tp.kill();
5005 }
5006 } catch (IOException e) {
5007 pw.println(innerPrefix + "Failure while dumping the activity: " + e);
5008 } catch (RemoteException e) {
5009 pw.println(innerPrefix + "Got a RemoteException while dumping the activity");
5010 }
Wale Ogunwalef6733932018-06-27 05:14:34 -07005011 }
Wale Ogunwaled0412b32018-05-08 09:25:50 -07005012 }
5013
sanryhuang498e77e2018-12-06 14:57:01 +08005014 private void writeSleepStateToProto(ProtoOutputStream proto, int wakeFullness,
5015 boolean testPssMode) {
5016 final long sleepToken = proto.start(ActivityManagerServiceDumpProcessesProto.SLEEP_STATUS);
5017 proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.WAKEFULNESS,
5018 PowerManagerInternal.wakefulnessToProtoEnum(wakeFullness));
Wale Ogunwaled32da472018-11-16 07:19:28 -08005019 for (ActivityTaskManagerInternal.SleepToken st : mRootActivityContainer.mSleepTokens) {
Wale Ogunwalef6733932018-06-27 05:14:34 -07005020 proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SLEEP_TOKENS,
5021 st.toString());
5022 }
Wale Ogunwalef6733932018-06-27 05:14:34 -07005023 proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SLEEPING, mSleeping);
5024 proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SHUTTING_DOWN,
5025 mShuttingDown);
sanryhuang498e77e2018-12-06 14:57:01 +08005026 proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.TEST_PSS_MODE,
5027 testPssMode);
5028 proto.end(sleepToken);
Wale Ogunwaled0412b32018-05-08 09:25:50 -07005029 }
5030
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005031 int getCurrentUserId() {
5032 return mAmInternal.getCurrentUserId();
5033 }
5034
5035 private void enforceNotIsolatedCaller(String caller) {
5036 if (UserHandle.isIsolated(Binder.getCallingUid())) {
5037 throw new SecurityException("Isolated process not allowed to call " + caller);
5038 }
5039 }
5040
Wale Ogunwalef6733932018-06-27 05:14:34 -07005041 public Configuration getConfiguration() {
5042 Configuration ci;
5043 synchronized(mGlobalLock) {
Yunfan Chen75157d72018-07-27 14:47:21 +09005044 ci = new Configuration(getGlobalConfigurationForCallingPid());
Wale Ogunwalef6733932018-06-27 05:14:34 -07005045 ci.userSetLocale = false;
5046 }
5047 return ci;
5048 }
5049
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005050 /**
5051 * Current global configuration information. Contains general settings for the entire system,
5052 * also corresponds to the merged configuration of the default display.
5053 */
5054 Configuration getGlobalConfiguration() {
Wale Ogunwaled32da472018-11-16 07:19:28 -08005055 return mRootActivityContainer.getConfiguration();
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005056 }
5057
5058 boolean updateConfigurationLocked(Configuration values, ActivityRecord starting,
5059 boolean initLocale) {
5060 return updateConfigurationLocked(values, starting, initLocale, false /* deferResume */);
5061 }
5062
5063 boolean updateConfigurationLocked(Configuration values, ActivityRecord starting,
5064 boolean initLocale, boolean deferResume) {
5065 // pass UserHandle.USER_NULL as userId because we don't persist configuration for any user
5066 return updateConfigurationLocked(values, starting, initLocale, false /* persistent */,
5067 UserHandle.USER_NULL, deferResume);
5068 }
5069
Wale Ogunwale59507092018-10-29 09:00:30 -07005070 public void updatePersistentConfiguration(Configuration values, @UserIdInt int userId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005071 final long origId = Binder.clearCallingIdentity();
5072 try {
5073 synchronized (mGlobalLock) {
5074 updateConfigurationLocked(values, null, false, true, userId,
5075 false /* deferResume */);
5076 }
5077 } finally {
5078 Binder.restoreCallingIdentity(origId);
5079 }
5080 }
5081
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005082 private boolean updateConfigurationLocked(Configuration values, ActivityRecord starting,
5083 boolean initLocale, boolean persistent, int userId, boolean deferResume) {
5084 return updateConfigurationLocked(values, starting, initLocale, persistent, userId,
5085 deferResume, null /* result */);
5086 }
5087
5088 /**
5089 * Do either or both things: (1) change the current configuration, and (2)
5090 * make sure the given activity is running with the (now) current
5091 * configuration. Returns true if the activity has been left running, or
5092 * false if <var>starting</var> is being destroyed to match the new
5093 * configuration.
5094 *
5095 * @param userId is only used when persistent parameter is set to true to persist configuration
5096 * for that particular user
5097 */
5098 boolean updateConfigurationLocked(Configuration values, ActivityRecord starting,
5099 boolean initLocale, boolean persistent, int userId, boolean deferResume,
5100 ActivityTaskManagerService.UpdateConfigurationResult result) {
5101 int changes = 0;
5102 boolean kept = true;
5103
5104 if (mWindowManager != null) {
5105 mWindowManager.deferSurfaceLayout();
5106 }
5107 try {
5108 if (values != null) {
5109 changes = updateGlobalConfigurationLocked(values, initLocale, persistent, userId,
5110 deferResume);
5111 }
5112
5113 kept = ensureConfigAndVisibilityAfterUpdate(starting, changes);
5114 } finally {
5115 if (mWindowManager != null) {
5116 mWindowManager.continueSurfaceLayout();
5117 }
5118 }
5119
5120 if (result != null) {
5121 result.changes = changes;
5122 result.activityRelaunched = !kept;
5123 }
5124 return kept;
5125 }
5126
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005127 /** Update default (global) configuration and notify listeners about changes. */
Shivam Agrawal1d3db652019-07-01 15:26:11 -07005128 int updateGlobalConfigurationLocked(@NonNull Configuration values, boolean initLocale,
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005129 boolean persistent, int userId, boolean deferResume) {
Shivam Agrawal1d3db652019-07-01 15:26:11 -07005130
5131 final ActivityDisplay defaultDisplay =
5132 mRootActivityContainer.getActivityDisplay(DEFAULT_DISPLAY);
5133
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005134 mTempConfig.setTo(getGlobalConfiguration());
5135 final int changes = mTempConfig.updateFrom(values);
5136 if (changes == 0) {
5137 // Since calling to Activity.setRequestedOrientation leads to freezing the window with
5138 // setting WindowManagerService.mWaitingForConfig to true, it is important that we call
5139 // performDisplayOverrideConfigUpdate in order to send the new display configuration
5140 // (even if there are no actual changes) to unfreeze the window.
Shivam Agrawal1d3db652019-07-01 15:26:11 -07005141 defaultDisplay.performDisplayOverrideConfigUpdate(values, deferResume);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005142 return 0;
5143 }
5144
5145 if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.i(TAG_CONFIGURATION,
5146 "Updating global configuration to: " + values);
5147
5148 EventLog.writeEvent(EventLogTags.CONFIGURATION_CHANGED, changes);
5149 StatsLog.write(StatsLog.RESOURCE_CONFIGURATION_CHANGED,
5150 values.colorMode,
5151 values.densityDpi,
5152 values.fontScale,
5153 values.hardKeyboardHidden,
5154 values.keyboard,
5155 values.keyboardHidden,
5156 values.mcc,
5157 values.mnc,
5158 values.navigation,
5159 values.navigationHidden,
5160 values.orientation,
5161 values.screenHeightDp,
5162 values.screenLayout,
5163 values.screenWidthDp,
5164 values.smallestScreenWidthDp,
5165 values.touchscreen,
5166 values.uiMode);
5167
5168
5169 if (!initLocale && !values.getLocales().isEmpty() && values.userSetLocale) {
5170 final LocaleList locales = values.getLocales();
5171 int bestLocaleIndex = 0;
5172 if (locales.size() > 1) {
5173 if (mSupportedSystemLocales == null) {
5174 mSupportedSystemLocales = Resources.getSystem().getAssets().getLocales();
5175 }
5176 bestLocaleIndex = Math.max(0, locales.getFirstMatchIndex(mSupportedSystemLocales));
5177 }
5178 SystemProperties.set("persist.sys.locale",
5179 locales.get(bestLocaleIndex).toLanguageTag());
5180 LocaleList.setDefault(locales, bestLocaleIndex);
Wale Ogunwale342fbe92018-10-09 08:44:10 -07005181
5182 final Message m = PooledLambda.obtainMessage(
5183 ActivityTaskManagerService::sendLocaleToMountDaemonMsg, this,
5184 locales.get(bestLocaleIndex));
5185 mH.sendMessage(m);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005186 }
5187
Yunfan Chen75157d72018-07-27 14:47:21 +09005188 mTempConfig.seq = increaseConfigurationSeqLocked();
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005189
5190 // Update stored global config and notify everyone about the change.
Wale Ogunwaled32da472018-11-16 07:19:28 -08005191 mRootActivityContainer.onConfigurationChanged(mTempConfig);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005192
5193 Slog.i(TAG, "Config changes=" + Integer.toHexString(changes) + " " + mTempConfig);
5194 // TODO(multi-display): Update UsageEvents#Event to include displayId.
Wale Ogunwale342fbe92018-10-09 08:44:10 -07005195 mUsageStatsInternal.reportConfigurationChange(mTempConfig, mAmInternal.getCurrentUserId());
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005196
5197 // TODO: If our config changes, should we auto dismiss any currently showing dialogs?
Wale Ogunwalef6733932018-06-27 05:14:34 -07005198 updateShouldShowDialogsLocked(mTempConfig);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005199
5200 AttributeCache ac = AttributeCache.instance();
5201 if (ac != null) {
5202 ac.updateConfiguration(mTempConfig);
5203 }
5204
5205 // Make sure all resources in our process are updated right now, so that anyone who is going
5206 // to retrieve resource values after we return will be sure to get the new ones. This is
5207 // especially important during boot, where the first config change needs to guarantee all
5208 // resources have that config before following boot code is executed.
Wale Ogunwale342fbe92018-10-09 08:44:10 -07005209 mSystemThread.applyConfigurationToResources(mTempConfig);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005210
5211 // We need another copy of global config because we're scheduling some calls instead of
5212 // running them in place. We need to be sure that object we send will be handled unchanged.
5213 final Configuration configCopy = new Configuration(mTempConfig);
5214 if (persistent && Settings.System.hasInterestingConfigurationChanges(changes)) {
Wale Ogunwale342fbe92018-10-09 08:44:10 -07005215 final Message msg = PooledLambda.obtainMessage(
5216 ActivityTaskManagerService::sendPutConfigurationForUserMsg,
5217 this, userId, configCopy);
5218 mH.sendMessage(msg);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005219 }
5220
Michal Karpinski2e0aad22019-04-12 16:22:55 +01005221 SparseArray<WindowProcessController> pidMap = mProcessMap.getPidMap();
5222 for (int i = pidMap.size() - 1; i >= 0; i--) {
5223 final int pid = pidMap.keyAt(i);
5224 final WindowProcessController app = pidMap.get(pid);
Yunfan Chen34fcc7a2018-10-11 16:26:09 -07005225 if (DEBUG_CONFIGURATION) {
5226 Slog.v(TAG_CONFIGURATION, "Update process config of "
5227 + app.mName + " to new config " + configCopy);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005228 }
Yunfan Chen34fcc7a2018-10-11 16:26:09 -07005229 app.onConfigurationChanged(configCopy);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005230 }
5231
Wale Ogunwale2ea36d42018-10-18 10:27:31 -07005232 final Message msg = PooledLambda.obtainMessage(
5233 ActivityManagerInternal::broadcastGlobalConfigurationChanged,
5234 mAmInternal, changes, initLocale);
5235 mH.sendMessage(msg);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005236
5237 // Override configuration of the default display duplicates global config, so we need to
5238 // update it also. This will also notify WindowManager about changes.
Shivam Agrawal1d3db652019-07-01 15:26:11 -07005239 defaultDisplay.performDisplayOverrideConfigUpdate(mRootActivityContainer.getConfiguration(),
5240 deferResume);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005241
5242 return changes;
5243 }
5244
Wale Ogunwalef6733932018-06-27 05:14:34 -07005245 private void updateEventDispatchingLocked(boolean booted) {
5246 mWindowManager.setEventDispatching(booted && !mShuttingDown);
5247 }
5248
Wale Ogunwale342fbe92018-10-09 08:44:10 -07005249 private void sendPutConfigurationForUserMsg(int userId, Configuration config) {
5250 final ContentResolver resolver = mContext.getContentResolver();
5251 Settings.System.putConfigurationForUser(resolver, config, userId);
5252 }
5253
5254 private void sendLocaleToMountDaemonMsg(Locale l) {
5255 try {
5256 IBinder service = ServiceManager.getService("mount");
5257 IStorageManager storageManager = IStorageManager.Stub.asInterface(service);
5258 Log.d(TAG, "Storing locale " + l.toLanguageTag() + " for decryption UI");
5259 storageManager.setField(StorageManager.SYSTEM_LOCALE_KEY, l.toLanguageTag());
5260 } catch (RemoteException e) {
5261 Log.e(TAG, "Error storing locale for decryption UI", e);
5262 }
5263 }
5264
Alison Cichowlas3e340502018-08-07 17:15:01 -04005265 private void expireStartAsCallerTokenMsg(IBinder permissionToken) {
5266 mStartActivitySources.remove(permissionToken);
5267 mExpiredStartAsCallerTokens.add(permissionToken);
5268 }
5269
5270 private void forgetStartAsCallerTokenMsg(IBinder permissionToken) {
5271 mExpiredStartAsCallerTokens.remove(permissionToken);
5272 }
5273
Wale Ogunwale342fbe92018-10-09 08:44:10 -07005274 boolean isActivityStartsLoggingEnabled() {
5275 return mAmInternal.isActivityStartsLoggingEnabled();
5276 }
5277
Michal Karpinski8596ded2018-11-14 14:43:48 +00005278 boolean isBackgroundActivityStartsEnabled() {
5279 return mAmInternal.isBackgroundActivityStartsEnabled();
5280 }
5281
Wale Ogunwalef6733932018-06-27 05:14:34 -07005282 void enableScreenAfterBoot(boolean booted) {
5283 EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_ENABLE_SCREEN,
5284 SystemClock.uptimeMillis());
5285 mWindowManager.enableScreenAfterBoot();
5286
5287 synchronized (mGlobalLock) {
5288 updateEventDispatchingLocked(booted);
5289 }
5290 }
5291
Wale Ogunwale906f9c62018-07-23 11:23:44 -07005292 static long getInputDispatchingTimeoutLocked(ActivityRecord r) {
5293 if (r == null || !r.hasProcess()) {
5294 return KEY_DISPATCHING_TIMEOUT_MS;
5295 }
5296 return getInputDispatchingTimeoutLocked(r.app);
5297 }
5298
5299 private static long getInputDispatchingTimeoutLocked(WindowProcessController r) {
Wale Ogunwale51cc98a2018-10-15 10:41:05 -07005300 return r != null ? r.getInputDispatchingTimeout() : KEY_DISPATCHING_TIMEOUT_MS;
Wale Ogunwale906f9c62018-07-23 11:23:44 -07005301 }
5302
Wale Ogunwalef6733932018-06-27 05:14:34 -07005303 /**
5304 * Decide based on the configuration whether we should show the ANR,
5305 * crash, etc dialogs. The idea is that if there is no affordance to
5306 * press the on-screen buttons, or the user experience would be more
5307 * greatly impacted than the crash itself, we shouldn't show the dialog.
5308 *
5309 * A thought: SystemUI might also want to get told about this, the Power
5310 * dialog / global actions also might want different behaviors.
5311 */
5312 private void updateShouldShowDialogsLocked(Configuration config) {
5313 final boolean inputMethodExists = !(config.keyboard == Configuration.KEYBOARD_NOKEYS
5314 && config.touchscreen == Configuration.TOUCHSCREEN_NOTOUCH
5315 && config.navigation == Configuration.NAVIGATION_NONAV);
5316 int modeType = config.uiMode & Configuration.UI_MODE_TYPE_MASK;
5317 final boolean uiModeSupportsDialogs = (modeType != Configuration.UI_MODE_TYPE_CAR
5318 && !(modeType == Configuration.UI_MODE_TYPE_WATCH && Build.IS_USER)
5319 && modeType != Configuration.UI_MODE_TYPE_TELEVISION
5320 && modeType != Configuration.UI_MODE_TYPE_VR_HEADSET);
5321 final boolean hideDialogsSet = Settings.Global.getInt(mContext.getContentResolver(),
5322 HIDE_ERROR_DIALOGS, 0) != 0;
5323 mShowDialogs = inputMethodExists && uiModeSupportsDialogs && !hideDialogsSet;
5324 }
5325
5326 private void updateFontScaleIfNeeded(@UserIdInt int userId) {
5327 final float scaleFactor = Settings.System.getFloatForUser(mContext.getContentResolver(),
5328 FONT_SCALE, 1.0f, userId);
5329
5330 synchronized (this) {
5331 if (getGlobalConfiguration().fontScale == scaleFactor) {
5332 return;
5333 }
5334
5335 final Configuration configuration
5336 = mWindowManager.computeNewConfiguration(DEFAULT_DISPLAY);
5337 configuration.fontScale = scaleFactor;
5338 updatePersistentConfiguration(configuration, userId);
5339 }
5340 }
5341
5342 // Actually is sleeping or shutting down or whatever else in the future
5343 // is an inactive state.
5344 boolean isSleepingOrShuttingDownLocked() {
5345 return isSleepingLocked() || mShuttingDown;
5346 }
5347
5348 boolean isSleepingLocked() {
5349 return mSleeping;
5350 }
5351
Riddle Hsu16567132018-08-16 21:37:47 +08005352 /** Update AMS states when an activity is resumed. */
Wale Ogunwalef6733932018-06-27 05:14:34 -07005353 void setResumedActivityUncheckLocked(ActivityRecord r, String reason) {
Wale Ogunwale8b19de92018-11-29 19:58:26 -08005354 final TaskRecord task = r.getTaskRecord();
Wale Ogunwalef6733932018-06-27 05:14:34 -07005355 if (task.isActivityTypeStandard()) {
5356 if (mCurAppTimeTracker != r.appTimeTracker) {
5357 // We are switching app tracking. Complete the current one.
5358 if (mCurAppTimeTracker != null) {
5359 mCurAppTimeTracker.stop();
5360 mH.obtainMessage(
5361 REPORT_TIME_TRACKER_MSG, mCurAppTimeTracker).sendToTarget();
Wale Ogunwaled32da472018-11-16 07:19:28 -08005362 mRootActivityContainer.clearOtherAppTimeTrackers(r.appTimeTracker);
Wale Ogunwalef6733932018-06-27 05:14:34 -07005363 mCurAppTimeTracker = null;
5364 }
5365 if (r.appTimeTracker != null) {
5366 mCurAppTimeTracker = r.appTimeTracker;
5367 startTimeTrackingFocusedActivityLocked();
5368 }
5369 } else {
5370 startTimeTrackingFocusedActivityLocked();
5371 }
5372 } else {
5373 r.appTimeTracker = null;
5374 }
5375 // TODO: VI Maybe r.task.voiceInteractor || r.voiceInteractor != null
5376 // TODO: Probably not, because we don't want to resume voice on switching
5377 // back to this activity
5378 if (task.voiceInteractor != null) {
5379 startRunningVoiceLocked(task.voiceSession, r.info.applicationInfo.uid);
5380 } else {
5381 finishRunningVoiceLocked();
5382
5383 if (mLastResumedActivity != null) {
5384 final IVoiceInteractionSession session;
5385
Wale Ogunwale8b19de92018-11-29 19:58:26 -08005386 final TaskRecord lastResumedActivityTask = mLastResumedActivity.getTaskRecord();
Wale Ogunwalef6733932018-06-27 05:14:34 -07005387 if (lastResumedActivityTask != null
5388 && lastResumedActivityTask.voiceSession != null) {
5389 session = lastResumedActivityTask.voiceSession;
5390 } else {
5391 session = mLastResumedActivity.voiceSession;
5392 }
5393
5394 if (session != null) {
5395 // We had been in a voice interaction session, but now focused has
5396 // move to something different. Just finish the session, we can't
5397 // return to it and retain the proper state and synchronization with
5398 // the voice interaction service.
5399 finishVoiceTask(session);
5400 }
5401 }
5402 }
5403
Wale Ogunwale8b19de92018-11-29 19:58:26 -08005404 if (mLastResumedActivity != null && r.mUserId != mLastResumedActivity.mUserId) {
5405 mAmInternal.sendForegroundProfileChanged(r.mUserId);
Wale Ogunwalef6733932018-06-27 05:14:34 -07005406 }
5407 updateResumedAppTrace(r);
5408 mLastResumedActivity = r;
5409
Tiger Huang1e5b10a2018-07-30 20:19:51 +08005410 r.getDisplay().setFocusedApp(r, true);
Wale Ogunwalef6733932018-06-27 05:14:34 -07005411
5412 applyUpdateLockStateLocked(r);
5413 applyUpdateVrModeLocked(r);
5414
5415 EventLogTags.writeAmSetResumedActivity(
Wale Ogunwale8b19de92018-11-29 19:58:26 -08005416 r == null ? -1 : r.mUserId,
Wale Ogunwalef6733932018-06-27 05:14:34 -07005417 r == null ? "NULL" : r.shortComponentName,
5418 reason);
5419 }
5420
5421 ActivityTaskManagerInternal.SleepToken acquireSleepToken(String tag, int displayId) {
5422 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08005423 final ActivityTaskManagerInternal.SleepToken token =
5424 mRootActivityContainer.createSleepToken(tag, displayId);
Wale Ogunwalef6733932018-06-27 05:14:34 -07005425 updateSleepIfNeededLocked();
5426 return token;
5427 }
5428 }
5429
5430 void updateSleepIfNeededLocked() {
Wale Ogunwaled32da472018-11-16 07:19:28 -08005431 final boolean shouldSleep = !mRootActivityContainer.hasAwakeDisplay();
Wale Ogunwalef6733932018-06-27 05:14:34 -07005432 final boolean wasSleeping = mSleeping;
5433 boolean updateOomAdj = false;
5434
5435 if (!shouldSleep) {
5436 // If wasSleeping is true, we need to wake up activity manager state from when
5437 // we started sleeping. In either case, we need to apply the sleep tokens, which
5438 // will wake up stacks or put them to sleep as appropriate.
5439 if (wasSleeping) {
5440 mSleeping = false;
Chenjie Yubd1a28f2018-07-17 14:55:19 -07005441 StatsLog.write(StatsLog.ACTIVITY_MANAGER_SLEEP_STATE_CHANGED,
5442 StatsLog.ACTIVITY_MANAGER_SLEEP_STATE_CHANGED__STATE__AWAKE);
Wale Ogunwalef6733932018-06-27 05:14:34 -07005443 startTimeTrackingFocusedActivityLocked();
5444 mTopProcessState = ActivityManager.PROCESS_STATE_TOP;
Varun Shah98694fb2019-04-11 09:28:27 -07005445 Slog.d(TAG, "Top Process State changed to PROCESS_STATE_TOP");
Wale Ogunwalef6733932018-06-27 05:14:34 -07005446 mStackSupervisor.comeOutOfSleepIfNeededLocked();
5447 }
Wale Ogunwaled32da472018-11-16 07:19:28 -08005448 mRootActivityContainer.applySleepTokens(true /* applyToStacks */);
Wale Ogunwalef6733932018-06-27 05:14:34 -07005449 if (wasSleeping) {
5450 updateOomAdj = true;
5451 }
5452 } else if (!mSleeping && shouldSleep) {
5453 mSleeping = true;
Chenjie Yubd1a28f2018-07-17 14:55:19 -07005454 StatsLog.write(StatsLog.ACTIVITY_MANAGER_SLEEP_STATE_CHANGED,
5455 StatsLog.ACTIVITY_MANAGER_SLEEP_STATE_CHANGED__STATE__ASLEEP);
Wale Ogunwalef6733932018-06-27 05:14:34 -07005456 if (mCurAppTimeTracker != null) {
5457 mCurAppTimeTracker.stop();
5458 }
5459 mTopProcessState = ActivityManager.PROCESS_STATE_TOP_SLEEPING;
Varun Shah98694fb2019-04-11 09:28:27 -07005460 Slog.d(TAG, "Top Process State changed to PROCESS_STATE_TOP_SLEEPING");
Wale Ogunwalef6733932018-06-27 05:14:34 -07005461 mStackSupervisor.goingToSleepLocked();
5462 updateResumedAppTrace(null /* resumed */);
5463 updateOomAdj = true;
5464 }
5465 if (updateOomAdj) {
5466 mH.post(mAmInternal::updateOomAdj);
5467 }
5468 }
5469
5470 void updateOomAdj() {
5471 mH.post(mAmInternal::updateOomAdj);
5472 }
5473
Wale Ogunwale53783742018-09-16 10:21:51 -07005474 void updateCpuStats() {
5475 mH.post(mAmInternal::updateCpuStats);
5476 }
5477
Hui Yu03d12402018-12-06 18:00:37 -08005478 void updateBatteryStats(ActivityRecord component, boolean resumed) {
5479 final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::updateBatteryStats,
Wale Ogunwale8b19de92018-11-29 19:58:26 -08005480 mAmInternal, component.mActivityComponent, component.app.mUid, component.mUserId,
5481 resumed);
Wale Ogunwale53783742018-09-16 10:21:51 -07005482 mH.sendMessage(m);
5483 }
5484
Hui Yu03d12402018-12-06 18:00:37 -08005485 void updateActivityUsageStats(ActivityRecord activity, int event) {
Michael Wachenschwanz0b4ab1f2019-01-07 13:59:10 -08005486 ComponentName taskRoot = null;
5487 final TaskRecord task = activity.getTaskRecord();
5488 if (task != null) {
5489 final ActivityRecord rootActivity = task.getRootActivity();
5490 if (rootActivity != null) {
5491 taskRoot = rootActivity.mActivityComponent;
5492 }
5493 }
5494
Hui Yu03d12402018-12-06 18:00:37 -08005495 final Message m = PooledLambda.obtainMessage(
5496 ActivityManagerInternal::updateActivityUsageStats, mAmInternal,
Michael Wachenschwanz0b4ab1f2019-01-07 13:59:10 -08005497 activity.mActivityComponent, activity.mUserId, event, activity.appToken, taskRoot);
Hui Yu03d12402018-12-06 18:00:37 -08005498 mH.sendMessage(m);
5499 }
5500
Riddle Hsu32dbdca2019-05-17 23:10:16 -06005501 void startProcessAsync(ActivityRecord activity, boolean knownToBeDead, boolean isTop,
5502 String hostingType) {
5503 try {
5504 if (Trace.isTagEnabled(TRACE_TAG_ACTIVITY_MANAGER)) {
5505 Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "dispatchingStartProcess:"
5506 + activity.processName);
5507 }
5508 // Post message to start process to avoid possible deadlock of calling into AMS with the
5509 // ATMS lock held.
5510 final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess,
5511 mAmInternal, activity.processName, activity.info.applicationInfo, knownToBeDead,
5512 isTop, hostingType, activity.intent.getComponent());
5513 mH.sendMessage(m);
5514 } finally {
5515 Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
5516 }
5517 }
5518
Wale Ogunwale53783742018-09-16 10:21:51 -07005519 void setBooting(boolean booting) {
5520 mAmInternal.setBooting(booting);
5521 }
5522
5523 boolean isBooting() {
5524 return mAmInternal.isBooting();
5525 }
5526
5527 void setBooted(boolean booted) {
5528 mAmInternal.setBooted(booted);
5529 }
5530
5531 boolean isBooted() {
5532 return mAmInternal.isBooted();
5533 }
5534
5535 void postFinishBooting(boolean finishBooting, boolean enableScreen) {
5536 mH.post(() -> {
5537 if (finishBooting) {
5538 mAmInternal.finishBooting();
5539 }
5540 if (enableScreen) {
5541 mInternal.enableScreenAfterBoot(isBooted());
5542 }
5543 });
5544 }
5545
5546 void setHeavyWeightProcess(ActivityRecord root) {
5547 mHeavyWeightProcess = root.app;
5548 final Message m = PooledLambda.obtainMessage(
5549 ActivityTaskManagerService::postHeavyWeightProcessNotification, this,
Wale Ogunwale8b19de92018-11-29 19:58:26 -08005550 root.app, root.intent, root.mUserId);
Wale Ogunwale53783742018-09-16 10:21:51 -07005551 mH.sendMessage(m);
5552 }
5553
5554 void clearHeavyWeightProcessIfEquals(WindowProcessController proc) {
5555 if (mHeavyWeightProcess == null || mHeavyWeightProcess != proc) {
5556 return;
5557 }
5558
5559 mHeavyWeightProcess = null;
5560 final Message m = PooledLambda.obtainMessage(
5561 ActivityTaskManagerService::cancelHeavyWeightProcessNotification, this,
5562 proc.mUserId);
5563 mH.sendMessage(m);
5564 }
5565
5566 private void cancelHeavyWeightProcessNotification(int userId) {
5567 final INotificationManager inm = NotificationManager.getService();
5568 if (inm == null) {
5569 return;
5570 }
5571 try {
Julia Reynoldse4a47dd2019-06-07 13:40:59 -04005572 inm.cancelNotificationWithTag("android", "android", null,
Wale Ogunwale53783742018-09-16 10:21:51 -07005573 SystemMessage.NOTE_HEAVY_WEIGHT_NOTIFICATION, userId);
5574 } catch (RuntimeException e) {
5575 Slog.w(TAG, "Error canceling notification for service", e);
5576 } catch (RemoteException e) {
5577 }
5578
5579 }
5580
5581 private void postHeavyWeightProcessNotification(
5582 WindowProcessController proc, Intent intent, int userId) {
5583 if (proc == null) {
5584 return;
5585 }
5586
5587 final INotificationManager inm = NotificationManager.getService();
5588 if (inm == null) {
5589 return;
5590 }
5591
5592 try {
5593 Context context = mContext.createPackageContext(proc.mInfo.packageName, 0);
5594 String text = mContext.getString(R.string.heavy_weight_notification,
5595 context.getApplicationInfo().loadLabel(context.getPackageManager()));
5596 Notification notification =
5597 new Notification.Builder(context,
5598 SystemNotificationChannels.HEAVY_WEIGHT_APP)
5599 .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb)
5600 .setWhen(0)
5601 .setOngoing(true)
5602 .setTicker(text)
5603 .setColor(mContext.getColor(
5604 com.android.internal.R.color.system_notification_accent_color))
5605 .setContentTitle(text)
5606 .setContentText(
5607 mContext.getText(R.string.heavy_weight_notification_detail))
5608 .setContentIntent(PendingIntent.getActivityAsUser(mContext, 0,
5609 intent, PendingIntent.FLAG_CANCEL_CURRENT, null,
5610 new UserHandle(userId)))
5611 .build();
5612 try {
5613 inm.enqueueNotificationWithTag("android", "android", null,
5614 SystemMessage.NOTE_HEAVY_WEIGHT_NOTIFICATION, notification, userId);
5615 } catch (RuntimeException e) {
5616 Slog.w(TAG, "Error showing notification for heavy-weight app", e);
5617 } catch (RemoteException e) {
5618 }
5619 } catch (PackageManager.NameNotFoundException e) {
5620 Slog.w(TAG, "Unable to create context for heavy notification", e);
5621 }
5622
5623 }
5624
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07005625 IIntentSender getIntentSenderLocked(int type, String packageName, int callingUid, int userId,
5626 IBinder token, String resultWho, int requestCode, Intent[] intents,
5627 String[] resolvedTypes, int flags, Bundle bOptions) {
5628
5629 ActivityRecord activity = null;
5630 if (type == ActivityManager.INTENT_SENDER_ACTIVITY_RESULT) {
5631 activity = ActivityRecord.isInStackLocked(token);
5632 if (activity == null) {
5633 Slog.w(TAG, "Failed createPendingResult: activity " + token + " not in any stack");
5634 return null;
5635 }
5636 if (activity.finishing) {
5637 Slog.w(TAG, "Failed createPendingResult: activity " + activity + " is finishing");
5638 return null;
5639 }
5640 }
5641
5642 final PendingIntentRecord rec = mPendingIntentController.getIntentSender(type, packageName,
5643 callingUid, userId, token, resultWho, requestCode, intents, resolvedTypes, flags,
5644 bOptions);
5645 final boolean noCreate = (flags & PendingIntent.FLAG_NO_CREATE) != 0;
5646 if (noCreate) {
5647 return rec;
5648 }
5649 if (type == ActivityManager.INTENT_SENDER_ACTIVITY_RESULT) {
5650 if (activity.pendingResults == null) {
5651 activity.pendingResults = new HashSet<>();
5652 }
5653 activity.pendingResults.add(rec.ref);
5654 }
5655 return rec;
5656 }
5657
Andrii Kulian52d255c2018-07-13 11:32:19 -07005658 // TODO(b/111541062): Update app time tracking to make it aware of multiple resumed activities
Wale Ogunwalef6733932018-06-27 05:14:34 -07005659 private void startTimeTrackingFocusedActivityLocked() {
Wale Ogunwaled32da472018-11-16 07:19:28 -08005660 final ActivityRecord resumedActivity = mRootActivityContainer.getTopResumedActivity();
Wale Ogunwalef6733932018-06-27 05:14:34 -07005661 if (!mSleeping && mCurAppTimeTracker != null && resumedActivity != null) {
5662 mCurAppTimeTracker.start(resumedActivity.packageName);
5663 }
5664 }
5665
5666 private void updateResumedAppTrace(@Nullable ActivityRecord resumed) {
5667 if (mTracedResumedActivity != null) {
5668 Trace.asyncTraceEnd(TRACE_TAG_ACTIVITY_MANAGER,
5669 constructResumedTraceName(mTracedResumedActivity.packageName), 0);
5670 }
5671 if (resumed != null) {
5672 Trace.asyncTraceBegin(TRACE_TAG_ACTIVITY_MANAGER,
5673 constructResumedTraceName(resumed.packageName), 0);
5674 }
5675 mTracedResumedActivity = resumed;
5676 }
5677
5678 private String constructResumedTraceName(String packageName) {
5679 return "focused app: " + packageName;
5680 }
5681
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005682 /** Applies latest configuration and/or visibility updates if needed. */
Shivam Agrawal1d3db652019-07-01 15:26:11 -07005683 boolean ensureConfigAndVisibilityAfterUpdate(ActivityRecord starting, int changes) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005684 boolean kept = true;
Wale Ogunwaled32da472018-11-16 07:19:28 -08005685 final ActivityStack mainStack = mRootActivityContainer.getTopDisplayFocusedStack();
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005686 // mainStack is null during startup.
5687 if (mainStack != null) {
5688 if (changes != 0 && starting == null) {
5689 // If the configuration changed, and the caller is not already
5690 // in the process of starting an activity, then find the top
5691 // activity to check if its configuration needs to change.
5692 starting = mainStack.topRunningActivityLocked();
5693 }
5694
5695 if (starting != null) {
5696 kept = starting.ensureActivityConfiguration(changes,
5697 false /* preserveWindow */);
5698 // And we need to make sure at this point that all other activities
5699 // are made visible with the correct configuration.
Wale Ogunwaled32da472018-11-16 07:19:28 -08005700 mRootActivityContainer.ensureActivitiesVisible(starting, changes,
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005701 !PRESERVE_WINDOWS);
5702 }
5703 }
5704
5705 return kept;
5706 }
5707
Wale Ogunwale906f9c62018-07-23 11:23:44 -07005708 void scheduleAppGcsLocked() {
5709 mH.post(() -> mAmInternal.scheduleAppGcs());
5710 }
5711
Wale Ogunwale53783742018-09-16 10:21:51 -07005712 CompatibilityInfo compatibilityInfoForPackageLocked(ApplicationInfo ai) {
5713 return mCompatModePackages.compatibilityInfoForPackageLocked(ai);
5714 }
5715
Wale Ogunwale906f9c62018-07-23 11:23:44 -07005716 /**
5717 * Returns the PackageManager. Used by classes hosted by {@link ActivityTaskManagerService}. The
5718 * PackageManager could be unavailable at construction time and therefore needs to be accessed
5719 * on demand.
5720 */
5721 IPackageManager getPackageManager() {
5722 return AppGlobals.getPackageManager();
5723 }
5724
5725 PackageManagerInternal getPackageManagerInternalLocked() {
5726 if (mPmInternal == null) {
5727 mPmInternal = LocalServices.getService(PackageManagerInternal.class);
5728 }
5729 return mPmInternal;
5730 }
5731
Hai Zhangf4da9be2019-05-01 13:46:06 +08005732 PermissionPolicyInternal getPermissionPolicyInternal() {
5733 if (mPermissionPolicyInternal == null) {
5734 mPermissionPolicyInternal = LocalServices.getService(PermissionPolicyInternal.class);
5735 }
5736 return mPermissionPolicyInternal;
5737 }
5738
Wale Ogunwale008163e2018-07-23 23:11:08 -07005739 AppWarnings getAppWarningsLocked() {
5740 return mAppWarnings;
5741 }
5742
Wale Ogunwale214f3482018-10-04 11:00:47 -07005743 Intent getHomeIntent() {
5744 Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);
5745 intent.setComponent(mTopComponent);
5746 intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
5747 if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
5748 intent.addCategory(Intent.CATEGORY_HOME);
5749 }
5750 return intent;
5751 }
5752
Chilun2ef71f72018-11-16 17:57:15 +08005753 /**
5754 * Return the intent set with {@link Intent#CATEGORY_SECONDARY_HOME} to resolve secondary home
5755 * activities.
5756 *
5757 * @param preferredPackage Specify a preferred package name, otherwise use secondary home
5758 * component defined in config_secondaryHomeComponent.
5759 * @return the intent set with {@link Intent#CATEGORY_SECONDARY_HOME}
5760 */
5761 Intent getSecondaryHomeIntent(String preferredPackage) {
5762 final Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);
Keun young Park340546a2019-05-06 16:27:44 -07005763 final boolean useSystemProvidedLauncher = mContext.getResources().getBoolean(
5764 com.android.internal.R.bool.config_useSystemProvidedLauncherForSecondary);
5765 if (preferredPackage == null || useSystemProvidedLauncher) {
5766 // Using the component stored in config if no package name or forced.
Chilun2ef71f72018-11-16 17:57:15 +08005767 final String secondaryHomeComponent = mContext.getResources().getString(
5768 com.android.internal.R.string.config_secondaryHomeComponent);
5769 intent.setComponent(ComponentName.unflattenFromString(secondaryHomeComponent));
5770 } else {
5771 intent.setPackage(preferredPackage);
5772 }
5773 intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
5774 if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
5775 intent.addCategory(Intent.CATEGORY_SECONDARY_HOME);
5776 }
5777 return intent;
5778 }
5779
Wale Ogunwale214f3482018-10-04 11:00:47 -07005780 ApplicationInfo getAppInfoForUser(ApplicationInfo info, int userId) {
5781 if (info == null) return null;
5782 ApplicationInfo newInfo = new ApplicationInfo(info);
5783 newInfo.initForUser(userId);
5784 return newInfo;
5785 }
5786
Wale Ogunwale9c103022018-10-18 07:44:54 -07005787 WindowProcessController getProcessController(String processName, int uid) {
Wale Ogunwale214f3482018-10-04 11:00:47 -07005788 if (uid == SYSTEM_UID) {
5789 // The system gets to run in any process. If there are multiple processes with the same
5790 // uid, just pick the first (this should never happen).
5791 final SparseArray<WindowProcessController> procs =
5792 mProcessNames.getMap().get(processName);
5793 if (procs == null) return null;
5794 final int procCount = procs.size();
5795 for (int i = 0; i < procCount; i++) {
5796 final int procUid = procs.keyAt(i);
5797 if (UserHandle.isApp(procUid) || !UserHandle.isSameUser(procUid, uid)) {
5798 // Don't use an app process or different user process for system component.
5799 continue;
5800 }
5801 return procs.valueAt(i);
5802 }
5803 }
5804
5805 return mProcessNames.get(processName, uid);
5806 }
5807
Wale Ogunwale342fbe92018-10-09 08:44:10 -07005808 WindowProcessController getProcessController(IApplicationThread thread) {
5809 if (thread == null) {
5810 return null;
5811 }
5812
5813 final IBinder threadBinder = thread.asBinder();
5814 final ArrayMap<String, SparseArray<WindowProcessController>> pmap = mProcessNames.getMap();
5815 for (int i = pmap.size()-1; i >= 0; i--) {
5816 final SparseArray<WindowProcessController> procs = pmap.valueAt(i);
5817 for (int j = procs.size() - 1; j >= 0; j--) {
5818 final WindowProcessController proc = procs.valueAt(j);
5819 if (proc.hasThread() && proc.getThread().asBinder() == threadBinder) {
5820 return proc;
5821 }
5822 }
5823 }
5824
5825 return null;
5826 }
5827
Michal Karpinski9cbb20b2019-02-05 17:31:50 +00005828 WindowProcessController getProcessController(int pid, int uid) {
Michal Karpinski2e0aad22019-04-12 16:22:55 +01005829 final WindowProcessController proc = mProcessMap.getProcess(pid);
Yunfan Chen8546b212019-04-01 15:34:44 +09005830 if (proc == null) return null;
5831 if (UserHandle.isApp(uid) && proc.mUid == uid) {
5832 return proc;
Michal Karpinski9cbb20b2019-02-05 17:31:50 +00005833 }
5834 return null;
5835 }
5836
Riddle Hsua0536432019-02-16 00:38:59 +08005837 int getUidState(int uid) {
5838 return mActiveUids.getUidState(uid);
Wale Ogunwalebff2df42018-10-18 17:09:19 -07005839 }
5840
Michal Karpinskicc88d7e2019-01-24 15:32:12 +00005841 boolean isUidForeground(int uid) {
Alan Stokeseea8d3e2019-04-10 17:37:25 +01005842 // A uid is considered to be foreground if it has a visible non-toast window.
5843 return mWindowManager.mRoot.isAnyNonToastWindowVisibleForUid(uid);
Michal Karpinskicc88d7e2019-01-24 15:32:12 +00005844 }
5845
Ricky Wai96f5c352019-04-10 18:40:17 +01005846 boolean isDeviceOwner(int uid) {
5847 return uid >= 0 && mDeviceOwnerUid == uid;
Michal Karpinski4026cae2019-02-12 11:51:47 +00005848 }
5849
Ricky Wai96f5c352019-04-10 18:40:17 +01005850 void setDeviceOwnerUid(int uid) {
5851 mDeviceOwnerUid = uid;
Michal Karpinski4026cae2019-02-12 11:51:47 +00005852 }
5853
Wale Ogunwale9de19442018-10-18 19:05:03 -07005854 /**
5855 * @return whitelist tag for a uid from mPendingTempWhitelist, null if not currently on
5856 * the whitelist
5857 */
5858 String getPendingTempWhitelistTagForUidLocked(int uid) {
5859 return mPendingTempWhitelist.get(uid);
5860 }
5861
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07005862 void logAppTooSlow(WindowProcessController app, long startTime, String msg) {
5863 if (true || Build.IS_USER) {
5864 return;
5865 }
5866
5867 StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
5868 StrictMode.allowThreadDiskWrites();
5869 try {
5870 File tracesDir = new File("/data/anr");
5871 File tracesFile = null;
5872 try {
5873 tracesFile = File.createTempFile("app_slow", null, tracesDir);
5874
5875 StringBuilder sb = new StringBuilder();
5876 Time tobj = new Time();
5877 tobj.set(System.currentTimeMillis());
5878 sb.append(tobj.format("%Y-%m-%d %H:%M:%S"));
5879 sb.append(": ");
5880 TimeUtils.formatDuration(SystemClock.uptimeMillis()-startTime, sb);
5881 sb.append(" since ");
5882 sb.append(msg);
5883 FileOutputStream fos = new FileOutputStream(tracesFile);
5884 fos.write(sb.toString().getBytes());
5885 if (app == null) {
5886 fos.write("\n*** No application process!".getBytes());
5887 }
5888 fos.close();
5889 FileUtils.setPermissions(tracesFile.getPath(), 0666, -1, -1); // -rw-rw-rw-
5890 } catch (IOException e) {
5891 Slog.w(TAG, "Unable to prepare slow app traces file: " + tracesFile, e);
5892 return;
5893 }
5894
5895 if (app != null && app.getPid() > 0) {
5896 ArrayList<Integer> firstPids = new ArrayList<Integer>();
5897 firstPids.add(app.getPid());
5898 dumpStackTraces(tracesFile.getAbsolutePath(), firstPids, null, null);
5899 }
5900
5901 File lastTracesFile = null;
5902 File curTracesFile = null;
5903 for (int i=9; i>=0; i--) {
5904 String name = String.format(Locale.US, "slow%02d.txt", i);
5905 curTracesFile = new File(tracesDir, name);
5906 if (curTracesFile.exists()) {
5907 if (lastTracesFile != null) {
5908 curTracesFile.renameTo(lastTracesFile);
5909 } else {
5910 curTracesFile.delete();
5911 }
5912 }
5913 lastTracesFile = curTracesFile;
5914 }
5915 tracesFile.renameTo(curTracesFile);
5916 } finally {
5917 StrictMode.setThreadPolicy(oldPolicy);
5918 }
5919 }
5920
Michal Karpinskida34cd42019-04-02 19:46:52 +01005921 boolean isAssociatedCompanionApp(int userId, int uid) {
5922 final Set<Integer> allUids = mCompanionAppUidsMap.get(userId);
5923 if (allUids == null) {
Ricky Wai2452e2d2019-03-18 19:19:08 +00005924 return false;
5925 }
Michal Karpinskida34cd42019-04-02 19:46:52 +01005926 return allUids.contains(uid);
Ricky Wai2452e2d2019-03-18 19:19:08 +00005927 }
5928
Wale Ogunwaled0412b32018-05-08 09:25:50 -07005929 final class H extends Handler {
Wale Ogunwalef6733932018-06-27 05:14:34 -07005930 static final int REPORT_TIME_TRACKER_MSG = 1;
Alison Cichowlas3e340502018-08-07 17:15:01 -04005931
5932
Wale Ogunwale98875612018-10-12 07:53:02 -07005933 static final int FIRST_ACTIVITY_STACK_MSG = 100;
5934 static final int FIRST_SUPERVISOR_STACK_MSG = 200;
Wale Ogunwalef6733932018-06-27 05:14:34 -07005935
Riddle Hsud93a6c42018-11-29 21:50:06 +08005936 H(Looper looper) {
5937 super(looper);
Wale Ogunwaled0412b32018-05-08 09:25:50 -07005938 }
Wale Ogunwalef6733932018-06-27 05:14:34 -07005939
5940 @Override
5941 public void handleMessage(Message msg) {
5942 switch (msg.what) {
5943 case REPORT_TIME_TRACKER_MSG: {
5944 AppTimeTracker tracker = (AppTimeTracker) msg.obj;
5945 tracker.deliverResult(mContext);
5946 } break;
5947 }
5948 }
Wale Ogunwaled0412b32018-05-08 09:25:50 -07005949 }
5950
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005951 final class UiHandler extends Handler {
Wale Ogunwalef6733932018-06-27 05:14:34 -07005952 static final int DISMISS_DIALOG_UI_MSG = 1;
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005953
5954 public UiHandler() {
Wale Ogunwale1f5e53d2018-11-05 05:12:46 -08005955 super(UiThread.get().getLooper(), null, true);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005956 }
Wale Ogunwalef6733932018-06-27 05:14:34 -07005957
5958 @Override
5959 public void handleMessage(Message msg) {
5960 switch (msg.what) {
5961 case DISMISS_DIALOG_UI_MSG: {
5962 final Dialog d = (Dialog) msg.obj;
5963 d.dismiss();
5964 break;
5965 }
5966 }
5967 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005968 }
5969
Wale Ogunwale6767eae2018-05-03 15:52:51 -07005970 final class LocalService extends ActivityTaskManagerInternal {
5971 @Override
5972 public SleepToken acquireSleepToken(String tag, int displayId) {
5973 Preconditions.checkNotNull(tag);
Wale Ogunwalef6733932018-06-27 05:14:34 -07005974 return ActivityTaskManagerService.this.acquireSleepToken(tag, displayId);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07005975 }
5976
5977 @Override
5978 public ComponentName getHomeActivityForUser(int userId) {
5979 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08005980 final ActivityRecord homeActivity =
5981 mRootActivityContainer.getDefaultDisplayHomeActivityForUser(userId);
Wale Ogunwale8b19de92018-11-29 19:58:26 -08005982 return homeActivity == null ? null : homeActivity.mActivityComponent;
Wale Ogunwale6767eae2018-05-03 15:52:51 -07005983 }
5984 }
5985
5986 @Override
5987 public void onLocalVoiceInteractionStarted(IBinder activity,
5988 IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor) {
5989 synchronized (mGlobalLock) {
Wale Ogunwalef6733932018-06-27 05:14:34 -07005990 onLocalVoiceInteractionStartedLocked(activity, voiceSession, voiceInteractor);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07005991 }
5992 }
5993
5994 @Override
Issei Suzukicac2a502019-04-16 16:52:50 +02005995 public void notifyAppTransitionStarting(SparseIntArray reasons,
5996 long timestamp) {
Wale Ogunwale6767eae2018-05-03 15:52:51 -07005997 synchronized (mGlobalLock) {
5998 mStackSupervisor.getActivityMetricsLogger().notifyTransitionStarting(
5999 reasons, timestamp);
6000 }
6001 }
6002
6003 @Override
Issei Suzukicac2a502019-04-16 16:52:50 +02006004 public void notifySingleTaskDisplayDrawn(int displayId) {
6005 mTaskChangeNotificationController.notifySingleTaskDisplayDrawn(displayId);
6006 }
6007
6008 @Override
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006009 public void notifyAppTransitionFinished() {
6010 synchronized (mGlobalLock) {
6011 mStackSupervisor.notifyAppTransitionDone();
6012 }
6013 }
6014
6015 @Override
6016 public void notifyAppTransitionCancelled() {
6017 synchronized (mGlobalLock) {
6018 mStackSupervisor.notifyAppTransitionDone();
6019 }
6020 }
6021
6022 @Override
6023 public List<IBinder> getTopVisibleActivities() {
6024 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08006025 return mRootActivityContainer.getTopVisibleActivities();
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006026 }
6027 }
6028
6029 @Override
6030 public void notifyDockedStackMinimizedChanged(boolean minimized) {
6031 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08006032 mRootActivityContainer.setDockedStackMinimized(minimized);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006033 }
6034 }
6035
6036 @Override
6037 public int startActivitiesAsPackage(String packageName, int userId, Intent[] intents,
6038 Bundle bOptions) {
6039 Preconditions.checkNotNull(intents, "intents");
6040 final String[] resolvedTypes = new String[intents.length];
6041
6042 // UID of the package on user userId.
6043 // "= 0" is needed because otherwise catch(RemoteException) would make it look like
6044 // packageUid may not be initialized.
6045 int packageUid = 0;
6046 final long ident = Binder.clearCallingIdentity();
6047
6048 try {
6049 for (int i = 0; i < intents.length; i++) {
6050 resolvedTypes[i] =
6051 intents[i].resolveTypeIfNeeded(mContext.getContentResolver());
6052 }
6053
6054 packageUid = AppGlobals.getPackageManager().getPackageUid(
6055 packageName, PackageManager.MATCH_DEBUG_TRIAGED_MISSING, userId);
6056 } catch (RemoteException e) {
6057 // Shouldn't happen.
6058 } finally {
6059 Binder.restoreCallingIdentity(ident);
6060 }
6061
Riddle Hsu591bf612019-02-14 17:55:31 +08006062 return getActivityStartController().startActivitiesInPackage(
6063 packageUid, packageName,
6064 intents, resolvedTypes, null /* resultTo */,
6065 SafeActivityOptions.fromBundle(bOptions), userId,
6066 false /* validateIncomingUser */, null /* originatingPendingIntent */,
6067 false /* allowBackgroundActivityStart */);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006068 }
6069
6070 @Override
Michal Karpinski84d9ebd2019-01-17 18:28:59 +00006071 public int startActivitiesInPackage(int uid, int realCallingPid, int realCallingUid,
6072 String callingPackage, Intent[] intents, String[] resolvedTypes, IBinder resultTo,
6073 SafeActivityOptions options, int userId, boolean validateIncomingUser,
6074 PendingIntentRecord originatingPendingIntent,
Michal Karpinskiac116df2018-12-10 17:51:42 +00006075 boolean allowBackgroundActivityStart) {
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006076 synchronized (mGlobalLock) {
Michal Karpinski84d9ebd2019-01-17 18:28:59 +00006077 return getActivityStartController().startActivitiesInPackage(uid, realCallingPid,
6078 realCallingUid, callingPackage, intents, resolvedTypes, resultTo, options,
6079 userId, validateIncomingUser, originatingPendingIntent,
6080 allowBackgroundActivityStart);
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006081 }
6082 }
6083
6084 @Override
6085 public int startActivityInPackage(int uid, int realCallingPid, int realCallingUid,
6086 String callingPackage, Intent intent, String resolvedType, IBinder resultTo,
6087 String resultWho, int requestCode, int startFlags, SafeActivityOptions options,
6088 int userId, TaskRecord inTask, String reason, boolean validateIncomingUser,
Michal Karpinskiac116df2018-12-10 17:51:42 +00006089 PendingIntentRecord originatingPendingIntent,
6090 boolean allowBackgroundActivityStart) {
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006091 synchronized (mGlobalLock) {
6092 return getActivityStartController().startActivityInPackage(uid, realCallingPid,
6093 realCallingUid, callingPackage, intent, resolvedType, resultTo, resultWho,
6094 requestCode, startFlags, options, userId, inTask, reason,
Michal Karpinskiac116df2018-12-10 17:51:42 +00006095 validateIncomingUser, originatingPendingIntent,
6096 allowBackgroundActivityStart);
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006097 }
6098 }
6099
6100 @Override
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006101 public int startActivityAsUser(IApplicationThread caller, String callerPacakge,
6102 Intent intent, Bundle options, int userId) {
6103 return ActivityTaskManagerService.this.startActivityAsUser(
6104 caller, callerPacakge, intent,
6105 intent.resolveTypeIfNeeded(mContext.getContentResolver()),
6106 null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null, options, userId,
6107 false /*validateIncomingUser*/);
6108 }
6109
6110 @Override
lumark588a3e82018-07-20 18:53:54 +08006111 public void notifyKeyguardFlagsChanged(@Nullable Runnable callback, int displayId) {
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006112 synchronized (mGlobalLock) {
6113
6114 // We might change the visibilities here, so prepare an empty app transition which
6115 // might be overridden later if we actually change visibilities.
lumark52ea28e2018-11-09 17:30:47 +08006116 final ActivityDisplay activityDisplay =
Wale Ogunwaled32da472018-11-16 07:19:28 -08006117 mRootActivityContainer.getActivityDisplay(displayId);
lumark52ea28e2018-11-09 17:30:47 +08006118 if (activityDisplay == null) {
6119 return;
6120 }
Wale Ogunwale3a256e62018-12-06 14:41:18 -08006121 final DisplayContent dc = activityDisplay.mDisplayContent;
6122 final boolean wasTransitionSet =
6123 dc.mAppTransition.getAppTransition() != TRANSIT_NONE;
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006124 if (!wasTransitionSet) {
Wale Ogunwale3a256e62018-12-06 14:41:18 -08006125 dc.prepareAppTransition(TRANSIT_NONE, false /* alwaysKeepCurrent */);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006126 }
Wale Ogunwaled32da472018-11-16 07:19:28 -08006127 mRootActivityContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006128
6129 // If there was a transition set already we don't want to interfere with it as we
6130 // might be starting it too early.
6131 if (!wasTransitionSet) {
Wale Ogunwale3a256e62018-12-06 14:41:18 -08006132 dc.executeAppTransition();
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006133 }
6134 }
6135 if (callback != null) {
6136 callback.run();
6137 }
6138 }
6139
6140 @Override
6141 public void notifyKeyguardTrustedChanged() {
6142 synchronized (mGlobalLock) {
Wale Ogunwaled0412b32018-05-08 09:25:50 -07006143 if (mKeyguardController.isKeyguardShowing(DEFAULT_DISPLAY)) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08006144 mRootActivityContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006145 }
6146 }
6147 }
6148
6149 /**
6150 * Called after virtual display Id is updated by
6151 * {@link com.android.server.vr.Vr2dDisplay} with a specific
6152 * {@param vrVr2dDisplayId}.
6153 */
6154 @Override
6155 public void setVr2dDisplayId(int vr2dDisplayId) {
6156 if (DEBUG_STACK) Slog.d(TAG, "setVr2dDisplayId called for: " + vr2dDisplayId);
6157 synchronized (mGlobalLock) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006158 mVr2dDisplayId = vr2dDisplayId;
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006159 }
6160 }
6161
6162 @Override
6163 public void setFocusedActivity(IBinder token) {
6164 synchronized (mGlobalLock) {
6165 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
6166 if (r == null) {
6167 throw new IllegalArgumentException(
6168 "setFocusedActivity: No activity record matching token=" + token);
6169 }
Louis Chang19443452018-10-09 12:10:21 +08006170 if (r.moveFocusableActivityToTop("setFocusedActivity")) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08006171 mRootActivityContainer.resumeFocusedStacksTopActivities();
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006172 }
6173 }
6174 }
6175
6176 @Override
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006177 public void registerScreenObserver(ScreenObserver observer) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006178 mScreenObservers.add(observer);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006179 }
6180
6181 @Override
6182 public boolean isCallerRecents(int callingUid) {
Wale Ogunwale16e505a2018-05-07 15:00:49 -07006183 return getRecentTasks().isCallerRecents(callingUid);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006184 }
6185
6186 @Override
6187 public boolean isRecentsComponentHomeActivity(int userId) {
Wale Ogunwale16e505a2018-05-07 15:00:49 -07006188 return getRecentTasks().isRecentsComponentHomeActivity(userId);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006189 }
6190
6191 @Override
6192 public void cancelRecentsAnimation(boolean restoreHomeStackPosition) {
6193 ActivityTaskManagerService.this.cancelRecentsAnimation(restoreHomeStackPosition);
6194 }
6195
6196 @Override
6197 public void enforceCallerIsRecentsOrHasPermission(String permission, String func) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006198 ActivityTaskManagerService.this.enforceCallerIsRecentsOrHasPermission(permission, func);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006199 }
Wale Ogunwaled0412b32018-05-08 09:25:50 -07006200
6201 @Override
6202 public void notifyActiveVoiceInteractionServiceChanged(ComponentName component) {
6203 synchronized (mGlobalLock) {
6204 mActiveVoiceInteractionServiceComponent = component;
6205 }
6206 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006207
6208 @Override
6209 public void setAllowAppSwitches(@NonNull String type, int uid, int userId) {
6210 if (!mAmInternal.isUserRunning(userId, ActivityManager.FLAG_OR_STOPPED)) {
6211 return;
6212 }
6213 synchronized (mGlobalLock) {
6214 ArrayMap<String, Integer> types = mAllowAppSwitchUids.get(userId);
6215 if (types == null) {
6216 if (uid < 0) {
6217 return;
6218 }
6219 types = new ArrayMap<>();
6220 mAllowAppSwitchUids.put(userId, types);
6221 }
6222 if (uid < 0) {
6223 types.remove(type);
6224 } else {
6225 types.put(type, uid);
6226 }
6227 }
6228 }
6229
6230 @Override
6231 public void onUserStopped(int userId) {
6232 synchronized (mGlobalLock) {
6233 getRecentTasks().unloadUserDataFromMemoryLocked(userId);
6234 mAllowAppSwitchUids.remove(userId);
6235 }
6236 }
6237
6238 @Override
6239 public boolean isGetTasksAllowed(String caller, int callingPid, int callingUid) {
6240 synchronized (mGlobalLock) {
6241 return ActivityTaskManagerService.this.isGetTasksAllowed(
6242 caller, callingPid, callingUid);
6243 }
6244 }
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006245
Riddle Hsua0536432019-02-16 00:38:59 +08006246 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006247 @Override
6248 public void onProcessAdded(WindowProcessController proc) {
Riddle Hsua0536432019-02-16 00:38:59 +08006249 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006250 mProcessNames.put(proc.mName, proc.mUid, proc);
6251 }
6252 }
6253
Riddle Hsua0536432019-02-16 00:38:59 +08006254 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006255 @Override
6256 public void onProcessRemoved(String name, int uid) {
Riddle Hsua0536432019-02-16 00:38:59 +08006257 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006258 mProcessNames.remove(name, uid);
6259 }
6260 }
6261
Riddle Hsua0536432019-02-16 00:38:59 +08006262 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006263 @Override
6264 public void onCleanUpApplicationRecord(WindowProcessController proc) {
Riddle Hsua0536432019-02-16 00:38:59 +08006265 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006266 if (proc == mHomeProcess) {
6267 mHomeProcess = null;
6268 }
6269 if (proc == mPreviousProcess) {
6270 mPreviousProcess = null;
6271 }
6272 }
6273 }
Wale Ogunwalef6733932018-06-27 05:14:34 -07006274
Riddle Hsua0536432019-02-16 00:38:59 +08006275 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwalef6733932018-06-27 05:14:34 -07006276 @Override
6277 public int getTopProcessState() {
Riddle Hsua0536432019-02-16 00:38:59 +08006278 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwalef6733932018-06-27 05:14:34 -07006279 return mTopProcessState;
6280 }
6281 }
6282
Riddle Hsua0536432019-02-16 00:38:59 +08006283 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwalef6733932018-06-27 05:14:34 -07006284 @Override
Wale Ogunwale53783742018-09-16 10:21:51 -07006285 public boolean isHeavyWeightProcess(WindowProcessController proc) {
Riddle Hsua0536432019-02-16 00:38:59 +08006286 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale53783742018-09-16 10:21:51 -07006287 return proc == mHeavyWeightProcess;
6288 }
6289 }
6290
Riddle Hsua0536432019-02-16 00:38:59 +08006291 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale53783742018-09-16 10:21:51 -07006292 @Override
6293 public void clearHeavyWeightProcessIfEquals(WindowProcessController proc) {
Riddle Hsua0536432019-02-16 00:38:59 +08006294 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale53783742018-09-16 10:21:51 -07006295 ActivityTaskManagerService.this.clearHeavyWeightProcessIfEquals(proc);
6296 }
6297 }
6298
6299 @Override
6300 public void finishHeavyWeightApp() {
6301 synchronized (mGlobalLock) {
Sudheer Shankaee1da272018-10-20 20:11:44 -07006302 if (mHeavyWeightProcess != null) {
6303 mHeavyWeightProcess.finishActivities();
6304 }
Wale Ogunwale53783742018-09-16 10:21:51 -07006305 ActivityTaskManagerService.this.clearHeavyWeightProcessIfEquals(
6306 mHeavyWeightProcess);
6307 }
6308 }
6309
Riddle Hsua0536432019-02-16 00:38:59 +08006310 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwale53783742018-09-16 10:21:51 -07006311 @Override
Wale Ogunwalef6733932018-06-27 05:14:34 -07006312 public boolean isSleeping() {
Riddle Hsua0536432019-02-16 00:38:59 +08006313 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwalef6733932018-06-27 05:14:34 -07006314 return isSleepingLocked();
6315 }
6316 }
6317
6318 @Override
6319 public boolean isShuttingDown() {
6320 synchronized (mGlobalLock) {
6321 return mShuttingDown;
6322 }
6323 }
6324
6325 @Override
6326 public boolean shuttingDown(boolean booted, int timeout) {
6327 synchronized (mGlobalLock) {
6328 mShuttingDown = true;
Wale Ogunwaled32da472018-11-16 07:19:28 -08006329 mRootActivityContainer.prepareForShutdown();
Wale Ogunwalef6733932018-06-27 05:14:34 -07006330 updateEventDispatchingLocked(booted);
Wale Ogunwaled4d67d02018-10-25 18:09:39 -07006331 notifyTaskPersisterLocked(null, true);
Wale Ogunwalef6733932018-06-27 05:14:34 -07006332 return mStackSupervisor.shutdownLocked(timeout);
6333 }
6334 }
6335
6336 @Override
6337 public void enableScreenAfterBoot(boolean booted) {
6338 synchronized (mGlobalLock) {
6339 EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_ENABLE_SCREEN,
6340 SystemClock.uptimeMillis());
6341 mWindowManager.enableScreenAfterBoot();
6342 updateEventDispatchingLocked(booted);
6343 }
6344 }
6345
6346 @Override
6347 public boolean showStrictModeViolationDialog() {
6348 synchronized (mGlobalLock) {
6349 return mShowDialogs && !mSleeping && !mShuttingDown;
6350 }
6351 }
6352
6353 @Override
6354 public void showSystemReadyErrorDialogsIfNeeded() {
6355 synchronized (mGlobalLock) {
6356 try {
6357 if (AppGlobals.getPackageManager().hasSystemUidErrors()) {
6358 Slog.e(TAG, "UIDs on the system are inconsistent, you need to wipe your"
6359 + " data partition or your device will be unstable.");
6360 mUiHandler.post(() -> {
6361 if (mShowDialogs) {
6362 AlertDialog d = new BaseErrorDialog(mUiContext);
6363 d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
6364 d.setCancelable(false);
6365 d.setTitle(mUiContext.getText(R.string.android_system_label));
6366 d.setMessage(mUiContext.getText(R.string.system_error_wipe_data));
6367 d.setButton(DialogInterface.BUTTON_POSITIVE,
6368 mUiContext.getText(R.string.ok),
6369 mUiHandler.obtainMessage(DISMISS_DIALOG_UI_MSG, d));
6370 d.show();
6371 }
6372 });
6373 }
6374 } catch (RemoteException e) {
6375 }
6376
6377 if (!Build.isBuildConsistent()) {
6378 Slog.e(TAG, "Build fingerprint is not consistent, warning user");
6379 mUiHandler.post(() -> {
6380 if (mShowDialogs) {
6381 AlertDialog d = new BaseErrorDialog(mUiContext);
6382 d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
6383 d.setCancelable(false);
6384 d.setTitle(mUiContext.getText(R.string.android_system_label));
6385 d.setMessage(mUiContext.getText(R.string.system_error_manufacturer));
6386 d.setButton(DialogInterface.BUTTON_POSITIVE,
6387 mUiContext.getText(R.string.ok),
6388 mUiHandler.obtainMessage(DISMISS_DIALOG_UI_MSG, d));
6389 d.show();
6390 }
6391 });
6392 }
6393 }
6394 }
Wale Ogunwale906f9c62018-07-23 11:23:44 -07006395
6396 @Override
Wale Ogunwale906f9c62018-07-23 11:23:44 -07006397 public void onProcessMapped(int pid, WindowProcessController proc) {
6398 synchronized (mGlobalLock) {
Michal Karpinski2e0aad22019-04-12 16:22:55 +01006399 mProcessMap.put(pid, proc);
Wale Ogunwale906f9c62018-07-23 11:23:44 -07006400 }
6401 }
6402
6403 @Override
6404 public void onProcessUnMapped(int pid) {
6405 synchronized (mGlobalLock) {
Michal Karpinski2e0aad22019-04-12 16:22:55 +01006406 mProcessMap.remove(pid);
Wale Ogunwale906f9c62018-07-23 11:23:44 -07006407 }
6408 }
Wale Ogunwale008163e2018-07-23 23:11:08 -07006409
6410 @Override
6411 public void onPackageDataCleared(String name) {
6412 synchronized (mGlobalLock) {
Wale Ogunwale53783742018-09-16 10:21:51 -07006413 mCompatModePackages.handlePackageDataClearedLocked(name);
Wale Ogunwale008163e2018-07-23 23:11:08 -07006414 mAppWarnings.onPackageDataCleared(name);
6415 }
6416 }
6417
6418 @Override
6419 public void onPackageUninstalled(String name) {
6420 synchronized (mGlobalLock) {
6421 mAppWarnings.onPackageUninstalled(name);
Wale Ogunwale53783742018-09-16 10:21:51 -07006422 mCompatModePackages.handlePackageUninstalledLocked(name);
Wale Ogunwale008163e2018-07-23 23:11:08 -07006423 }
6424 }
Wale Ogunwale53783742018-09-16 10:21:51 -07006425
6426 @Override
6427 public void onPackageAdded(String name, boolean replacing) {
6428 synchronized (mGlobalLock) {
6429 mCompatModePackages.handlePackageAddedLocked(name, replacing);
6430 }
6431 }
6432
6433 @Override
Wale Ogunwale31913b52018-10-13 08:29:31 -07006434 public void onPackageReplaced(ApplicationInfo aInfo) {
6435 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08006436 mRootActivityContainer.updateActivityApplicationInfo(aInfo);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006437 }
6438 }
6439
6440 @Override
Wale Ogunwale53783742018-09-16 10:21:51 -07006441 public CompatibilityInfo compatibilityInfoForPackage(ApplicationInfo ai) {
6442 synchronized (mGlobalLock) {
6443 return compatibilityInfoForPackageLocked(ai);
6444 }
6445 }
6446
Yunfan Chen75157d72018-07-27 14:47:21 +09006447 /**
6448 * Set the corresponding display information for the process global configuration. To be
6449 * called when we need to show IME on a different display.
6450 *
6451 * @param pid The process id associated with the IME window.
6452 * @param displayId The ID of the display showing the IME.
6453 */
6454 @Override
Yunfan Chen79b96062018-10-17 12:45:23 -07006455 public void onImeWindowSetOnDisplay(final int pid, final int displayId) {
lumark48973532019-04-12 20:18:15 +08006456 // Don't update process-level configuration for Multi-Client IME process since other
6457 // IMEs on other displays will also receive this configuration change due to IME
6458 // services use the same application config/context.
6459 if (InputMethodSystemProperty.MULTI_CLIENT_IME_ENABLED) return;
lumark5df49512019-04-02 14:56:46 +08006460
Yunfan Chen75157d72018-07-27 14:47:21 +09006461 if (pid == MY_PID || pid < 0) {
6462 if (DEBUG_CONFIGURATION) {
6463 Slog.w(TAG,
6464 "Trying to update display configuration for system/invalid process.");
6465 }
6466 return;
6467 }
Yunfan Chencafc7062019-01-22 17:21:32 +09006468 synchronized (mGlobalLock) {
6469 final ActivityDisplay activityDisplay =
6470 mRootActivityContainer.getActivityDisplay(displayId);
6471 if (activityDisplay == null) {
6472 // Call might come when display is not yet added or has been removed.
6473 if (DEBUG_CONFIGURATION) {
6474 Slog.w(TAG, "Trying to update display configuration for non-existing "
6475 + "displayId=" + displayId);
Yunfan Chen75157d72018-07-27 14:47:21 +09006476 }
Yunfan Chencafc7062019-01-22 17:21:32 +09006477 return;
Yunfan Chen75157d72018-07-27 14:47:21 +09006478 }
Michal Karpinski2e0aad22019-04-12 16:22:55 +01006479 final WindowProcessController process = mProcessMap.getProcess(pid);
Yunfan Chencafc7062019-01-22 17:21:32 +09006480 if (process == null) {
6481 if (DEBUG_CONFIGURATION) {
6482 Slog.w(TAG, "Trying to update display configuration for invalid "
6483 + "process, pid=" + pid);
6484 }
6485 return;
6486 }
6487 process.registerDisplayConfigurationListenerLocked(activityDisplay);
6488 }
Yunfan Chen75157d72018-07-27 14:47:21 +09006489 }
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006490
6491 @Override
6492 public void sendActivityResult(int callingUid, IBinder activityToken, String resultWho,
Wale Ogunwale586a8ee2019-06-04 13:44:14 +00006493 int requestCode, int resultCode, Intent data) {
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006494 synchronized (mGlobalLock) {
Wale Ogunwale586a8ee2019-06-04 13:44:14 +00006495 final ActivityRecord r = ActivityRecord.isInStackLocked(activityToken);
6496 if (r != null && r.getActivityStack() != null) {
6497 r.getActivityStack().sendActivityResultLocked(callingUid, r, resultWho,
6498 requestCode, resultCode, data);
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006499 }
6500 }
6501 }
6502
6503 @Override
6504 public void clearPendingResultForActivity(IBinder activityToken,
6505 WeakReference<PendingIntentRecord> pir) {
6506 synchronized (mGlobalLock) {
6507 final ActivityRecord r = ActivityRecord.isInStackLocked(activityToken);
6508 if (r != null && r.pendingResults != null) {
6509 r.pendingResults.remove(pir);
6510 }
6511 }
6512 }
6513
6514 @Override
Sunny Goyald40c3452019-03-20 12:46:55 -07006515 public ActivityTokens getTopActivityForTask(int taskId) {
6516 synchronized (mGlobalLock) {
6517 final TaskRecord taskRecord = mRootActivityContainer.anyTaskForId(taskId);
6518 if (taskRecord == null) {
6519 Slog.w(TAG, "getApplicationThreadForTopActivity failed:"
6520 + " Requested task not found");
6521 return null;
6522 }
6523 final ActivityRecord activity = taskRecord.getTopActivity();
6524 if (activity == null) {
6525 Slog.w(TAG, "getApplicationThreadForTopActivity failed:"
6526 + " Requested activity not found");
6527 return null;
6528 }
6529 if (!activity.attachedToProcess()) {
6530 Slog.w(TAG, "getApplicationThreadForTopActivity failed: No process for "
6531 + activity);
6532 return null;
6533 }
6534 return new ActivityTokens(activity.appToken, activity.assistToken,
6535 activity.app.getThread());
6536 }
6537 }
6538
6539 @Override
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006540 public IIntentSender getIntentSender(int type, String packageName,
6541 int callingUid, int userId, IBinder token, String resultWho,
6542 int requestCode, Intent[] intents, String[] resolvedTypes, int flags,
6543 Bundle bOptions) {
6544 synchronized (mGlobalLock) {
6545 return getIntentSenderLocked(type, packageName, callingUid, userId, token,
6546 resultWho, requestCode, intents, resolvedTypes, flags, bOptions);
6547 }
6548 }
Wale Ogunwalec4e63a42018-10-02 13:19:54 -07006549
6550 @Override
6551 public ActivityServiceConnectionsHolder getServiceConnectionsHolder(IBinder token) {
6552 synchronized (mGlobalLock) {
6553 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
6554 if (r == null) {
6555 return null;
6556 }
6557 if (r.mServiceConnectionsHolder == null) {
6558 r.mServiceConnectionsHolder = new ActivityServiceConnectionsHolder(
6559 ActivityTaskManagerService.this, r);
6560 }
6561
6562 return r.mServiceConnectionsHolder;
6563 }
6564 }
Wale Ogunwale214f3482018-10-04 11:00:47 -07006565
6566 @Override
6567 public Intent getHomeIntent() {
6568 synchronized (mGlobalLock) {
6569 return ActivityTaskManagerService.this.getHomeIntent();
6570 }
6571 }
6572
6573 @Override
6574 public boolean startHomeActivity(int userId, String reason) {
6575 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08006576 return mRootActivityContainer.startHomeOnDisplay(userId, reason, DEFAULT_DISPLAY);
Louis Chang89f43fc2018-10-05 10:59:14 +08006577 }
6578 }
6579
6580 @Override
Chilun8b1f1be2019-03-13 17:14:36 +08006581 public boolean startHomeOnDisplay(int userId, String reason, int displayId,
Chilun39232092019-03-22 14:41:30 +08006582 boolean allowInstrumenting, boolean fromHomeKey) {
Chilun5fd56542019-03-21 19:51:37 +08006583 synchronized (mGlobalLock) {
6584 return mRootActivityContainer.startHomeOnDisplay(userId, reason, displayId,
Chilun39232092019-03-22 14:41:30 +08006585 allowInstrumenting, fromHomeKey);
Chilun5fd56542019-03-21 19:51:37 +08006586 }
Chilun8b1f1be2019-03-13 17:14:36 +08006587 }
6588
6589 @Override
Louis Chang89f43fc2018-10-05 10:59:14 +08006590 public boolean startHomeOnAllDisplays(int userId, String reason) {
6591 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08006592 return mRootActivityContainer.startHomeOnAllDisplays(userId, reason);
Wale Ogunwale214f3482018-10-04 11:00:47 -07006593 }
6594 }
6595
Riddle Hsua0536432019-02-16 00:38:59 +08006596 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale214f3482018-10-04 11:00:47 -07006597 @Override
6598 public boolean isFactoryTestProcess(WindowProcessController wpc) {
Riddle Hsua0536432019-02-16 00:38:59 +08006599 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale214f3482018-10-04 11:00:47 -07006600 if (mFactoryTest == FACTORY_TEST_OFF) {
6601 return false;
6602 }
6603 if (mFactoryTest == FACTORY_TEST_LOW_LEVEL && mTopComponent != null
6604 && wpc.mName.equals(mTopComponent.getPackageName())) {
6605 return true;
6606 }
6607 return mFactoryTest == FACTORY_TEST_HIGH_LEVEL
6608 && (wpc.mInfo.flags & FLAG_FACTORY_TEST) != 0;
6609 }
6610 }
6611
6612 @Override
6613 public void updateTopComponentForFactoryTest() {
6614 synchronized (mGlobalLock) {
6615 if (mFactoryTest != FACTORY_TEST_LOW_LEVEL) {
6616 return;
6617 }
6618 final ResolveInfo ri = mContext.getPackageManager()
6619 .resolveActivity(new Intent(Intent.ACTION_FACTORY_TEST), STOCK_PM_FLAGS);
6620 final CharSequence errorMsg;
6621 if (ri != null) {
6622 final ActivityInfo ai = ri.activityInfo;
6623 final ApplicationInfo app = ai.applicationInfo;
6624 if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
6625 mTopAction = Intent.ACTION_FACTORY_TEST;
6626 mTopData = null;
6627 mTopComponent = new ComponentName(app.packageName, ai.name);
6628 errorMsg = null;
6629 } else {
6630 errorMsg = mContext.getResources().getText(
6631 com.android.internal.R.string.factorytest_not_system);
6632 }
6633 } else {
6634 errorMsg = mContext.getResources().getText(
6635 com.android.internal.R.string.factorytest_no_action);
6636 }
6637 if (errorMsg == null) {
6638 return;
6639 }
6640
6641 mTopAction = null;
6642 mTopData = null;
6643 mTopComponent = null;
6644 mUiHandler.post(() -> {
6645 Dialog d = new FactoryErrorDialog(mUiContext, errorMsg);
6646 d.show();
Wale Ogunwale342fbe92018-10-09 08:44:10 -07006647 mAmInternal.ensureBootCompleted();
Wale Ogunwale214f3482018-10-04 11:00:47 -07006648 });
6649 }
6650 }
Wale Ogunwale31913b52018-10-13 08:29:31 -07006651
Riddle Hsua0536432019-02-16 00:38:59 +08006652 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale31913b52018-10-13 08:29:31 -07006653 @Override
6654 public void handleAppDied(WindowProcessController wpc, boolean restarting,
6655 Runnable finishInstrumentationCallback) {
Riddle Hsua0536432019-02-16 00:38:59 +08006656 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale31913b52018-10-13 08:29:31 -07006657 // Remove this application's activities from active lists.
Wale Ogunwaled32da472018-11-16 07:19:28 -08006658 boolean hasVisibleActivities = mRootActivityContainer.handleAppDied(wpc);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006659
6660 wpc.clearRecentTasks();
6661 wpc.clearActivities();
6662
6663 if (wpc.isInstrumenting()) {
6664 finishInstrumentationCallback.run();
6665 }
6666
Jorim Jaggid0752812018-10-16 16:07:20 +02006667 if (!restarting && hasVisibleActivities) {
6668 mWindowManager.deferSurfaceLayout();
6669 try {
6670 if (!mRootActivityContainer.resumeFocusedStacksTopActivities()) {
6671 // If there was nothing to resume, and we are not already restarting
6672 // this process, but there is a visible activity that is hosted by the
6673 // process...then make sure all visible activities are running, taking
6674 // care of restarting this process.
6675 mRootActivityContainer.ensureActivitiesVisible(null, 0,
6676 !PRESERVE_WINDOWS);
6677 }
6678 } finally {
6679 mWindowManager.continueSurfaceLayout();
Wale Ogunwale31913b52018-10-13 08:29:31 -07006680 }
Wale Ogunwale31913b52018-10-13 08:29:31 -07006681 }
6682 }
6683 }
6684
6685 @Override
6686 public void closeSystemDialogs(String reason) {
6687 enforceNotIsolatedCaller("closeSystemDialogs");
6688
6689 final int pid = Binder.getCallingPid();
6690 final int uid = Binder.getCallingUid();
6691 final long origId = Binder.clearCallingIdentity();
6692 try {
6693 synchronized (mGlobalLock) {
6694 // Only allow this from foreground processes, so that background
6695 // applications can't abuse it to prevent system UI from being shown.
6696 if (uid >= FIRST_APPLICATION_UID) {
Michal Karpinski2e0aad22019-04-12 16:22:55 +01006697 final WindowProcessController proc = mProcessMap.getProcess(pid);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006698 if (!proc.isPerceptible()) {
6699 Slog.w(TAG, "Ignoring closeSystemDialogs " + reason
6700 + " from background process " + proc);
6701 return;
6702 }
6703 }
Wale Ogunwale31913b52018-10-13 08:29:31 -07006704 mWindowManager.closeSystemDialogs(reason);
6705
Wale Ogunwaled32da472018-11-16 07:19:28 -08006706 mRootActivityContainer.closeSystemDialogs();
Wale Ogunwale31913b52018-10-13 08:29:31 -07006707 }
Wale Ogunwale2ea36d42018-10-18 10:27:31 -07006708 // Call into AM outside the synchronized block.
6709 mAmInternal.broadcastCloseSystemDialogs(reason);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006710 } finally {
6711 Binder.restoreCallingIdentity(origId);
6712 }
6713 }
6714
6715 @Override
6716 public void cleanupDisabledPackageComponents(
6717 String packageName, Set<String> disabledClasses, int userId, boolean booted) {
6718 synchronized (mGlobalLock) {
6719 // Clean-up disabled activities.
Wale Ogunwaled32da472018-11-16 07:19:28 -08006720 if (mRootActivityContainer.finishDisabledPackageActivities(
Wale Ogunwale31913b52018-10-13 08:29:31 -07006721 packageName, disabledClasses, true, false, userId) && booted) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08006722 mRootActivityContainer.resumeFocusedStacksTopActivities();
Wale Ogunwale31913b52018-10-13 08:29:31 -07006723 mStackSupervisor.scheduleIdleLocked();
6724 }
6725
6726 // Clean-up disabled tasks
6727 getRecentTasks().cleanupDisabledPackageTasksLocked(
6728 packageName, disabledClasses, userId);
6729 }
6730 }
6731
6732 @Override
6733 public boolean onForceStopPackage(String packageName, boolean doit, boolean evenPersistent,
6734 int userId) {
6735 synchronized (mGlobalLock) {
6736
6737 boolean didSomething =
6738 getActivityStartController().clearPendingActivityLaunches(packageName);
Wale Ogunwaled32da472018-11-16 07:19:28 -08006739 didSomething |= mRootActivityContainer.finishDisabledPackageActivities(packageName,
Wale Ogunwale31913b52018-10-13 08:29:31 -07006740 null, doit, evenPersistent, userId);
6741 return didSomething;
6742 }
6743 }
6744
6745 @Override
6746 public void resumeTopActivities(boolean scheduleIdle) {
6747 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08006748 mRootActivityContainer.resumeFocusedStacksTopActivities();
Wale Ogunwale31913b52018-10-13 08:29:31 -07006749 if (scheduleIdle) {
6750 mStackSupervisor.scheduleIdleLocked();
6751 }
6752 }
6753 }
6754
Riddle Hsua0536432019-02-16 00:38:59 +08006755 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale31913b52018-10-13 08:29:31 -07006756 @Override
6757 public void preBindApplication(WindowProcessController wpc) {
Riddle Hsua0536432019-02-16 00:38:59 +08006758 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale31913b52018-10-13 08:29:31 -07006759 mStackSupervisor.getActivityMetricsLogger().notifyBindApplication(wpc.mInfo);
6760 }
6761 }
6762
Riddle Hsua0536432019-02-16 00:38:59 +08006763 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale31913b52018-10-13 08:29:31 -07006764 @Override
6765 public boolean attachApplication(WindowProcessController wpc) throws RemoteException {
Riddle Hsua0536432019-02-16 00:38:59 +08006766 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08006767 return mRootActivityContainer.attachApplication(wpc);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006768 }
6769 }
6770
6771 @Override
6772 public void notifyLockedProfile(@UserIdInt int userId, int currentUserId) {
6773 try {
6774 if (!AppGlobals.getPackageManager().isUidPrivileged(Binder.getCallingUid())) {
6775 throw new SecurityException("Only privileged app can call notifyLockedProfile");
6776 }
6777 } catch (RemoteException ex) {
6778 throw new SecurityException("Fail to check is caller a privileged app", ex);
6779 }
6780
6781 synchronized (mGlobalLock) {
6782 final long ident = Binder.clearCallingIdentity();
6783 try {
6784 if (mAmInternal.shouldConfirmCredentials(userId)) {
6785 if (mKeyguardController.isKeyguardLocked()) {
6786 // Showing launcher to avoid user entering credential twice.
6787 startHomeActivity(currentUserId, "notifyLockedProfile");
6788 }
Wale Ogunwaled32da472018-11-16 07:19:28 -08006789 mRootActivityContainer.lockAllProfileTasks(userId);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006790 }
6791 } finally {
6792 Binder.restoreCallingIdentity(ident);
6793 }
6794 }
6795 }
6796
6797 @Override
6798 public void startConfirmDeviceCredentialIntent(Intent intent, Bundle options) {
6799 mAmInternal.enforceCallingPermission(
6800 MANAGE_ACTIVITY_STACKS, "startConfirmDeviceCredentialIntent");
6801
6802 synchronized (mGlobalLock) {
6803 final long ident = Binder.clearCallingIdentity();
6804 try {
Pavel Grafovc0fe0a02019-05-13 18:19:33 +01006805 intent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
6806 final ActivityOptions activityOptions = options != null
Wale Ogunwale31913b52018-10-13 08:29:31 -07006807 ? new ActivityOptions(options) : ActivityOptions.makeBasic();
Wale Ogunwale31913b52018-10-13 08:29:31 -07006808 mContext.startActivityAsUser(intent, activityOptions.toBundle(),
6809 UserHandle.CURRENT);
6810 } finally {
6811 Binder.restoreCallingIdentity(ident);
6812 }
6813 }
6814 }
6815
6816 @Override
6817 public void writeActivitiesToProto(ProtoOutputStream proto) {
6818 synchronized (mGlobalLock) {
6819 // The output proto of "activity --proto activities"
6820 // is ActivityManagerServiceDumpActivitiesProto
Wale Ogunwaled32da472018-11-16 07:19:28 -08006821 mRootActivityContainer.writeToProto(proto,
Nataniel Borges023ecb52019-01-16 14:15:43 -08006822 ActivityManagerServiceDumpActivitiesProto.ACTIVITY_STACK_SUPERVISOR,
6823 WindowTraceLogLevel.ALL);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006824 }
6825 }
6826
6827 @Override
6828 public void saveANRState(String reason) {
6829 synchronized (mGlobalLock) {
6830 final StringWriter sw = new StringWriter();
6831 final PrintWriter pw = new FastPrintWriter(sw, false, 1024);
6832 pw.println(" ANR time: " + DateFormat.getDateTimeInstance().format(new Date()));
6833 if (reason != null) {
6834 pw.println(" Reason: " + reason);
6835 }
6836 pw.println();
6837 getActivityStartController().dump(pw, " ", null);
6838 pw.println();
6839 pw.println("-------------------------------------------------------------------------------");
6840 dumpActivitiesLocked(null /* fd */, pw, null /* args */, 0 /* opti */,
6841 true /* dumpAll */, false /* dumpClient */, null /* dumpPackage */,
6842 "" /* header */);
6843 pw.println();
6844 pw.close();
6845
6846 mLastANRState = sw.toString();
6847 }
6848 }
6849
6850 @Override
6851 public void clearSavedANRState() {
6852 synchronized (mGlobalLock) {
6853 mLastANRState = null;
6854 }
6855 }
6856
6857 @Override
6858 public void dump(String cmd, FileDescriptor fd, PrintWriter pw, String[] args, int opti,
6859 boolean dumpAll, boolean dumpClient, String dumpPackage) {
6860 synchronized (mGlobalLock) {
6861 if (DUMP_ACTIVITIES_CMD.equals(cmd) || DUMP_ACTIVITIES_SHORT_CMD.equals(cmd)) {
6862 dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
6863 } else if (DUMP_LASTANR_CMD.equals(cmd)) {
6864 dumpLastANRLocked(pw);
6865 } else if (DUMP_LASTANR_TRACES_CMD.equals(cmd)) {
6866 dumpLastANRTracesLocked(pw);
6867 } else if (DUMP_STARTER_CMD.equals(cmd)) {
6868 dumpActivityStarterLocked(pw, dumpPackage);
6869 } else if (DUMP_CONTAINERS_CMD.equals(cmd)) {
6870 dumpActivityContainersLocked(pw);
6871 } else if (DUMP_RECENTS_CMD.equals(cmd) || DUMP_RECENTS_SHORT_CMD.equals(cmd)) {
6872 if (getRecentTasks() != null) {
6873 getRecentTasks().dump(pw, dumpAll, dumpPackage);
6874 }
6875 }
6876 }
6877 }
6878
6879 @Override
6880 public boolean dumpForProcesses(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
6881 String dumpPackage, int dumpAppId, boolean needSep, boolean testPssMode,
6882 int wakefulness) {
6883 synchronized (mGlobalLock) {
6884 if (mHomeProcess != null && (dumpPackage == null
6885 || mHomeProcess.mPkgList.contains(dumpPackage))) {
6886 if (needSep) {
6887 pw.println();
6888 needSep = false;
6889 }
6890 pw.println(" mHomeProcess: " + mHomeProcess);
6891 }
6892 if (mPreviousProcess != null && (dumpPackage == null
6893 || mPreviousProcess.mPkgList.contains(dumpPackage))) {
6894 if (needSep) {
6895 pw.println();
6896 needSep = false;
6897 }
6898 pw.println(" mPreviousProcess: " + mPreviousProcess);
6899 }
6900 if (dumpAll && (mPreviousProcess == null || dumpPackage == null
6901 || mPreviousProcess.mPkgList.contains(dumpPackage))) {
6902 StringBuilder sb = new StringBuilder(128);
6903 sb.append(" mPreviousProcessVisibleTime: ");
6904 TimeUtils.formatDuration(mPreviousProcessVisibleTime, sb);
6905 pw.println(sb);
6906 }
6907 if (mHeavyWeightProcess != null && (dumpPackage == null
6908 || mHeavyWeightProcess.mPkgList.contains(dumpPackage))) {
6909 if (needSep) {
6910 pw.println();
6911 needSep = false;
6912 }
6913 pw.println(" mHeavyWeightProcess: " + mHeavyWeightProcess);
6914 }
6915 if (dumpPackage == null) {
6916 pw.println(" mGlobalConfiguration: " + getGlobalConfiguration());
Wale Ogunwaled32da472018-11-16 07:19:28 -08006917 mRootActivityContainer.dumpDisplayConfigs(pw, " ");
Wale Ogunwale31913b52018-10-13 08:29:31 -07006918 }
6919 if (dumpAll) {
6920 if (dumpPackage == null) {
6921 pw.println(" mConfigWillChange: "
6922 + getTopDisplayFocusedStack().mConfigWillChange);
6923 }
6924 if (mCompatModePackages.getPackages().size() > 0) {
6925 boolean printed = false;
6926 for (Map.Entry<String, Integer> entry
6927 : mCompatModePackages.getPackages().entrySet()) {
6928 String pkg = entry.getKey();
6929 int mode = entry.getValue();
6930 if (dumpPackage != null && !dumpPackage.equals(pkg)) {
6931 continue;
6932 }
6933 if (!printed) {
6934 pw.println(" mScreenCompatPackages:");
6935 printed = true;
6936 }
6937 pw.println(" " + pkg + ": " + mode);
6938 }
6939 }
6940 }
6941
6942 if (dumpPackage == null) {
6943 pw.println(" mWakefulness="
6944 + PowerManagerInternal.wakefulnessToString(wakefulness));
Wale Ogunwaled32da472018-11-16 07:19:28 -08006945 pw.println(" mSleepTokens=" + mRootActivityContainer.mSleepTokens);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006946 if (mRunningVoice != null) {
6947 pw.println(" mRunningVoice=" + mRunningVoice);
6948 pw.println(" mVoiceWakeLock" + mVoiceWakeLock);
6949 }
6950 pw.println(" mSleeping=" + mSleeping);
6951 pw.println(" mShuttingDown=" + mShuttingDown + " mTestPssMode=" + testPssMode);
6952 pw.println(" mVrController=" + mVrController);
6953 }
6954 if (mCurAppTimeTracker != null) {
6955 mCurAppTimeTracker.dumpWithHeader(pw, " ", true);
6956 }
6957 if (mAllowAppSwitchUids.size() > 0) {
6958 boolean printed = false;
6959 for (int i = 0; i < mAllowAppSwitchUids.size(); i++) {
6960 ArrayMap<String, Integer> types = mAllowAppSwitchUids.valueAt(i);
6961 for (int j = 0; j < types.size(); j++) {
6962 if (dumpPackage == null ||
6963 UserHandle.getAppId(types.valueAt(j).intValue()) == dumpAppId) {
6964 if (needSep) {
6965 pw.println();
6966 needSep = false;
6967 }
6968 if (!printed) {
6969 pw.println(" mAllowAppSwitchUids:");
6970 printed = true;
6971 }
6972 pw.print(" User ");
6973 pw.print(mAllowAppSwitchUids.keyAt(i));
6974 pw.print(": Type ");
6975 pw.print(types.keyAt(j));
6976 pw.print(" = ");
6977 UserHandle.formatUid(pw, types.valueAt(j).intValue());
6978 pw.println();
6979 }
6980 }
6981 }
6982 }
6983 if (dumpPackage == null) {
6984 if (mController != null) {
6985 pw.println(" mController=" + mController
6986 + " mControllerIsAMonkey=" + mControllerIsAMonkey);
6987 }
Andrii Kulianc598b2d2019-02-07 17:16:38 -08006988 pw.println(" mGoingToSleepWakeLock=" + mStackSupervisor.mGoingToSleepWakeLock);
6989 pw.println(" mLaunchingActivityWakeLock="
6990 + mStackSupervisor.mLaunchingActivityWakeLock);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006991 }
6992
6993 return needSep;
6994 }
6995 }
6996
6997 @Override
sanryhuang498e77e2018-12-06 14:57:01 +08006998 public void writeProcessesToProto(ProtoOutputStream proto, String dumpPackage,
6999 int wakeFullness, boolean testPssMode) {
Wale Ogunwale31913b52018-10-13 08:29:31 -07007000 synchronized (mGlobalLock) {
7001 if (dumpPackage == null) {
7002 getGlobalConfiguration().writeToProto(proto, GLOBAL_CONFIGURATION);
7003 proto.write(CONFIG_WILL_CHANGE, getTopDisplayFocusedStack().mConfigWillChange);
sanryhuang498e77e2018-12-06 14:57:01 +08007004 writeSleepStateToProto(proto, wakeFullness, testPssMode);
7005 if (mRunningVoice != null) {
7006 final long vrToken = proto.start(
7007 ActivityManagerServiceDumpProcessesProto.RUNNING_VOICE);
7008 proto.write(ActivityManagerServiceDumpProcessesProto.Voice.SESSION,
7009 mRunningVoice.toString());
7010 mVoiceWakeLock.writeToProto(
7011 proto, ActivityManagerServiceDumpProcessesProto.Voice.WAKELOCK);
7012 proto.end(vrToken);
7013 }
7014 mVrController.writeToProto(proto,
7015 ActivityManagerServiceDumpProcessesProto.VR_CONTROLLER);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007016 if (mController != null) {
7017 final long token = proto.start(CONTROLLER);
7018 proto.write(CONTROLLER, mController.toString());
7019 proto.write(IS_A_MONKEY, mControllerIsAMonkey);
7020 proto.end(token);
7021 }
Andrii Kulianc598b2d2019-02-07 17:16:38 -08007022 mStackSupervisor.mGoingToSleepWakeLock.writeToProto(proto, GOING_TO_SLEEP);
7023 mStackSupervisor.mLaunchingActivityWakeLock.writeToProto(proto,
7024 LAUNCHING_ACTIVITY);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007025 }
7026
7027 if (mHomeProcess != null && (dumpPackage == null
7028 || mHomeProcess.mPkgList.contains(dumpPackage))) {
Wale Ogunwale51cc98a2018-10-15 10:41:05 -07007029 mHomeProcess.writeToProto(proto, HOME_PROC);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007030 }
7031
7032 if (mPreviousProcess != null && (dumpPackage == null
7033 || mPreviousProcess.mPkgList.contains(dumpPackage))) {
Wale Ogunwale51cc98a2018-10-15 10:41:05 -07007034 mPreviousProcess.writeToProto(proto, PREVIOUS_PROC);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007035 proto.write(PREVIOUS_PROC_VISIBLE_TIME_MS, mPreviousProcessVisibleTime);
7036 }
7037
7038 if (mHeavyWeightProcess != null && (dumpPackage == null
7039 || mHeavyWeightProcess.mPkgList.contains(dumpPackage))) {
Wale Ogunwale51cc98a2018-10-15 10:41:05 -07007040 mHeavyWeightProcess.writeToProto(proto, HEAVY_WEIGHT_PROC);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007041 }
7042
7043 for (Map.Entry<String, Integer> entry
7044 : mCompatModePackages.getPackages().entrySet()) {
7045 String pkg = entry.getKey();
7046 int mode = entry.getValue();
7047 if (dumpPackage == null || dumpPackage.equals(pkg)) {
7048 long compatToken = proto.start(SCREEN_COMPAT_PACKAGES);
7049 proto.write(PACKAGE, pkg);
7050 proto.write(MODE, mode);
7051 proto.end(compatToken);
7052 }
7053 }
7054
7055 if (mCurAppTimeTracker != null) {
7056 mCurAppTimeTracker.writeToProto(proto, CURRENT_TRACKER, true);
7057 }
7058
7059 }
7060 }
7061
7062 @Override
7063 public boolean dumpActivity(FileDescriptor fd, PrintWriter pw, String name,
7064 String[] args, int opti, boolean dumpAll, boolean dumpVisibleStacksOnly,
7065 boolean dumpFocusedStackOnly) {
7066 synchronized (mGlobalLock) {
7067 return ActivityTaskManagerService.this.dumpActivity(fd, pw, name, args, opti,
7068 dumpAll, dumpVisibleStacksOnly, dumpFocusedStackOnly);
7069 }
7070 }
7071
7072 @Override
Wale Ogunwaled4d67d02018-10-25 18:09:39 -07007073 public void dumpForOom(PrintWriter pw) {
7074 synchronized (mGlobalLock) {
7075 pw.println(" mHomeProcess: " + mHomeProcess);
7076 pw.println(" mPreviousProcess: " + mPreviousProcess);
7077 if (mHeavyWeightProcess != null) {
7078 pw.println(" mHeavyWeightProcess: " + mHeavyWeightProcess);
7079 }
7080 }
7081 }
7082
7083 @Override
Wale Ogunwale31913b52018-10-13 08:29:31 -07007084 public boolean canGcNow() {
7085 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08007086 return isSleeping() || mRootActivityContainer.allResumedActivitiesIdle();
Wale Ogunwale31913b52018-10-13 08:29:31 -07007087 }
7088 }
7089
Riddle Hsua0536432019-02-16 00:38:59 +08007090 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwale31913b52018-10-13 08:29:31 -07007091 @Override
7092 public WindowProcessController getTopApp() {
Riddle Hsud7088f82019-01-30 13:04:50 +08007093 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08007094 final ActivityRecord top = mRootActivityContainer.getTopResumedActivity();
Wale Ogunwale31913b52018-10-13 08:29:31 -07007095 return top != null ? top.app : null;
7096 }
7097 }
7098
Riddle Hsua0536432019-02-16 00:38:59 +08007099 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwale31913b52018-10-13 08:29:31 -07007100 @Override
7101 public void rankTaskLayersIfNeeded() {
Riddle Hsud7088f82019-01-30 13:04:50 +08007102 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08007103 if (mRootActivityContainer != null) {
7104 mRootActivityContainer.rankTaskLayersIfNeeded();
Wale Ogunwale31913b52018-10-13 08:29:31 -07007105 }
7106 }
7107 }
7108
7109 @Override
7110 public void scheduleDestroyAllActivities(String reason) {
7111 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08007112 mRootActivityContainer.scheduleDestroyAllActivities(null, reason);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007113 }
7114 }
7115
7116 @Override
7117 public void removeUser(int userId) {
7118 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08007119 mRootActivityContainer.removeUser(userId);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007120 }
7121 }
7122
7123 @Override
7124 public boolean switchUser(int userId, UserState userState) {
7125 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08007126 return mRootActivityContainer.switchUser(userId, userState);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007127 }
7128 }
7129
7130 @Override
7131 public void onHandleAppCrash(WindowProcessController wpc) {
7132 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08007133 mRootActivityContainer.handleAppCrash(wpc);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007134 }
7135 }
Wale Ogunwale64258362018-10-16 15:13:37 -07007136
7137 @Override
7138 public int finishTopCrashedActivities(WindowProcessController crashedApp, String reason) {
7139 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08007140 return mRootActivityContainer.finishTopCrashedActivities(crashedApp, reason);
Wale Ogunwale64258362018-10-16 15:13:37 -07007141 }
7142 }
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007143
Riddle Hsua0536432019-02-16 00:38:59 +08007144 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007145 @Override
7146 public void onUidActive(int uid, int procState) {
Riddle Hsua0536432019-02-16 00:38:59 +08007147 mActiveUids.onUidActive(uid, procState);
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007148 }
7149
Riddle Hsua0536432019-02-16 00:38:59 +08007150 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007151 @Override
7152 public void onUidInactive(int uid) {
Riddle Hsua0536432019-02-16 00:38:59 +08007153 mActiveUids.onUidInactive(uid);
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007154 }
7155
Riddle Hsua0536432019-02-16 00:38:59 +08007156 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007157 @Override
7158 public void onActiveUidsCleared() {
Riddle Hsua0536432019-02-16 00:38:59 +08007159 mActiveUids.onActiveUidsCleared();
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007160 }
7161
Riddle Hsua0536432019-02-16 00:38:59 +08007162 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007163 @Override
7164 public void onUidProcStateChanged(int uid, int procState) {
Riddle Hsua0536432019-02-16 00:38:59 +08007165 mActiveUids.onUidProcStateChanged(uid, procState);
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007166 }
Wale Ogunwale9de19442018-10-18 19:05:03 -07007167
7168 @Override
7169 public void onUidAddedToPendingTempWhitelist(int uid, String tag) {
Riddle Hsud7088f82019-01-30 13:04:50 +08007170 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale9de19442018-10-18 19:05:03 -07007171 mPendingTempWhitelist.put(uid, tag);
7172 }
7173 }
7174
7175 @Override
7176 public void onUidRemovedFromPendingTempWhitelist(int uid) {
Riddle Hsud7088f82019-01-30 13:04:50 +08007177 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale9de19442018-10-18 19:05:03 -07007178 mPendingTempWhitelist.remove(uid);
7179 }
7180 }
Wale Ogunwalee2172292018-10-25 10:11:10 -07007181
7182 @Override
7183 public boolean handleAppCrashInActivityController(String processName, int pid,
7184 String shortMsg, String longMsg, long timeMillis, String stackTrace,
7185 Runnable killCrashingAppCallback) {
7186 synchronized (mGlobalLock) {
7187 if (mController == null) {
7188 return false;
7189 }
7190
7191 try {
7192 if (!mController.appCrashed(processName, pid, shortMsg, longMsg, timeMillis,
7193 stackTrace)) {
7194 killCrashingAppCallback.run();
7195 return true;
7196 }
7197 } catch (RemoteException e) {
7198 mController = null;
7199 Watchdog.getInstance().setActivityController(null);
7200 }
7201 return false;
7202 }
7203 }
Wale Ogunwaled7889f52018-10-25 11:03:20 -07007204
7205 @Override
7206 public void removeRecentTasksByPackageName(String packageName, int userId) {
7207 synchronized (mGlobalLock) {
7208 mRecentTasks.removeTasksByPackageName(packageName, userId);
7209 }
7210 }
7211
7212 @Override
7213 public void cleanupRecentTasksForUser(int userId) {
7214 synchronized (mGlobalLock) {
7215 mRecentTasks.cleanupLocked(userId);
7216 }
7217 }
7218
7219 @Override
7220 public void loadRecentTasksForUser(int userId) {
7221 synchronized (mGlobalLock) {
7222 mRecentTasks.loadUserRecentsLocked(userId);
7223 }
7224 }
7225
7226 @Override
7227 public void onPackagesSuspendedChanged(String[] packages, boolean suspended, int userId) {
7228 synchronized (mGlobalLock) {
7229 mRecentTasks.onPackagesSuspendedChanged(packages, suspended, userId);
7230 }
7231 }
7232
7233 @Override
7234 public void flushRecentTasks() {
7235 mRecentTasks.flush();
7236 }
Wale Ogunwaled4d67d02018-10-25 18:09:39 -07007237
7238 @Override
7239 public WindowProcessController getHomeProcess() {
7240 synchronized (mGlobalLock) {
7241 return mHomeProcess;
7242 }
7243 }
7244
7245 @Override
7246 public WindowProcessController getPreviousProcess() {
7247 synchronized (mGlobalLock) {
7248 return mPreviousProcess;
7249 }
7250 }
Wale Ogunwale27c48ae2018-10-25 19:01:01 -07007251
7252 @Override
7253 public void clearLockedTasks(String reason) {
7254 synchronized (mGlobalLock) {
7255 getLockTaskController().clearLockedTasks(reason);
7256 }
7257 }
7258
7259 @Override
7260 public void updateUserConfiguration() {
7261 synchronized (mGlobalLock) {
7262 final Configuration configuration = new Configuration(getGlobalConfiguration());
7263 final int currentUserId = mAmInternal.getCurrentUserId();
7264 Settings.System.adjustConfigurationForUser(mContext.getContentResolver(),
7265 configuration, currentUserId, Settings.System.canWrite(mContext));
7266 updateConfigurationLocked(configuration, null /* starting */,
7267 false /* initLocale */, false /* persistent */, currentUserId,
7268 false /* deferResume */);
7269 }
7270 }
Wale Ogunwale387b34c2018-10-25 19:59:40 -07007271
7272 @Override
7273 public boolean canShowErrorDialogs() {
7274 synchronized (mGlobalLock) {
7275 return mShowDialogs && !mSleeping && !mShuttingDown
7276 && !mKeyguardController.isKeyguardOrAodShowing(DEFAULT_DISPLAY)
7277 && !hasUserRestriction(UserManager.DISALLOW_SYSTEM_ERROR_DIALOGS,
7278 mAmInternal.getCurrentUserId())
7279 && !(UserManager.isDeviceInDemoMode(mContext)
7280 && mAmInternal.getCurrentUser().isDemo());
7281 }
7282 }
Wale Ogunwale1f5e53d2018-11-05 05:12:46 -08007283
7284 @Override
7285 public void setProfileApp(String profileApp) {
7286 synchronized (mGlobalLock) {
7287 mProfileApp = profileApp;
7288 }
7289 }
7290
7291 @Override
7292 public void setProfileProc(WindowProcessController wpc) {
7293 synchronized (mGlobalLock) {
7294 mProfileProc = wpc;
7295 }
7296 }
7297
7298 @Override
7299 public void setProfilerInfo(ProfilerInfo profilerInfo) {
7300 synchronized (mGlobalLock) {
7301 mProfilerInfo = profilerInfo;
7302 }
7303 }
Igor Murashkinc0b47e42018-11-07 15:54:18 -08007304
7305 @Override
7306 public ActivityMetricsLaunchObserverRegistry getLaunchObserverRegistry() {
7307 synchronized (mGlobalLock) {
7308 return mStackSupervisor.getActivityMetricsLogger().getLaunchObserverRegistry();
7309 }
7310 }
Winson Chung3fb0f252019-01-08 17:41:55 -08007311
7312 @Override
Jorim Jaggi925bb3c2019-06-04 19:51:45 +02007313 public ActivityManager.TaskSnapshot getTaskSnapshotNoRestore(int taskId,
7314 boolean reducedResolution) {
7315 return ActivityTaskManagerService.this.getTaskSnapshot(taskId, reducedResolution,
7316 false /* restoreFromDisk */);
Winson Chung3fb0f252019-01-08 17:41:55 -08007317 }
Michal Karpinskicc88d7e2019-01-24 15:32:12 +00007318
7319 @Override
7320 public boolean isUidForeground(int uid) {
7321 synchronized (mGlobalLock) {
7322 return ActivityTaskManagerService.this.isUidForeground(uid);
7323 }
7324 }
Michal Karpinski4026cae2019-02-12 11:51:47 +00007325
7326 @Override
Ricky Wai96f5c352019-04-10 18:40:17 +01007327 public void setDeviceOwnerUid(int uid) {
Michal Karpinski4026cae2019-02-12 11:51:47 +00007328 synchronized (mGlobalLock) {
Ricky Wai96f5c352019-04-10 18:40:17 +01007329 ActivityTaskManagerService.this.setDeviceOwnerUid(uid);
Michal Karpinski4026cae2019-02-12 11:51:47 +00007330 }
7331 }
Ricky Wai2452e2d2019-03-18 19:19:08 +00007332
7333 @Override
7334 public void setCompanionAppPackages(int userId, Set<String> companionAppPackages) {
Michal Karpinskida34cd42019-04-02 19:46:52 +01007335 // Translate package names into UIDs
7336 final Set<Integer> result = new HashSet<>();
Ricky Wai2452e2d2019-03-18 19:19:08 +00007337 for (String pkg : companionAppPackages) {
Michal Karpinskida34cd42019-04-02 19:46:52 +01007338 final int uid = getPackageManagerInternalLocked().getPackageUid(pkg, 0, userId);
7339 if (uid >= 0) {
7340 result.add(uid);
7341 }
Ricky Wai2452e2d2019-03-18 19:19:08 +00007342 }
7343 synchronized (mGlobalLock) {
Michal Karpinskida34cd42019-04-02 19:46:52 +01007344 mCompanionAppUidsMap.put(userId, result);
Ricky Wai2452e2d2019-03-18 19:19:08 +00007345 }
7346 }
Wale Ogunwale6767eae2018-05-03 15:52:51 -07007347 }
Wale Ogunwaleb73f3962018-11-20 07:58:22 -08007348}