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

Commit c3728f6f authored by wilsonshih's avatar wilsonshih
Browse files

Fixes the invisible unknownApps blocking keyguard transition.

An activity can be added into unknownAppVisibility controller if it
does not declared as noDisplay and it was started before keyguard
unlocked.
If that activity start another activity and finish itself immediately,
the app transition controller will stuck in the status because
unknownApp is not resolved.

And before the keyguard transition been executed, if anything trigger
to prepare new app transition, we will reset the 5 seconds timeout
even if the keyguard transition didn't been overwrite, which extends
original timeout.

To fix this issue, we should remove the activity from unknown apps
once it must become invisible.
Also we don't need to reset app transition timeout if
prepareAppTransition doesn't apply new transition.

Fixes: 161499433
Test: atest AppTransitionTests KeyguardTransitionTests
KeyguardLockedTests UnknownAppVisibilityControllerTest

Change-Id: Ia9aed128fa44f3677e8a420aa9e81aac983bf9a2
parent 7a6667d6
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -4114,6 +4114,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
            // Now that the app is going invisible, we can remove it. It will be restarted
            // if made visible again.
            removeDeadWindows();
            // If this activity is about to finish/stopped and now becomes invisible, remove it
            // from the unknownApp list in case the activity does not want to draw anything, which
            // keep the user waiting for the next transition to start.
            if (finishing || isState(STOPPED)) {
                displayContent.mUnknownAppVisibilityController.appRemovedOrHidden(this);
            }
        } else {
            if (!appTransition.isTransitionSet()
                    && appTransition.isReady()) {
+6 −6
Original line number Diff line number Diff line
@@ -337,6 +337,11 @@ public class AppTransition implements Dump {
        mNextAppTransitionFlags |= flags;
        setLastAppTransition(TRANSIT_UNSET, null, null, null);
        updateBooster();
        if (isTransitionSet()) {
            removeAppTransitionTimeoutCallbacks();
            mHandler.postDelayed(mHandleAppTransitionTimeoutRunnable,
                    APP_TRANSITION_TIMEOUT_MS);
        }
    }

    void setLastAppTransition(int transit, ActivityRecord openingApp, ActivityRecord closingApp,
@@ -2229,12 +2234,7 @@ public class AppTransition implements Dump {
                setAppTransition(transit, flags);
            }
        }
        boolean prepared = prepare();
        if (isTransitionSet()) {
            removeAppTransitionTimeoutCallbacks();
            mHandler.postDelayed(mHandleAppTransitionTimeoutRunnable, APP_TRANSITION_TIMEOUT_MS);
        }
        return prepared;
        return prepare();
    }

    /**
+10 −0
Original line number Diff line number Diff line
@@ -78,6 +78,16 @@ public class UnknownAppVisibilityControllerTest extends WindowTestsBase {
        assertTrue(mDisplayContent.mUnknownAppVisibilityController.allResolved());
    }

    @Test
    public void testRemoveFinishingInvisibleActivityFromUnknown() {
        final ActivityRecord activity = WindowTestUtils.createTestActivityRecord(mDisplayContent);
        mDisplayContent.mUnknownAppVisibilityController.notifyLaunched(activity);
        activity.finishing = true;
        activity.mVisibleRequested = true;
        activity.setVisibility(false, false);
        assertTrue(mDisplayContent.mUnknownAppVisibilityController.allResolved());
    }

    @Test
    public void testAppRemoved() {
        final ActivityRecord activity = WindowTestUtils.createTestActivityRecord(mDisplayContent);