Merge changes Ia438f4a2,I356c2d57 into pi-dev

* changes:
  Bouncer notification and QS scrim
  Fix bouncer not showing on top of QS or notif
diff --git a/packages/SystemUI/src/com/android/systemui/DejankUtils.java b/packages/SystemUI/src/com/android/systemui/DejankUtils.java
index eba1d0f..4ee3bd3 100644
--- a/packages/SystemUI/src/com/android/systemui/DejankUtils.java
+++ b/packages/SystemUI/src/com/android/systemui/DejankUtils.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.systemui.util.Assert;
 
 import android.os.Handler;
@@ -30,9 +31,13 @@
 
     private static final Choreographer sChoreographer = Choreographer.getInstance();
     private static final Handler sHandler = new Handler();
-
     private static final ArrayList<Runnable> sPendingRunnables = new ArrayList<>();
 
+    /**
+     * Only for testing.
+     */
+    private static boolean sImmediate;
+
     private static final Runnable sAnimationCallbackRunnable = new Runnable() {
         @Override
         public void run() {
@@ -51,6 +56,10 @@
      * <p>Needs to be called from the main thread.
      */
     public static void postAfterTraversal(Runnable r) {
+        if (sImmediate) {
+            r.run();
+            return;
+        }
         Assert.isMainThread();
         sPendingRunnables.add(r);
         postAnimationCallback();
@@ -71,4 +80,9 @@
         sChoreographer.postCallback(Choreographer.CALLBACK_ANIMATION, sAnimationCallbackRunnable,
                 null);
     }
+
+    @VisibleForTesting
+    public static void setImmediate(boolean immediate) {
+        sImmediate = immediate;
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
index d1834e9..91edfda 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
@@ -27,6 +27,7 @@
 import com.android.internal.widget.LockPatternUtils;
 import com.android.keyguard.ViewMediatorCallback;
 import com.android.systemui.Dependency.DependencyProvider;
+import com.android.systemui.classifier.FalsingManager;
 import com.android.systemui.keyguard.DismissCallbackRegistry;
 import com.android.systemui.qs.QSTileHost;
 import com.android.systemui.statusbar.KeyguardIndicationController;
@@ -95,7 +96,7 @@
             LockPatternUtils lockPatternUtils,
             ViewGroup container, DismissCallbackRegistry dismissCallbackRegistry) {
         return new KeyguardBouncer(context, callback, lockPatternUtils, container,
-                dismissCallbackRegistry);
+                dismissCallbackRegistry, FalsingManager.getInstance(context));
     }
 
     public ScrimController createScrimController(LightBarController lightBarController,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
index 010b165..2a1813f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
@@ -16,10 +16,14 @@
 
 package com.android.systemui.statusbar.phone;
 
+import static com.android.keyguard.KeyguardHostView.OnDismissAction;
+import static com.android.keyguard.KeyguardSecurityModel.SecurityMode;
+
 import android.content.Context;
 import android.os.Handler;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.util.Log;
 import android.util.MathUtils;
 import android.util.Slog;
 import android.util.StatsLog;
@@ -29,7 +33,6 @@
 import android.view.ViewGroup;
 import android.view.ViewTreeObserver;
 import android.view.WindowInsets;
-import android.view.accessibility.AccessibilityEvent;
 
 import com.android.internal.widget.LockPatternUtils;
 import com.android.keyguard.KeyguardHostView;
@@ -42,9 +45,6 @@
 import com.android.systemui.classifier.FalsingManager;
 import com.android.systemui.keyguard.DismissCallbackRegistry;
 
-import static com.android.keyguard.KeyguardHostView.OnDismissAction;
-import static com.android.keyguard.KeyguardSecurityModel.SecurityMode;
-
 /**
  * A class which manages the bouncer on the lockscreen.
  */
@@ -76,13 +76,13 @@
 
     public KeyguardBouncer(Context context, ViewMediatorCallback callback,
             LockPatternUtils lockPatternUtils, ViewGroup container,
-            DismissCallbackRegistry dismissCallbackRegistry) {
+            DismissCallbackRegistry dismissCallbackRegistry, FalsingManager falsingManager) {
         mContext = context;
         mCallback = callback;
         mLockPatternUtils = lockPatternUtils;
         mContainer = container;
         KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback);
-        mFalsingManager = FalsingManager.getInstance(mContext);
+        mFalsingManager = falsingManager;
         mDismissCallbackRegistry = dismissCallbackRegistry;
         mHandler = new Handler();
     }
@@ -91,7 +91,14 @@
         show(resetSecuritySelection, true /* notifyFalsing */);
     }
 
-    public void show(boolean resetSecuritySelection, boolean notifyFalsing) {
+    /**
+     * Shows the bouncer.
+     *
+     * @param resetSecuritySelection Cleans keyguard view
+     * @param animated true when the bouncer show show animated, false when the user will be
+     *                 dragging it and animation should be deferred.
+     */
+    public void show(boolean resetSecuritySelection, boolean animated) {
         final int keyguardUserId = KeyguardUpdateMonitor.getCurrentUser();
         if (keyguardUserId == UserHandle.USER_SYSTEM && UserManager.isSplitSystemUser()) {
             // In split system user mode, we never unlock system user.
@@ -104,9 +111,11 @@
         // are valid.
         // Later, at the end of the animation, when the bouncer is at the top of the screen,
         // onFullyShown() will be called and FalsingManager will stop recording touches.
-        if (notifyFalsing) {
+        if (animated) {
             mFalsingManager.onBouncerShown();
+            setExpansion(0);
         }
+
         if (resetSecuritySelection) {
             // showPrimarySecurityScreen() updates the current security method. This is needed in
             // case we are already showing and the current security method changed.
@@ -157,7 +166,9 @@
     public void onFullyHidden() {
         if (!mShowingSoon) {
             cancelShowRunnable();
-            mRoot.setVisibility(View.INVISIBLE);
+            if (mRoot != null) {
+                mRoot.setVisibility(View.INVISIBLE);
+            }
             mFalsingManager.onBouncerHidden();
         }
     }
@@ -202,11 +213,19 @@
      *               and {@link KeyguardSecurityView#PROMPT_REASON_RESTART}
      */
     public void showPromptReason(int reason) {
-        mKeyguardView.showPromptReason(reason);
+        if (mKeyguardView != null) {
+            mKeyguardView.showPromptReason(reason);
+        } else {
+            Log.w(TAG, "Trying to show prompt reason on empty bouncer");
+        }
     }
 
     public void showMessage(String message, int color) {
-        mKeyguardView.showMessage(message, color);
+        if (mKeyguardView != null) {
+            mKeyguardView.showMessage(message, color);
+        } else {
+            Log.w(TAG, "Trying to show message on empty bouncer");
+        }
     }
 
     private void cancelShowRunnable() {
@@ -290,7 +309,8 @@
      */
     public void setExpansion(float fraction) {
         if (mKeyguardView != null) {
-            mKeyguardView.setAlpha(MathUtils.map(ALPHA_EXPANSION_THRESHOLD, 1, 1, 0, fraction));
+            float alpha = MathUtils.map(ALPHA_EXPANSION_THRESHOLD, 1, 1, 0, fraction);
+            mKeyguardView.setAlpha(MathUtils.constrain(alpha, 0f, 1f));
             mKeyguardView.setTranslationY(fraction * mKeyguardView.getHeight());
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index 7f1e9d0..04cb620 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -947,6 +947,17 @@
         return mClosing || mLaunchingNotification;
     }
 
+    /**
+     * Bouncer might need a scrim when you double tap on notifications or edit QS.
+     * On other cases, when you drag up the bouncer with the finger or just fling,
+     * the scrim should be hidden to avoid occluding the clock.
+     *
+     * @return true when we need a scrim to show content on top of the notification panel.
+     */
+    public boolean needsScrimming() {
+        return !isTracking() && !isCollapsing() && !isFullyCollapsed();
+    }
+
     public boolean isTracking() {
         return mTracking;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index f8b4e07..a09b84f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -449,7 +449,7 @@
         if (mNeedsDrawableColorUpdate) {
             mNeedsDrawableColorUpdate = false;
             final GradientColors currentScrimColors;
-            if (mState == ScrimState.KEYGUARD || mState == ScrimState.BOUNCER_OCCLUDED
+            if (mState == ScrimState.KEYGUARD || mState == ScrimState.BOUNCER_SCRIMMED
                     || mState == ScrimState.BOUNCER) {
                 // Always animate color changes if we're seeing the keyguard
                 mScrimInFront.setColors(mLockColors, true /* animated */);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
index 58100ef..a14d056 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
@@ -79,7 +79,7 @@
     /**
      * Showing password challenge on top of a FLAG_SHOW_WHEN_LOCKED activity.
      */
-    BOUNCER_OCCLUDED(2) {
+    BOUNCER_SCRIMMED(2) {
         @Override
         public void prepare(ScrimState previousState) {
             mCurrentBehindAlpha = 0;
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 2e45b12..120122f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -3907,12 +3907,12 @@
 
     private void showBouncerIfKeyguard() {
         if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) {
-            showBouncer();
+            showBouncer(true /* animated */);
         }
     }
 
-    protected void showBouncer() {
-        mStatusBarKeyguardViewManager.dismiss();
+    protected void showBouncer(boolean animated) {
+        mStatusBarKeyguardViewManager.showBouncer(animated);
     }
 
     private void instantExpandNotificationsPanel() {
@@ -4026,7 +4026,7 @@
     public void onTrackingStopped(boolean expand) {
         if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) {
             if (!expand && !mUnlockMethodCache.canSkipBouncer()) {
-                showBouncerIfKeyguard();
+                showBouncer(false /* animated */);
             }
         }
     }
@@ -4165,7 +4165,7 @@
     @Override
     public void onLockedRemoteInput(ExpandableNotificationRow row, View clicked) {
         mLeaveOpenOnKeyguardHide = true;
-        showBouncer();
+        showBouncer(true /* animated */);
         mPendingRemoteInputView = clicked;
     }
 
@@ -4631,9 +4631,10 @@
                 != FingerprintUnlockController.MODE_UNLOCK);
 
         if (mBouncerShowing) {
-            final boolean qsExpanded = mQSPanel != null && mQSPanel.isExpanded();
-            mScrimController.transitionTo(mIsOccluded || qsExpanded ?
-                    ScrimState.BOUNCER_OCCLUDED : ScrimState.BOUNCER);
+            // Bouncer needs the front scrim when it's on top of an activity,
+            // tapping on a notification or editing QS.
+            mScrimController.transitionTo(mIsOccluded || mNotificationPanel.needsScrimming() ?
+                    ScrimState.BOUNCER_SCRIMMED : ScrimState.BOUNCER);
         } else if (mLaunchCameraOnScreenTurningOn || isInLaunchTransition()) {
             mScrimController.transitionTo(ScrimState.UNLOCKED, mUnlockScrimCallback);
         } else if (mBrightnessMirrorVisible) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index 8d536d8..b26b7c9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -198,9 +198,9 @@
         cancelPendingWakeupAction();
     }
 
-    private void showBouncer() {
+    public void showBouncer(boolean animated) {
         if (mShowing) {
-            mBouncer.show(false /* resetSecuritySelection */);
+            mBouncer.show(false /* resetSecuritySelection */, animated);
         }
         updateStates();
     }
@@ -485,10 +485,6 @@
         mStatusBar.executeRunnableDismissingKeyguard(null, null, true, false, true);
     }
 
-    public void dismiss() {
-        showBouncer();
-    }
-
     /**
      * WARNING: This method might cause Binder calls.
      */
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
index 4051220..f3a8417 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
@@ -16,39 +16,268 @@
 
 package com.android.systemui.statusbar.phone;
 
-import static org.mockito.Mockito.mock;
+import static com.google.common.truth.Truth.assertThat;
 
-import android.content.Context;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyFloat;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.calls;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+import android.graphics.Color;
 import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
 import android.test.UiThreadTest;
-import android.view.ContextThemeWrapper;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
 import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
 import android.widget.FrameLayout;
 
 import com.android.internal.widget.LockPatternUtils;
+import com.android.keyguard.KeyguardHostView;
+import com.android.keyguard.KeyguardSecurityModel;
 import com.android.keyguard.ViewMediatorCallback;
-import com.android.systemui.R;
+import com.android.systemui.DejankUtils;
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.classifier.FalsingManager;
 import com.android.systemui.keyguard.DismissCallbackRegistry;
 
+import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 
 @SmallTest
-@RunWith(AndroidJUnit4.class)
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper(setAsMainLooper = true)
 public class KeyguardBouncerTest extends SysuiTestCase {
 
-    @UiThreadTest
-    @Test
-    public void inflateDetached() {
-        final ViewGroup container = new FrameLayout(getContext());
-        final KeyguardBouncer bouncer = new KeyguardBouncer(getContext(),
-                mock(ViewMediatorCallback.class), mock(LockPatternUtils.class), container, mock(
-                DismissCallbackRegistry.class));
+    @Mock
+    private FalsingManager mFalsingManager;
+    @Mock
+    private ViewMediatorCallback mViewMediatorCallback;
+    @Mock
+    private LockPatternUtils mLockPatternUtils;
+    @Mock
+    private DismissCallbackRegistry mDismissCallbackRegistry;
+    @Mock
+    private KeyguardHostView mKeyguardHostView;
+    @Mock
+    private ViewTreeObserver mViewTreeObserver;
 
-        // Detached bouncer should still be able to be inflated
-        bouncer.inflateView();
+    private KeyguardBouncer mBouncer;
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+        DejankUtils.setImmediate(true);
+        final ViewGroup container = new FrameLayout(getContext());
+        when(mKeyguardHostView.getViewTreeObserver()).thenReturn(mViewTreeObserver);
+        when(mKeyguardHostView.getHeight()).thenReturn(500);
+        mBouncer = new KeyguardBouncer(getContext(), mViewMediatorCallback,
+                mLockPatternUtils, container, mDismissCallbackRegistry, mFalsingManager) {
+            @Override
+            protected void inflateView() {
+                super.inflateView();
+                mKeyguardView = mKeyguardHostView;
+            }
+        };
     }
 
+    @Test
+    public void testInflateView_doesntCrash() {
+        mBouncer.inflateView();
+    }
+
+    @Test
+    public void testShow_notifiesFalsingManager() {
+        mBouncer.show(true);
+        verify(mFalsingManager).onBouncerShown();
+
+        mBouncer.show(true, false);
+        verifyNoMoreInteractions(mFalsingManager);
+    }
+
+    /**
+     * Regression test: Invisible bouncer when occluded.
+     */
+    @Test
+    public void testShow_bouncerIsVisible() {
+        // Expand notification panel as if we were in the keyguard.
+        mBouncer.ensureView();
+        mBouncer.setExpansion(1);
+
+        reset(mKeyguardHostView);
+        when(mKeyguardHostView.getHeight()).thenReturn(500);
+
+        mBouncer.show(true);
+        verify(mKeyguardHostView).setAlpha(eq(1f));
+        verify(mKeyguardHostView).setTranslationY(eq(0f));
+    }
+
+    @Test
+    public void testShow_notifiesVisibility() {
+        mBouncer.show(true);
+        verify(mViewMediatorCallback).onBouncerVisiblityChanged(eq(true));
+
+        // Not called again when visible
+        reset(mViewMediatorCallback);
+        mBouncer.show(true);
+        verifyNoMoreInteractions(mViewMediatorCallback);
+    }
+
+    @Test
+    public void testShow_triesToDismissKeyguard() {
+        mBouncer.show(true);
+        verify(mKeyguardHostView).dismiss(anyInt());
+    }
+
+    @Test
+    public void testShow_resetsSecuritySelection() {
+        mBouncer.show(false);
+        verify(mKeyguardHostView, never()).showPrimarySecurityScreen();
+
+        mBouncer.hide(false);
+        mBouncer.show(true);
+        verify(mKeyguardHostView).showPrimarySecurityScreen();
+    }
+
+    @Test
+    public void testShow_animatesKeyguardView() {
+        mBouncer.show(true);
+        verify(mKeyguardHostView).startAppearAnimation();
+    }
+
+    @Test
+    public void testShow_showsErrorMessage() {
+        final String errorMessage = "an error message";
+        when(mViewMediatorCallback.consumeCustomMessage()).thenReturn(errorMessage);
+        mBouncer.show(true);
+        verify(mKeyguardHostView).showErrorMessage(eq(errorMessage));
+    }
+
+    @Test
+    public void testOnFullyShown_notifiesFalsingManager() {
+        mBouncer.onFullyShown();
+        verify(mFalsingManager).onBouncerShown();
+    }
+
+    @Test
+    public void testOnFullyHidden_notifiesFalsingManager() {
+        mBouncer.onFullyHidden();
+        verify(mFalsingManager).onBouncerHidden();
+    }
+
+    @Test
+    public void testHide_notifiesFalsingManager() {
+        mBouncer.hide(false);
+        verify(mFalsingManager).onBouncerHidden();
+    }
+
+    @Test
+    public void testHide_notifiesVisibility() {
+        mBouncer.hide(false);
+        verify(mViewMediatorCallback).onBouncerVisiblityChanged(eq(false));
+    }
+
+    @Test
+    public void testHide_notifiesDismissCallbackIfVisible() {
+        mBouncer.hide(false);
+        verifyZeroInteractions(mDismissCallbackRegistry);
+        mBouncer.show(false);
+        mBouncer.hide(false);
+        verify(mDismissCallbackRegistry).notifyDismissCancelled();
+    }
+
+    @Test
+    public void testShowPromptReason_propagates() {
+        mBouncer.ensureView();
+        mBouncer.showPromptReason(1);
+        verify(mKeyguardHostView).showPromptReason(eq(1));
+    }
+
+    @Test
+    public void testShowMessage_propagates() {
+        final String message = "a message";
+        mBouncer.ensureView();
+        mBouncer.showMessage(message, Color.GREEN);
+        verify(mKeyguardHostView).showMessage(eq(message), eq(Color.GREEN));
+    }
+
+    @Test
+    public void testShowOnDismissAction_showsBouncer() {
+        final KeyguardHostView.OnDismissAction dismissAction = () -> false;
+        final Runnable cancelAction = () -> {};
+        mBouncer.showWithDismissAction(dismissAction, cancelAction);
+        verify(mKeyguardHostView).setOnDismissAction(dismissAction, cancelAction);
+        Assert.assertTrue("Should be showing", mBouncer.isShowing());
+    }
+
+    @Test
+    public void testStartPreHideAnimation_notifiesView() {
+        final boolean[] ran = {false};
+        final Runnable r = () -> ran[0] = true;
+        mBouncer.startPreHideAnimation(r);
+        Assert.assertTrue("Callback should have been invoked", ran[0]);
+
+        ran[0] = false;
+        mBouncer.ensureView();
+        mBouncer.startPreHideAnimation(r);
+        verify(mKeyguardHostView).startDisappearAnimation(r);
+        Assert.assertFalse("Callback should have been deferred", ran[0]);
+    }
+
+    @Test
+    public void testIsShowing() {
+        Assert.assertFalse("Show wasn't invoked yet", mBouncer.isShowing());
+        mBouncer.show(true);
+        Assert.assertTrue("Should be showing", mBouncer.isShowing());
+    }
+
+    @Test
+    public void testSetExpansion() {
+        mBouncer.ensureView();
+        mBouncer.setExpansion(0.5f);
+        verify(mKeyguardHostView).setAlpha(anyFloat());
+        verify(mKeyguardHostView).setTranslationY(anyFloat());
+    }
+
+    @Test
+    public void testNeedsFullscreenBouncer_asksKeyguardView() {
+        mBouncer.ensureView();
+        mBouncer.needsFullscreenBouncer();
+        verify(mKeyguardHostView).getSecurityMode();
+        verify(mKeyguardHostView, never()).getCurrentSecurityMode();
+    }
+
+    @Test
+    public void testIsFullscreenBouncer_asksKeyguardView() {
+        mBouncer.ensureView();
+        mBouncer.isFullscreenBouncer();
+        verify(mKeyguardHostView).getCurrentSecurityMode();
+        verify(mKeyguardHostView, never()).getSecurityMode();
+    }
+
+    @Test
+    public void testIsSecure() {
+        Assert.assertTrue("Bouncer is secure before inflating views", mBouncer.isSecure());
+
+        mBouncer.ensureView();
+        for (KeyguardSecurityModel.SecurityMode mode : KeyguardSecurityModel.SecurityMode.values()){
+            reset(mKeyguardHostView);
+            when(mKeyguardHostView.getSecurityMode()).thenReturn(mode);
+            Assert.assertEquals("Security doesn't match for mode: " + mode,
+                    mBouncer.isSecure(), mode != KeyguardSecurityModel.SecurityMode.None);
+        }
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
index 6fbc0d7..df29e1f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
@@ -181,7 +181,7 @@
 
     @Test
     public void transitionToBouncer() {
-        mScrimController.transitionTo(ScrimState.BOUNCER_OCCLUDED);
+        mScrimController.transitionTo(ScrimState.BOUNCER_SCRIMMED);
         mScrimController.finishAnimationsImmediately();
         // Front scrim should be transparent
         // Back scrim should be visible without tint