Moved startHomeActivity methods from AMS to ATMS (19/n)
Bug: 80414790
Test: Existing tests pass.
Change-Id: Ie3354304ea800777bd9ca7a83885b379776704e2
diff --git a/services/core/java/com/android/server/PinnerService.java b/services/core/java/com/android/server/PinnerService.java
index 0deaee7..526aebe 100644
--- a/services/core/java/com/android/server/PinnerService.java
+++ b/services/core/java/com/android/server/PinnerService.java
@@ -59,6 +59,7 @@
import com.android.internal.util.DumpUtils;
import com.android.internal.util.function.pooled.PooledLambda;
+import com.android.server.wm.ActivityTaskManagerInternal;
import dalvik.system.DexFile;
import dalvik.system.VMRuntime;
@@ -103,6 +104,7 @@
public @interface AppKey {}
private final Context mContext;
+ private final ActivityTaskManagerInternal mAtmInternal;
private final ActivityManagerInternal mAmInternal;
private final IActivityManager mAm;
private final UserManager mUserManager;
@@ -164,6 +166,7 @@
}
mPinnerHandler = new PinnerHandler(BackgroundThread.get().getLooper());
+ mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
mAm = ActivityManager.getService();
@@ -380,7 +383,7 @@
}
private ApplicationInfo getHomeInfo(int userHandle) {
- Intent intent = mAmInternal.getHomeIntent();
+ Intent intent = mAtmInternal.getHomeIntent();
return getApplicationInfoForIntent(intent, userHandle, false);
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 9c96968..14b5e42 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -42,6 +42,7 @@
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.net.NetworkPolicyManager.isProcStateAllowedWhileIdleOrPowerSaveMode;
import static android.net.NetworkPolicyManager.isProcStateAllowedWhileOnRestrictBackground;
+import static android.os.FactoryTest.FACTORY_TEST_OFF;
import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_CRITICAL;
import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_HIGH;
import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_NORMAL;
@@ -1068,17 +1069,10 @@
*/
final StringBuilder mStringBuilder = new StringBuilder(256);
- /**
- * Used to control how we initialize the service.
- */
- ComponentName mTopComponent;
- String mTopAction = Intent.ACTION_MAIN;
- String mTopData;
-
volatile boolean mProcessesReady = false;
volatile boolean mSystemReady = false;
volatile boolean mOnBattery = false;
- volatile int mFactoryTest;
+ final int mFactoryTest;
volatile boolean mBooting = false;
@GuardedBy("this") boolean mCallFinishBooting = false;
@@ -1411,7 +1405,6 @@
static final int SHOW_ERROR_UI_MSG = 1;
static final int SHOW_NOT_RESPONDING_UI_MSG = 2;
- static final int SHOW_FACTORY_ERROR_UI_MSG = 3;
static final int UPDATE_CONFIGURATION_MSG = 4;
static final int GC_BACKGROUND_PROCESSES_MSG = 5;
static final int WAIT_FOR_DEBUGGER_UI_MSG = 6;
@@ -1472,8 +1465,6 @@
PackageManagerInternal mPackageManagerInt;
- boolean mHasHeavyWeightFeature;
-
/**
* Whether to force background check on all apps (for battery saver) or not.
*/
@@ -1555,12 +1546,6 @@
}
ensureBootCompleted();
} break;
- case SHOW_FACTORY_ERROR_UI_MSG: {
- Dialog d = new FactoryErrorDialog(
- mUiContext, msg.getData().getCharSequence("msg"));
- d.show();
- ensureBootCompleted();
- } break;
case WAIT_FOR_DEBUGGER_UI_MSG: {
synchronized (ActivityManagerService.this) {
ProcessRecord app = (ProcessRecord)msg.obj;
@@ -2331,6 +2316,7 @@
mProcStartHandlerThread = null;
mProcStartHandler = null;
mHiddenApiBlacklist = null;
+ mFactoryTest = FACTORY_TEST_OFF;
}
// Note: This method is invoked on the main thread but may need to attach various
@@ -3345,16 +3331,8 @@
if (gids[1] == UserHandle.ERR_GID) gids[1] = gids[2];
}
checkTime(startTime, "startProcess: building args");
- if (mFactoryTest != FactoryTest.FACTORY_TEST_OFF) {
- if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL
- && mTopComponent != null
- && app.processName.equals(mTopComponent.getPackageName())) {
- uid = 0;
- }
- if (mFactoryTest == FactoryTest.FACTORY_TEST_HIGH_LEVEL
- && (app.info.flags&ApplicationInfo.FLAG_FACTORY_TEST) != 0) {
- uid = 0;
- }
+ if (mAtmInternal.isFactoryTestProcess(app.getWindowProcessController())) {
+ uid = 0;
}
int runtimeFlags = 0;
if ((app.info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
@@ -3715,82 +3693,6 @@
}
}
- Intent getHomeIntent() {
- Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);
- intent.setComponent(mTopComponent);
- intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
- if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
- intent.addCategory(Intent.CATEGORY_HOME);
- }
- return intent;
- }
-
- boolean startHomeActivityLocked(int userId, String reason) {
- return startHomeActivityLocked(userId, reason, DEFAULT_DISPLAY);
- }
-
- /**
- * This starts home activity on displays that can have system decorations and only if the
- * home activity can have multiple instances.
- */
- boolean startHomeActivityLocked(int userId, String reason, int displayId) {
- if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL
- && mTopAction == null) {
- // We are running in factory test mode, but unable to find
- // the factory test app, so just sit around displaying the
- // error message and don't try to start anything.
- return false;
- }
- Intent intent = getHomeIntent();
- ActivityInfo aInfo = resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);
- if (aInfo != null) {
- intent.setComponent(new ComponentName(aInfo.applicationInfo.packageName, aInfo.name));
- // Don't do this if the home app is currently being
- // instrumented.
- aInfo = new ActivityInfo(aInfo);
- aInfo.applicationInfo = getAppInfoForUser(aInfo.applicationInfo, userId);
- ProcessRecord app = getProcessRecordLocked(aInfo.processName,
- aInfo.applicationInfo.uid, true);
- if (app == null || app.getActiveInstrumentation() == null) {
- intent.setFlags(intent.getFlags() | FLAG_ACTIVITY_NEW_TASK);
- final int resolvedUserId = UserHandle.getUserId(aInfo.applicationInfo.uid);
- // For ANR debugging to verify if the user activity is the one that actually
- // launched.
- final String myReason = reason + ":" + userId + ":" + resolvedUserId;
- mActivityTaskManager.getActivityStartController().startHomeActivity(intent, aInfo,
- myReason, displayId);
- }
- } else {
- Slog.wtf(TAG, "No home screen found for " + intent, new Throwable());
- }
-
- return true;
- }
-
- private ActivityInfo resolveActivityInfo(Intent intent, int flags, int userId) {
- ActivityInfo ai = null;
- ComponentName comp = intent.getComponent();
- try {
- if (comp != null) {
- // Factory test.
- ai = AppGlobals.getPackageManager().getActivityInfo(comp, flags, userId);
- } else {
- ResolveInfo info = AppGlobals.getPackageManager().resolveIntent(
- intent,
- intent.resolveTypeIfNeeded(mContext.getContentResolver()),
- flags, userId);
-
- if (info != null) {
- ai = info.activityInfo;
- }
- }
- } catch (RemoteException e) {
- // ignore
- }
-
- return ai;
- }
-
boolean getCheckedForSetup() {
return mCheckedForSetup;
}
@@ -6722,7 +6624,7 @@
}
}
- static int checkComponentPermission(String permission, int pid, int uid,
+ public static int checkComponentPermission(String permission, int pid, int uid,
int owningUid, boolean exported) {
if (pid == MY_PID) {
return PackageManager.PERMISSION_GRANTED;
@@ -8804,7 +8706,7 @@
if (mActivityTaskManager.mKeyguardController.isKeyguardLocked()) {
// Showing launcher to avoid user entering credential twice.
final int currentUserId = mUserController.getCurrentUserId();
- startHomeActivityLocked(currentUserId, "notifyLockedProfile");
+ mAtmInternal.startHomeActivity(currentUserId, "notifyLockedProfile");
}
mStackSupervisor.lockAllProfileTasks(userId);
}
@@ -9817,8 +9719,6 @@
return;
}
- mHasHeavyWeightFeature = mContext.getPackageManager().hasSystemFeature(
- PackageManager.FEATURE_CANT_SAVE_STATE);
mLocalDeviceIdleController
= LocalServices.getService(DeviceIdleController.LocalService.class);
mActivityTaskManager.onSystemReady();
@@ -9863,44 +9763,9 @@
}
Slog.i(TAG, "System now ready");
- EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_AMS_READY,
- SystemClock.uptimeMillis());
+ EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_AMS_READY, SystemClock.uptimeMillis());
- synchronized(this) {
- // Make sure we have no pre-ready processes sitting around.
-
- if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL) {
- ResolveInfo ri = mContext.getPackageManager()
- .resolveActivity(new Intent(Intent.ACTION_FACTORY_TEST),
- STOCK_PM_FLAGS);
- CharSequence errorMsg = null;
- if (ri != null) {
- ActivityInfo ai = ri.activityInfo;
- ApplicationInfo app = ai.applicationInfo;
- if ((app.flags&ApplicationInfo.FLAG_SYSTEM) != 0) {
- mTopAction = Intent.ACTION_FACTORY_TEST;
- mTopData = null;
- mTopComponent = new ComponentName(app.packageName,
- ai.name);
- } else {
- errorMsg = mContext.getResources().getText(
- com.android.internal.R.string.factorytest_not_system);
- }
- } else {
- errorMsg = mContext.getResources().getText(
- com.android.internal.R.string.factorytest_no_action);
- }
- if (errorMsg != null) {
- mTopAction = null;
- mTopData = null;
- mTopComponent = null;
- Message msg = Message.obtain();
- msg.what = SHOW_FACTORY_ERROR_UI_MSG;
- msg.getData().putCharSequence("msg", errorMsg);
- mUiHandler.sendMessage(msg);
- }
- }
- }
+ mAtmInternal.updateTopComponentForFactoryTest();
retrieveSettings();
final int currentUserId = mUserController.getCurrentUserId();
@@ -9946,7 +9811,7 @@
throw e.rethrowAsRuntimeException();
}
}
- startHomeActivityLocked(currentUserId, "systemReady");
+ mAtmInternal.startHomeActivity(currentUserId, "systemReady");
mAtmInternal.showSystemReadyErrorDialogsIfNeeded();
@@ -20821,13 +20686,6 @@
}
@Override
- public Intent getHomeIntent() {
- synchronized (ActivityManagerService.this) {
- return ActivityManagerService.this.getHomeIntent();
- }
- }
-
- @Override
public void scheduleAppGcs() {
synchronized (ActivityManagerService.this) {
ActivityManagerService.this.scheduleAppGcsLocked();
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 4e126d9..f949fc7 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -42,6 +42,7 @@
import static android.app.WindowConfiguration.windowingModeToString;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK;
+import static android.content.pm.PackageManager.NOTIFY_PACKAGE_USE_ACTIVITY;
import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.graphics.Rect.copyOrNull;
@@ -828,7 +829,7 @@
moveFocusableActivityToTop(r, myReason);
return resumeFocusedStacksTopActivitiesLocked(r.getStack(), prev, null);
}
- return mService.mAm.startHomeActivityLocked(mCurrentUser, myReason, displayId);
+ return mService.startHomeActivityLocked(mCurrentUser, myReason, displayId);
}
boolean canStartHomeOnDisplay(ActivityInfo homeActivity, int displayId) {
@@ -1526,8 +1527,8 @@
// Home process is the root process of the task.
mService.mHomeProcess = task.mActivities.get(0).app;
}
- mService.mAm.notifyPackageUse(r.intent.getComponent().getPackageName(),
- PackageManager.NOTIFY_PACKAGE_USE_ACTIVITY);
+ mService.getPackageManagerInternalLocked().notifyPackageUse(
+ r.intent.getComponent().getPackageName(), NOTIFY_PACKAGE_USE_ACTIVITY);
r.sleeping = false;
r.forceNewConfig = false;
mService.getAppWarningsLocked().onStartActivity(r);
@@ -1592,7 +1593,7 @@
mService.getLifecycleManager().scheduleTransaction(clientTransaction);
if ((app.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0
- && mService.mAm.mHasHeavyWeightFeature) {
+ && mService.mHasHeavyWeightFeature) {
// This may be a heavy-weight process! Note that the package manager will ensure
// that only activity can run in the main process of the .apk, which is the only
// thing that will be considered heavy-weight.
@@ -1961,7 +1962,7 @@
private int getComponentRestrictionForCallingPackage(ActivityInfo activityInfo,
String callingPackage, int callingPid, int callingUid, boolean ignoreTargetSecurity) {
- if (!ignoreTargetSecurity && mService.mAm.checkComponentPermission(activityInfo.permission,
+ if (!ignoreTargetSecurity && mService.checkComponentPermission(activityInfo.permission,
callingPid, callingUid, activityInfo.applicationInfo.uid, activityInfo.exported)
== PERMISSION_DENIED) {
return ACTIVITY_RESTRICTION_PERMISSION;
@@ -4279,7 +4280,7 @@
private void handleDisplayAdded(int displayId) {
synchronized (mService.mGlobalLock) {
getActivityDisplayOrCreateLocked(displayId);
- mService.mAm.startHomeActivityLocked(mCurrentUser, "displayAdded", displayId);
+ mService.startHomeActivityLocked(mCurrentUser, "displayAdded", displayId);
}
}
diff --git a/services/core/java/com/android/server/am/ActivityStartController.java b/services/core/java/com/android/server/am/ActivityStartController.java
index 5e73bc3..f6f1e55 100644
--- a/services/core/java/com/android/server/am/ActivityStartController.java
+++ b/services/core/java/com/android/server/am/ActivityStartController.java
@@ -21,6 +21,7 @@
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+import static android.os.FactoryTest.FACTORY_TEST_LOW_LEVEL;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
@@ -200,9 +201,8 @@
// version than the last one shown, and we are not running in
// low-level factory test mode.
final ContentResolver resolver = mService.mContext.getContentResolver();
- if (mService.mAm.mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL &&
- Settings.Global.getInt(resolver,
- Settings.Global.DEVICE_PROVISIONED, 0) != 0) {
+ if (mService.mFactoryTest != FACTORY_TEST_LOW_LEVEL
+ && Settings.Global.getInt(resolver, Settings.Global.DEVICE_PROVISIONED, 0) != 0) {
mService.mAm.setCheckedForSetup(true);
// See if we should be showing the platform update setup UI.
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index de3b9cf..2bd22e8 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -1076,7 +1076,7 @@
if (aInfo != null &&
(aInfo.applicationInfo.privateFlags
& ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0 &&
- mService.mAm.mHasHeavyWeightFeature) {
+ mService.mHasHeavyWeightFeature) {
// This may be a heavy-weight process! Check to see if we already
// have another, different heavy-weight process running.
if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) {
diff --git a/services/core/java/com/android/server/am/ActivityTaskManagerService.java b/services/core/java/com/android/server/am/ActivityTaskManagerService.java
index c1eab82..8e3eeae 100644
--- a/services/core/java/com/android/server/am/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityTaskManagerService.java
@@ -39,6 +39,7 @@
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+import static android.content.pm.ApplicationInfo.FLAG_FACTORY_TEST;
import static android.content.pm.PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS;
import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT;
import static android.content.pm.PackageManager.FEATURE_PC;
@@ -46,6 +47,9 @@
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.content.res.Configuration.UI_MODE_TYPE_TELEVISION;
import static android.os.Build.VERSION_CODES.N;
+import static android.os.FactoryTest.FACTORY_TEST_HIGH_LEVEL;
+import static android.os.FactoryTest.FACTORY_TEST_LOW_LEVEL;
+import static android.os.FactoryTest.FACTORY_TEST_OFF;
import static android.os.Process.SYSTEM_UID;
import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER;
import static android.provider.Settings.Global.ALWAYS_FINISH_ACTIVITIES;
@@ -86,7 +90,6 @@
import static com.android.server.am.ActivityManagerService.SEND_LOCALE_TO_MOUNT_DAEMON_MSG;
import static com.android.server.am.ActivityManagerService.STOCK_PM_FLAGS;
import static com.android.server.am.ActivityManagerService.UPDATE_CONFIGURATION_MSG;
-import static com.android.server.am.ActivityManagerService.checkComponentPermission;
import static com.android.server.am.ActivityManagerService.dumpStackTraces;
import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_DESTROYING;
import static com.android.server.am.ActivityStackSupervisor.DEFER_RESUME;
@@ -167,6 +170,7 @@
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
+import android.os.FactoryTest;
import android.os.FileUtils;
import android.os.Handler;
import android.os.IBinder;
@@ -293,6 +297,7 @@
WindowProcessController mHomeProcess;
/** The currently running heavy-weight process, if any. */
WindowProcessController mHeavyWeightProcess = null;
+ boolean mHasHeavyWeightFeature;
/**
* This is the process holding the activity the user last visited that is in a different process
* from the one they are currently in.
@@ -388,6 +393,13 @@
IActivityController mController = null;
boolean mControllerIsAMonkey = false;
+ final int mFactoryTest;
+
+ /** Used to control how we initialize the service. */
+ ComponentName mTopComponent;
+ String mTopAction = Intent.ACTION_MAIN;
+ String mTopData;
+
/**
* Used to retain an update lock when the foreground activity is in
* immersive mode.
@@ -524,11 +536,14 @@
ActivityTaskManagerService(Context context) {
mContext = context;
+ mFactoryTest = FactoryTest.getMode();
mUiContext = ActivityThread.currentActivityThread().getSystemUiContext();
mLifecycleManager = new ClientLifecycleManager();
}
void onSystemReady() {
+ mHasHeavyWeightFeature = mContext.getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_CANT_SAVE_STATE);
mAssistUtils = new AssistUtils(mContext);
mVrController.onSystemReady();
mRecentTasks.onSystemReadyLocked();
@@ -2970,7 +2985,7 @@
}
/** This can be called with or without the global lock held. */
- void enforceCallerIsRecentsOrHasPermission(String permission, String func) {
+ private void enforceCallerIsRecentsOrHasPermission(String permission, String func) {
if (!getRecentTasks().isCallerRecents(Binder.getCallingUid())) {
mAmInternal.enforceCallingPermission(permission, func);
}
@@ -2988,6 +3003,12 @@
return checkComponentPermission(permission, pid, uid, -1, true);
}
+ public static int checkComponentPermission(String permission, int pid, int uid,
+ int owningUid, boolean exported) {
+ return ActivityManagerService.checkComponentPermission(
+ permission, pid, uid, owningUid, exported);
+ }
+
boolean isGetTasksAllowed(String caller, int callingPid, int callingUid) {
if (getRecentTasks().isCallerRecents(callingUid)) {
// Always allow the recents component to get tasks
@@ -5155,6 +5176,103 @@
return mAppWarnings;
}
+ Intent getHomeIntent() {
+ Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);
+ intent.setComponent(mTopComponent);
+ intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
+ if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
+ intent.addCategory(Intent.CATEGORY_HOME);
+ }
+ return intent;
+ }
+
+ /**
+ * This starts home activity on displays that can have system decorations and only if the
+ * home activity can have multiple instances.
+ */
+ boolean startHomeActivityLocked(int userId, String reason, int displayId) {
+ if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL && mTopAction == null) {
+ // We are running in factory test mode, but unable to find the factory test app, so just
+ // sit around displaying the error message and don't try to start anything.
+ return false;
+ }
+
+ final Intent intent = getHomeIntent();
+ ActivityInfo aInfo = resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);
+ if (aInfo != null) {
+ intent.setComponent(new ComponentName(aInfo.applicationInfo.packageName, aInfo.name));
+ // Don't do this if the home app is currently being instrumented.
+ aInfo = new ActivityInfo(aInfo);
+ aInfo.applicationInfo = getAppInfoForUser(aInfo.applicationInfo, userId);
+ WindowProcessController app =
+ getProcessController(aInfo.processName, aInfo.applicationInfo.uid);
+ if (app == null || !app.isInstrumenting()) {
+ intent.setFlags(intent.getFlags() | FLAG_ACTIVITY_NEW_TASK);
+ final int resolvedUserId = UserHandle.getUserId(aInfo.applicationInfo.uid);
+ // For ANR debugging to verify if the user activity is the one that actually
+ // launched.
+ final String myReason = reason + ":" + userId + ":" + resolvedUserId;
+ getActivityStartController().startHomeActivity(intent, aInfo, myReason, displayId);
+ }
+ } else {
+ Slog.wtf(TAG, "No home screen found for " + intent, new Throwable());
+ }
+
+ return true;
+ }
+
+ private ActivityInfo resolveActivityInfo(Intent intent, int flags, int userId) {
+ ActivityInfo ai = null;
+ final ComponentName comp = intent.getComponent();
+ try {
+ if (comp != null) {
+ // Factory test.
+ ai = AppGlobals.getPackageManager().getActivityInfo(comp, flags, userId);
+ } else {
+ ResolveInfo info = AppGlobals.getPackageManager().resolveIntent(
+ intent,
+ intent.resolveTypeIfNeeded(mContext.getContentResolver()),
+ flags, userId);
+
+ if (info != null) {
+ ai = info.activityInfo;
+ }
+ }
+ } catch (RemoteException e) {
+ // ignore
+ }
+
+ return ai;
+ }
+
+ ApplicationInfo getAppInfoForUser(ApplicationInfo info, int userId) {
+ if (info == null) return null;
+ ApplicationInfo newInfo = new ApplicationInfo(info);
+ newInfo.initForUser(userId);
+ return newInfo;
+ }
+
+ private WindowProcessController getProcessController(String processName, int uid) {
+ if (uid == SYSTEM_UID) {
+ // The system gets to run in any process. If there are multiple processes with the same
+ // uid, just pick the first (this should never happen).
+ final SparseArray<WindowProcessController> procs =
+ mProcessNames.getMap().get(processName);
+ if (procs == null) return null;
+ final int procCount = procs.size();
+ for (int i = 0; i < procCount; i++) {
+ final int procUid = procs.keyAt(i);
+ if (UserHandle.isApp(procUid) || !UserHandle.isSameUser(procUid, uid)) {
+ // Don't use an app process or different user process for system component.
+ continue;
+ }
+ return procs.valueAt(i);
+ }
+ }
+
+ return mProcessNames.get(processName, uid);
+ }
+
void logAppTooSlow(WindowProcessController app, long startTime, String msg) {
if (true || Build.IS_USER) {
return;
@@ -5795,5 +5913,74 @@
return r.mServiceConnectionsHolder;
}
}
+
+ @Override
+ public Intent getHomeIntent() {
+ synchronized (mGlobalLock) {
+ return ActivityTaskManagerService.this.getHomeIntent();
+ }
+ }
+
+ @Override
+ public boolean startHomeActivity(int userId, String reason) {
+ synchronized (mGlobalLock) {
+ return startHomeActivityLocked(userId, reason, DEFAULT_DISPLAY);
+ }
+ }
+
+ @Override
+ public boolean isFactoryTestProcess(WindowProcessController wpc) {
+ synchronized (mGlobalLock) {
+ if (mFactoryTest == FACTORY_TEST_OFF) {
+ return false;
+ }
+ if (mFactoryTest == FACTORY_TEST_LOW_LEVEL && mTopComponent != null
+ && wpc.mName.equals(mTopComponent.getPackageName())) {
+ return true;
+ }
+ return mFactoryTest == FACTORY_TEST_HIGH_LEVEL
+ && (wpc.mInfo.flags & FLAG_FACTORY_TEST) != 0;
+ }
+ }
+
+ @Override
+ public void updateTopComponentForFactoryTest() {
+ synchronized (mGlobalLock) {
+ if (mFactoryTest != FACTORY_TEST_LOW_LEVEL) {
+ return;
+ }
+ final ResolveInfo ri = mContext.getPackageManager()
+ .resolveActivity(new Intent(Intent.ACTION_FACTORY_TEST), STOCK_PM_FLAGS);
+ final CharSequence errorMsg;
+ if (ri != null) {
+ final ActivityInfo ai = ri.activityInfo;
+ final ApplicationInfo app = ai.applicationInfo;
+ if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
+ mTopAction = Intent.ACTION_FACTORY_TEST;
+ mTopData = null;
+ mTopComponent = new ComponentName(app.packageName, ai.name);
+ errorMsg = null;
+ } else {
+ errorMsg = mContext.getResources().getText(
+ com.android.internal.R.string.factorytest_not_system);
+ }
+ } else {
+ errorMsg = mContext.getResources().getText(
+ com.android.internal.R.string.factorytest_no_action);
+ }
+ if (errorMsg == null) {
+ return;
+ }
+
+ mTopAction = null;
+ mTopData = null;
+ mTopComponent = null;
+ mUiHandler.post(() -> {
+ Dialog d = new FactoryErrorDialog(mUiContext, errorMsg);
+ d.show();
+ mAm.ensureBootCompleted();
+ });
+ }
+ }
}
}
diff --git a/services/core/java/com/android/server/am/RecentTasks.java b/services/core/java/com/android/server/am/RecentTasks.java
index 4d0b1da..dd13e98 100644
--- a/services/core/java/com/android/server/am/RecentTasks.java
+++ b/services/core/java/com/android/server/am/RecentTasks.java
@@ -755,7 +755,7 @@
boolean getTasksAllowed, boolean getDetailedTasks, int userId, int callingUid) {
final boolean withExcluded = (flags & RECENT_WITH_EXCLUDED) != 0;
- if (!mService.mAm.isUserRunning(userId, FLAG_AND_UNLOCKED)) {
+ if (!mService.mAmInternal.isUserRunning(userId, FLAG_AND_UNLOCKED)) {
Slog.i(TAG, "user " + userId + " is still locked. Cannot load recents");
return new ArrayList<>();
}
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index 8154062..3a897c4 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -2178,9 +2178,7 @@
}
protected void startHomeActivity(int userId, String reason) {
- synchronized (mService) {
- mService.startHomeActivityLocked(userId, reason);
- }
+ mService.mAtmInternal.startHomeActivity(userId, reason);
}
void startUserWidgets(int userId) {
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
index db0bd4f..e5347cf 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
@@ -336,4 +336,11 @@
/** @return the service connection holder for a given activity token. */
public abstract ActivityServiceConnectionsHolder getServiceConnectionsHolder(IBinder token);
+
+ /** @return The intent used to launch the home activity. */
+ public abstract Intent getHomeIntent();
+ public abstract boolean startHomeActivity(int userId, String reason);
+ /** @return true if the given process is the factory test process. */
+ public abstract boolean isFactoryTestProcess(WindowProcessController wpc);
+ public abstract void updateTopComponentForFactoryTest();
}