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}