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

Commit f8d77da9 authored by Jorim Jaggi's avatar Jorim Jaggi
Browse files

Improve lockscreen launch animations

- Add a timeout so if WindowManager "forgets" to tell that the
activity has drawn, we still unlock after 3 seconds, so the user
is not completely stuck.

- Use the screen height instead of the window height for the
translation animation.

- Don't run the animation if the attached window is not null. The
animation from the attached window will influence the transformation
as well, so there is no need to run an additional animation in this
case (apps with SurfaceView's had broken unlock transitions because
of this).

- If the starting window needs to go away while the unlock transition
is running, modify the existing animation such that it fades out in
the same transition.

Bug: 15991916
Change-Id: Ia5dfa31e1bc0d5745fe228e1daf08e268733b6f1
parent d6f440e0
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -18,8 +18,11 @@
*/
-->

<set xmlns:android="http://schemas.android.com/apk/res/android"
        android:detachWallpaper="true" android:interpolator="@interpolator/decelerate_quad">
	<alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="160" />
</set>
<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:detachWallpaper="true"
    android:interpolator="@interpolator/decelerate_quad"
    android:fromAlpha="1.0"
    android:toAlpha="0.0"
    android:duration="160" />
+1 −1
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@
        android:shareInterpolator="false"
        android:startOffset="100">

    <translate android:fromYDelta="110%" android:toYDelta="0"
    <translate android:fromYDelta="110%p" android:toYDelta="0"
            android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
            android:interpolator="@interpolator/decelerate_quint"
            android:duration="300" />
+1 −1
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@
        android:interpolator="@interpolator/decelerate_quint"
        android:duration="400"/>

    <translate android:fromYDelta="11%" android:toYDelta="0"
    <translate android:fromYDelta="11%p" android:toYDelta="0"
        android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
        android:interpolator="@interpolator/decelerate_quint"
        android:duration="300" />
+18 −5
Original line number Diff line number Diff line
@@ -113,6 +113,8 @@ import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
 */
public class KeyguardViewMediator extends SystemUI {
    private static final int KEYGUARD_DISPLAY_TIMEOUT_DELAY_DEFAULT = 30000;
    private static final long KEYGUARD_DONE_PENDING_TIMEOUT_MS = 3000;

    final static boolean DEBUG = false;
    private final static boolean DBG_WAKE = false;

@@ -136,6 +138,7 @@ public class KeyguardViewMediator extends SystemUI {
    private static final int DISMISS = 17;
    private static final int START_KEYGUARD_EXIT_ANIM = 18;
    private static final int ON_ACTIVITY_DRAWN = 19;
    private static final int KEYGUARD_DONE_PENDING_TIMEOUT = 20;

    /**
     * The default amount of time we stay awake (used for all key input)
@@ -294,7 +297,7 @@ public class KeyguardViewMediator extends SystemUI {
            // ActivityManagerService) will not reconstruct the keyguard if it is already showing.
            synchronized (KeyguardViewMediator.this) {
                mSwitchingUser = true;
                mKeyguardDonePending = false;
                resetKeyguardDonePendingLocked();
                resetStateLocked();
                adjustStatusBarLocked();
                // When we switch users we want to bring the new user to the biometric unlock even
@@ -450,6 +453,8 @@ public class KeyguardViewMediator extends SystemUI {
            mKeyguardDonePending = true;
            mHideAnimationRun = true;
            mStatusBarKeyguardViewManager.startPreHideAnimation(null /* finishRunnable */);
            mHandler.sendEmptyMessageDelayed(KEYGUARD_DONE_PENDING_TIMEOUT,
                    KEYGUARD_DONE_PENDING_TIMEOUT_MS);
        }

        @Override
@@ -584,7 +589,7 @@ public class KeyguardViewMediator extends SystemUI {
            mScreenOn = false;
            if (DEBUG) Log.d(TAG, "onScreenTurnedOff(" + why + ")");

            mKeyguardDonePending = false;
            resetKeyguardDonePendingLocked();
            mHideAnimationRun = false;

            // Lock immediately based on setting if secure (user has a pin/pattern/password).
@@ -1108,6 +1113,9 @@ public class KeyguardViewMediator extends SystemUI {
                    StartKeyguardExitAnimParams params = (StartKeyguardExitAnimParams) msg.obj;
                    handleStartKeyguardExitAnimation(params.startTime, params.fadeoutDuration);
                    break;
                case KEYGUARD_DONE_PENDING_TIMEOUT:
                    Log.w(TAG, "Timeout while waiting for activity drawn!");
                    // Fall through.
                case ON_ACTIVITY_DRAWN:
                    handleOnActivityDrawn();
                    break;
@@ -1122,7 +1130,7 @@ public class KeyguardViewMediator extends SystemUI {
    private void handleKeyguardDone(boolean authenticated, boolean wakeup) {
        if (DEBUG) Log.d(TAG, "handleKeyguardDone");
        synchronized (this) {
            mKeyguardDonePending = false;
            resetKeyguardDonePendingLocked();
        }

        if (authenticated) {
@@ -1242,7 +1250,7 @@ public class KeyguardViewMediator extends SystemUI {
            mStatusBarKeyguardViewManager.show(options);
            mHiding = false;
            mShowing = true;
            mKeyguardDonePending = false;
            resetKeyguardDonePendingLocked();
            mHideAnimationRun = false;
            updateActivityLockScreenState();
            adjustStatusBarLocked();
@@ -1321,7 +1329,7 @@ public class KeyguardViewMediator extends SystemUI {

            mStatusBarKeyguardViewManager.hide(startTime, fadeoutDuration);
            mShowing = false;
            mKeyguardDonePending = false;
            resetKeyguardDonePendingLocked();
            mHideAnimationRun = false;
            updateActivityLockScreenState();
            adjustStatusBarLocked();
@@ -1417,6 +1425,11 @@ public class KeyguardViewMediator extends SystemUI {
                && mSearchManager.getAssistIntent(mContext, false, UserHandle.USER_CURRENT) != null;
    }

    private void resetKeyguardDonePendingLocked() {
        mKeyguardDonePending = false;
        mHandler.removeMessages(KEYGUARD_DONE_PENDING_TIMEOUT);
    }

    public void onBootCompleted() {
        mUpdateMonitor.dispatchBootCompleted();
        synchronized (this) {
+4 −2
Original line number Diff line number Diff line
@@ -349,7 +349,8 @@ public class WindowAnimator {
                    } else {
                        boolean applyExistingExitAnimation = mPostKeyguardExitAnimation != null
                                && !winAnimator.mKeyguardGoingAwayAnimation
                                && win.hasDrawnLw();
                                && win.hasDrawnLw()
                                && win.mAttachedWindow == null;

                        // If the window is already showing and we don't need to apply an existing
                        // Keyguard exit animation, skip.
@@ -364,7 +365,8 @@ public class WindowAnimator {
                        }
                        if (DEBUG_KEYGUARD || WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
                                "Now policy shown: " + win);
                        if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0) {
                        if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
                                && win.mAttachedWindow == null) {
                            if (unForceHiding == null) {
                                unForceHiding = new ArrayList<>();
                            }
Loading