Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3aa28b28 authored by Chong Zhang's avatar Chong Zhang
Browse files

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
parent 3bc8dd8e
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -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,
+1 −1
Original line number Diff line number Diff line
@@ -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");