Loading services/core/java/com/android/server/am/ActivityManagerService.java +39 −86 Original line number Diff line number Diff line Loading @@ -591,14 +591,11 @@ public final class ActivityManagerService extends ActivityManagerNative } /** * Activity we have told the window manager to have key focus. * 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 mFocusedActivity = null; /** * User id of the last activity mFocusedActivity was set to. */ private int mLastFocusedUserId; private ActivityRecord mLastResumedActivity; /** * If non-null, we are tracking the time the user spends in the currently focused app. Loading Loading @@ -639,8 +636,6 @@ public final class ActivityManagerService extends ActivityManagerNative final AppErrors mAppErrors; boolean mDoingSetFocusedActivity; public boolean canShowErrorDialogs() { return mShowDialogs && !mSleeping && !mShuttingDown; } Loading Loading @@ -2952,25 +2947,13 @@ public final class ActivityManagerService extends ActivityManagerNative return mAppBindArgs; } boolean setFocusedActivityLocked(ActivityRecord r, String reason) { if (r == null || mFocusedActivity == r) { return false; } if (!r.isFocusable()) { if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "setFocusedActivityLocked: unfocusable r=" + r); return false; } if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "setFocusedActivityLocked: r=" + r); final boolean wasDoingSetFocusedActivity = mDoingSetFocusedActivity; if (wasDoingSetFocusedActivity) Slog.w(TAG, "setFocusedActivityLocked: called recursively, r=" + r + ", reason=" + reason); mDoingSetFocusedActivity = true; /** * Update AMS states when an activity is resumed. This should only be called by * {@link ActivityStack#setResumedActivityLocked} when an activity is resumed. */ void setResumedActivityUncheckLocked(ActivityRecord r, String reason) { r.state = ActivityState.RESUMED; final ActivityRecord last = mFocusedActivity; mFocusedActivity = r; if (r.task.isApplicationTask()) { if (mCurAppTimeTracker != r.appTimeTracker) { // We are switching app tracking. Complete the current one. Loading Loading @@ -2999,8 +2982,9 @@ public final class ActivityManagerService extends ActivityManagerNative } else { finishRunningVoiceLocked(); IVoiceInteractionSession session; if (last != null && ((session = last.task.voiceSession) != null || (session = last.voiceSession) != null)) { if (mLastResumedActivity != null && ((session = mLastResumedActivity.task.voiceSession) != null || (session = mLastResumedActivity.voiceSession) != 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 Loading @@ -3008,57 +2992,23 @@ public final class ActivityManagerService extends ActivityManagerNative finishVoiceTask(session); } } if (mStackSupervisor.moveActivityStackToFront(r, reason + " setFocusedActivity")) { mWindowManager.setFocusedApp(r.appToken, true); } applyUpdateLockStateLocked(r); applyUpdateVrModeLocked(r); if (mFocusedActivity.userId != mLastFocusedUserId) { if (mLastResumedActivity != null && r.userId != mLastResumedActivity.userId) { mHandler.removeMessages(FOREGROUND_PROFILE_CHANGED_MSG); mHandler.obtainMessage( FOREGROUND_PROFILE_CHANGED_MSG, mFocusedActivity.userId, 0).sendToTarget(); mLastFocusedUserId = mFocusedActivity.userId; FOREGROUND_PROFILE_CHANGED_MSG, r.userId, 0).sendToTarget(); } // Log a warning if the focused app is changed during the process. This could // indicate a problem of the focus setting logic! if (mFocusedActivity != r) Slog.w(TAG, "setFocusedActivityLocked: r=" + r + " but focused to " + mFocusedActivity); mDoingSetFocusedActivity = wasDoingSetFocusedActivity; mLastResumedActivity = r; EventLogTags.writeAmFocusedActivity( mFocusedActivity == null ? -1 : mFocusedActivity.userId, mFocusedActivity == null ? "NULL" : mFocusedActivity.shortComponentName, EventLogTags.writeAmSetResumedActivity( r == null ? -1 : r.userId, r == null ? "NULL" : r.shortComponentName, reason); return true; } final void resetFocusedActivityIfNeededLocked(ActivityRecord goingAway) { if (mFocusedActivity != goingAway) { return; } final ActivityStack focusedStack = mStackSupervisor.getFocusedStack(); if (focusedStack != null) { final ActivityRecord top = focusedStack.topActivity(); if (top != null && top.userId != mLastFocusedUserId) { mHandler.removeMessages(FOREGROUND_PROFILE_CHANGED_MSG); mHandler.sendMessage( mHandler.obtainMessage(FOREGROUND_PROFILE_CHANGED_MSG, top.userId, 0)); mLastFocusedUserId = top.userId; } } // Try to move focus to another activity if possible. if (setFocusedActivityLocked( focusedStack.topRunningActivityLocked(), "resetFocusedActivityIfNeeded")) { return; } if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "resetFocusedActivityIfNeeded: Setting focus to NULL " + "prev mFocusedActivity=" + mFocusedActivity + " goingAway=" + goingAway); mFocusedActivity = null; EventLogTags.writeAmFocusedActivity(-1, "NULL", "resetFocusedActivityIfNeeded"); } @Override Loading @@ -3073,7 +3023,7 @@ public final class ActivityManagerService extends ActivityManagerNative return; } final ActivityRecord r = stack.topRunningActivityLocked(); if (setFocusedActivityLocked(r, "setFocusedStack")) { if (mStackSupervisor.moveFocusableActivityStackToFrontLocked(r, "setFocusedStack")) { mStackSupervisor.resumeFocusedStackTopActivityLocked(); } } Loading @@ -3094,7 +3044,7 @@ public final class ActivityManagerService extends ActivityManagerNative return; } final ActivityRecord r = task.topRunningActivityLocked(); if (setFocusedActivityLocked(r, "setFocusedTask")) { if (mStackSupervisor.moveFocusableActivityStackToFrontLocked(r, "setFocusedTask")) { mStackSupervisor.resumeFocusedStackTopActivityLocked(); } } Loading Loading @@ -6722,7 +6672,7 @@ public final class ActivityManagerService extends ActivityManagerNative // Some stack visibility might change (e.g. docked stack) mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS); applyVrModeIfNeededLocked(mFocusedActivity, true); applyVrModeIfNeededLocked(mStackSupervisor.getResumedActivityLocked(), true); } } } finally { Loading Loading @@ -11585,8 +11535,9 @@ public final class ActivityManagerService extends ActivityManagerNative } void startTimeTrackingFocusedActivityLocked() { if (!mSleeping && mCurAppTimeTracker != null && mFocusedActivity != null) { mCurAppTimeTracker.start(mFocusedActivity.packageName); final ActivityRecord resumedActivity = mStackSupervisor.getResumedActivityLocked(); if (!mSleeping && mCurAppTimeTracker != null && resumedActivity != null) { mCurAppTimeTracker.start(resumedActivity.packageName); } } Loading Loading @@ -12530,7 +12481,7 @@ public final class ActivityManagerService extends ActivityManagerNative r.immersive = immersive; // update associated state if we're frontmost if (r == mFocusedActivity) { if (r == mStackSupervisor.getResumedActivityLocked()) { if (DEBUG_IMMERSIVE) Slog.d(TAG_IMMERSIVE, "Frontmost changed immersion: "+ r); applyUpdateLockStateLocked(r); } Loading Loading @@ -12641,7 +12592,7 @@ public final class ActivityManagerService extends ActivityManagerNative r.requestedVrComponent = (enabled) ? packageName : null; // Update associated state if this activity is currently focused if (r == mFocusedActivity) { if (r == mStackSupervisor.getResumedActivityLocked()) { applyUpdateVrModeLocked(r); } return 0; Loading Loading @@ -14319,8 +14270,9 @@ public final class ActivityManagerService extends ActivityManagerNative dumpPackage); boolean needSep = printedAnything; boolean printed = ActivityStackSupervisor.printThisActivity(pw, mFocusedActivity, dumpPackage, needSep, " mFocusedActivity: "); boolean printed = ActivityStackSupervisor.printThisActivity(pw, mStackSupervisor.getResumedActivityLocked(), dumpPackage, needSep, " ResumedActivity: "); if (printed) { printedAnything = true; needSep = false; Loading Loading @@ -20604,7 +20556,7 @@ public final class ActivityManagerService extends ActivityManagerNative } private final ActivityRecord resumedAppLocked() { ActivityRecord act = mStackSupervisor.resumedAppLocked(); ActivityRecord act = mStackSupervisor.getResumedActivityLocked(); String pkg; int uid; if (act != null) { Loading Loading @@ -21688,10 +21640,11 @@ public final class ActivityManagerService extends ActivityManagerNative ComponentName callingVrActivity = null; int userId = -1; synchronized (ActivityManagerService.this) { if (mFocusedActivity != null) { requestedVrService = mFocusedActivity.requestedVrComponent; callingVrActivity = mFocusedActivity.info.getComponentName(); userId = mFocusedActivity.userId; final ActivityRecord resumedActivity = mStackSupervisor.getResumedActivityLocked(); if (resumedActivity != null) { requestedVrService = resumedActivity.requestedVrComponent; callingVrActivity = resumedActivity.info.getComponentName(); userId = resumedActivity.userId; } } services/core/java/com/android/server/am/ActivityStack.java +28 −24 Original line number Diff line number Diff line Loading @@ -895,14 +895,10 @@ final class ActivityStack { } void minimalResumeActivityLocked(ActivityRecord r) { r.state = ActivityState.RESUMED; if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to RESUMED: " + r + " (starting new instance)" + " callers=" + Debug.getCallers(5)); mResumedActivity = r; r.task.touchActiveTime(); mRecentTasks.addLocked(r.task); setResumedActivityLocked(r, "minimalResumeActivityLocked"); completeResumeLocked(r); mStackSupervisor.checkReadyForSleepLocked(); setLaunchTime(r); if (DEBUG_SAVED_STATE) Slog.i(TAG_SAVED_STATE, "Launch completed; removing icicle of " + r.icicle); Loading Loading @@ -1431,6 +1427,7 @@ final class ActivityStack { // When resuming an activity, require it to call requestVisibleBehind() again. setVisibleBehindActivity(null); } mStackSupervisor.checkReadyForSleepLocked(); } private void setVisible(ActivityRecord r, boolean visible) { Loading Loading @@ -2121,6 +2118,15 @@ final class ActivityStack { return result; } void setResumedActivityLocked(ActivityRecord r, String reason) { // TODO: move mResumedActivity to stack supervisor, // there should only be 1 global copy of resumed activity. mResumedActivity = r; mService.setResumedActivityUncheckLocked(r, reason); r.task.touchActiveTime(); mRecentTasks.addLocked(r.task); } private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) { if (DEBUG_LOCKSCREEN) mService.logLockScreen(""); Loading Loading @@ -2428,10 +2434,9 @@ final class ActivityStack { mService.updateCpuStats(); if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to RESUMED: " + next + " (in existing)"); next.state = ActivityState.RESUMED; mResumedActivity = next; next.task.touchActiveTime(); mRecentTasks.addLocked(next.task); setResumedActivityLocked(next, "resumeTopActivityInnerLocked"); mService.updateLruProcessLocked(next.app, true, null); updateLRUListLocked(next); mService.updateOomAdjLocked(); Loading Loading @@ -2504,8 +2509,6 @@ final class ActivityStack { next.app.thread.scheduleResumeActivity(next.appToken, next.app.repProcState, mService.isNextTransitionForward(), resumeAnimOptions); mStackSupervisor.checkReadyForSleepLocked(); if (DEBUG_STATES) Slog.d(TAG_STATES, "resumeTopActivityLocked: Resumed " + next); } catch (Exception e) { // Whoops, need to restart this activity! Loading Loading @@ -3173,8 +3176,8 @@ final class ActivityStack { r.addResultLocked(null, resultWho, requestCode, resultCode, data); } private void adjustFocusedActivityLocked(ActivityRecord r, String reason) { if (!mStackSupervisor.isFocusedStack(this) || mService.mFocusedActivity != r) { private void adjustFocusedActivityStackLocked(ActivityRecord r, String reason) { if (!mStackSupervisor.isFocusedStack(this) || mResumedActivity != r) { return; } Loading @@ -3183,9 +3186,7 @@ final class ActivityStack { if (next != r) { if (next != null && StackId.keepFocusInStackIfPossible(mStackId) && isFocusable()) { // For freeform, docked, and pinned stacks we always keep the focus within the // stack as long as there is a running activity in the stack that we can adjust // focus to. mService.setFocusedActivityLocked(next, myReason); // stack as long as there is a running activity. return; } else { final TaskRecord task = r.task; Loading @@ -3209,7 +3210,8 @@ final class ActivityStack { } } mService.setFocusedActivityLocked(mStackSupervisor.topRunningActivityLocked(), myReason); mStackSupervisor.moveFocusableActivityStackToFrontLocked( mStackSupervisor.topRunningActivityLocked(), myReason); } private boolean adjustFocusToNextFocusableStackLocked(int taskToReturnTo, String reason) { Loading @@ -3226,7 +3228,9 @@ final class ActivityStack { // visible, then use the task return to value to determine the home task to display next. return mStackSupervisor.moveHomeStackTaskToTop(taskToReturnTo, reason); } return mService.setFocusedActivityLocked(top, myReason); stack.moveToFront(myReason); return true; } final void stopActivityLocked(ActivityRecord r) { Loading @@ -3239,7 +3243,7 @@ final class ActivityStack { if (requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null, "stop-no-history", false)) { // Activity was finished, no need to continue trying to schedule stop. adjustFocusedActivityLocked(r, "stopActivityFinished"); adjustFocusedActivityStackLocked(r, "stopActivityFinished"); r.resumeKeyDispatchingLocked(); return; } Loading @@ -3251,7 +3255,7 @@ final class ActivityStack { } if (r.app != null && r.app.thread != null) { adjustFocusedActivityLocked(r, "stopActivity"); adjustFocusedActivityStackLocked(r, "stopActivity"); r.resumeKeyDispatchingLocked(); try { r.stopped = false; Loading Loading @@ -3478,7 +3482,7 @@ final class ActivityStack { r.pauseKeyDispatchingLocked(); adjustFocusedActivityLocked(r, "finishActivity"); adjustFocusedActivityStackLocked(r, "finishActivity"); finishActivityResultsLocked(r, resultCode, resultData); Loading Loading @@ -3739,7 +3743,6 @@ final class ActivityStack { if (mPausingActivity == r) { mPausingActivity = null; } mService.resetFocusedActivityIfNeededLocked(r); r.deferRelaunchUntilPaused = false; r.frozenBeforeDestroy = false; Loading Loading @@ -4298,7 +4301,7 @@ final class ActivityStack { // Set focus to the top running activity of this stack. ActivityRecord r = topRunningActivityLocked(); mService.setFocusedActivityLocked(r, reason); mStackSupervisor.moveFocusableActivityStackToFrontLocked(r, reason); if (DEBUG_TRANSITION) Slog.v(TAG_TRANSITION, "Prepare to front transition: task=" + tr); if (noAnimation) { Loading Loading @@ -4373,7 +4376,7 @@ final class ActivityStack { mStackSupervisor.getStack(FULLSCREEN_WORKSPACE_STACK_ID); if (fullscreenStack != null && fullscreenStack.hasVisibleBehindActivity()) { final ActivityRecord visibleBehind = fullscreenStack.getVisibleBehindActivity(); mService.setFocusedActivityLocked(visibleBehind, "moveTaskToBack"); mStackSupervisor.moveFocusableActivityStackToFrontLocked(visibleBehind, "moveTaskToBack"); mStackSupervisor.resumeFocusedStackTopActivityLocked(); return true; } Loading Loading @@ -4758,6 +4761,7 @@ final class ActivityStack { // code in resumeTopActivityInnerLocked to complete the resume might be skipped. if (!r.visible || r.stopped) { mWindowManager.setAppVisibility(r.appToken, true); setResumedActivityLocked(r, "relaunchActivityLocked"); completeResumeLocked(r); } else { r.results = null; Loading services/core/java/com/android/server/am/ActivityStackSupervisor.java +34 −23 Original line number Diff line number Diff line Loading @@ -128,6 +128,7 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CONTAINERS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FOCUS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_IDLE; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LOCKSCREEN; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LOCKTASK; Loading @@ -140,6 +141,7 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SWITCH; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_TASKS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_VISIBLE_BEHIND; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CONTAINERS; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_FOCUS; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_IDLE; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_LOCKTASK; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_PAUSE; Loading Loading @@ -180,6 +182,7 @@ import static com.android.server.wm.AppTransition.TRANSIT_DOCK_TASK_FROM_RECENTS public final class ActivityStackSupervisor implements DisplayListener { private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStackSupervisor" : TAG_AM; private static final String TAG_CONTAINERS = TAG + POSTFIX_CONTAINERS; private static final String TAG_FOCUS = TAG + POSTFIX_FOCUS; private static final String TAG_IDLE = TAG + POSTFIX_IDLE; private static final String TAG_LOCKTASK = TAG + POSTFIX_LOCKTASK; private static final String TAG_PAUSE = TAG + POSTFIX_PAUSE; Loading Loading @@ -613,12 +616,6 @@ public final class ActivityStackSupervisor implements DisplayListener { } final ActivityRecord r = topRunningActivityLocked(); if (!mService.mDoingSetFocusedActivity && mService.mFocusedActivity != r) { // The focus activity should always be the top activity in the focused stack. // There will be chaos and anarchy if it isn't... mService.setFocusedActivityLocked(r, reason + " setFocusStack"); } if (mService.mBooting || !mService.mBooted) { if (r != null && r.idle) { checkFinishBootingLocked(); Loading @@ -643,7 +640,7 @@ public final class ActivityStackSupervisor implements DisplayListener { if (top == null) { return false; } mService.setFocusedActivityLocked(top, reason); moveFocusableActivityStackToFrontLocked(top, reason); return true; } Loading @@ -668,7 +665,7 @@ public final class ActivityStackSupervisor implements DisplayListener { // Only resume home activity if isn't finishing. if (r != null && !r.finishing) { mService.setFocusedActivityLocked(r, myReason); moveFocusableActivityStackToFrontLocked(r, myReason); return resumeFocusedStackTopActivityLocked(mHomeStack, prev, null); } return mService.startHomeActivityLocked(mCurrentUser, myReason); Loading Loading @@ -807,7 +804,7 @@ public final class ActivityStackSupervisor implements DisplayListener { return candidateTaskId; } ActivityRecord resumedAppLocked() { ActivityRecord getResumedActivityLocked() { ActivityStack stack = mFocusedStack; if (stack == null) { return null; Loading Loading @@ -1542,20 +1539,6 @@ public final class ActivityStackSupervisor implements DisplayListener { return ACTIVITY_RESTRICTION_NONE; } boolean moveActivityStackToFront(ActivityRecord r, String reason) { if (r == null) { // Not sure what you are trying to do, but it is not going to work... return false; } final TaskRecord task = r.task; if (task == null || task.stack == null) { Slog.w(TAG, "Can't move stack to front for r=" + r + " task=" + task); return false; } task.stack.moveToFront(reason, task); return true; } void setLaunchSource(int uid) { mLaunchingActivity.setWorkSource(new WorkSource(uid)); } Loading Loading @@ -2604,6 +2587,34 @@ public final class ActivityStackSupervisor implements DisplayListener { mService.notifyActivityPinnedLocked(); } boolean moveFocusableActivityStackToFrontLocked(ActivityRecord r, String reason) { if (r == null || !r.isFocusable()) { if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "moveActivityStackToFront: unfocusable r=" + r); return false; } final TaskRecord task = r.task; if (task == null || task.stack == null) { Slog.w(TAG, "moveActivityStackToFront: invalid task or stack: r=" + r + " task=" + task); return false; } final ActivityStack stack = task.stack; if (stack == mFocusedStack && stack.topRunningActivityLocked() == r) { if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "moveActivityStackToFront: already on top, r=" + r); return false; } if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "moveActivityStackToFront: r=" + r); stack.moveToFront(reason, task); return true; } void positionTaskInStackLocked(int taskId, int stackId, int position) { final TaskRecord task = anyTaskForIdLocked(taskId); if (task == null) { Loading services/core/java/com/android/server/am/ActivityStarter.java +48 −45 File changed.Preview size limit exceeded, changes collapsed. Show changes services/core/java/com/android/server/am/EventLogTags.logtags +2 −2 Original line number Diff line number Diff line Loading @@ -90,8 +90,8 @@ option java_package com.android.server.am # Activity fully drawn time 30042 am_activity_fully_drawn_time (User|1|5),(Token|1|5),(Component Name|3),(time|2|3) # Activity focused 30043 am_focused_activity (User|1|5),(Component Name|3),(Reason|3) # Activity set to resumed 30043 am_set_resumed_activity (User|1|5),(Component Name|3),(Reason|3) # Stack focus 30044 am_focused_stack (User|1|5),(Focused Stack Id|1|5),(Last Focused Stack Id|1|5),(Reason|3) Loading Loading
services/core/java/com/android/server/am/ActivityManagerService.java +39 −86 Original line number Diff line number Diff line Loading @@ -591,14 +591,11 @@ public final class ActivityManagerService extends ActivityManagerNative } /** * Activity we have told the window manager to have key focus. * 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 mFocusedActivity = null; /** * User id of the last activity mFocusedActivity was set to. */ private int mLastFocusedUserId; private ActivityRecord mLastResumedActivity; /** * If non-null, we are tracking the time the user spends in the currently focused app. Loading Loading @@ -639,8 +636,6 @@ public final class ActivityManagerService extends ActivityManagerNative final AppErrors mAppErrors; boolean mDoingSetFocusedActivity; public boolean canShowErrorDialogs() { return mShowDialogs && !mSleeping && !mShuttingDown; } Loading Loading @@ -2952,25 +2947,13 @@ public final class ActivityManagerService extends ActivityManagerNative return mAppBindArgs; } boolean setFocusedActivityLocked(ActivityRecord r, String reason) { if (r == null || mFocusedActivity == r) { return false; } if (!r.isFocusable()) { if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "setFocusedActivityLocked: unfocusable r=" + r); return false; } if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "setFocusedActivityLocked: r=" + r); final boolean wasDoingSetFocusedActivity = mDoingSetFocusedActivity; if (wasDoingSetFocusedActivity) Slog.w(TAG, "setFocusedActivityLocked: called recursively, r=" + r + ", reason=" + reason); mDoingSetFocusedActivity = true; /** * Update AMS states when an activity is resumed. This should only be called by * {@link ActivityStack#setResumedActivityLocked} when an activity is resumed. */ void setResumedActivityUncheckLocked(ActivityRecord r, String reason) { r.state = ActivityState.RESUMED; final ActivityRecord last = mFocusedActivity; mFocusedActivity = r; if (r.task.isApplicationTask()) { if (mCurAppTimeTracker != r.appTimeTracker) { // We are switching app tracking. Complete the current one. Loading Loading @@ -2999,8 +2982,9 @@ public final class ActivityManagerService extends ActivityManagerNative } else { finishRunningVoiceLocked(); IVoiceInteractionSession session; if (last != null && ((session = last.task.voiceSession) != null || (session = last.voiceSession) != null)) { if (mLastResumedActivity != null && ((session = mLastResumedActivity.task.voiceSession) != null || (session = mLastResumedActivity.voiceSession) != 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 Loading @@ -3008,57 +2992,23 @@ public final class ActivityManagerService extends ActivityManagerNative finishVoiceTask(session); } } if (mStackSupervisor.moveActivityStackToFront(r, reason + " setFocusedActivity")) { mWindowManager.setFocusedApp(r.appToken, true); } applyUpdateLockStateLocked(r); applyUpdateVrModeLocked(r); if (mFocusedActivity.userId != mLastFocusedUserId) { if (mLastResumedActivity != null && r.userId != mLastResumedActivity.userId) { mHandler.removeMessages(FOREGROUND_PROFILE_CHANGED_MSG); mHandler.obtainMessage( FOREGROUND_PROFILE_CHANGED_MSG, mFocusedActivity.userId, 0).sendToTarget(); mLastFocusedUserId = mFocusedActivity.userId; FOREGROUND_PROFILE_CHANGED_MSG, r.userId, 0).sendToTarget(); } // Log a warning if the focused app is changed during the process. This could // indicate a problem of the focus setting logic! if (mFocusedActivity != r) Slog.w(TAG, "setFocusedActivityLocked: r=" + r + " but focused to " + mFocusedActivity); mDoingSetFocusedActivity = wasDoingSetFocusedActivity; mLastResumedActivity = r; EventLogTags.writeAmFocusedActivity( mFocusedActivity == null ? -1 : mFocusedActivity.userId, mFocusedActivity == null ? "NULL" : mFocusedActivity.shortComponentName, EventLogTags.writeAmSetResumedActivity( r == null ? -1 : r.userId, r == null ? "NULL" : r.shortComponentName, reason); return true; } final void resetFocusedActivityIfNeededLocked(ActivityRecord goingAway) { if (mFocusedActivity != goingAway) { return; } final ActivityStack focusedStack = mStackSupervisor.getFocusedStack(); if (focusedStack != null) { final ActivityRecord top = focusedStack.topActivity(); if (top != null && top.userId != mLastFocusedUserId) { mHandler.removeMessages(FOREGROUND_PROFILE_CHANGED_MSG); mHandler.sendMessage( mHandler.obtainMessage(FOREGROUND_PROFILE_CHANGED_MSG, top.userId, 0)); mLastFocusedUserId = top.userId; } } // Try to move focus to another activity if possible. if (setFocusedActivityLocked( focusedStack.topRunningActivityLocked(), "resetFocusedActivityIfNeeded")) { return; } if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "resetFocusedActivityIfNeeded: Setting focus to NULL " + "prev mFocusedActivity=" + mFocusedActivity + " goingAway=" + goingAway); mFocusedActivity = null; EventLogTags.writeAmFocusedActivity(-1, "NULL", "resetFocusedActivityIfNeeded"); } @Override Loading @@ -3073,7 +3023,7 @@ public final class ActivityManagerService extends ActivityManagerNative return; } final ActivityRecord r = stack.topRunningActivityLocked(); if (setFocusedActivityLocked(r, "setFocusedStack")) { if (mStackSupervisor.moveFocusableActivityStackToFrontLocked(r, "setFocusedStack")) { mStackSupervisor.resumeFocusedStackTopActivityLocked(); } } Loading @@ -3094,7 +3044,7 @@ public final class ActivityManagerService extends ActivityManagerNative return; } final ActivityRecord r = task.topRunningActivityLocked(); if (setFocusedActivityLocked(r, "setFocusedTask")) { if (mStackSupervisor.moveFocusableActivityStackToFrontLocked(r, "setFocusedTask")) { mStackSupervisor.resumeFocusedStackTopActivityLocked(); } } Loading Loading @@ -6722,7 +6672,7 @@ public final class ActivityManagerService extends ActivityManagerNative // Some stack visibility might change (e.g. docked stack) mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS); applyVrModeIfNeededLocked(mFocusedActivity, true); applyVrModeIfNeededLocked(mStackSupervisor.getResumedActivityLocked(), true); } } } finally { Loading Loading @@ -11585,8 +11535,9 @@ public final class ActivityManagerService extends ActivityManagerNative } void startTimeTrackingFocusedActivityLocked() { if (!mSleeping && mCurAppTimeTracker != null && mFocusedActivity != null) { mCurAppTimeTracker.start(mFocusedActivity.packageName); final ActivityRecord resumedActivity = mStackSupervisor.getResumedActivityLocked(); if (!mSleeping && mCurAppTimeTracker != null && resumedActivity != null) { mCurAppTimeTracker.start(resumedActivity.packageName); } } Loading Loading @@ -12530,7 +12481,7 @@ public final class ActivityManagerService extends ActivityManagerNative r.immersive = immersive; // update associated state if we're frontmost if (r == mFocusedActivity) { if (r == mStackSupervisor.getResumedActivityLocked()) { if (DEBUG_IMMERSIVE) Slog.d(TAG_IMMERSIVE, "Frontmost changed immersion: "+ r); applyUpdateLockStateLocked(r); } Loading Loading @@ -12641,7 +12592,7 @@ public final class ActivityManagerService extends ActivityManagerNative r.requestedVrComponent = (enabled) ? packageName : null; // Update associated state if this activity is currently focused if (r == mFocusedActivity) { if (r == mStackSupervisor.getResumedActivityLocked()) { applyUpdateVrModeLocked(r); } return 0; Loading Loading @@ -14319,8 +14270,9 @@ public final class ActivityManagerService extends ActivityManagerNative dumpPackage); boolean needSep = printedAnything; boolean printed = ActivityStackSupervisor.printThisActivity(pw, mFocusedActivity, dumpPackage, needSep, " mFocusedActivity: "); boolean printed = ActivityStackSupervisor.printThisActivity(pw, mStackSupervisor.getResumedActivityLocked(), dumpPackage, needSep, " ResumedActivity: "); if (printed) { printedAnything = true; needSep = false; Loading Loading @@ -20604,7 +20556,7 @@ public final class ActivityManagerService extends ActivityManagerNative } private final ActivityRecord resumedAppLocked() { ActivityRecord act = mStackSupervisor.resumedAppLocked(); ActivityRecord act = mStackSupervisor.getResumedActivityLocked(); String pkg; int uid; if (act != null) { Loading Loading @@ -21688,10 +21640,11 @@ public final class ActivityManagerService extends ActivityManagerNative ComponentName callingVrActivity = null; int userId = -1; synchronized (ActivityManagerService.this) { if (mFocusedActivity != null) { requestedVrService = mFocusedActivity.requestedVrComponent; callingVrActivity = mFocusedActivity.info.getComponentName(); userId = mFocusedActivity.userId; final ActivityRecord resumedActivity = mStackSupervisor.getResumedActivityLocked(); if (resumedActivity != null) { requestedVrService = resumedActivity.requestedVrComponent; callingVrActivity = resumedActivity.info.getComponentName(); userId = resumedActivity.userId; } }
services/core/java/com/android/server/am/ActivityStack.java +28 −24 Original line number Diff line number Diff line Loading @@ -895,14 +895,10 @@ final class ActivityStack { } void minimalResumeActivityLocked(ActivityRecord r) { r.state = ActivityState.RESUMED; if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to RESUMED: " + r + " (starting new instance)" + " callers=" + Debug.getCallers(5)); mResumedActivity = r; r.task.touchActiveTime(); mRecentTasks.addLocked(r.task); setResumedActivityLocked(r, "minimalResumeActivityLocked"); completeResumeLocked(r); mStackSupervisor.checkReadyForSleepLocked(); setLaunchTime(r); if (DEBUG_SAVED_STATE) Slog.i(TAG_SAVED_STATE, "Launch completed; removing icicle of " + r.icicle); Loading Loading @@ -1431,6 +1427,7 @@ final class ActivityStack { // When resuming an activity, require it to call requestVisibleBehind() again. setVisibleBehindActivity(null); } mStackSupervisor.checkReadyForSleepLocked(); } private void setVisible(ActivityRecord r, boolean visible) { Loading Loading @@ -2121,6 +2118,15 @@ final class ActivityStack { return result; } void setResumedActivityLocked(ActivityRecord r, String reason) { // TODO: move mResumedActivity to stack supervisor, // there should only be 1 global copy of resumed activity. mResumedActivity = r; mService.setResumedActivityUncheckLocked(r, reason); r.task.touchActiveTime(); mRecentTasks.addLocked(r.task); } private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) { if (DEBUG_LOCKSCREEN) mService.logLockScreen(""); Loading Loading @@ -2428,10 +2434,9 @@ final class ActivityStack { mService.updateCpuStats(); if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to RESUMED: " + next + " (in existing)"); next.state = ActivityState.RESUMED; mResumedActivity = next; next.task.touchActiveTime(); mRecentTasks.addLocked(next.task); setResumedActivityLocked(next, "resumeTopActivityInnerLocked"); mService.updateLruProcessLocked(next.app, true, null); updateLRUListLocked(next); mService.updateOomAdjLocked(); Loading Loading @@ -2504,8 +2509,6 @@ final class ActivityStack { next.app.thread.scheduleResumeActivity(next.appToken, next.app.repProcState, mService.isNextTransitionForward(), resumeAnimOptions); mStackSupervisor.checkReadyForSleepLocked(); if (DEBUG_STATES) Slog.d(TAG_STATES, "resumeTopActivityLocked: Resumed " + next); } catch (Exception e) { // Whoops, need to restart this activity! Loading Loading @@ -3173,8 +3176,8 @@ final class ActivityStack { r.addResultLocked(null, resultWho, requestCode, resultCode, data); } private void adjustFocusedActivityLocked(ActivityRecord r, String reason) { if (!mStackSupervisor.isFocusedStack(this) || mService.mFocusedActivity != r) { private void adjustFocusedActivityStackLocked(ActivityRecord r, String reason) { if (!mStackSupervisor.isFocusedStack(this) || mResumedActivity != r) { return; } Loading @@ -3183,9 +3186,7 @@ final class ActivityStack { if (next != r) { if (next != null && StackId.keepFocusInStackIfPossible(mStackId) && isFocusable()) { // For freeform, docked, and pinned stacks we always keep the focus within the // stack as long as there is a running activity in the stack that we can adjust // focus to. mService.setFocusedActivityLocked(next, myReason); // stack as long as there is a running activity. return; } else { final TaskRecord task = r.task; Loading @@ -3209,7 +3210,8 @@ final class ActivityStack { } } mService.setFocusedActivityLocked(mStackSupervisor.topRunningActivityLocked(), myReason); mStackSupervisor.moveFocusableActivityStackToFrontLocked( mStackSupervisor.topRunningActivityLocked(), myReason); } private boolean adjustFocusToNextFocusableStackLocked(int taskToReturnTo, String reason) { Loading @@ -3226,7 +3228,9 @@ final class ActivityStack { // visible, then use the task return to value to determine the home task to display next. return mStackSupervisor.moveHomeStackTaskToTop(taskToReturnTo, reason); } return mService.setFocusedActivityLocked(top, myReason); stack.moveToFront(myReason); return true; } final void stopActivityLocked(ActivityRecord r) { Loading @@ -3239,7 +3243,7 @@ final class ActivityStack { if (requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null, "stop-no-history", false)) { // Activity was finished, no need to continue trying to schedule stop. adjustFocusedActivityLocked(r, "stopActivityFinished"); adjustFocusedActivityStackLocked(r, "stopActivityFinished"); r.resumeKeyDispatchingLocked(); return; } Loading @@ -3251,7 +3255,7 @@ final class ActivityStack { } if (r.app != null && r.app.thread != null) { adjustFocusedActivityLocked(r, "stopActivity"); adjustFocusedActivityStackLocked(r, "stopActivity"); r.resumeKeyDispatchingLocked(); try { r.stopped = false; Loading Loading @@ -3478,7 +3482,7 @@ final class ActivityStack { r.pauseKeyDispatchingLocked(); adjustFocusedActivityLocked(r, "finishActivity"); adjustFocusedActivityStackLocked(r, "finishActivity"); finishActivityResultsLocked(r, resultCode, resultData); Loading Loading @@ -3739,7 +3743,6 @@ final class ActivityStack { if (mPausingActivity == r) { mPausingActivity = null; } mService.resetFocusedActivityIfNeededLocked(r); r.deferRelaunchUntilPaused = false; r.frozenBeforeDestroy = false; Loading Loading @@ -4298,7 +4301,7 @@ final class ActivityStack { // Set focus to the top running activity of this stack. ActivityRecord r = topRunningActivityLocked(); mService.setFocusedActivityLocked(r, reason); mStackSupervisor.moveFocusableActivityStackToFrontLocked(r, reason); if (DEBUG_TRANSITION) Slog.v(TAG_TRANSITION, "Prepare to front transition: task=" + tr); if (noAnimation) { Loading Loading @@ -4373,7 +4376,7 @@ final class ActivityStack { mStackSupervisor.getStack(FULLSCREEN_WORKSPACE_STACK_ID); if (fullscreenStack != null && fullscreenStack.hasVisibleBehindActivity()) { final ActivityRecord visibleBehind = fullscreenStack.getVisibleBehindActivity(); mService.setFocusedActivityLocked(visibleBehind, "moveTaskToBack"); mStackSupervisor.moveFocusableActivityStackToFrontLocked(visibleBehind, "moveTaskToBack"); mStackSupervisor.resumeFocusedStackTopActivityLocked(); return true; } Loading Loading @@ -4758,6 +4761,7 @@ final class ActivityStack { // code in resumeTopActivityInnerLocked to complete the resume might be skipped. if (!r.visible || r.stopped) { mWindowManager.setAppVisibility(r.appToken, true); setResumedActivityLocked(r, "relaunchActivityLocked"); completeResumeLocked(r); } else { r.results = null; Loading
services/core/java/com/android/server/am/ActivityStackSupervisor.java +34 −23 Original line number Diff line number Diff line Loading @@ -128,6 +128,7 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CONTAINERS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FOCUS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_IDLE; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LOCKSCREEN; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LOCKTASK; Loading @@ -140,6 +141,7 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SWITCH; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_TASKS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_VISIBLE_BEHIND; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CONTAINERS; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_FOCUS; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_IDLE; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_LOCKTASK; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_PAUSE; Loading Loading @@ -180,6 +182,7 @@ import static com.android.server.wm.AppTransition.TRANSIT_DOCK_TASK_FROM_RECENTS public final class ActivityStackSupervisor implements DisplayListener { private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStackSupervisor" : TAG_AM; private static final String TAG_CONTAINERS = TAG + POSTFIX_CONTAINERS; private static final String TAG_FOCUS = TAG + POSTFIX_FOCUS; private static final String TAG_IDLE = TAG + POSTFIX_IDLE; private static final String TAG_LOCKTASK = TAG + POSTFIX_LOCKTASK; private static final String TAG_PAUSE = TAG + POSTFIX_PAUSE; Loading Loading @@ -613,12 +616,6 @@ public final class ActivityStackSupervisor implements DisplayListener { } final ActivityRecord r = topRunningActivityLocked(); if (!mService.mDoingSetFocusedActivity && mService.mFocusedActivity != r) { // The focus activity should always be the top activity in the focused stack. // There will be chaos and anarchy if it isn't... mService.setFocusedActivityLocked(r, reason + " setFocusStack"); } if (mService.mBooting || !mService.mBooted) { if (r != null && r.idle) { checkFinishBootingLocked(); Loading @@ -643,7 +640,7 @@ public final class ActivityStackSupervisor implements DisplayListener { if (top == null) { return false; } mService.setFocusedActivityLocked(top, reason); moveFocusableActivityStackToFrontLocked(top, reason); return true; } Loading @@ -668,7 +665,7 @@ public final class ActivityStackSupervisor implements DisplayListener { // Only resume home activity if isn't finishing. if (r != null && !r.finishing) { mService.setFocusedActivityLocked(r, myReason); moveFocusableActivityStackToFrontLocked(r, myReason); return resumeFocusedStackTopActivityLocked(mHomeStack, prev, null); } return mService.startHomeActivityLocked(mCurrentUser, myReason); Loading Loading @@ -807,7 +804,7 @@ public final class ActivityStackSupervisor implements DisplayListener { return candidateTaskId; } ActivityRecord resumedAppLocked() { ActivityRecord getResumedActivityLocked() { ActivityStack stack = mFocusedStack; if (stack == null) { return null; Loading Loading @@ -1542,20 +1539,6 @@ public final class ActivityStackSupervisor implements DisplayListener { return ACTIVITY_RESTRICTION_NONE; } boolean moveActivityStackToFront(ActivityRecord r, String reason) { if (r == null) { // Not sure what you are trying to do, but it is not going to work... return false; } final TaskRecord task = r.task; if (task == null || task.stack == null) { Slog.w(TAG, "Can't move stack to front for r=" + r + " task=" + task); return false; } task.stack.moveToFront(reason, task); return true; } void setLaunchSource(int uid) { mLaunchingActivity.setWorkSource(new WorkSource(uid)); } Loading Loading @@ -2604,6 +2587,34 @@ public final class ActivityStackSupervisor implements DisplayListener { mService.notifyActivityPinnedLocked(); } boolean moveFocusableActivityStackToFrontLocked(ActivityRecord r, String reason) { if (r == null || !r.isFocusable()) { if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "moveActivityStackToFront: unfocusable r=" + r); return false; } final TaskRecord task = r.task; if (task == null || task.stack == null) { Slog.w(TAG, "moveActivityStackToFront: invalid task or stack: r=" + r + " task=" + task); return false; } final ActivityStack stack = task.stack; if (stack == mFocusedStack && stack.topRunningActivityLocked() == r) { if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "moveActivityStackToFront: already on top, r=" + r); return false; } if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "moveActivityStackToFront: r=" + r); stack.moveToFront(reason, task); return true; } void positionTaskInStackLocked(int taskId, int stackId, int position) { final TaskRecord task = anyTaskForIdLocked(taskId); if (task == null) { Loading
services/core/java/com/android/server/am/ActivityStarter.java +48 −45 File changed.Preview size limit exceeded, changes collapsed. Show changes
services/core/java/com/android/server/am/EventLogTags.logtags +2 −2 Original line number Diff line number Diff line Loading @@ -90,8 +90,8 @@ option java_package com.android.server.am # Activity fully drawn time 30042 am_activity_fully_drawn_time (User|1|5),(Token|1|5),(Component Name|3),(time|2|3) # Activity focused 30043 am_focused_activity (User|1|5),(Component Name|3),(Reason|3) # Activity set to resumed 30043 am_set_resumed_activity (User|1|5),(Component Name|3),(Reason|3) # Stack focus 30044 am_focused_stack (User|1|5),(Focused Stack Id|1|5),(Last Focused Stack Id|1|5),(Reason|3) Loading