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

Commit 61331cea authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Fix pulse wake-up transition

ScrimController was transitioning to the wrong state because
fingerprint would take the device to a dozing but not pulsing
state before unlocking. And since I was already touching this
area, I used the oportunity to remove ScrimController references
from DozeScrimController.

Change-Id: Iaa1274eedc9cfb808a71b49a9184de39009e981c
Fixes: 115305153
Test: Manually unlock with fp while pulsing
Test: Unlock with fp
Test: Unlock with bouncer
Test: Wait for pulse to go away
Test: atest DozeScrimControllerTest
parent 9b74c075
Loading
Loading
Loading
Loading
+6 −14
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
package com.android.systemui.statusbar.phone;

import android.annotation.NonNull;
import android.content.Context;
import android.os.Handler;
import android.util.Log;

@@ -33,7 +32,6 @@ public class DozeScrimController {

    private final DozeParameters mDozeParameters;
    private final Handler mHandler = new Handler();
    private final ScrimController mScrimController;

    private boolean mDozing;
    private DozeHost.PulseCallback mPulseCallback;
@@ -83,9 +81,7 @@ public class DozeScrimController {
        }
    };

    public DozeScrimController(ScrimController scrimController, Context context,
            DozeParameters dozeParameters) {
        mScrimController = scrimController;
    public DozeScrimController(DozeParameters dozeParameters) {
        mDozeParameters = dozeParameters;
    }

@@ -117,8 +113,6 @@ public class DozeScrimController {
        // be invoked when we're done so that the caller can drop the pulse wakelock.
        mPulseCallback = callback;
        mPulseReason = reason;

        mScrimController.transitionTo(ScrimState.PULSING, mScrimCallback);
    }

    public void pulseOutNow() {
@@ -180,13 +174,11 @@ public class DozeScrimController {
            mHandler.removeCallbacks(mPulseOutExtended);
            if (DEBUG) Log.d(TAG, "Pulse out, mDozing=" + mDozing);
            if (!mDozing) return;
            mScrimController.transitionTo(ScrimState.AOD,
                    new ScrimController.Callback() {
                        @Override
                        public void onDisplayBlanked() {
            pulseFinished();
        }
                    });
        }
    };

    public ScrimController.Callback getScrimCallback() {
        return mScrimCallback;
    }
}
 No newline at end of file
+9 −6
Original line number Diff line number Diff line
@@ -882,8 +882,7 @@ public class StatusBar extends SystemUI implements DemoMode,
                mContext.getSystemService(AlarmManager.class));
        mNotificationPanel.initDependencies(this, mGroupManager, mNotificationShelf,
                mHeadsUpManager, mNotificationIconAreaController, mScrimController);
        mDozeScrimController = new DozeScrimController(mScrimController, context,
                DozeParameters.getInstance(context));
        mDozeScrimController = new DozeScrimController(DozeParameters.getInstance(context));

        mBackdrop = mStatusBarWindow.findViewById(R.id.backdrop);
        mBackdropFront = mBackdrop.findViewById(R.id.backdrop_front);
@@ -1519,7 +1518,7 @@ public class StatusBar extends SystemUI implements DemoMode,
    }

    public boolean isPulsing() {
        return mDozeScrimController != null && mDozeScrimController.isPulsing();
        return mAmbientPulseManager.hasNotifications();
    }

    public boolean isLaunchTransitionFadingAway() {
@@ -3648,7 +3647,6 @@ public class StatusBar extends SystemUI implements DemoMode,
            mNotificationPanel.setTouchAndAnimationDisabled(false);
            updateVisibleToUser();
            updateIsKeyguard();
            updateScrimController();
        }
    };

@@ -3834,8 +3832,9 @@ public class StatusBar extends SystemUI implements DemoMode,
        } else if (mBrightnessMirrorVisible) {
            mScrimController.transitionTo(ScrimState.BRIGHTNESS_MIRROR);
        } else if (isPulsing()) {
            // Handled in DozeScrimController#setPulsing
        } else if (mDozing) {
            mScrimController.transitionTo(ScrimState.PULSING,
                    mDozeScrimController.getScrimCallback());
        } else if (mDozing && !wakeAndUnlocking) {
            mScrimController.transitionTo(ScrimState.AOD);
        } else if (mIsKeyguard && !wakeAndUnlocking) {
            mScrimController.transitionTo(mNotificationPanel.isSemiAwake()
@@ -3928,8 +3927,12 @@ public class StatusBar extends SystemUI implements DemoMode,
                    mNotificationPanel.setPulsing(pulsing);
                    mVisualStabilityManager.setPulsing(pulsing);
                    mIgnoreTouchWhilePulsing = false;
                    updateScrimController();
                }
            }, reason);
            // DozeScrimController is in pulse state, now let's ask ScrimController to start
            // pulsing and draw the black frame, if necessary.
            updateScrimController();
        }

        @Override
+6 −25
Original line number Diff line number Diff line
@@ -16,14 +16,10 @@

package com.android.systemui.statusbar.phone;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;

import android.os.Debug;
import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
@@ -42,8 +38,6 @@ import org.mockito.MockitoAnnotations;
@SmallTest
public class DozeScrimControllerTest extends SysuiTestCase {

    @Mock
    private ScrimController mScrimController;
    @Mock
    private DozeParameters mDozeParameters;
    private DozeScrimController mDozeScrimController;
@@ -51,33 +45,20 @@ public class DozeScrimControllerTest extends SysuiTestCase {
    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        // Make sure callbacks will be invoked to complete the lifecycle.
        doAnswer(invocationOnMock -> {
            ScrimController.Callback callback = invocationOnMock.getArgument(1);
            callback.onStart();
            callback.onDisplayBlanked();
            callback.onFinished();
            return null;
        }).when(mScrimController).transitionTo(any(ScrimState.class),
                any(ScrimController.Callback.class));

        mDozeScrimController = new DozeScrimController(mScrimController, getContext(),
                mDozeParameters);
        mDozeScrimController = new DozeScrimController(mDozeParameters);
        mDozeScrimController.setDozing(true);
    }

    @Test
    public void changesScrimControllerState() {
        mDozeScrimController.pulse(mock(DozeHost.PulseCallback.class), 0);
        verify(mScrimController).transitionTo(eq(ScrimState.PULSING),
                any(ScrimController.Callback.class));
    }

    @Test
    public void callsPulseCallback() {
        DozeHost.PulseCallback callback = mock(DozeHost.PulseCallback.class);
        mDozeScrimController.pulse(callback, 0);

        // Manually simulate a scrim lifecycle
        mDozeScrimController.getScrimCallback().onStart();
        mDozeScrimController.getScrimCallback().onDisplayBlanked();
        mDozeScrimController.getScrimCallback().onFinished();

        verify(callback).onPulseStarted();
        mDozeScrimController.pulseOutNow();
        verify(callback).onPulseFinished();