blob: cf6fd4a3380f86514d1584ce72638187cf91f019 [file] [log] [blame]
Bartosz Fabianowski5f045002016-12-01 10:36:18 +01001/*
2 * Copyright (C) 2016 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;
18
Lucas Dupinff6628d2018-10-15 10:12:37 -070019import static com.google.common.truth.Truth.assertThat;
20
Adrian Roosc1b50322017-02-27 21:07:58 +010021import static org.junit.Assert.assertFalse;
22import static org.junit.Assert.assertTrue;
Lucas Dupin8e2fd012019-04-25 16:40:54 -070023import static org.mockito.ArgumentMatchers.any;
Lucas Dupin0df60fe2019-04-23 10:19:27 -070024import static org.mockito.ArgumentMatchers.anyInt;
25import static org.mockito.ArgumentMatchers.eq;
Jason Monk3cfedd72016-12-09 09:31:37 -050026import static org.mockito.Mockito.mock;
27import static org.mockito.Mockito.reset;
Lucas Dupin8e2fd012019-04-25 16:40:54 -070028import static org.mockito.Mockito.times;
Jason Monk3cfedd72016-12-09 09:31:37 -050029import static org.mockito.Mockito.verify;
Jason Monk3cfedd72016-12-09 09:31:37 -050030import static org.mockito.Mockito.when;
31
Adrian Roosc1b50322017-02-27 21:07:58 +010032import android.app.Instrumentation;
Bartosz Fabianowski5f045002016-12-01 10:36:18 +010033import android.app.admin.DevicePolicyManager;
34import android.app.trust.TrustManager;
Bartosz Fabianowski5f045002016-12-01 10:36:18 +010035import android.content.Context;
Lucas Dupinff6628d2018-10-15 10:12:37 -070036import android.graphics.Color;
Jason Monk3cfedd72016-12-09 09:31:37 -050037import android.hardware.fingerprint.FingerprintManager;
Bartosz Fabianowski5f045002016-12-01 10:36:18 +010038import android.os.Looper;
Bartosz Fabianowski5f045002016-12-01 10:36:18 +010039import android.view.View;
40import android.view.ViewGroup;
41
Brett Chabot84151d92019-02-27 15:37:59 -080042import androidx.test.InstrumentationRegistry;
43import androidx.test.filters.SmallTest;
44import androidx.test.runner.AndroidJUnit4;
45
Lucas Dupin2e838ac2019-04-17 16:50:58 -070046import com.android.internal.widget.LockPatternUtils;
Lucas Dupin8e2fd012019-04-25 16:40:54 -070047import com.android.keyguard.KeyguardUpdateMonitor;
Bartosz Fabianowski5f045002016-12-01 10:36:18 +010048import com.android.systemui.R;
49import com.android.systemui.SysuiTestCase;
Lucas Dupin8e2fd012019-04-25 16:40:54 -070050import com.android.systemui.plugins.statusbar.StatusBarStateController;
Bartosz Fabianowski5f045002016-12-01 10:36:18 +010051import com.android.systemui.statusbar.phone.KeyguardIndicationTextView;
Lucas Dupin2e838ac2019-04-17 16:50:58 -070052import com.android.systemui.statusbar.phone.LockIcon;
Lucas Dupin0df60fe2019-04-23 10:19:27 -070053import com.android.systemui.statusbar.phone.ShadeController;
54import com.android.systemui.statusbar.policy.AccessibilityController;
Lucas Dupinc8f16e82019-09-17 18:24:50 -040055import com.android.systemui.statusbar.policy.KeyguardStateController;
Adrian Roosc1b50322017-02-27 21:07:58 +010056import com.android.systemui.util.wakelock.WakeLockFake;
Bartosz Fabianowski5f045002016-12-01 10:36:18 +010057
58import org.junit.Before;
59import org.junit.Test;
60import org.junit.runner.RunWith;
Lucas Dupin0df60fe2019-04-23 10:19:27 -070061import org.mockito.ArgumentCaptor;
Lucas Dupinff6628d2018-10-15 10:12:37 -070062import org.mockito.Mock;
63import org.mockito.MockitoAnnotations;
Bartosz Fabianowski5f045002016-12-01 10:36:18 +010064
65@SmallTest
66@RunWith(AndroidJUnit4.class)
67public class KeyguardIndicationControllerTest extends SysuiTestCase {
68
Lucas Dupinff6628d2018-10-15 10:12:37 -070069 @Mock
70 private DevicePolicyManager mDevicePolicyManager;
71 @Mock
72 private ViewGroup mIndicationArea;
73 @Mock
Lucas Dupin2e838ac2019-04-17 16:50:58 -070074 private LockIcon mLockIcon;
75 @Mock
76 private LockPatternUtils mLockPatternUtils;
Lucas Dupin0df60fe2019-04-23 10:19:27 -070077 @Mock
78 private ShadeController mShadeController;
79 @Mock
80 private AccessibilityController mAccessibilityController;
Lucas Dupin8e2fd012019-04-25 16:40:54 -070081 @Mock
Lucas Dupinc8f16e82019-09-17 18:24:50 -040082 private KeyguardStateController mKeyguardStateController;
Lucas Dupin8e2fd012019-04-25 16:40:54 -070083 @Mock
84 private StatusBarStateController mStatusBarStateController;
85 @Mock
86 private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
Lucas Dupinff6628d2018-10-15 10:12:37 -070087 private KeyguardIndicationTextView mTextView;
Bartosz Fabianowski5f045002016-12-01 10:36:18 +010088
89 private KeyguardIndicationController mController;
Adrian Roosc1b50322017-02-27 21:07:58 +010090 private WakeLockFake mWakeLock;
91 private Instrumentation mInstrumentation;
Bartosz Fabianowski5f045002016-12-01 10:36:18 +010092
93 @Before
94 public void setUp() throws Exception {
Lucas Dupinff6628d2018-10-15 10:12:37 -070095 MockitoAnnotations.initMocks(this);
Adrian Roosc1b50322017-02-27 21:07:58 +010096 mInstrumentation = InstrumentationRegistry.getInstrumentation();
Lucas Dupinff6628d2018-10-15 10:12:37 -070097 mTextView = new KeyguardIndicationTextView(mContext);
Adrian Roosc1b50322017-02-27 21:07:58 +010098
Jason Monk3cfedd72016-12-09 09:31:37 -050099 mContext.addMockSystemService(Context.DEVICE_POLICY_SERVICE, mDevicePolicyManager);
100 mContext.addMockSystemService(Context.TRUST_SERVICE, mock(TrustManager.class));
101 mContext.addMockSystemService(Context.FINGERPRINT_SERVICE, mock(FingerprintManager.class));
Bartosz Fabianowski5f045002016-12-01 10:36:18 +0100102
Lucas Dupinff6628d2018-10-15 10:12:37 -0700103 when(mIndicationArea.findViewById(R.id.keyguard_indication_text)).thenReturn(mTextView);
Adrian Roosc1b50322017-02-27 21:07:58 +0100104
105 mWakeLock = new WakeLockFake();
Bartosz Fabianowski5f045002016-12-01 10:36:18 +0100106 }
107
108 private void createController() {
109 if (Looper.myLooper() == null) {
110 Looper.prepare();
111 }
Lucas Dupin2e838ac2019-04-17 16:50:58 -0700112 mController = new KeyguardIndicationController(mContext, mIndicationArea, mLockIcon,
Lucas Dupin8e2fd012019-04-25 16:40:54 -0700113 mLockPatternUtils, mWakeLock, mShadeController, mAccessibilityController,
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400114 mKeyguardStateController, mStatusBarStateController, mKeyguardUpdateMonitor);
Bartosz Fabianowski5f045002016-12-01 10:36:18 +0100115 }
116
117 @Test
Adrian Roosc1b50322017-02-27 21:07:58 +0100118 public void transientIndication_holdsWakeLock_whenDozing() {
119 createController();
120
121 mController.setDozing(true);
122 mController.showTransientIndication("Test");
123
124 assertTrue(mWakeLock.isHeld());
125 }
126
127 @Test
128 public void transientIndication_releasesWakeLock_afterHiding() {
129 createController();
130
131 mController.setDozing(true);
132 mController.showTransientIndication("Test");
133 mController.hideTransientIndication();
134
135 assertFalse(mWakeLock.isHeld());
136 }
137
138 @Test
139 public void transientIndication_releasesWakeLock_afterHidingDelayed() throws Throwable {
140 mInstrumentation.runOnMainSync(() -> {
141 createController();
142
143 mController.setDozing(true);
144 mController.showTransientIndication("Test");
145 mController.hideTransientIndicationDelayed(0);
146 });
147 mInstrumentation.waitForIdleSync();
148
Adrian Roosaf45b602017-03-14 13:10:25 -0700149 Boolean[] held = new Boolean[1];
Adrian Roosc1b50322017-02-27 21:07:58 +0100150 mInstrumentation.runOnMainSync(() -> {
151 held[0] = mWakeLock.isHeld();
Adrian Roosc1b50322017-02-27 21:07:58 +0100152 });
Adrian Roosaf45b602017-03-14 13:10:25 -0700153 assertFalse("WakeLock expected: RELEASED, was: HELD", held[0]);
Adrian Roosc1b50322017-02-27 21:07:58 +0100154 }
Lucas Dupinff6628d2018-10-15 10:12:37 -0700155
156 @Test
157 public void transientIndication_visibleWhenDozing() {
158 createController();
159
160 mController.setVisible(true);
161 mController.showTransientIndication("Test");
162 mController.setDozing(true);
163
164 assertThat(mTextView.getText()).isEqualTo("Test");
165 assertThat(mTextView.getCurrentTextColor()).isEqualTo(Color.WHITE);
166 assertThat(mTextView.getAlpha()).isEqualTo(1f);
167 }
Lucas Dupin0df60fe2019-04-23 10:19:27 -0700168
169 @Test
170 public void lockIcon_click() {
171 createController();
172
173 ArgumentCaptor<View.OnLongClickListener> longClickCaptor = ArgumentCaptor.forClass(
174 View.OnLongClickListener.class);
175 ArgumentCaptor<View.OnClickListener> clickCaptor = ArgumentCaptor.forClass(
176 View.OnClickListener.class);
177 verify(mLockIcon).setOnLongClickListener(longClickCaptor.capture());
178 verify(mLockIcon).setOnClickListener(clickCaptor.capture());
179
180 when(mAccessibilityController.isAccessibilityEnabled()).thenReturn(true);
181 clickCaptor.getValue().onClick(mLockIcon);
Lucas Dupind54f00e2019-05-06 17:44:03 -0700182 verify(mShadeController).animateCollapsePanels(anyInt(), eq(true));
Lucas Dupin0df60fe2019-04-23 10:19:27 -0700183
184 longClickCaptor.getValue().onLongClick(mLockIcon);
185 verify(mLockPatternUtils).requireCredentialEntry(anyInt());
Lucas Dupinca88e5f2019-05-14 16:11:08 -0700186 verify(mKeyguardUpdateMonitor).onLockIconPressed();
Lucas Dupin0df60fe2019-04-23 10:19:27 -0700187 }
Lucas Dupin8e2fd012019-04-25 16:40:54 -0700188
189 @Test
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400190 public void updateMonitor_listenerUpdatesIndication() {
Lucas Dupin8e2fd012019-04-25 16:40:54 -0700191 createController();
192 String restingIndication = "Resting indication";
Lucas Dupin6c6d5732019-08-27 17:36:05 -0700193
Lucas Dupin8e2fd012019-04-25 16:40:54 -0700194 mController.setVisible(true);
Lucas Dupin6c6d5732019-08-27 17:36:05 -0700195 assertThat(mTextView.getText()).isEqualTo(
196 mContext.getString(com.android.internal.R.string.lockscreen_storage_locked));
197
198 when(mKeyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(true);
199 when(mKeyguardUpdateMonitor.isUserUnlocked(anyInt())).thenReturn(true);
200 mController.setRestingIndication(restingIndication);
Lucas Dupin8e2fd012019-04-25 16:40:54 -0700201 assertThat(mTextView.getText()).isEqualTo(mController.getTrustGrantedIndication());
202
203 reset(mKeyguardUpdateMonitor);
Lucas Dupin6c6d5732019-08-27 17:36:05 -0700204 when(mKeyguardUpdateMonitor.isUserUnlocked(anyInt())).thenReturn(true);
Lucas Dupin8e2fd012019-04-25 16:40:54 -0700205 when(mKeyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(false);
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400206 mController.onUnlockedChanged();
Lucas Dupin8e2fd012019-04-25 16:40:54 -0700207 assertThat(mTextView.getText()).isEqualTo(restingIndication);
208 }
209
210 @Test
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400211 public void updateMonitor_listener() {
Lucas Dupin8e2fd012019-04-25 16:40:54 -0700212 createController();
Lucas Dupinc8f16e82019-09-17 18:24:50 -0400213 verify(mKeyguardStateController).addCallback(eq(mController));
Lucas Dupin8e2fd012019-04-25 16:40:54 -0700214 verify(mStatusBarStateController).addCallback(eq(mController));
215 verify(mKeyguardUpdateMonitor, times(2)).registerCallback(any());
Lucas Dupin8e2fd012019-04-25 16:40:54 -0700216 }
Bartosz Fabianowski5f045002016-12-01 10:36:18 +0100217}