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
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
index 25db4f2..a0597dc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
@@ -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 @@
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 DozeScrimController(ScrimController scrimController, Context context,
- DozeParameters dozeParameters) {
- mScrimController = scrimController;
+ public DozeScrimController(DozeParameters dozeParameters) {
mDozeParameters = dozeParameters;
}
@@ -117,8 +113,6 @@
// 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 @@
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();
- }
- });
+ pulseFinished();
}
};
+
+ public ScrimController.Callback getScrimCallback() {
+ return mScrimCallback;
+ }
}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 2b661ab..201d6d0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -882,8 +882,7 @@
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 boolean isPulsing() {
- return mDozeScrimController != null && mDozeScrimController.isPulsing();
+ return mAmbientPulseManager.hasNotifications();
}
public boolean isLaunchTransitionFadingAway() {
@@ -3648,7 +3647,6 @@
mNotificationPanel.setTouchAndAnimationDisabled(false);
updateVisibleToUser();
updateIsKeyguard();
- updateScrimController();
}
};
@@ -3834,8 +3832,9 @@
} 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 @@
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
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeScrimControllerTest.java
index 203ebe6..fe36b6d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeScrimControllerTest.java
@@ -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;
@@ -43,41 +39,26 @@
public class DozeScrimControllerTest extends SysuiTestCase {
@Mock
- private ScrimController mScrimController;
- @Mock
private DozeParameters mDozeParameters;
private DozeScrimController mDozeScrimController;
@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();