1/* 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 19import static org.junit.Assert.assertFalse; 20import static org.junit.Assert.assertTrue; 21import static org.mockito.Mockito.mock; 22import static org.mockito.Mockito.reset; 23import static org.mockito.Mockito.verify; 24import static org.mockito.Mockito.verifyNoMoreInteractions; 25import static org.mockito.Mockito.when; 26 27import android.app.Instrumentation; 28import android.app.admin.DevicePolicyManager; 29import android.app.trust.TrustManager; 30import android.content.Context; 31import android.hardware.fingerprint.FingerprintManager; 32import android.os.Looper; 33import android.support.test.InstrumentationRegistry; 34import android.support.test.filters.SmallTest; 35import android.support.test.runner.AndroidJUnit4; 36import android.view.View; 37import android.view.ViewGroup; 38 39import com.android.keyguard.KeyguardUpdateMonitorCallback; 40import com.android.systemui.R; 41import com.android.systemui.SysuiTestCase; 42import com.android.systemui.statusbar.phone.KeyguardIndicationTextView; 43import com.android.systemui.util.wakelock.WakeLockFake; 44 45import org.junit.Before; 46import org.junit.Test; 47import org.junit.runner.RunWith; 48 49@SmallTest 50@RunWith(AndroidJUnit4.class) 51public class KeyguardIndicationControllerTest extends SysuiTestCase { 52 53 private final String ORGANIZATION_NAME = "organization"; 54 55 private String mDisclosureWithOrganization; 56 57 private DevicePolicyManager mDevicePolicyManager = mock(DevicePolicyManager.class); 58 private ViewGroup mIndicationArea = mock(ViewGroup.class); 59 private KeyguardIndicationTextView mDisclosure = mock(KeyguardIndicationTextView.class); 60 61 private KeyguardIndicationController mController; 62 private WakeLockFake mWakeLock; 63 private Instrumentation mInstrumentation; 64 65 @Before 66 public void setUp() throws Exception { 67 mInstrumentation = InstrumentationRegistry.getInstrumentation(); 68 69 mContext.addMockSystemService(Context.DEVICE_POLICY_SERVICE, mDevicePolicyManager); 70 mContext.addMockSystemService(Context.TRUST_SERVICE, mock(TrustManager.class)); 71 mContext.addMockSystemService(Context.FINGERPRINT_SERVICE, mock(FingerprintManager.class)); 72 mDisclosureWithOrganization = mContext.getString(R.string.do_disclosure_with_name, 73 ORGANIZATION_NAME); 74 75 when(mIndicationArea.findViewById(R.id.keyguard_indication_enterprise_disclosure)) 76 .thenReturn(mDisclosure); 77 78 mWakeLock = new WakeLockFake(); 79 } 80 81 private void createController() { 82 if (Looper.myLooper() == null) { 83 Looper.prepare(); 84 } 85 mController = new KeyguardIndicationController(mContext, mIndicationArea, null, mWakeLock); 86 } 87 88 @Test 89 public void unmanaged() { 90 when(mDevicePolicyManager.isDeviceManaged()).thenReturn(false); 91 createController(); 92 93 verify(mDisclosure).setVisibility(View.GONE); 94 verifyNoMoreInteractions(mDisclosure); 95 } 96 97 @Test 98 public void managedNoOwnerName() { 99 when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true); 100 when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(null); 101 createController(); 102 103 verify(mDisclosure).setVisibility(View.VISIBLE); 104 verify(mDisclosure).switchIndication(R.string.do_disclosure_generic); 105 verifyNoMoreInteractions(mDisclosure); 106 } 107 108 @Test 109 public void managedOwnerName() { 110 when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true); 111 when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(ORGANIZATION_NAME); 112 createController(); 113 114 verify(mDisclosure).setVisibility(View.VISIBLE); 115 verify(mDisclosure).switchIndication(mDisclosureWithOrganization); 116 verifyNoMoreInteractions(mDisclosure); 117 } 118 119 @Test 120 public void updateOnTheFly() { 121 when(mDevicePolicyManager.isDeviceManaged()).thenReturn(false); 122 createController(); 123 124 final KeyguardUpdateMonitorCallback monitor = mController.getKeyguardCallback(); 125 reset(mDisclosure); 126 127 when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true); 128 when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(null); 129 monitor.onKeyguardVisibilityChanged(true); 130 131 verify(mDisclosure).setVisibility(View.VISIBLE); 132 verify(mDisclosure).switchIndication(R.string.do_disclosure_generic); 133 verifyNoMoreInteractions(mDisclosure); 134 reset(mDisclosure); 135 136 when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true); 137 when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(ORGANIZATION_NAME); 138 monitor.onKeyguardVisibilityChanged(false); 139 monitor.onKeyguardVisibilityChanged(true); 140 141 verify(mDisclosure).setVisibility(View.VISIBLE); 142 verify(mDisclosure).switchIndication(mDisclosureWithOrganization); 143 verifyNoMoreInteractions(mDisclosure); 144 reset(mDisclosure); 145 146 when(mDevicePolicyManager.isDeviceManaged()).thenReturn(false); 147 monitor.onKeyguardVisibilityChanged(false); 148 monitor.onKeyguardVisibilityChanged(true); 149 150 verify(mDisclosure).setVisibility(View.GONE); 151 verifyNoMoreInteractions(mDisclosure); 152 } 153 154 @Test 155 public void transientIndication_holdsWakeLock_whenDozing() { 156 createController(); 157 158 mController.setDozing(true); 159 mController.showTransientIndication("Test"); 160 161 assertTrue(mWakeLock.isHeld()); 162 } 163 164 @Test 165 public void transientIndication_releasesWakeLock_afterHiding() { 166 createController(); 167 168 mController.setDozing(true); 169 mController.showTransientIndication("Test"); 170 mController.hideTransientIndication(); 171 172 assertFalse(mWakeLock.isHeld()); 173 } 174 175 @Test 176 public void transientIndication_releasesWakeLock_afterHidingDelayed() throws Throwable { 177 mInstrumentation.runOnMainSync(() -> { 178 createController(); 179 180 mController.setDozing(true); 181 mController.showTransientIndication("Test"); 182 mController.hideTransientIndicationDelayed(0); 183 }); 184 mInstrumentation.waitForIdleSync(); 185 186 Boolean[] held = new Boolean[1]; 187 mInstrumentation.runOnMainSync(() -> { 188 held[0] = mWakeLock.isHeld(); 189 }); 190 assertFalse("WakeLock expected: RELEASED, was: HELD", held[0]); 191 } 192} 193