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

Commit 703719be authored by Winson Chung's avatar Winson Chung
Browse files

Workaround to ensure we cancel the recents animation prior to starting home



- It is possible for the call from SystemUI to cancel the recents animation
  to be processed and handled after the virtual key has been processed in
  PhoneWindowManager. This causes a misordering in which the canceling of
  the Recents animation clears the pending start activity remote animation
  (which is waiting for app transition ready).

  Instead, move the canceling of the Recents animation to PhoneWindowManager
  where the nav button is handled, to ensure that we cancel the animation
  on the same thread before we start the activity.

Bug: 73188263
Test: Only able to reproduce so far artificially, which points to this
      misordering

Change-Id: I1f3477acdf988953a5b3cef2e3b2b402af2d9909
Signed-off-by: default avatarWinson Chung <winsonc@google.com>
parent df173b59
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -376,6 +376,11 @@ public abstract class ActivityManagerInternal {
     */
    public abstract boolean isRecentsComponentHomeActivity(int userId);

    /**
     * Cancels any currently running recents animation.
     */
    public abstract void cancelRecentsAnimation(boolean restoreHomeStackPosition);

    /**
     * Whether an UID is active or idle.
     */
+0 −7
Original line number Diff line number Diff line
@@ -269,13 +269,6 @@ public class KeyButtonView extends ImageView implements ButtonInterface {
                }
                if (mCode != 0) {
                    if (doIt) {
                        // If there was a pending remote recents animation, then we need to
                        // cancel the animation now before we handle the button itself. In the case
                        // where we are going home and the recents animation has already started,
                        // just cancel the recents animation, leaving the home stack in place
                        boolean isHomeKey = mCode == KEYCODE_HOME;
                        ActivityManagerWrapper.getInstance().cancelRecentsAnimation(!isHomeKey);

                        sendEvent(KeyEvent.ACTION_UP, 0);
                        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
                    } else {
+5 −0
Original line number Diff line number Diff line
@@ -26628,6 +26628,11 @@ public class ActivityManagerService extends IActivityManager.Stub
            return getRecentTasks().isRecentsComponentHomeActivity(userId);
        }
        @Override
        public void cancelRecentsAnimation(boolean restoreHomeStackPosition) {
            ActivityManagerService.this.cancelRecentsAnimation(restoreHomeStackPosition);
        }
        @Override
        public boolean isUidActive(int uid) {
            synchronized (ActivityManagerService.this) {
+8 −0
Original line number Diff line number Diff line
@@ -6091,6 +6091,14 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                && (!isNavBarVirtKey || mNavBarVirtualKeyHapticFeedbackEnabled)
                && event.getRepeatCount() == 0;

        // Cancel any pending remote recents animations before handling the button itself. In the
        // case where we are going home and the recents animation has already started, just cancel
        // the recents animation, leaving the home stack in place for the pending start activity
        if (isNavBarVirtKey && !down) {
            boolean isHomeKey = keyCode == KeyEvent.KEYCODE_HOME;
            mActivityManagerInternal.cancelRecentsAnimation(!isHomeKey);
        }

        // Handle special keys.
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK: {
+1 −1
Original line number Diff line number Diff line
@@ -369,7 +369,7 @@ public class RecentsAnimationController implements DeathRecipient {
    }

    void cancelAnimation(@ReorderMode int reorderMode, String reason) {
        if (DEBUG_RECENTS_ANIMATIONS) Slog.d(TAG, "cancelAnimation()");
        if (DEBUG_RECENTS_ANIMATIONS) Slog.d(TAG, "cancelAnimation(): reason=" + reason);
        synchronized (mService.getWindowManagerLock()) {
            if (mCanceled) {
                // We've already canceled the animation
Loading