Moved more stuff from ActivityManagerService to ActivityTaskManagerService (11/n)
Moved more stuff related to activities out of the current service to the new one.
Bug: 80414790
Fixes: 110988007
Test: Existing tests pass.
Change-Id: Iceed1da8a7441a26d11efebc6d9f692fd053bc7f
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index f7cd5ad..96ac712 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -2107,7 +2107,7 @@
private final boolean scheduleServiceRestartLocked(ServiceRecord r, boolean allowCancel) {
boolean canceled = false;
- if (mAm.isShuttingDownLocked()) {
+ if (mAm.mAtmInternal.isShuttingDown()) {
Slog.w(TAG, "Not scheduling restart of crashed service " + r.shortName
+ " - system is shutting down");
return false;
diff --git a/services/core/java/com/android/server/am/ActivityDisplay.java b/services/core/java/com/android/server/am/ActivityDisplay.java
index 9f9fe4c..562dfd6 100644
--- a/services/core/java/com/android/server/am/ActivityDisplay.java
+++ b/services/core/java/com/android/server/am/ActivityDisplay.java
@@ -141,7 +141,7 @@
+ " to displayId=" + mDisplayId + " position=" + position);
addStackReferenceIfNeeded(stack);
positionChildAt(stack, position);
- mSupervisor.mService.mAm.updateSleepIfNeededLocked();
+ mSupervisor.mService.updateSleepIfNeededLocked();
}
void removeChild(ActivityStack stack) {
@@ -149,7 +149,7 @@
+ " from displayId=" + mDisplayId);
mStacks.remove(stack);
removeStackReferenceIfNeeded(stack);
- mSupervisor.mService.mAm.updateSleepIfNeededLocked();
+ mSupervisor.mService.updateSleepIfNeededLocked();
onStackOrderChanged();
}
@@ -715,7 +715,7 @@
boolean shouldSleep() {
return (mStacks.isEmpty() || !mAllSleepTokens.isEmpty())
- && (mSupervisor.mService.mAm.mRunningVoice == null);
+ && (mSupervisor.mService.mRunningVoice == null);
}
/**
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 89810f9..64e3c10 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -89,12 +89,9 @@
import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER;
import static android.provider.Settings.Global.ALWAYS_FINISH_ACTIVITIES;
import static android.provider.Settings.Global.DEBUG_APP;
-import static android.provider.Settings.Global.HIDE_ERROR_DIALOGS;
import static android.provider.Settings.Global.NETWORK_ACCESS_TIMEOUT_MS;
import static android.provider.Settings.Global.WAIT_FOR_DEBUGGER;
-import static android.provider.Settings.System.FONT_SCALE;
import static android.text.format.DateUtils.DAY_IN_MILLIS;
-import static android.view.Display.DEFAULT_DISPLAY;
import static com.android.internal.util.XmlUtils.readBooleanAttribute;
import static com.android.internal.util.XmlUtils.readIntAttribute;
import static com.android.internal.util.XmlUtils.readLongAttribute;
@@ -580,11 +577,6 @@
public final IntentFirewall mIntentFirewall;
- // Whether we should show our dialogs (ANR, crash, etc) or just perform their
- // default action automatically. Important for devices without direct input
- // devices.
- private boolean mShowDialogs = true;
-
// Whether we should use SCHED_FIFO for UI and RenderThreads.
private boolean mUseFifoUiScheduling = false;
@@ -608,25 +600,6 @@
}
/**
- * The last resumed activity. This is identical to the current resumed activity most
- * of the time but could be different when we're pausing one activity before we resume
- * another activity.
- */
- ActivityRecord mLastResumedActivity;
-
- /**
- * The activity that is currently being traced as the active resumed activity.
- *
- * @see #updateResumedAppTrace
- */
- private @Nullable ActivityRecord mTracedResumedActivity;
-
- /**
- * If non-null, we are tracking the time the user spends in the currently focused app.
- */
- private AppTimeTracker mCurAppTimeTracker;
-
- /**
* The package name of the DeviceOwner. This package is not permitted to have its data cleared.
*/
String mDeviceOwnerName;
@@ -679,15 +652,6 @@
}
};
- public boolean canShowErrorDialogs() {
- return mShowDialogs && !mSleeping && !mShuttingDown
- && !mActivityTaskManager.mKeyguardController.isKeyguardOrAodShowing(DEFAULT_DISPLAY)
- && !mUserController.hasUserRestriction(UserManager.DISALLOW_SYSTEM_ERROR_DIALOGS,
- mUserController.getCurrentUserId())
- && !(UserManager.isDeviceInDemoMode(mContext)
- && mUserController.getCurrentUser().isDemo());
- }
-
private static ThreadPriorityBooster sThreadPriorityBooster = new ThreadPriorityBooster(
THREAD_PRIORITY_FOREGROUND, LockGuard.INDEX_ACTIVITY);
@@ -1095,32 +1059,6 @@
CoreSettingsObserver mCoreSettingsObserver;
- FontScaleSettingObserver mFontScaleSettingObserver;
-
- private final class FontScaleSettingObserver extends ContentObserver {
- private final Uri mFontScaleUri = Settings.System.getUriFor(FONT_SCALE);
- private final Uri mHideErrorDialogsUri = Settings.Global.getUriFor(HIDE_ERROR_DIALOGS);
-
- public FontScaleSettingObserver() {
- super(mHandler);
- ContentResolver resolver = mContext.getContentResolver();
- resolver.registerContentObserver(mFontScaleUri, false, this, UserHandle.USER_ALL);
- resolver.registerContentObserver(mHideErrorDialogsUri, false, this,
- UserHandle.USER_ALL);
- }
-
- @Override
- public void onChange(boolean selfChange, Uri uri, @UserIdInt int userId) {
- if (mFontScaleUri.equals(uri)) {
- updateFontScaleIfNeeded(userId);
- } else if (mHideErrorDialogsUri.equals(uri)) {
- synchronized (ActivityManagerService.this) {
- updateShouldShowDialogsLocked(getGlobalConfiguration());
- }
- }
- }
- }
-
DevelopmentSettingsObserver mDevelopmentSettingsObserver;
private final class DevelopmentSettingsObserver extends ContentObserver {
@@ -1280,55 +1218,16 @@
long mLastPowerCheckUptime;
/**
- * Set while we are wanting to sleep, to prevent any
- * activities from being started/resumed.
- *
- * TODO(b/33594039): Clarify the actual state transitions represented by mSleeping.
- *
- * Currently mSleeping is set to true when transitioning into the sleep state, and remains true
- * while in the sleep state until there is a pending transition out of sleep, in which case
- * mSleeping is set to false, and remains false while awake.
- *
- * Whether mSleeping can quickly toggled between true/false without the device actually
- * display changing states is undefined.
- */
- private boolean mSleeping = false;
-
- /**
- * The process state used for processes that are running the top activities.
- * This changes between TOP and TOP_SLEEPING to following mSleeping.
- */
- int mTopProcessState = ActivityManager.PROCESS_STATE_TOP;
-
- /**
- * Set while we are running a voice interaction. This overrides
- * sleeping while it is active.
- */
- IVoiceInteractionSession mRunningVoice;
-
- /**
* For some direct access we need to power manager.
*/
PowerManagerInternal mLocalPowerManager;
/**
- * We want to hold a wake lock while running a voice interaction session, since
- * this may happen with the screen off and we need to keep the CPU running to
- * be able to continue to interact with the user.
- */
- PowerManager.WakeLock mVoiceWakeLock;
-
- /**
* State of external calls telling us if the device is awake or asleep.
*/
private int mWakefulness = PowerManagerInternal.WAKEFULNESS_AWAKE;
/**
- * Set if we are shutting down the system, similar to sleeping.
- */
- boolean mShuttingDown = false;
-
- /**
* Current sequence id for oom_adj computation traversal.
*/
int mAdjSeq = 0;
@@ -1638,8 +1537,6 @@
static final int WAIT_FOR_DEBUGGER_UI_MSG = 6;
static final int SERVICE_TIMEOUT_MSG = 12;
static final int UPDATE_TIME_ZONE = 13;
- static final int SHOW_UID_ERROR_UI_MSG = 14;
- static final int SHOW_FINGERPRINT_ERROR_UI_MSG = 15;
static final int PROC_START_TIMEOUT_MSG = 20;
static final int KILL_APPLICATION_MSG = 22;
static final int FINALIZE_PENDING_INTENT_MSG = 23;
@@ -1657,12 +1554,10 @@
static final int UPDATE_TIME_PREFERENCE_MSG = 41;
static final int FINISH_BOOTING_MSG = 45;
static final int SEND_LOCALE_TO_MOUNT_DAEMON_MSG = 47;
- static final int DISMISS_DIALOG_UI_MSG = 48;
static final int NOTIFY_CLEARTEXT_NETWORK_MSG = 49;
static final int POST_DUMP_HEAP_NOTIFICATION_MSG = 50;
static final int DELETE_DUMPHEAP_MSG = 51;
static final int DISPATCH_UIDS_CHANGED_UI_MSG = 53;
- static final int REPORT_TIME_TRACKER_MSG = 54;
static final int SHUTDOWN_UI_AUTOMATION_CONNECTION_MSG = 56;
static final int CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG = 57;
static final int IDLE_UIDS_MSG = 58;
@@ -1777,7 +1672,7 @@
return;
}
AppErrorResult res = (AppErrorResult) data.get("result");
- if (mShowDialogs && !mSleeping && !mShuttingDown) {
+ if (mAtmInternal.showStrictModeViolationDialog()) {
Dialog d = new StrictModeViolationDialog(mUiContext,
ActivityManagerService.this, res, proc);
d.show();
@@ -1816,30 +1711,6 @@
}
}
} break;
- case SHOW_UID_ERROR_UI_MSG: {
- if (mShowDialogs) {
- AlertDialog d = new BaseErrorDialog(mUiContext);
- d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
- d.setCancelable(false);
- d.setTitle(mUiContext.getText(R.string.android_system_label));
- d.setMessage(mUiContext.getText(R.string.system_error_wipe_data));
- d.setButton(DialogInterface.BUTTON_POSITIVE, mUiContext.getText(R.string.ok),
- obtainMessage(DISMISS_DIALOG_UI_MSG, d));
- d.show();
- }
- } break;
- case SHOW_FINGERPRINT_ERROR_UI_MSG: {
- if (mShowDialogs) {
- AlertDialog d = new BaseErrorDialog(mUiContext);
- d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
- d.setCancelable(false);
- d.setTitle(mUiContext.getText(R.string.android_system_label));
- d.setMessage(mUiContext.getText(R.string.system_error_manufacturer));
- d.setButton(DialogInterface.BUTTON_POSITIVE, mUiContext.getText(R.string.ok),
- obtainMessage(DISMISS_DIALOG_UI_MSG, d));
- d.show();
- }
- } break;
case SHOW_COMPAT_MODE_DIALOG_UI_MSG: {
synchronized (ActivityManagerService.this) {
ActivityRecord ar = (ActivityRecord) msg.obj;
@@ -1868,11 +1739,6 @@
}
break;
}
- case DISMISS_DIALOG_UI_MSG: {
- final Dialog d = (Dialog) msg.obj;
- d.dismiss();
- break;
- }
case DISPATCH_PROCESSES_CHANGED_UI_MSG: {
dispatchProcessesChanged();
break;
@@ -2127,7 +1993,7 @@
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
}
if (msg.arg2 != 0) {
- enableScreenAfterBoot();
+ mAtmInternal.enableScreenAfterBoot(mBooted);
}
break;
}
@@ -2247,10 +2113,6 @@
mMemWatchDumpUid = -1;
}
} break;
- case REPORT_TIME_TRACKER_MSG: {
- AppTimeTracker tracker = (AppTimeTracker)msg.obj;
- tracker.deliverResult(mContext);
- } break;
case SHUTDOWN_UI_AUTOMATION_CONNECTION_MSG: {
IUiAutomationConnection connection = (IUiAutomationConnection) msg.obj;
try {
@@ -2889,12 +2751,9 @@
}
public void initPowerManagement() {
- mStackSupervisor.initPowerManagement();
+ mActivityTaskManager.onInitPowerManagement();
mBatteryStatsService.initPowerManagement();
mLocalPowerManager = LocalServices.getService(PowerManagerInternal.class);
- PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
- mVoiceWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*voice*");
- mVoiceWakeLock.setReferenceCounted(false);
}
private ArraySet<String> getBackgroundLaunchBroadcasts() {
@@ -3145,96 +3004,6 @@
}
}
- /**
- * Update AMS states when an activity is resumed. This should only be called by
- * {@link ActivityStack#onActivityStateChanged(ActivityRecord, ActivityState, String)} when an
- * activity is resumed.
- */
- @GuardedBy("this")
- void setResumedActivityUncheckLocked(ActivityRecord r, String reason) {
- final TaskRecord task = r.getTask();
- if (task.isActivityTypeStandard()) {
- if (mCurAppTimeTracker != r.appTimeTracker) {
- // We are switching app tracking. Complete the current one.
- if (mCurAppTimeTracker != null) {
- mCurAppTimeTracker.stop();
- mHandler.obtainMessage(
- REPORT_TIME_TRACKER_MSG, mCurAppTimeTracker).sendToTarget();
- mStackSupervisor.clearOtherAppTimeTrackers(r.appTimeTracker);
- mCurAppTimeTracker = null;
- }
- if (r.appTimeTracker != null) {
- mCurAppTimeTracker = r.appTimeTracker;
- startTimeTrackingFocusedActivityLocked();
- }
- } else {
- startTimeTrackingFocusedActivityLocked();
- }
- } else {
- r.appTimeTracker = null;
- }
- // TODO: VI Maybe r.task.voiceInteractor || r.voiceInteractor != null
- // TODO: Probably not, because we don't want to resume voice on switching
- // back to this activity
- if (task.voiceInteractor != null) {
- startRunningVoiceLocked(task.voiceSession, r.info.applicationInfo.uid);
- } else {
- finishRunningVoiceLocked();
-
- if (mLastResumedActivity != null) {
- final IVoiceInteractionSession session;
-
- final TaskRecord lastResumedActivityTask = mLastResumedActivity.getTask();
- if (lastResumedActivityTask != null
- && lastResumedActivityTask.voiceSession != null) {
- session = lastResumedActivityTask.voiceSession;
- } else {
- session = mLastResumedActivity.voiceSession;
- }
-
- if (session != null) {
- // We had been in a voice interaction session, but now focused has
- // move to something different. Just finish the session, we can't
- // return to it and retain the proper state and synchronization with
- // the voice interaction service.
- mActivityTaskManager.finishVoiceTask(session);
- }
- }
- }
-
- if (mLastResumedActivity != null && r.userId != mLastResumedActivity.userId) {
- mUserController.sendForegroundProfileChanged(r.userId);
- }
- updateResumedAppTrace(r);
- mLastResumedActivity = r;
-
- mWindowManager.setFocusedApp(r.appToken, true);
-
- mActivityTaskManager.applyUpdateLockStateLocked(r);
- mActivityTaskManager.applyUpdateVrModeLocked(r);
-
- EventLogTags.writeAmSetResumedActivity(
- r == null ? -1 : r.userId,
- r == null ? "NULL" : r.shortComponentName,
- reason);
- }
-
- private void updateResumedAppTrace(@Nullable ActivityRecord resumed) {
- if (mTracedResumedActivity != null) {
- Trace.asyncTraceEnd(TRACE_TAG_ACTIVITY_MANAGER,
- constructResumedTraceName(mTracedResumedActivity.packageName), 0);
- }
- if (resumed != null) {
- Trace.asyncTraceBegin(TRACE_TAG_ACTIVITY_MANAGER,
- constructResumedTraceName(resumed.packageName), 0);
- }
- mTracedResumedActivity = resumed;
- }
-
- private String constructResumedTraceName(String packageName) {
- return "focused app: " + packageName;
- }
-
@Override
public void setFocusedStack(int stackId) {
mActivityTaskManager.setFocusedStack(stackId);
@@ -4654,44 +4423,6 @@
mActivityTaskManager.cancelRecentsAnimation(restoreHomeStackPosition);
}
- @GuardedBy("this")
- void onLocalVoiceInteractionStartedLocked(IBinder activity,
- IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor) {
- ActivityRecord activityToCallback = ActivityRecord.forTokenLocked(activity);
- if (activityToCallback == null) return;
- activityToCallback.setVoiceSessionLocked(voiceSession);
-
- // Inform the activity
- try {
- activityToCallback.app.getThread().scheduleLocalVoiceInteractionStarted(activity,
- voiceInteractor);
- long token = Binder.clearCallingIdentity();
- try {
- startRunningVoiceLocked(voiceSession, activityToCallback.appInfo.uid);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- // TODO: VI Should we cache the activity so that it's easier to find later
- // rather than scan through all the stacks and activities?
- } catch (RemoteException re) {
- activityToCallback.clearVoiceSessionLocked();
- // TODO: VI Should this terminate the voice session?
- }
- }
-
- @Override
- public void setVoiceKeepAwake(IVoiceInteractionSession session, boolean keepAwake) {
- synchronized (this) {
- if (mRunningVoice != null && mRunningVoice.asBinder() == session.asBinder()) {
- if (keepAwake) {
- mVoiceWakeLock.acquire();
- } else {
- mVoiceWakeLock.release();
- }
- }
- }
- }
-
/**
* This is the internal entry point for handling Activity.finish().
*
@@ -6603,16 +6334,6 @@
finishBooting ? 1 : 0, enableScreen ? 1 : 0));
}
- void enableScreenAfterBoot() {
- EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_ENABLE_SCREEN,
- SystemClock.uptimeMillis());
- mWindowManager.enableScreenAfterBoot();
-
- synchronized (this) {
- updateEventDispatchingLocked();
- }
- }
-
@Override
public void showBootMessage(final CharSequence msg, final boolean always) {
if (Binder.getCallingUid() != myUid()) {
@@ -6760,7 +6481,7 @@
}
if (enableScreen) {
- enableScreenAfterBoot();
+ mAtmInternal.enableScreenAfterBoot(mBooted);
}
}
@@ -10156,7 +9877,7 @@
mConstants.start(mContext.getContentResolver());
mCoreSettingsObserver = new CoreSettingsObserver(this);
- mFontScaleSettingObserver = new FontScaleSettingObserver();
+ mActivityTaskManager.installSystemProviders();
mDevelopmentSettingsObserver = new DevelopmentSettingsObserver();
GlobalSettingsToPropertiesMapper.start(mContext.getContentResolver());
@@ -10502,20 +10223,6 @@
return pfd;
}
- // Actually is sleeping or shutting down or whatever else in the future
- // is an inactive state.
- boolean isSleepingOrShuttingDownLocked() {
- return isSleepingLocked() || mShuttingDown;
- }
-
- boolean isShuttingDownLocked() {
- return mShuttingDown;
- }
-
- boolean isSleepingLocked() {
- return mSleeping;
- }
-
void reportGlobalUsageEventLocked(int event) {
mUsageStatsService.reportEvent("android", mUserController.getCurrentUserId(), event);
int[] profiles = mUserController.getCurrentProfileIds();
@@ -10548,53 +10255,6 @@
}
}
- @GuardedBy("this")
- void finishRunningVoiceLocked() {
- if (mRunningVoice != null) {
- mRunningVoice = null;
- mVoiceWakeLock.release();
- updateSleepIfNeededLocked();
- }
- }
-
- void startTimeTrackingFocusedActivityLocked() {
- final ActivityRecord resumedActivity = mStackSupervisor.getResumedActivityLocked();
- if (!mSleeping && mCurAppTimeTracker != null && resumedActivity != null) {
- mCurAppTimeTracker.start(resumedActivity.packageName);
- }
- }
-
- @GuardedBy("this")
- void updateSleepIfNeededLocked() {
- final boolean shouldSleep = !mStackSupervisor.hasAwakeDisplay();
- final boolean wasSleeping = mSleeping;
-
- if (!shouldSleep) {
- // If wasSleeping is true, we need to wake up activity manager state from when
- // we started sleeping. In either case, we need to apply the sleep tokens, which
- // will wake up stacks or put them to sleep as appropriate.
- if (wasSleeping) {
- mSleeping = false;
- startTimeTrackingFocusedActivityLocked();
- mTopProcessState = ActivityManager.PROCESS_STATE_TOP;
- mStackSupervisor.comeOutOfSleepIfNeededLocked();
- }
- mStackSupervisor.applySleepTokensLocked(true /* applyToStacks */);
- if (wasSleeping) {
- updateOomAdjLocked();
- }
- } else if (!mSleeping && shouldSleep) {
- mSleeping = true;
- if (mCurAppTimeTracker != null) {
- mCurAppTimeTracker.stop();
- }
- mTopProcessState = ActivityManager.PROCESS_STATE_TOP_SLEEPING;
- mStackSupervisor.goingToSleepLocked();
- updateResumedAppTrace(null /* resumed */);
- updateOomAdjLocked();
- }
- }
-
@Override
public void notifyCleartextNetwork(int uid, byte[] firstPacket) {
mHandler.obtainMessage(NOTIFY_CLEARTEXT_NETWORK_MSG, uid, 0, firstPacket).sendToTarget();
@@ -10608,14 +10268,7 @@
+ android.Manifest.permission.SHUTDOWN);
}
- boolean timedout = false;
-
- synchronized(this) {
- mShuttingDown = true;
- mStackSupervisor.prepareForShutdownLocked();
- updateEventDispatchingLocked();
- timedout = mStackSupervisor.shutdownLocked(timeout);
- }
+ final boolean timedout = mAtmInternal.shuttingDown(mBooted, timeout);
mAppOpsService.shutdown();
if (mUsageStatsService != null) {
@@ -10630,24 +10283,6 @@
return timedout;
}
- @GuardedBy("this")
- void startRunningVoiceLocked(IVoiceInteractionSession session, int targetUid) {
- Slog.d(TAG, "<<< startRunningVoiceLocked()");
- mVoiceWakeLock.setWorkSource(new WorkSource(targetUid));
- if (mRunningVoice == null || mRunningVoice.asBinder() != session.asBinder()) {
- boolean wasRunningVoice = mRunningVoice != null;
- mRunningVoice = session;
- if (!wasRunningVoice) {
- mVoiceWakeLock.acquire();
- updateSleepIfNeededLocked();
- }
- }
- }
-
- private void updateEventDispatchingLocked() {
- mWindowManager.setEventDispatching(mBooted && !mShuttingDown);
- }
-
@Override
public void setLockScreenShown(boolean keyguardShowing, boolean aodShowing,
int secondaryDisplayShowing) {
@@ -11699,7 +11334,7 @@
proc.notCachedSinceIdle = true;
proc.initialIdlePss = 0;
proc.nextPssTime = ProcessList.computeNextPssTime(proc.setProcState, null,
- mTestPssMode, isSleepingLocked(), now);
+ mTestPssMode, mAtmInternal.isSleeping(), now);
}
}
}
@@ -11899,19 +11534,7 @@
}
startHomeActivityLocked(currentUserId, "systemReady");
- try {
- if (AppGlobals.getPackageManager().hasSystemUidErrors()) {
- Slog.e(TAG, "UIDs on the system are inconsistent, you need to wipe your"
- + " data partition or your device will be unstable.");
- mUiHandler.obtainMessage(SHOW_UID_ERROR_UI_MSG).sendToTarget();
- }
- } catch (RemoteException e) {
- }
-
- if (!Build.isBuildConsistent()) {
- Slog.e(TAG, "Build fingerprint is not consistent, warning user");
- mUiHandler.obtainMessage(SHOW_FINGERPRINT_ERROR_UI_MSG).sendToTarget();
- }
+ mAtmInternal.showSystemReadyErrorDialogsIfNeeded();
long ident = Binder.clearCallingIdentity();
try {
@@ -12639,14 +12262,6 @@
this, in, out, err, args, callback, resultReceiver);
}
- SleepToken acquireSleepToken(String tag, int displayId) {
- synchronized (this) {
- final SleepToken token = mStackSupervisor.createSleepTokenLocked(tag, displayId);
- updateSleepIfNeededLocked();
- return token;
- }
- }
-
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
PriorityDump.dump(mPriorityDumper, fd, pw, args);
@@ -13670,14 +13285,7 @@
if (dumpPackage == null) {
pw.println(" mWakefulness="
+ PowerManagerInternal.wakefulnessToString(mWakefulness));
- pw.println(" mSleepTokens=" + mStackSupervisor.mSleepTokens);
- pw.println(" mSleeping=" + mSleeping);
- pw.println(" mShuttingDown=" + mShuttingDown + " mTestPssMode=" + mTestPssMode);
- if (mRunningVoice != null) {
- pw.println(" mRunningVoice=" + mRunningVoice);
- pw.println(" mVoiceWakeLock" + mVoiceWakeLock);
- }
- mActivityTaskManager.dumpVrControllerLocked(pw);
+ mActivityTaskManager.dumpSleepStates(pw, mTestPssMode);
}
if (mDebugApp != null || mOrigDebugApp != null || mDebugTransient
|| mOrigWaitForDebugger) {
@@ -13692,8 +13300,8 @@
+ " mOrigWaitForDebugger=" + mOrigWaitForDebugger);
}
}
- if (mCurAppTimeTracker != null) {
- mCurAppTimeTracker.dumpWithHeader(pw, " ", true);
+ if (mActivityTaskManager.mCurAppTimeTracker != null) {
+ mActivityTaskManager.mCurAppTimeTracker.dumpWithHeader(pw, " ", true);
}
if (mMemWatchProcesses.getMap().size() > 0) {
pw.println(" Mem watch processes:");
@@ -14030,23 +13638,10 @@
final long sleepToken = proto.start(ActivityManagerServiceDumpProcessesProto.SLEEP_STATUS);
proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.WAKEFULNESS,
PowerManagerInternal.wakefulnessToProtoEnum(mWakefulness));
- for (SleepToken st : mStackSupervisor.mSleepTokens) {
- proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SLEEP_TOKENS, st.toString());
- }
- proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SLEEPING, mSleeping);
- proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SHUTTING_DOWN, mShuttingDown);
proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.TEST_PSS_MODE, mTestPssMode);
proto.end(sleepToken);
- if (mRunningVoice != null) {
- final long vrToken = proto.start(ActivityManagerServiceDumpProcessesProto.RUNNING_VOICE);
- proto.write(ActivityManagerServiceDumpProcessesProto.Voice.SESSION, mRunningVoice.toString());
- mVoiceWakeLock.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.Voice.WAKELOCK);
- proto.end(vrToken);
- }
-
- mActivityTaskManager.writeVrControllerToProto(
- proto, ActivityManagerServiceDumpProcessesProto.VR_CONTROLLER);
+ mActivityTaskManager.writeSleepStateToProto(proto);
}
if (mDebugApp != null || mOrigDebugApp != null || mDebugTransient
@@ -14062,8 +13657,9 @@
}
}
- if (mCurAppTimeTracker != null) {
- mCurAppTimeTracker.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.CURRENT_TRACKER, true);
+ if (mActivityTaskManager.mCurAppTimeTracker != null) {
+ mActivityTaskManager.mCurAppTimeTracker.writeToProto(
+ proto, ActivityManagerServiceDumpProcessesProto.CURRENT_TRACKER, true);
}
if (mMemWatchProcesses.getMap().size() > 0) {
@@ -18965,13 +18561,9 @@
return mActivityTaskManager.getFocusedStackInfo();
}
+ @Override
public Configuration getConfiguration() {
- Configuration ci;
- synchronized(this) {
- ci = new Configuration(getGlobalConfiguration());
- ci.userSetLocale = false;
- }
- return ci;
+ return mActivityTaskManager.getConfiguration();
}
@Override
@@ -18992,22 +18584,6 @@
mActivityTaskManager.updatePersistentConfiguration(values, userId);
}
- private void updateFontScaleIfNeeded(@UserIdInt int userId) {
- final float scaleFactor = Settings.System.getFloatForUser(mContext.getContentResolver(),
- FONT_SCALE, 1.0f, userId);
-
- synchronized (this) {
- if (getGlobalConfiguration().fontScale == scaleFactor) {
- return;
- }
-
- final Configuration configuration
- = mWindowManager.computeNewConfiguration(DEFAULT_DISPLAY);
- configuration.fontScale = scaleFactor;
- mActivityTaskManager.updatePersistentConfiguration(configuration, userId);
- }
- }
-
private void enforceWriteSettingsPermission(String func) {
int uid = Binder.getCallingUid();
if (uid == ROOT_UID) {
@@ -19032,29 +18608,6 @@
return mActivityTaskManager.updateConfiguration(values);
}
- /**
- * Decide based on the configuration whether we should show the ANR,
- * crash, etc dialogs. The idea is that if there is no affordance to
- * press the on-screen buttons, or the user experience would be more
- * greatly impacted than the crash itself, we shouldn't show the dialog.
- *
- * A thought: SystemUI might also want to get told about this, the Power
- * dialog / global actions also might want different behaviors.
- */
- void updateShouldShowDialogsLocked(Configuration config) {
- final boolean inputMethodExists = !(config.keyboard == Configuration.KEYBOARD_NOKEYS
- && config.touchscreen == Configuration.TOUCHSCREEN_NOTOUCH
- && config.navigation == Configuration.NAVIGATION_NONAV);
- int modeType = config.uiMode & Configuration.UI_MODE_TYPE_MASK;
- final boolean uiModeSupportsDialogs = (modeType != Configuration.UI_MODE_TYPE_CAR
- && !(modeType == Configuration.UI_MODE_TYPE_WATCH && Build.IS_USER)
- && modeType != Configuration.UI_MODE_TYPE_TELEVISION
- && modeType != Configuration.UI_MODE_TYPE_VR_HEADSET);
- final boolean hideDialogsSet = Settings.Global.getInt(mContext.getContentResolver(),
- HIDE_ERROR_DIALOGS, 0) != 0;
- mShowDialogs = inputMethodExists && uiModeSupportsDialogs && !hideDialogsSet;
- }
-
@Override
public int getLaunchedFromUid(IBinder activityToken) {
return mActivityTaskManager.getLaunchedFromUid(activityToken);
@@ -19272,7 +18825,7 @@
app.systemNoUi = false;
- final int PROCESS_STATE_CUR_TOP = mTopProcessState;
+ final int PROCESS_STATE_CUR_TOP = mAtmInternal.getTopProcessState();
// Determine the importance of the process, starting with most
// important to least, and assign an appropriate OOM adjustment.
@@ -20322,7 +19875,7 @@
app.pssStatType = always ? ProcessStats.ADD_PSS_INTERNAL_ALL_POLL
: ProcessStats.ADD_PSS_INTERNAL_ALL_MEM;
app.nextPssTime = ProcessList.computeNextPssTime(app.curProcState,
- app.procStateMemTracker, mTestPssMode, isSleepingLocked(), now);
+ app.procStateMemTracker, mTestPssMode, mAtmInternal.isSleeping(), now);
mPendingPssProcesses.add(app);
}
}
@@ -20372,7 +19925,7 @@
}
}
return !processingBroadcasts
- && (isSleepingLocked() || mStackSupervisor.allResumedActivitiesIdle());
+ && (mAtmInternal.isSleeping() || mStackSupervisor.allResumedActivitiesIdle());
}
/**
@@ -20706,7 +20259,7 @@
}
app.lastStateTime = now;
app.nextPssTime = ProcessList.computeNextPssTime(app.curProcState,
- app.procStateMemTracker, mTestPssMode, isSleepingLocked(), now);
+ app.procStateMemTracker, mTestPssMode, mAtmInternal.isSleeping(), now);
if (DEBUG_PSS) Slog.d(TAG_PSS, "Process state change from "
+ ProcessList.makeProcStateString(app.setProcState) + " to "
+ ProcessList.makeProcStateString(app.curProcState) + " next pss in "
@@ -20717,7 +20270,7 @@
mTestPssMode)))) {
if (requestPssLocked(app, app.setProcState)) {
app.nextPssTime = ProcessList.computeNextPssTime(app.curProcState,
- app.procStateMemTracker, mTestPssMode, isSleepingLocked(), now);
+ app.procStateMemTracker, mTestPssMode, mAtmInternal.isSleeping(), now);
}
} else if (false && DEBUG_PSS) Slog.d(TAG_PSS,
"Not requesting pss of " + app + ": next=" + (app.nextPssTime-now));
@@ -21358,7 +20911,8 @@
}
mLastMemoryLevel = memFactor;
mLastNumProcesses = mLruProcesses.size();
- boolean allChanged = mProcessStats.setMemFactorLocked(memFactor, !isSleepingLocked(), now);
+ boolean allChanged = mProcessStats.setMemFactorLocked(
+ memFactor, mAtmInternal != null ? !mAtmInternal.isSleeping() : true, now);
final int trackerMemFactor = mProcessStats.getMemFactorLocked();
if (memFactor != ProcessStats.ADJ_MEM_FACTOR_NORMAL) {
if (mLowRamStartTime == 0) {
@@ -22807,6 +22361,18 @@
}
return false;
}
+
+ @Override
+ public void updateOomAdj() {
+ synchronized (ActivityManagerService.this) {
+ ActivityManagerService.this.updateOomAdjLocked();
+ }
+ }
+
+ @Override
+ public void sendForegroundProfileChanged(int userId) {
+ mUserController.sendForegroundProfileChanged(userId);
+ }
}
/**
diff --git a/services/core/java/com/android/server/am/ActivityMetricsLogger.java b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
index 9b08823..62f8c72 100644
--- a/services/core/java/com/android/server/am/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
@@ -133,7 +133,7 @@
private final class WindowingModeTransitionInfoSnapshot {
final private ApplicationInfo applicationInfo;
- final private ProcessRecord processRecord;
+ final private WindowProcessController processRecord;
final private String packageName;
final private String launchedActivityName;
final private String launchedActivityLaunchedFromPackage;
@@ -238,7 +238,7 @@
* @param launchedActivity the activity that is being launched
*/
void notifyActivityLaunched(int resultCode, ActivityRecord launchedActivity) {
- final ProcessRecord processRecord = findProcessForActivity(launchedActivity);
+ final WindowProcessController processRecord = findProcessForActivity(launchedActivity);
final boolean processRunning = processRecord != null;
// We consider this a "process switch" if the process of the activity that gets launched
@@ -246,7 +246,7 @@
// of caches might be purged so the time until it produces the first frame is very
// interesting.
final boolean processSwitch = processRecord == null
- || !processRecord.getWindowProcessController().hasStartedActivity(launchedActivity);
+ || !processRecord.hasStartedActivity(launchedActivity);
notifyActivityLaunched(resultCode, launchedActivity, processRunning, processSwitch);
}
@@ -631,7 +631,7 @@
return;
}
- final int pid = info.processRecord.pid;
+ final int pid = info.processRecord.getPid();
final int uid = info.applicationInfo.uid;
final MemoryStat memoryStat = readMemoryStatFromFilesystem(uid, pid);
if (memoryStat == null) {
@@ -651,9 +651,9 @@
memoryStat.swapInBytes);
}
- private ProcessRecord findProcessForActivity(ActivityRecord launchedActivity) {
+ private WindowProcessController findProcessForActivity(ActivityRecord launchedActivity) {
return launchedActivity != null
- ? mSupervisor.mService.mAm.mProcessNames.get(
+ ? mSupervisor.mService.mProcessNames.get(
launchedActivity.processName, launchedActivity.appInfo.uid)
: null;
}
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index d40b9b4..b44ce9a 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -641,7 +641,7 @@
}
private void scheduleConfigurationChanged(Configuration config) {
- if (attachedToProcess()) {
+ if (!attachedToProcess()) {
if (DEBUG_CONFIGURATION) Slog.w(TAG,
"Can't report activity configuration update - client not running"
+ ", activityRecord=" + this);
@@ -1343,13 +1343,8 @@
* @return Whether AppOps allows this package to enter picture-in-picture.
*/
private boolean checkEnterPictureInPictureAppOpsState() {
- try {
- return service.mAm.getAppOpsService().checkOperation(
- OP_PICTURE_IN_PICTURE, appInfo.uid, packageName) == MODE_ALLOWED;
- } catch (RemoteException e) {
- // Local call
- }
- return false;
+ return service.getAppOpsService().checkOperation(
+ OP_PICTURE_IN_PICTURE, appInfo.uid, packageName) == MODE_ALLOWED;
}
boolean isAlwaysFocusable() {
@@ -1424,7 +1419,7 @@
final boolean isSleeping() {
final ActivityStack stack = getStack();
- return stack != null ? stack.shouldSleepActivities() : service.mAm.isSleepingLocked();
+ return stack != null ? stack.shouldSleepActivities() : service.isSleepingLocked();
}
/**
@@ -2015,7 +2010,7 @@
EventLog.writeEvent(AM_ACTIVITY_FULLY_DRAWN_TIME,
userId, System.identityHashCode(this), shortComponentName,
thisTime, totalTime);
- StringBuilder sb = service.mAm.mStringBuilder;
+ StringBuilder sb = service.mStringBuilder;
sb.setLength(0);
sb.append("Fully drawn ");
sb.append(shortComponentName);
@@ -2052,7 +2047,7 @@
EventLog.writeEvent(AM_ACTIVITY_LAUNCH_TIME,
userId, System.identityHashCode(this), shortComponentName,
thisTime, totalTime);
- StringBuilder sb = service.mAm.mStringBuilder;
+ StringBuilder sb = service.mStringBuilder;
sb.setLength(0);
sb.append("Displayed ");
sb.append(shortComponentName);
@@ -2570,8 +2565,7 @@
// Update last reported values.
final Configuration newMergedOverrideConfig = getMergedOverrideConfiguration();
- setLastReportedConfiguration(service.mAm.getGlobalConfiguration(),
- newMergedOverrideConfig);
+ setLastReportedConfiguration(service.getGlobalConfiguration(), newMergedOverrideConfig);
if (mState == INITIALIZING) {
// No need to relaunch or schedule new config for activity that hasn't been launched
@@ -2773,7 +2767,7 @@
mStackSupervisor.activityRelaunchingLocked(this);
final ClientTransactionItem callbackItem = ActivityRelaunchItem.obtain(pendingResults,
pendingNewIntents, configChangeFlags,
- new MergedConfiguration(service.mAm.getGlobalConfiguration(),
+ new MergedConfiguration(service.getGlobalConfiguration(),
getMergedOverrideConfiguration()),
preserveWindow);
final ActivityLifecycleItem lifecycleItem;
@@ -2947,7 +2941,7 @@
}
final ActivityRecord r = new ActivityRecord(service, null /* caller */,
0 /* launchedFromPid */, launchedFromUid, launchedFromPackage, intent, resolvedType,
- aInfo, service.mAm.getConfiguration(), null /* resultTo */, null /* resultWho */,
+ aInfo, service.getConfiguration(), null /* resultTo */, null /* resultWho */,
0 /* reqCode */, componentSpecified, false /* rootVoiceInteraction */,
stackSupervisor, null /* options */, null /* sourceRecord */);
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index dae145d..c76df8b 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -495,7 +495,7 @@
if (DEBUG_STACK) Slog.v(TAG_STACK, "set resumed activity to:" + record + " reason:"
+ reason);
setResumedActivity(record, reason + " - onActivityStateChanged");
- mService.mAm.setResumedActivityUncheckLocked(record, reason);
+ mService.setResumedActivityUncheckLocked(record, reason);
mStackSupervisor.mRecentTasks.add(record.getTask());
}
}
@@ -1478,7 +1478,7 @@
// If we are not going to sleep, we want to ensure the device is
// awake until the next activity is started.
- if (!uiSleeping && !mService.mAm.isSleepingOrShuttingDownLocked()) {
+ if (!uiSleeping && !mService.isSleepingOrShuttingDownLocked()) {
mStackSupervisor.acquireLaunchWakelock();
}
@@ -2702,8 +2702,7 @@
next.sleeping = false;
mService.mAm.getAppWarningsLocked().onResumeActivity(next);
mService.mAm.showAskCompatModeDialogLocked(next);
- next.app.setPendingUiCleanAndForceProcessStateUpTo(
- mService.mAm.mTopProcessState);
+ next.app.setPendingUiCleanAndForceProcessStateUpTo(mService.mTopProcessState);
next.clearOptionsLocked();
transaction.setLifecycleStateRequest(
ResumeActivityItem.obtain(next.app.getReportedProcState(),
@@ -3546,7 +3545,7 @@
}
}
}
- mService.mAm.updateOomAdjLocked();
+ mService.updateOomAdj();
}
/**
@@ -3626,7 +3625,7 @@
} catch (RemoteException re) {
// Ok
}
- mService.mAm.finishRunningVoiceLocked();
+ mService.finishRunningVoiceLocked();
break;
}
}
@@ -3634,7 +3633,7 @@
}
if (didOne) {
- mService.mAm.updateOomAdjLocked();
+ mService.updateOomAdj();
}
}
@@ -3823,7 +3822,7 @@
"Moving to STOPPING: "+ r + " (finish requested)");
r.setState(STOPPING, "finishCurrentActivityLocked");
if (oomAdj) {
- mService.mAm.updateOomAdjLocked();
+ mService.updateOomAdj();
}
return r;
}
@@ -5362,11 +5361,11 @@
return false;
}
- return display != null ? display.isSleeping() : mService.mAm.isSleepingLocked();
+ return display != null ? display.isSleeping() : mService.isSleepingLocked();
}
boolean shouldSleepOrShutDownActivities() {
- return shouldSleepActivities() || mService.mAm.isShuttingDownLocked();
+ return shouldSleepActivities() || mService.mShuttingDown;
}
public void writeToProto(ProtoOutputStream proto, long fieldId) {
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 1cb6be6..7f749b3 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -624,7 +624,7 @@
mInitialized = true;
mRunningTasks = createRunningTasks();
mActivityMetricsLogger = new ActivityMetricsLogger(this, mService.mContext, mHandler.getLooper());
- mKeyguardController = new KeyguardController(mService.mAm, this);
+ mKeyguardController = new KeyguardController(mService, this);
mLaunchParamsController = new LaunchParamsController(mService);
mLaunchParamsController.registerDefaultModifiers(this);
@@ -912,7 +912,7 @@
// result to an activity belonging to userId. Example case: a document
// picker for personal files, opened by a work app, should still get locked.
if (taskTopActivityIsUser(task, userId)) {
- mService.mAm.mActivityTaskManager.getTaskChangeNotificationController().notifyTaskProfileLocked(
+ mService.getTaskChangeNotificationController().notifyTaskProfileLocked(
task.taskId, userId);
}
}
@@ -1167,7 +1167,7 @@
}
}
if (changed) {
- mService.mAm.notifyAll();
+ mService.mGlobalLock.notifyAll();
}
}
@@ -1197,7 +1197,7 @@
}
if (changed) {
- mService.mAm.notifyAll();
+ mService.mGlobalLock.notifyAll();
}
}
@@ -1218,7 +1218,7 @@
}
}
if (changed) {
- mService.mAm.notifyAll();
+ mService.mGlobalLock.notifyAll();
}
}
@@ -1512,13 +1512,13 @@
app.hasShownUi = true;
app.pendingUiClean = true;
- app.forceProcessStateUpTo(mService.mAm.mTopProcessState);
+ app.forceProcessStateUpTo(mService.mTopProcessState);
// Because we could be starting an Activity in the system process this may not go
// across a Binder interface which would create a new Configuration. Consequently
// we have to always create a new Configuration here.
final MergedConfiguration mergedConfiguration = new MergedConfiguration(
- mService.mAm.getGlobalConfiguration(), r.getMergedOverrideConfiguration());
+ mService.getGlobalConfiguration(), r.getMergedOverrideConfiguration());
r.setLastReportedConfiguration(mergedConfiguration);
logIfTransactionTooLarge(r.intent, r.icicle);
@@ -1752,7 +1752,7 @@
ProcessRecord callerApp, ActivityRecord resultRecord, ActivityStack resultStack) {
final boolean isCallerRecents = mService.getRecentTasks() != null
&& mService.getRecentTasks().isCallerRecents(callingUid);
- final int startAnyPerm = mService.mAm.checkPermission(START_ANY_ACTIVITY, callingPid,
+ final int startAnyPerm = mService.checkPermission(START_ANY_ACTIVITY, callingPid,
callingUid);
if (startAnyPerm == PERMISSION_GRANTED || (isCallerRecents && launchingInTask)) {
// If the caller has START_ANY_ACTIVITY, ignore all checks below. In addition, if the
@@ -1831,7 +1831,7 @@
// Check if the caller has enough privileges to embed activities and launch to private
// displays.
- final int startAnyPerm = mService.mAm.checkPermission(INTERNAL_SYSTEM_WINDOW, callingPid,
+ final int startAnyPerm = mService.checkPermission(INTERNAL_SYSTEM_WINDOW, callingPid,
callingUid);
if (startAnyPerm == PERMISSION_GRANTED) {
if (DEBUG_TASKS) Slog.d(TAG, "Launch on display check:"
@@ -1853,7 +1853,7 @@
return false;
}
// Check if the caller is allowed to embed activities from other apps.
- if (mService.mAm.checkPermission(ACTIVITY_EMBEDDING, callingPid, callingUid)
+ if (mService.checkPermission(ACTIVITY_EMBEDDING, callingPid, callingUid)
== PERMISSION_DENIED && !uidPresentOnDisplay) {
if (DEBUG_TASKS) Slog.d(TAG, "Launch on display check:"
+ " disallow activity embedding without permission.");
@@ -1926,8 +1926,8 @@
return ACTIVITY_RESTRICTION_NONE;
}
- if (mService.mAm.mAppOpsService.noteOperation(opCode, callingUid,
- callingPackage) != AppOpsManager.MODE_ALLOWED) {
+ if (mService.getAppOpsService().noteOperation(opCode, callingUid, callingPackage)
+ != AppOpsManager.MODE_ALLOWED) {
if (!ignoreTargetSecurity) {
return ACTIVITY_RESTRICTION_APPOP;
}
@@ -1960,7 +1960,7 @@
return ACTIVITY_RESTRICTION_NONE;
}
- if (mService.mAm.checkPermission(permission, callingPid, callingUid) == PERMISSION_DENIED) {
+ if (mService.checkPermission(permission, callingPid, callingUid) == PERMISSION_DENIED) {
return ACTIVITY_RESTRICTION_PERMISSION;
}
@@ -1969,8 +1969,8 @@
return ACTIVITY_RESTRICTION_NONE;
}
- if (mService.mAm.mAppOpsService.noteOperation(opCode, callingUid,
- callingPackage) != AppOpsManager.MODE_ALLOWED) {
+ if (mService.getAppOpsService().noteOperation(opCode, callingUid, callingPackage)
+ != AppOpsManager.MODE_ALLOWED) {
return ACTIVITY_RESTRICTION_APPOP;
}
@@ -3517,7 +3517,7 @@
long timeRemaining = endTime - System.currentTimeMillis();
if (timeRemaining > 0) {
try {
- mService.mAm.wait(timeRemaining);
+ mService.mGlobalLock.wait(timeRemaining);
} catch (InterruptedException e) {
}
} else {
@@ -3599,7 +3599,7 @@
}
void checkReadyForSleepLocked(boolean allowDelay) {
- if (!mService.mAm.isSleepingOrShuttingDownLocked()) {
+ if (!mService.isSleepingOrShuttingDownLocked()) {
// Do not care.
return;
}
@@ -3616,8 +3616,8 @@
if (mGoingToSleep.isHeld()) {
mGoingToSleep.release();
}
- if (mService.mAm.mShuttingDown) {
- mService.mAm.notifyAll();
+ if (mService.mShuttingDown) {
+ mService.mGlobalLock.notifyAll();
}
}
@@ -3884,7 +3884,7 @@
final ActivityStack stack = s.getStack();
final boolean shouldSleepOrShutDown = stack != null
? stack.shouldSleepOrShutDownActivities()
- : mService.mAm.isSleepingOrShuttingDownLocked();
+ : mService.isSleepingOrShuttingDownLocked();
if (!waitingVisible || shouldSleepOrShutDown) {
if (!processPausingActivities && s.isState(PAUSING)) {
// Defer processing pausing activities in this iteration and reschedule
@@ -4329,7 +4329,7 @@
int displayState = activityDisplay.mDisplay.getState();
if (displayState == Display.STATE_OFF && activityDisplay.mOffToken == null) {
activityDisplay.mOffToken =
- mService.mAm.acquireSleepToken("Display-off", displayId);
+ mService.acquireSleepToken("Display-off", displayId);
} else if (displayState == Display.STATE_ON
&& activityDisplay.mOffToken != null) {
activityDisplay.mOffToken.release();
@@ -4362,7 +4362,7 @@
if (display != null) {
display.mAllSleepTokens.remove(token);
if (display.mAllSleepTokens.isEmpty()) {
- mService.mAm.updateSleepIfNeededLocked();
+ mService.updateSleepIfNeededLocked();
}
}
}
@@ -4376,7 +4376,7 @@
}
display.mAllSleepTokens.clear();
- mService.mAm.updateSleepIfNeededLocked();
+ mService.updateSleepIfNeededLocked();
}
private StackInfo getStackInfo(ActivityStack stack) {
@@ -4673,7 +4673,7 @@
} break;
case SLEEP_TIMEOUT_MSG: {
synchronized (mService.mGlobalLock) {
- if (mService.mAm.isSleepingOrShuttingDownLocked()) {
+ if (mService.isSleepingOrShuttingDownLocked()) {
Slog.w(TAG, "Sleep timeout! Sleeping now.");
checkReadyForSleepLocked(false /* allowDelay */);
}
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index dac7715..d59a651 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -826,7 +826,7 @@
ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid,
callingUid,
- callingPackage, intent, resolvedType, aInfo, mService.mAm.getGlobalConfiguration(),
+ callingPackage, intent, resolvedType, aInfo, mService.getGlobalConfiguration(),
resultRecord, resultWho, requestCode, componentSpecified, voiceSession != null,
mSupervisor, checkedOptions, sourceRecord);
if (outActivity != null) {
@@ -1015,7 +1015,7 @@
synchronized (mService.mGlobalLock) {
final ActivityStack stack = mSupervisor.mFocusedStack;
stack.mConfigWillChange = globalConfig != null
- && mService.mAm.getGlobalConfiguration().diff(globalConfig) != 0;
+ && mService.getGlobalConfiguration().diff(globalConfig) != 0;
if (DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
"Starting activity when config will change = " + stack.mConfigWillChange);
diff --git a/services/core/java/com/android/server/am/ActivityTaskManagerService.java b/services/core/java/com/android/server/am/ActivityTaskManagerService.java
index d47fb44..50d0212 100644
--- a/services/core/java/com/android/server/am/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityTaskManagerService.java
@@ -26,7 +26,12 @@
import static android.Manifest.permission.START_TASKS_FROM_RECENTS;
import static android.Manifest.permission.STOP_APP_SWITCHES;
import static android.app.ActivityManager.LOCK_TASK_MODE_NONE;
+import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER;
+import static android.provider.Settings.Global.HIDE_ERROR_DIALOGS;
+import static android.provider.Settings.System.FONT_SCALE;
import static com.android.server.am.ActivityManagerService.dumpStackTraces;
+import static com.android.server.am.ActivityTaskManagerService.H.REPORT_TIME_TRACKER_MSG;
+import static com.android.server.am.ActivityTaskManagerService.UiHandler.DISMISS_DIALOG_UI_MSG;
import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_CONTENT;
import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_DATA;
import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_RECEIVER_EXTRAS;
@@ -113,6 +118,23 @@
import android.app.ActivityManagerInternal;
import android.app.ActivityOptions;
import android.app.ActivityTaskManager;
+import android.app.ActivityThread;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.database.ContentObserver;
+import android.os.IUserManager;
+import android.os.PowerManager;
+import android.os.ServiceManager;
+import android.os.Trace;
+import android.os.UserManager;
+import android.os.WorkSource;
+import android.view.WindowManager;
+import com.android.internal.R;
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.app.IAppOpsService;
+import com.android.server.AppOpsService;
+import com.android.server.pm.UserManagerService;
import com.android.server.wm.ActivityTaskManagerInternal;
import android.app.AppGlobals;
import android.app.IActivityController;
@@ -228,6 +250,11 @@
private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION;
Context mContext;
+ /**
+ * This Context is themable and meant for UI display (AlertDialogs, etc.). The theme can
+ * change at runtime. Use mContext for non-UI purposes.
+ */
+ final Context mUiContext;
H mH;
UiHandler mUiHandler;
ActivityManagerService mAm;
@@ -236,6 +263,8 @@
Object mGlobalLock;
ActivityStackSupervisor mStackSupervisor;
WindowManagerService mWindowManager;
+ private UserManagerService mUserManager;
+ private AppOpsService mAppOpsService;
/** All processes currently running that might have a window organized by name. */
final ProcessMap<WindowProcessController> mProcessNames = new ProcessMap<>();
/** This is the process holding what we currently consider to be the "home" activity. */
@@ -314,6 +343,9 @@
*/
private Configuration mTempConfig = new Configuration();
+ /** Temporary to avoid allocations. */
+ final StringBuilder mStringBuilder = new StringBuilder(256);
+
// Amount of time after a call to stopAppSwitches() during which we will
// prevent further untrusted switches from happening.
private static final long APP_SWITCH_DELAY_TIME = 5 * 1000;
@@ -322,12 +354,12 @@
* The time at which we will allow normal application switches again,
* after a call to {@link #stopAppSwitches()}.
*/
- long mAppSwitchesAllowedTime;
+ private long mAppSwitchesAllowedTime;
/**
* This is set to true after the first switch after mAppSwitchesAllowedTime
* is set; any switches after that will clear the time.
*/
- boolean mDidAppSwitch;
+ private boolean mDidAppSwitch;
IActivityController mController = null;
boolean mControllerIsAMonkey = false;
@@ -336,7 +368,7 @@
* Used to retain an update lock when the foreground activity is in
* immersive mode.
*/
- final UpdateLock mUpdateLock = new UpdateLock("immersive");
+ private final UpdateLock mUpdateLock = new UpdateLock("immersive");
/**
* Packages that are being allowed to perform unrestricted app switches. Mapping is
@@ -345,9 +377,9 @@
final SparseArray<ArrayMap<String, Integer>> mAllowAppSwitchUids = new SparseArray<>();
/** The dimensions of the thumbnails in the Recents UI. */
- int mThumbnailWidth;
- int mThumbnailHeight;
- float mFullscreenThumbnailScale;
+ private int mThumbnailWidth;
+ private int mThumbnailHeight;
+ private float mFullscreenThumbnailScale;
/**
* Flag that indicates if multi-window is enabled.
@@ -375,8 +407,92 @@
// VR Vr2d Display Id.
int mVr2dDisplayId = INVALID_DISPLAY;
+ /**
+ * Set while we are wanting to sleep, to prevent any
+ * activities from being started/resumed.
+ *
+ * TODO(b/33594039): Clarify the actual state transitions represented by mSleeping.
+ *
+ * Currently mSleeping is set to true when transitioning into the sleep state, and remains true
+ * while in the sleep state until there is a pending transition out of sleep, in which case
+ * mSleeping is set to false, and remains false while awake.
+ *
+ * Whether mSleeping can quickly toggled between true/false without the device actually
+ * display changing states is undefined.
+ */
+ private boolean mSleeping = false;
+
+ /**
+ * The process state used for processes that are running the top activities.
+ * This changes between TOP and TOP_SLEEPING to following mSleeping.
+ */
+ int mTopProcessState = ActivityManager.PROCESS_STATE_TOP;
+
+ // Whether we should show our dialogs (ANR, crash, etc) or just perform their default action
+ // automatically. Important for devices without direct input devices.
+ private boolean mShowDialogs = true;
+
+ /** Set if we are shutting down the system, similar to sleeping. */
+ boolean mShuttingDown = false;
+
+ /**
+ * We want to hold a wake lock while running a voice interaction session, since
+ * this may happen with the screen off and we need to keep the CPU running to
+ * be able to continue to interact with the user.
+ */
+ PowerManager.WakeLock mVoiceWakeLock;
+
+ /**
+ * Set while we are running a voice interaction. This overrides sleeping while it is active.
+ */
+ IVoiceInteractionSession mRunningVoice;
+
+ /**
+ * The last resumed activity. This is identical to the current resumed activity most
+ * of the time but could be different when we're pausing one activity before we resume
+ * another activity.
+ */
+ ActivityRecord mLastResumedActivity;
+
+ /**
+ * The activity that is currently being traced as the active resumed activity.
+ *
+ * @see #updateResumedAppTrace
+ */
+ private @Nullable ActivityRecord mTracedResumedActivity;
+
+ /** If non-null, we are tracking the time the user spends in the currently focused app. */
+ AppTimeTracker mCurAppTimeTracker;
+
+ private FontScaleSettingObserver mFontScaleSettingObserver;
+
+ private final class FontScaleSettingObserver extends ContentObserver {
+ private final Uri mFontScaleUri = Settings.System.getUriFor(FONT_SCALE);
+ private final Uri mHideErrorDialogsUri = Settings.Global.getUriFor(HIDE_ERROR_DIALOGS);
+
+ public FontScaleSettingObserver() {
+ super(mH);
+ final ContentResolver resolver = mContext.getContentResolver();
+ resolver.registerContentObserver(mFontScaleUri, false, this, UserHandle.USER_ALL);
+ resolver.registerContentObserver(mHideErrorDialogsUri, false, this,
+ UserHandle.USER_ALL);
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri, @UserIdInt int userId) {
+ if (mFontScaleUri.equals(uri)) {
+ updateFontScaleIfNeeded(userId);
+ } else if (mHideErrorDialogsUri.equals(uri)) {
+ synchronized (mGlobalLock) {
+ updateShouldShowDialogsLocked(getGlobalConfiguration());
+ }
+ }
+ }
+ }
+
ActivityTaskManagerService(Context context) {
mContext = context;
+ mUiContext = ActivityThread.currentActivityThread().getSystemUiContext();
mLifecycleManager = new ClientLifecycleManager();
}
@@ -386,6 +502,17 @@
mRecentTasks.onSystemReadyLocked();
}
+ void onInitPowerManagement() {
+ mStackSupervisor.initPowerManagement();
+ final PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
+ mVoiceWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*voice*");
+ mVoiceWakeLock.setReferenceCounted(false);
+ }
+
+ void installSystemProviders() {
+ mFontScaleSettingObserver = new FontScaleSettingObserver();
+ }
+
void retrieveSettings(ContentResolver resolver) {
final boolean freeformWindowManagement =
mContext.getPackageManager().hasSystemFeature(FEATURE_FREEFORM_WINDOW_MANAGEMENT)
@@ -498,6 +625,26 @@
mLockTaskController.setWindowManager(wm);
}
+ UserManagerService getUserManager() {
+ if (mUserManager == null) {
+ IBinder b = ServiceManager.getService(Context.USER_SERVICE);
+ mUserManager = (UserManagerService) IUserManager.Stub.asInterface(b);
+ }
+ return mUserManager;
+ }
+
+ AppOpsService getAppOpsService() {
+ if (mAppOpsService == null) {
+ IBinder b = ServiceManager.getService(Context.APP_OPS_SERVICE);
+ mAppOpsService = (AppOpsService) IAppOpsService.Stub.asInterface(b);
+ }
+ return mAppOpsService;
+ }
+
+ boolean hasUserRestriction(String restriction, int userId) {
+ return getUserManager().hasUserRestriction(restriction, userId);
+ }
+
protected RecentTasks createRecentTasks() {
return new RecentTasks(this, mStackSupervisor);
}
@@ -2979,6 +3126,64 @@
}
}
+ private void onLocalVoiceInteractionStartedLocked(IBinder activity,
+ IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor) {
+ ActivityRecord activityToCallback = ActivityRecord.forTokenLocked(activity);
+ if (activityToCallback == null) return;
+ activityToCallback.setVoiceSessionLocked(voiceSession);
+
+ // Inform the activity
+ try {
+ activityToCallback.app.getThread().scheduleLocalVoiceInteractionStarted(activity,
+ voiceInteractor);
+ long token = Binder.clearCallingIdentity();
+ try {
+ startRunningVoiceLocked(voiceSession, activityToCallback.appInfo.uid);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ // TODO: VI Should we cache the activity so that it's easier to find later
+ // rather than scan through all the stacks and activities?
+ } catch (RemoteException re) {
+ activityToCallback.clearVoiceSessionLocked();
+ // TODO: VI Should this terminate the voice session?
+ }
+ }
+
+ private void startRunningVoiceLocked(IVoiceInteractionSession session, int targetUid) {
+ Slog.d(TAG, "<<< startRunningVoiceLocked()");
+ mVoiceWakeLock.setWorkSource(new WorkSource(targetUid));
+ if (mRunningVoice == null || mRunningVoice.asBinder() != session.asBinder()) {
+ boolean wasRunningVoice = mRunningVoice != null;
+ mRunningVoice = session;
+ if (!wasRunningVoice) {
+ mVoiceWakeLock.acquire();
+ updateSleepIfNeededLocked();
+ }
+ }
+ }
+
+ void finishRunningVoiceLocked() {
+ if (mRunningVoice != null) {
+ mRunningVoice = null;
+ mVoiceWakeLock.release();
+ updateSleepIfNeededLocked();
+ }
+ }
+
+ @Override
+ public void setVoiceKeepAwake(IVoiceInteractionSession session, boolean keepAwake) {
+ synchronized (mGlobalLock) {
+ if (mRunningVoice != null && mRunningVoice.asBinder() == session.asBinder()) {
+ if (keepAwake) {
+ mVoiceWakeLock.acquire();
+ } else {
+ mVoiceWakeLock.release();
+ }
+ }
+ }
+ }
+
@Override
public ComponentName getActivityClassForToken(IBinder token) {
synchronized (mGlobalLock) {
@@ -3516,7 +3721,7 @@
if (ActivityRecord.forTokenLocked(callingActivity) != activity) {
throw new SecurityException("Only focused activity can call startVoiceInteraction");
}
- if (mAm.mRunningVoice != null || activity.getTask().voiceSession != null
+ if (mRunningVoice != null || activity.getTask().voiceSession != null
|| activity.voiceSession != null) {
Slog.w(TAG, "Already in a voice interaction, cannot start new voice interaction");
return;
@@ -3720,10 +3925,10 @@
mAmInternal.enforceCallingPermission(
Manifest.permission.INTERACT_ACROSS_USERS_FULL, "getLastResumedActivityUserId()");
synchronized (mGlobalLock) {
- if (mAm.mLastResumedActivity == null) {
+ if (mLastResumedActivity == null) {
return getCurrentUserId();
}
- return mAm.mLastResumedActivity.userId;
+ return mLastResumedActivity.userId;
}
}
@@ -3949,12 +4154,39 @@
|| transit == TRANSIT_TASK_TO_FRONT;
}
- void dumpVrControllerLocked(PrintWriter pw) {
- pw.println(" mVrController=" + mVrController);
+ void dumpSleepStates(PrintWriter pw, boolean testPssMode) {
+ synchronized (mGlobalLock) {
+ pw.println(" mSleepTokens=" + mStackSupervisor.mSleepTokens);
+ if (mRunningVoice != null) {
+ pw.println(" mRunningVoice=" + mRunningVoice);
+ pw.println(" mVoiceWakeLock" + mVoiceWakeLock);
+ }
+ pw.println(" mSleeping=" + mSleeping);
+ pw.println(" mShuttingDown=" + mShuttingDown + " mTestPssMode=" + testPssMode);
+ pw.println(" mVrController=" + mVrController);
+ }
}
- void writeVrControllerToProto(ProtoOutputStream proto, long fieldId) {
- mVrController.writeToProto(proto, fieldId);
+ void writeSleepStateToProto(ProtoOutputStream proto) {
+ for (ActivityTaskManagerInternal.SleepToken st : mStackSupervisor.mSleepTokens) {
+ proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SLEEP_TOKENS,
+ st.toString());
+ }
+
+ if (mRunningVoice != null) {
+ final long vrToken = proto.start(
+ ActivityManagerServiceDumpProcessesProto.RUNNING_VOICE);
+ proto.write(ActivityManagerServiceDumpProcessesProto.Voice.SESSION,
+ mRunningVoice.toString());
+ mVoiceWakeLock.writeToProto(
+ proto, ActivityManagerServiceDumpProcessesProto.Voice.WAKELOCK);
+ proto.end(vrToken);
+ }
+
+ proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SLEEPING, mSleeping);
+ proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SHUTTING_DOWN,
+ mShuttingDown);
+ mVrController.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.VR_CONTROLLER);
}
int getCurrentUserId() {
@@ -3967,6 +4199,15 @@
}
}
+ public Configuration getConfiguration() {
+ Configuration ci;
+ synchronized(mGlobalLock) {
+ ci = new Configuration(getGlobalConfiguration());
+ ci.userSetLocale = false;
+ }
+ return ci;
+ }
+
/**
* Current global configuration information. Contains general settings for the entire system,
* also corresponds to the merged configuration of the default display.
@@ -4129,7 +4370,7 @@
mTempConfig, mAmInternal.getCurrentUserId());
// TODO: If our config changes, should we auto dismiss any currently showing dialogs?
- mAm.updateShouldShowDialogsLocked(mTempConfig);
+ updateShouldShowDialogsLocked(mTempConfig);
AttributeCache ac = AttributeCache.instance();
if (ac != null) {
@@ -4288,6 +4529,220 @@
return changes;
}
+ private void updateEventDispatchingLocked(boolean booted) {
+ mWindowManager.setEventDispatching(booted && !mShuttingDown);
+ }
+
+ void enableScreenAfterBoot(boolean booted) {
+ EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_ENABLE_SCREEN,
+ SystemClock.uptimeMillis());
+ mWindowManager.enableScreenAfterBoot();
+
+ synchronized (mGlobalLock) {
+ updateEventDispatchingLocked(booted);
+ }
+ }
+
+ boolean canShowErrorDialogs() {
+ return mShowDialogs && !mSleeping && !mShuttingDown
+ && !mKeyguardController.isKeyguardOrAodShowing(DEFAULT_DISPLAY)
+ && !hasUserRestriction(UserManager.DISALLOW_SYSTEM_ERROR_DIALOGS,
+ mAm.mUserController.getCurrentUserId())
+ && !(UserManager.isDeviceInDemoMode(mContext)
+ && mAm.mUserController.getCurrentUser().isDemo());
+ }
+
+ /**
+ * Decide based on the configuration whether we should show the ANR,
+ * crash, etc dialogs. The idea is that if there is no affordance to
+ * press the on-screen buttons, or the user experience would be more
+ * greatly impacted than the crash itself, we shouldn't show the dialog.
+ *
+ * A thought: SystemUI might also want to get told about this, the Power
+ * dialog / global actions also might want different behaviors.
+ */
+ private void updateShouldShowDialogsLocked(Configuration config) {
+ final boolean inputMethodExists = !(config.keyboard == Configuration.KEYBOARD_NOKEYS
+ && config.touchscreen == Configuration.TOUCHSCREEN_NOTOUCH
+ && config.navigation == Configuration.NAVIGATION_NONAV);
+ int modeType = config.uiMode & Configuration.UI_MODE_TYPE_MASK;
+ final boolean uiModeSupportsDialogs = (modeType != Configuration.UI_MODE_TYPE_CAR
+ && !(modeType == Configuration.UI_MODE_TYPE_WATCH && Build.IS_USER)
+ && modeType != Configuration.UI_MODE_TYPE_TELEVISION
+ && modeType != Configuration.UI_MODE_TYPE_VR_HEADSET);
+ final boolean hideDialogsSet = Settings.Global.getInt(mContext.getContentResolver(),
+ HIDE_ERROR_DIALOGS, 0) != 0;
+ mShowDialogs = inputMethodExists && uiModeSupportsDialogs && !hideDialogsSet;
+ }
+
+ private void updateFontScaleIfNeeded(@UserIdInt int userId) {
+ final float scaleFactor = Settings.System.getFloatForUser(mContext.getContentResolver(),
+ FONT_SCALE, 1.0f, userId);
+
+ synchronized (this) {
+ if (getGlobalConfiguration().fontScale == scaleFactor) {
+ return;
+ }
+
+ final Configuration configuration
+ = mWindowManager.computeNewConfiguration(DEFAULT_DISPLAY);
+ configuration.fontScale = scaleFactor;
+ updatePersistentConfiguration(configuration, userId);
+ }
+ }
+
+ // Actually is sleeping or shutting down or whatever else in the future
+ // is an inactive state.
+ boolean isSleepingOrShuttingDownLocked() {
+ return isSleepingLocked() || mShuttingDown;
+ }
+
+ boolean isSleepingLocked() {
+ return mSleeping;
+ }
+
+ /**
+ * Update AMS states when an activity is resumed. This should only be called by
+ * {@link ActivityStack#onActivityStateChanged(
+ * ActivityRecord, ActivityStack.ActivityState, String)} when an activity is resumed.
+ */
+ void setResumedActivityUncheckLocked(ActivityRecord r, String reason) {
+ final TaskRecord task = r.getTask();
+ if (task.isActivityTypeStandard()) {
+ if (mCurAppTimeTracker != r.appTimeTracker) {
+ // We are switching app tracking. Complete the current one.
+ if (mCurAppTimeTracker != null) {
+ mCurAppTimeTracker.stop();
+ mH.obtainMessage(
+ REPORT_TIME_TRACKER_MSG, mCurAppTimeTracker).sendToTarget();
+ mStackSupervisor.clearOtherAppTimeTrackers(r.appTimeTracker);
+ mCurAppTimeTracker = null;
+ }
+ if (r.appTimeTracker != null) {
+ mCurAppTimeTracker = r.appTimeTracker;
+ startTimeTrackingFocusedActivityLocked();
+ }
+ } else {
+ startTimeTrackingFocusedActivityLocked();
+ }
+ } else {
+ r.appTimeTracker = null;
+ }
+ // TODO: VI Maybe r.task.voiceInteractor || r.voiceInteractor != null
+ // TODO: Probably not, because we don't want to resume voice on switching
+ // back to this activity
+ if (task.voiceInteractor != null) {
+ startRunningVoiceLocked(task.voiceSession, r.info.applicationInfo.uid);
+ } else {
+ finishRunningVoiceLocked();
+
+ if (mLastResumedActivity != null) {
+ final IVoiceInteractionSession session;
+
+ final TaskRecord lastResumedActivityTask = mLastResumedActivity.getTask();
+ if (lastResumedActivityTask != null
+ && lastResumedActivityTask.voiceSession != null) {
+ session = lastResumedActivityTask.voiceSession;
+ } else {
+ session = mLastResumedActivity.voiceSession;
+ }
+
+ if (session != null) {
+ // We had been in a voice interaction session, but now focused has
+ // move to something different. Just finish the session, we can't
+ // return to it and retain the proper state and synchronization with
+ // the voice interaction service.
+ finishVoiceTask(session);
+ }
+ }
+ }
+
+ if (mLastResumedActivity != null && r.userId != mLastResumedActivity.userId) {
+ mAmInternal.sendForegroundProfileChanged(r.userId);
+ }
+ updateResumedAppTrace(r);
+ mLastResumedActivity = r;
+
+ mWindowManager.setFocusedApp(r.appToken, true);
+
+ applyUpdateLockStateLocked(r);
+ applyUpdateVrModeLocked(r);
+
+ EventLogTags.writeAmSetResumedActivity(
+ r == null ? -1 : r.userId,
+ r == null ? "NULL" : r.shortComponentName,
+ reason);
+ }
+
+ ActivityTaskManagerInternal.SleepToken acquireSleepToken(String tag, int displayId) {
+ synchronized (mGlobalLock) {
+ final ActivityTaskManagerInternal.SleepToken token = mStackSupervisor.createSleepTokenLocked(tag, displayId);
+ updateSleepIfNeededLocked();
+ return token;
+ }
+ }
+
+ void updateSleepIfNeededLocked() {
+ final boolean shouldSleep = !mStackSupervisor.hasAwakeDisplay();
+ final boolean wasSleeping = mSleeping;
+ boolean updateOomAdj = false;
+
+ if (!shouldSleep) {
+ // If wasSleeping is true, we need to wake up activity manager state from when
+ // we started sleeping. In either case, we need to apply the sleep tokens, which
+ // will wake up stacks or put them to sleep as appropriate.
+ if (wasSleeping) {
+ mSleeping = false;
+ startTimeTrackingFocusedActivityLocked();
+ mTopProcessState = ActivityManager.PROCESS_STATE_TOP;
+ mStackSupervisor.comeOutOfSleepIfNeededLocked();
+ }
+ mStackSupervisor.applySleepTokensLocked(true /* applyToStacks */);
+ if (wasSleeping) {
+ updateOomAdj = true;
+ }
+ } else if (!mSleeping && shouldSleep) {
+ mSleeping = true;
+ if (mCurAppTimeTracker != null) {
+ mCurAppTimeTracker.stop();
+ }
+ mTopProcessState = ActivityManager.PROCESS_STATE_TOP_SLEEPING;
+ mStackSupervisor.goingToSleepLocked();
+ updateResumedAppTrace(null /* resumed */);
+ updateOomAdj = true;
+ }
+ if (updateOomAdj) {
+ mH.post(mAmInternal::updateOomAdj);
+ }
+ }
+
+ void updateOomAdj() {
+ mH.post(mAmInternal::updateOomAdj);
+ }
+
+ private void startTimeTrackingFocusedActivityLocked() {
+ final ActivityRecord resumedActivity = mStackSupervisor.getResumedActivityLocked();
+ if (!mSleeping && mCurAppTimeTracker != null && resumedActivity != null) {
+ mCurAppTimeTracker.start(resumedActivity.packageName);
+ }
+ }
+
+ private void updateResumedAppTrace(@Nullable ActivityRecord resumed) {
+ if (mTracedResumedActivity != null) {
+ Trace.asyncTraceEnd(TRACE_TAG_ACTIVITY_MANAGER,
+ constructResumedTraceName(mTracedResumedActivity.packageName), 0);
+ }
+ if (resumed != null) {
+ Trace.asyncTraceBegin(TRACE_TAG_ACTIVITY_MANAGER,
+ constructResumedTraceName(resumed.packageName), 0);
+ }
+ mTracedResumedActivity = resumed;
+ }
+
+ private String constructResumedTraceName(String packageName) {
+ return "focused app: " + packageName;
+ }
+
/** Helper method that requests bounds from WM and applies them to stack. */
private void resizeStackWithBoundsFromWindowManager(int stackId, boolean deferResume) {
final Rect newStackBounds = new Rect();
@@ -4396,23 +4851,47 @@
}
final class H extends Handler {
+ static final int REPORT_TIME_TRACKER_MSG = 1;
+
public H(Looper looper) {
super(looper, null, true);
}
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case REPORT_TIME_TRACKER_MSG: {
+ AppTimeTracker tracker = (AppTimeTracker) msg.obj;
+ tracker.deliverResult(mContext);
+ } break;
+ }
+ }
}
final class UiHandler extends Handler {
+ static final int DISMISS_DIALOG_UI_MSG = 1;
public UiHandler() {
super(com.android.server.UiThread.get().getLooper(), null, true);
}
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case DISMISS_DIALOG_UI_MSG: {
+ final Dialog d = (Dialog) msg.obj;
+ d.dismiss();
+ break;
+ }
+ }
+ }
}
final class LocalService extends ActivityTaskManagerInternal {
@Override
public SleepToken acquireSleepToken(String tag, int displayId) {
Preconditions.checkNotNull(tag);
- return mAm.acquireSleepToken(tag, displayId);
+ return ActivityTaskManagerService.this.acquireSleepToken(tag, displayId);
}
@Override
@@ -4427,7 +4906,7 @@
public void onLocalVoiceInteractionStarted(IBinder activity,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor) {
synchronized (mGlobalLock) {
- mAm.onLocalVoiceInteractionStartedLocked(activity, voiceSession, voiceInteractor);
+ onLocalVoiceInteractionStartedLocked(activity, voiceSession, voiceInteractor);
}
}
@@ -4669,5 +5148,96 @@
}
}
}
+
+ @Override
+ public int getTopProcessState() {
+ synchronized (mGlobalLock) {
+ return mTopProcessState;
+ }
+ }
+
+ @Override
+ public boolean isSleeping() {
+ synchronized (mGlobalLock) {
+ return isSleepingLocked();
+ }
+ }
+
+ @Override
+ public boolean isShuttingDown() {
+ synchronized (mGlobalLock) {
+ return mShuttingDown;
+ }
+ }
+
+ @Override
+ public boolean shuttingDown(boolean booted, int timeout) {
+ synchronized (mGlobalLock) {
+ mShuttingDown = true;
+ mStackSupervisor.prepareForShutdownLocked();
+ updateEventDispatchingLocked(booted);
+ return mStackSupervisor.shutdownLocked(timeout);
+ }
+ }
+
+ @Override
+ public void enableScreenAfterBoot(boolean booted) {
+ synchronized (mGlobalLock) {
+ EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_ENABLE_SCREEN,
+ SystemClock.uptimeMillis());
+ mWindowManager.enableScreenAfterBoot();
+ updateEventDispatchingLocked(booted);
+ }
+ }
+
+ @Override
+ public boolean showStrictModeViolationDialog() {
+ synchronized (mGlobalLock) {
+ return mShowDialogs && !mSleeping && !mShuttingDown;
+ }
+ }
+
+ @Override
+ public void showSystemReadyErrorDialogsIfNeeded() {
+ synchronized (mGlobalLock) {
+ try {
+ if (AppGlobals.getPackageManager().hasSystemUidErrors()) {
+ Slog.e(TAG, "UIDs on the system are inconsistent, you need to wipe your"
+ + " data partition or your device will be unstable.");
+ mUiHandler.post(() -> {
+ if (mShowDialogs) {
+ AlertDialog d = new BaseErrorDialog(mUiContext);
+ d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
+ d.setCancelable(false);
+ d.setTitle(mUiContext.getText(R.string.android_system_label));
+ d.setMessage(mUiContext.getText(R.string.system_error_wipe_data));
+ d.setButton(DialogInterface.BUTTON_POSITIVE,
+ mUiContext.getText(R.string.ok),
+ mUiHandler.obtainMessage(DISMISS_DIALOG_UI_MSG, d));
+ d.show();
+ }
+ });
+ }
+ } catch (RemoteException e) {
+ }
+
+ if (!Build.isBuildConsistent()) {
+ Slog.e(TAG, "Build fingerprint is not consistent, warning user");
+ mUiHandler.post(() -> {
+ if (mShowDialogs) {
+ AlertDialog d = new BaseErrorDialog(mUiContext);
+ d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
+ d.setCancelable(false);
+ d.setTitle(mUiContext.getText(R.string.android_system_label));
+ d.setMessage(mUiContext.getText(R.string.system_error_manufacturer));
+ d.setButton(DialogInterface.BUTTON_POSITIVE,
+ mUiContext.getText(R.string.ok),
+ mUiHandler.obtainMessage(DISMISS_DIALOG_UI_MSG, d));
+ d.show();
+ }
+ });
+ }
+ }
+ }
}
}
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index 7db98b3..27567a7 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -824,7 +824,8 @@
mService.mUserController.getCurrentUserId()) != 0;
final boolean crashSilenced = mAppsNotReportingCrashes != null &&
mAppsNotReportingCrashes.contains(proc.info.packageName);
- if ((mService.canShowErrorDialogs() || showBackground) && !crashSilenced
+ if ((mService.mActivityTaskManager.canShowErrorDialogs() || showBackground)
+ && !crashSilenced
&& (showFirstCrash || showFirstCrashDevOption || data.repeating)) {
proc.crashDialog = dialogToShow = new AppErrorDialog(mContext, mService, data);
} else {
@@ -901,7 +902,7 @@
synchronized (mService) {
// PowerManager.reboot() can block for a long time, so ignore ANRs while shutting down.
- if (mService.mShuttingDown) {
+ if (mService.mActivityTaskManager.mShuttingDown) {
Slog.i(TAG, "During shutdown skipping ANR: " + app + " " + annotation);
return;
} else if (app.isNotResponding()) {
@@ -1122,7 +1123,7 @@
boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0;
- if (mService.canShowErrorDialogs() || showBackground) {
+ if (mService.mActivityTaskManager.canShowErrorDialogs() || showBackground) {
dialogToShow = new AppNotRespondingDialog(mService, mContext, data);
proc.anrDialog = dialogToShow;
} else {
diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java
index 657e0eb..efde70d 100644
--- a/services/core/java/com/android/server/am/KeyguardController.java
+++ b/services/core/java/com/android/server/am/KeyguardController.java
@@ -58,7 +58,7 @@
private static final String TAG = TAG_WITH_CLASS_NAME ? "KeyguardController" : TAG_AM;
- private final ActivityManagerService mService;
+ private final ActivityTaskManagerService mService;
private final ActivityStackSupervisor mStackSupervisor;
private WindowManagerService mWindowManager;
private boolean mKeyguardShowing;
@@ -72,7 +72,7 @@
private SleepToken mSleepToken;
private int mSecondaryDisplayShowing = INVALID_DISPLAY;
- KeyguardController(ActivityManagerService service,
+ KeyguardController(ActivityTaskManagerService service,
ActivityStackSupervisor stackSupervisor) {
mService = service;
mStackSupervisor = stackSupervisor;
diff --git a/services/core/java/com/android/server/am/SafeActivityOptions.java b/services/core/java/com/android/server/am/SafeActivityOptions.java
index fef3b86..f7de7f4 100644
--- a/services/core/java/com/android/server/am/SafeActivityOptions.java
+++ b/services/core/java/com/android/server/am/SafeActivityOptions.java
@@ -230,7 +230,7 @@
// Check permission for remote animations
final RemoteAnimationAdapter adapter = options.getRemoteAnimationAdapter();
- if (adapter != null && supervisor.mService.mAm.checkPermission(
+ if (adapter != null && supervisor.mService.checkPermission(
CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS, callingPid, callingUid)
!= PERMISSION_GRANTED) {
final String msg = "Permission Denial: starting " + getIntentString(intent)
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
index 3885cf9..bfecd9d 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
@@ -266,4 +266,12 @@
public abstract void onProcessAdded(WindowProcessController proc);
public abstract void onProcessRemoved(String name, int uid);
public abstract void onCleanUpApplicationRecord(WindowProcessController proc);
+ public abstract int getTopProcessState();
+
+ public abstract boolean isSleeping();
+ public abstract boolean isShuttingDown();
+ public abstract boolean shuttingDown(boolean booted, int timeout);
+ public abstract void enableScreenAfterBoot(boolean booted);
+ public abstract boolean showStrictModeViolationDialog();
+ public abstract void showSystemReadyErrorDialogsIfNeeded();
}