summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chong Zhang <chz@google.com> 2016-02-04 16:38:33 -0800
committer Chong Zhang <chz@google.com> 2016-02-04 16:57:52 -0800
commit3aa28b28fdc33c08d75fe7c75e77a1b4c32b89ba (patch)
treef59ec1d7af45054ea44a0f73215c77e82ca5c00f
parent3bc8dd8eddc103a32a66a9cf3aa411f1f0615f2d (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.java14
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java2
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");