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();