StatusBarTest.java revision fd57db6ead1b990ed000c5cd15d8fd1d1668f13e
1/* 2 * Copyright (C) 2017 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 17package com.android.systemui.statusbar.phone; 18 19import static org.mockito.Matchers.any; 20import static org.mockito.Matchers.anyBoolean; 21import static org.mockito.Mockito.doAnswer; 22import static org.mockito.Mockito.mock; 23import static org.mockito.Mockito.when; 24 25import android.metrics.LogMaker; 26import android.support.test.filters.SmallTest; 27import android.support.test.metricshelper.MetricsAsserts; 28import android.support.test.runner.AndroidJUnit4; 29import android.util.DisplayMetrics; 30 31import com.android.internal.logging.MetricsLogger; 32import com.android.internal.logging.nano.MetricsProto.MetricsEvent; 33import com.android.internal.logging.testing.FakeMetricsLogger; 34import com.android.keyguard.KeyguardHostView.OnDismissAction; 35import com.android.systemui.SysuiTestCase; 36import com.android.systemui.statusbar.ActivatableNotificationView; 37import com.android.systemui.statusbar.KeyguardIndicationController; 38import com.android.systemui.statusbar.NotificationData; 39import com.android.systemui.statusbar.stack.NotificationStackScrollLayout; 40 41import org.junit.Before; 42import org.junit.Test; 43import org.junit.runner.RunWith; 44 45@SmallTest 46@RunWith(AndroidJUnit4.class) 47public class StatusBarTest extends SysuiTestCase { 48 49 StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; 50 UnlockMethodCache mUnlockMethodCache; 51 KeyguardIndicationController mKeyguardIndicationController; 52 NotificationStackScrollLayout mStackScroller; 53 StatusBar mStatusBar; 54 FakeMetricsLogger mMetricsLogger; 55 56 private DisplayMetrics mDisplayMetrics = new DisplayMetrics(); 57 58 @Before 59 public void setup() { 60 mStatusBarKeyguardViewManager = mock(StatusBarKeyguardViewManager.class); 61 mUnlockMethodCache = mock(UnlockMethodCache.class); 62 mKeyguardIndicationController = mock(KeyguardIndicationController.class); 63 mStackScroller = mock(NotificationStackScrollLayout.class); 64 mMetricsLogger = new FakeMetricsLogger(); 65 mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache, 66 mKeyguardIndicationController, mStackScroller); 67 mStatusBar.setMetricsLogger(mMetricsLogger); 68 69 doAnswer(invocation -> { 70 OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0]; 71 onDismissAction.onDismiss(); 72 return null; 73 }).when(mStatusBarKeyguardViewManager).dismissWithAction(any(), any(), anyBoolean()); 74 75 doAnswer(invocation -> { 76 Runnable runnable = (Runnable) invocation.getArguments()[0]; 77 runnable.run(); 78 return null; 79 }).when(mStatusBarKeyguardViewManager).addAfterKeyguardGoneRunnable(any()); 80 81 when(mStackScroller.getActivatedChild()).thenReturn(null); 82 } 83 84 @Test 85 public void executeRunnableDismissingKeyguard_nullRunnable_showingAndOccluded() { 86 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true); 87 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(true); 88 89 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false); 90 } 91 92 @Test 93 public void executeRunnableDismissingKeyguard_nullRunnable_showing() { 94 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true); 95 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false); 96 97 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false); 98 } 99 100 @Test 101 public void executeRunnableDismissingKeyguard_nullRunnable_notShowing() { 102 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false); 103 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false); 104 105 mStatusBar.executeRunnableDismissingKeyguard(null, null, false, false, false); 106 } 107 108 @Test 109 public void lockscreenStateMetrics_notShowing() { 110 // uninteresting state, except that fingerprint must be non-zero 111 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false); 112 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true); 113 // interesting state 114 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false); 115 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false); 116 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false); 117 mStatusBar.onKeyguardViewManagerStatesUpdated(); 118 119 MetricsAsserts.assertHasLog("missing hidden insecure lockscreen log", 120 mMetricsLogger.getLogs(), 121 new LogMaker(MetricsEvent.LOCKSCREEN) 122 .setType(MetricsEvent.TYPE_CLOSE) 123 .setSubtype(0)); 124 } 125 126 @Test 127 public void lockscreenStateMetrics_notShowing_secure() { 128 // uninteresting state, except that fingerprint must be non-zero 129 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false); 130 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true); 131 // interesting state 132 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(false); 133 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false); 134 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true); 135 136 mStatusBar.onKeyguardViewManagerStatesUpdated(); 137 138 MetricsAsserts.assertHasLog("missing hidden secure lockscreen log", 139 mMetricsLogger.getLogs(), 140 new LogMaker(MetricsEvent.LOCKSCREEN) 141 .setType(MetricsEvent.TYPE_CLOSE) 142 .setSubtype(1)); 143 } 144 145 @Test 146 public void lockscreenStateMetrics_isShowing() { 147 // uninteresting state, except that fingerprint must be non-zero 148 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false); 149 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true); 150 // interesting state 151 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true); 152 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false); 153 when(mUnlockMethodCache.isMethodSecure()).thenReturn(false); 154 155 mStatusBar.onKeyguardViewManagerStatesUpdated(); 156 157 MetricsAsserts.assertHasLog("missing insecure lockscreen showing", 158 mMetricsLogger.getLogs(), 159 new LogMaker(MetricsEvent.LOCKSCREEN) 160 .setType(MetricsEvent.TYPE_OPEN) 161 .setSubtype(0)); 162 } 163 164 @Test 165 public void lockscreenStateMetrics_isShowing_secure() { 166 // uninteresting state, except that fingerprint must be non-zero 167 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false); 168 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true); 169 // interesting state 170 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true); 171 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(false); 172 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true); 173 174 mStatusBar.onKeyguardViewManagerStatesUpdated(); 175 176 MetricsAsserts.assertHasLog("missing secure lockscreen showing log", 177 mMetricsLogger.getLogs(), 178 new LogMaker(MetricsEvent.LOCKSCREEN) 179 .setType(MetricsEvent.TYPE_OPEN) 180 .setSubtype(1)); 181 } 182 183 @Test 184 public void lockscreenStateMetrics_isShowingBouncer() { 185 // uninteresting state, except that fingerprint must be non-zero 186 when(mStatusBarKeyguardViewManager.isOccluded()).thenReturn(false); 187 when(mUnlockMethodCache.canSkipBouncer()).thenReturn(true); 188 // interesting state 189 when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true); 190 when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true); 191 when(mUnlockMethodCache.isMethodSecure()).thenReturn(true); 192 193 mStatusBar.onKeyguardViewManagerStatesUpdated(); 194 195 MetricsAsserts.assertHasLog("missing bouncer log", 196 mMetricsLogger.getLogs(), 197 new LogMaker(MetricsEvent.BOUNCER) 198 .setType(MetricsEvent.TYPE_OPEN) 199 .setSubtype(1)); 200 } 201 202 @Test 203 public void onActivatedMetrics() { 204 ActivatableNotificationView view = mock(ActivatableNotificationView.class); 205 mStatusBar.onActivated(view); 206 207 MetricsAsserts.assertHasLog("missing lockscreen note tap log", 208 mMetricsLogger.getLogs(), 209 new LogMaker(MetricsEvent.ACTION_LS_NOTE) 210 .setType(MetricsEvent.TYPE_ACTION)); 211 } 212 213 static class TestableStatusBar extends StatusBar { 214 public TestableStatusBar(StatusBarKeyguardViewManager man, 215 UnlockMethodCache unlock, KeyguardIndicationController key, 216 NotificationStackScrollLayout stack) { 217 mStatusBarKeyguardViewManager = man; 218 mUnlockMethodCache = unlock; 219 mKeyguardIndicationController = key; 220 mStackScroller = stack; 221 } 222 223 @Override 224 protected H createHandler() { 225 return null; 226 } 227 } 228}