diff options
| author | 2016-02-04 16:38:33 -0800 | |
|---|---|---|
| committer | 2016-02-04 16:57:52 -0800 | |
| commit | 3aa28b28fdc33c08d75fe7c75e77a1b4c32b89ba (patch) | |
| tree | f59ec1d7af45054ea44a0f73215c77e82ca5c00f | |
| parent | 3bc8dd8eddc103a32a66a9cf3aa411f1f0615f2d (diff) | |
Do not recursively call setFocusedActivityLocked()
This could potentially cause AM to set focus back to the top running,
and lead to inconsistent focus in AM and WM.
Also add some warnings to watch out for such cases.
bug: 26819496
Change-Id: Ie3fceeddedec4f2103a427989c9543cb3e9ff8f2
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 14 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityStackSupervisor.java | 2 |
2 files changed, 15 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 54c4ced18e47..e8c1a0f0e8b2 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -600,6 +600,8 @@ public final class ActivityManagerService extends ActivityManagerNative final AppErrors mAppErrors; + boolean mDoingSetFocusedActivity; + public boolean canShowErrorDialogs() { return mShowDialogs && !mSleeping && !mShuttingDown; } @@ -2730,6 +2732,12 @@ public final class ActivityManagerService extends ActivityManagerNative } 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; + final ActivityRecord last = mFocusedActivity; mFocusedActivity = r; if (r.task.isApplicationTask()) { @@ -2781,6 +2789,12 @@ public final class ActivityManagerService extends ActivityManagerNative mLastFocusedUserId = mFocusedActivity.userId; } + // 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; + EventLogTags.writeAmFocusedActivity( mFocusedActivity == null ? -1 : mFocusedActivity.userId, mFocusedActivity == null ? "NULL" : mFocusedActivity.shortComponentName, diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 95bc95a8767a..e5ca1bfbaa9f 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -583,7 +583,7 @@ public final class ActivityStackSupervisor implements DisplayListener { } final ActivityRecord r = topRunningActivityLocked(); - if (mService.mFocusedActivity != r) { + 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"); |