Home | History | Annotate | Download | only in phone
      1 /*
      2  * Copyright (C) 2018 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License
     15  */
     16 
     17 package com.android.systemui.statusbar.phone;
     18 
     19 import static org.mockito.ArgumentMatchers.anyBoolean;
     20 import static org.mockito.ArgumentMatchers.anyFloat;
     21 import static org.mockito.ArgumentMatchers.eq;
     22 import static org.mockito.Mockito.never;
     23 import static org.mockito.Mockito.reset;
     24 import static org.mockito.Mockito.verify;
     25 import static org.mockito.Mockito.when;
     26 
     27 import android.content.Context;
     28 import android.support.test.filters.SmallTest;
     29 import android.testing.AndroidTestingRunner;
     30 import android.testing.TestableLooper;
     31 import android.view.ViewGroup;
     32 
     33 import com.android.internal.widget.LockPatternUtils;
     34 import com.android.keyguard.KeyguardHostView;
     35 import com.android.keyguard.ViewMediatorCallback;
     36 import com.android.systemui.SysuiTestCase;
     37 import com.android.systemui.keyguard.DismissCallbackRegistry;
     38 
     39 import org.junit.Before;
     40 import org.junit.Test;
     41 import org.junit.runner.RunWith;
     42 import org.mockito.Mock;
     43 import org.mockito.MockitoAnnotations;
     44 
     45 @SmallTest
     46 @RunWith(AndroidTestingRunner.class)
     47 @TestableLooper.RunWithLooper
     48 public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {
     49 
     50     @Mock
     51     private ViewMediatorCallback mViewMediatorCallback;
     52     @Mock
     53     private LockPatternUtils mLockPatternUtils;
     54     @Mock
     55     private KeyguardBouncer mBouncer;
     56     @Mock
     57     private StatusBar mStatusBar;
     58     @Mock
     59     private ViewGroup mContainer;
     60     @Mock
     61     private NotificationPanelView mNotificationPanelView;
     62     @Mock
     63     private FingerprintUnlockController mFingerprintUnlockController;
     64     @Mock
     65     private DismissCallbackRegistry mDismissCallbackRegistry;
     66     private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
     67 
     68     @Before
     69     public void setUp() {
     70         MockitoAnnotations.initMocks(this);
     71         mDependency.injectMockDependency(StatusBarWindowManager.class);
     72         mStatusBarKeyguardViewManager = new TestableStatusBarKeyguardViewManager(getContext(),
     73                 mViewMediatorCallback, mLockPatternUtils);
     74         mStatusBarKeyguardViewManager.registerStatusBar(mStatusBar, mContainer,
     75                 mNotificationPanelView, mFingerprintUnlockController, mDismissCallbackRegistry);
     76         mStatusBarKeyguardViewManager.show(null);
     77     }
     78 
     79     @Test
     80     public void dismissWithAction_AfterKeyguardGoneSetToFalse() {
     81         KeyguardHostView.OnDismissAction action = () -> false;
     82         Runnable cancelAction = () -> {};
     83         mStatusBarKeyguardViewManager.dismissWithAction(action, cancelAction,
     84                 false /* afterKeyguardGone */);
     85         verify(mBouncer).showWithDismissAction(eq(action), eq(cancelAction));
     86     }
     87 
     88     @Test
     89     public void showBouncer_onlyWhenShowing() {
     90         mStatusBarKeyguardViewManager.hide(0 /* startTime */, 0 /* fadeoutDuration */);
     91         mStatusBar.showBouncer(true /* scrimmed */);
     92         verify(mBouncer, never()).show(anyBoolean(), anyBoolean());
     93         verify(mBouncer, never()).show(anyBoolean());
     94     }
     95 
     96     @Test
     97     public void showBouncer_notWhenBouncerAlreadyShowing() {
     98         mStatusBarKeyguardViewManager.hide(0 /* startTime */, 0 /* fadeoutDuration */);
     99         when(mBouncer.isSecure()).thenReturn(true);
    100         mStatusBar.showBouncer(true /* scrimmed */);
    101         verify(mBouncer, never()).show(anyBoolean(), anyBoolean());
    102         verify(mBouncer, never()).show(anyBoolean());
    103     }
    104 
    105     @Test
    106     public void showBouncer_showsTheBouncer() {
    107         mStatusBarKeyguardViewManager.showBouncer(true /* scrimmed */);
    108         verify(mBouncer).show(anyBoolean(), eq(true));
    109     }
    110 
    111     @Test
    112     public void onPanelExpansionChanged_neverHidesFullscreenBouncer() {
    113         // TODO: StatusBar should not be here, mBouncer.isFullscreenBouncer() should do the same.
    114         when(mStatusBar.isFullScreenUserSwitcherState()).thenReturn(true);
    115         mStatusBarKeyguardViewManager.onPanelExpansionChanged(0.5f /* expansion */,
    116                 true /* tracking */);
    117         verify(mBouncer).setExpansion(eq(KeyguardBouncer.EXPANSION_VISIBLE));
    118     }
    119 
    120     @Test
    121     public void onPanelExpansionChanged_neverHidesScrimmedBouncer() {
    122         when(mBouncer.isShowingScrimmed()).thenReturn(true);
    123         mStatusBarKeyguardViewManager.onPanelExpansionChanged(0.5f /* expansion */,
    124                 true /* tracking */);
    125         verify(mBouncer).setExpansion(eq(KeyguardBouncer.EXPANSION_VISIBLE));
    126     }
    127 
    128     @Test
    129     public void onPanelExpansionChanged_neverShowsDuringHintAnimation() {
    130         when(mNotificationPanelView.isUnlockHintRunning()).thenReturn(true);
    131         mStatusBarKeyguardViewManager.onPanelExpansionChanged(0.5f /* expansion */,
    132                 true /* tracking */);
    133         verify(mBouncer).setExpansion(eq(KeyguardBouncer.EXPANSION_HIDDEN));
    134     }
    135 
    136     @Test
    137     public void onPanelExpansionChanged_propagatesToBouncer() {
    138         mStatusBarKeyguardViewManager.onPanelExpansionChanged(0.5f /* expansion */,
    139                 true /* tracking */);
    140         verify(mBouncer).setExpansion(eq(0.5f));
    141     }
    142 
    143     @Test
    144     public void onPanelExpansionChanged_showsBouncerWhenSwiping() {
    145         when(mStatusBar.isKeyguardCurrentlySecure()).thenReturn(true);
    146         mStatusBarKeyguardViewManager.onPanelExpansionChanged(0.5f /* expansion */,
    147                 true /* tracking */);
    148         verify(mBouncer).show(eq(false), eq(false));
    149 
    150         // But not when it's already visible
    151         reset(mBouncer);
    152         when(mBouncer.isShowing()).thenReturn(true);
    153         mStatusBarKeyguardViewManager.onPanelExpansionChanged(0.5f /* expansion */, true /* tracking */);
    154         verify(mBouncer, never()).show(eq(false), eq(false));
    155 
    156         // Or animating away
    157         reset(mBouncer);
    158         when(mBouncer.isAnimatingAway()).thenReturn(true);
    159         mStatusBarKeyguardViewManager.onPanelExpansionChanged(0.5f /* expansion */, true /* tracking */);
    160         verify(mBouncer, never()).show(eq(false), eq(false));
    161     }
    162 
    163     @Test
    164     public void onPanelExpansionChanged_neverTranslatesBouncerWhenOccluded() {
    165         mStatusBarKeyguardViewManager.setOccluded(true /* occluded */, false /* animate */);
    166         mStatusBarKeyguardViewManager.onPanelExpansionChanged(0.5f /* expansion */,
    167                 true /* tracking */);
    168         verify(mBouncer, never()).setExpansion(eq(0.5f));
    169     }
    170 
    171     @Test
    172     public void onPanelExpansionChanged_neverTranslatesBouncerWhenWakeAndUnlock() {
    173         when(mFingerprintUnlockController.getMode())
    174                 .thenReturn(FingerprintUnlockController.MODE_WAKE_AND_UNLOCK);
    175         mStatusBarKeyguardViewManager.onPanelExpansionChanged(KeyguardBouncer.EXPANSION_VISIBLE,
    176                 false /* tracking */);
    177         verify(mBouncer, never()).setExpansion(anyFloat());
    178     }
    179 
    180     private class TestableStatusBarKeyguardViewManager extends StatusBarKeyguardViewManager {
    181 
    182         public TestableStatusBarKeyguardViewManager(Context context,
    183                 ViewMediatorCallback callback,
    184                 LockPatternUtils lockPatternUtils) {
    185             super(context, callback, lockPatternUtils);
    186         }
    187 
    188         @Override
    189         public void registerStatusBar(StatusBar statusBar, ViewGroup container,
    190                 NotificationPanelView notificationPanelView,
    191                 FingerprintUnlockController fingerprintUnlockController,
    192                 DismissCallbackRegistry dismissCallbackRegistry) {
    193             super.registerStatusBar(statusBar, container, notificationPanelView,
    194                     fingerprintUnlockController, dismissCallbackRegistry);
    195             mBouncer = StatusBarKeyguardViewManagerTest.this.mBouncer;
    196         }
    197     }
    198 }