KeyguardIndicationControllerTest.java revision af45b60e90daf83c2a1d4428ccda7a5b6e9bd51c
124069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling/* 224069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling * Copyright (C) 2016 The Android Open Source Project 324069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling * 424069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling * Licensed under the Apache License, Version 2.0 (the "License"); 524069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling * you may not use this file except in compliance with the License. 624069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling * You may obtain a copy of the License at 724069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling * 824069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling * http://www.apache.org/licenses/LICENSE-2.0 924069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling * 1024069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling * Unless required by applicable law or agreed to in writing, software 1124069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling * distributed under the License is distributed on an "AS IS" BASIS, 1224069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1324069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling * See the License for the specific language governing permissions and 1424069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling * limitations under the License 1524069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling */ 1624069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling 1724069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingpackage com.android.systemui.statusbar; 1824069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling 1924069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport static org.junit.Assert.assertFalse; 2024069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport static org.junit.Assert.assertTrue; 2124069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport static org.mockito.Mockito.mock; 2224069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport static org.mockito.Mockito.reset; 2324069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport static org.mockito.Mockito.verify; 2424069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport static org.mockito.Mockito.verifyNoMoreInteractions; 2524069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport static org.mockito.Mockito.when; 2624069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling 2724069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport android.app.Instrumentation; 2824069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport android.app.admin.DevicePolicyManager; 2924069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport android.app.trust.TrustManager; 3024069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport android.content.Context; 3124069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport android.hardware.fingerprint.FingerprintManager; 3224069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport android.os.Looper; 3324069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport android.support.test.InstrumentationRegistry; 3424069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport android.support.test.filters.SmallTest; 3524069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport android.support.test.runner.AndroidJUnit4; 3624069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport android.view.View; 3724069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport android.view.ViewGroup; 3824069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling 3924069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport com.android.keyguard.KeyguardUpdateMonitorCallback; 4024069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport com.android.systemui.R; 4124069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport com.android.systemui.SysuiTestCase; 4224069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport com.android.systemui.statusbar.phone.KeyguardIndicationTextView; 4324069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport com.android.systemui.util.wakelock.WakeLockFake; 4424069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling 4524069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport org.junit.Before; 4624069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport org.junit.Test; 4724069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingimport org.junit.runner.RunWith; 4824069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling 4924069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling@SmallTest 5024069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling@RunWith(AndroidJUnit4.class) 5124069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberlingpublic class KeyguardIndicationControllerTest extends SysuiTestCase { 5224069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling 5324069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling private final String ORGANIZATION_NAME = "organization"; 544361352633d1e106c1574c02ddd27c8891c5ee78Shashi Shekhar 554361352633d1e106c1574c02ddd27c8891c5ee78Shashi Shekhar private String mDisclosureWithOrganization; 5624069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling 5724069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling private DevicePolicyManager mDevicePolicyManager = mock(DevicePolicyManager.class); 5824069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling private ViewGroup mIndicationArea = mock(ViewGroup.class); 5924069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling private KeyguardIndicationTextView mDisclosure = mock(KeyguardIndicationTextView.class); 6024069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling 6124069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling private KeyguardIndicationController mController; 624361352633d1e106c1574c02ddd27c8891c5ee78Shashi Shekhar private WakeLockFake mWakeLock; 634361352633d1e106c1574c02ddd27c8891c5ee78Shashi Shekhar private Instrumentation mInstrumentation; 6424069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling 6524069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling @Before 6624069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling public void setUp() throws Exception { 674361352633d1e106c1574c02ddd27c8891c5ee78Shashi Shekhar mInstrumentation = InstrumentationRegistry.getInstrumentation(); 6824069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling 694361352633d1e106c1574c02ddd27c8891c5ee78Shashi Shekhar mContext.addMockSystemService(Context.DEVICE_POLICY_SERVICE, mDevicePolicyManager); 704361352633d1e106c1574c02ddd27c8891c5ee78Shashi Shekhar mContext.addMockSystemService(Context.TRUST_SERVICE, mock(TrustManager.class)); 714361352633d1e106c1574c02ddd27c8891c5ee78Shashi Shekhar mContext.addMockSystemService(Context.FINGERPRINT_SERVICE, mock(FingerprintManager.class)); 724361352633d1e106c1574c02ddd27c8891c5ee78Shashi Shekhar mDisclosureWithOrganization = mContext.getString(R.string.do_disclosure_with_name, 734361352633d1e106c1574c02ddd27c8891c5ee78Shashi Shekhar ORGANIZATION_NAME); 744361352633d1e106c1574c02ddd27c8891c5ee78Shashi Shekhar 754361352633d1e106c1574c02ddd27c8891c5ee78Shashi Shekhar when(mIndicationArea.findViewById(R.id.keyguard_indication_enterprise_disclosure)) 7624069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling .thenReturn(mDisclosure); 774361352633d1e106c1574c02ddd27c8891c5ee78Shashi Shekhar 784361352633d1e106c1574c02ddd27c8891c5ee78Shashi Shekhar mWakeLock = new WakeLockFake(); 794361352633d1e106c1574c02ddd27c8891c5ee78Shashi Shekhar } 804361352633d1e106c1574c02ddd27c8891c5ee78Shashi Shekhar 8124069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling private void createController() { 8224069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling if (Looper.myLooper() == null) { 8324069e7a9cc9b4f908f18a71301285ccf5e164f6Sascha Haeberling 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