15f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski/* 25f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski * Copyright (C) 2016 The Android Open Source Project 35f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski * 45f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski * Licensed under the Apache License, Version 2.0 (the "License"); 55f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski * you may not use this file except in compliance with the License. 65f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski * You may obtain a copy of the License at 75f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski * 85f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski * http://www.apache.org/licenses/LICENSE-2.0 95f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski * 105f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski * Unless required by applicable law or agreed to in writing, software 115f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski * distributed under the License is distributed on an "AS IS" BASIS, 125f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski * See the License for the specific language governing permissions and 145f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski * limitations under the License 155f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski */ 165f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 175f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowskipackage com.android.systemui.statusbar; 185f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 19c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roosimport static org.junit.Assert.assertFalse; 20c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roosimport static org.junit.Assert.assertTrue; 213cfedd78b1e3704481de27d7354cb29b2fb43781Jason Monkimport static org.mockito.Mockito.mock; 223cfedd78b1e3704481de27d7354cb29b2fb43781Jason Monkimport static org.mockito.Mockito.reset; 233cfedd78b1e3704481de27d7354cb29b2fb43781Jason Monkimport static org.mockito.Mockito.verify; 243cfedd78b1e3704481de27d7354cb29b2fb43781Jason Monkimport static org.mockito.Mockito.verifyNoMoreInteractions; 253cfedd78b1e3704481de27d7354cb29b2fb43781Jason Monkimport static org.mockito.Mockito.when; 263cfedd78b1e3704481de27d7354cb29b2fb43781Jason Monk 27c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roosimport android.app.Instrumentation; 285f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowskiimport android.app.admin.DevicePolicyManager; 295f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowskiimport android.app.trust.TrustManager; 305f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowskiimport android.content.Context; 313cfedd78b1e3704481de27d7354cb29b2fb43781Jason Monkimport android.hardware.fingerprint.FingerprintManager; 325f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowskiimport android.os.Looper; 33c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roosimport android.support.test.InstrumentationRegistry; 34c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roosimport android.support.test.filters.SmallTest; 355f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowskiimport android.support.test.runner.AndroidJUnit4; 365f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowskiimport android.view.View; 375f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowskiimport android.view.ViewGroup; 385f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 39af45b60e90daf83c2a1d4428ccda7a5b6e9bd51cAdrian Roosimport com.android.keyguard.KeyguardUpdateMonitorCallback; 405f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowskiimport com.android.systemui.R; 415f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowskiimport com.android.systemui.SysuiTestCase; 425f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowskiimport com.android.systemui.statusbar.phone.KeyguardIndicationTextView; 43c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roosimport com.android.systemui.util.wakelock.WakeLockFake; 445f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 455f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowskiimport org.junit.Before; 465f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowskiimport org.junit.Test; 475f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowskiimport org.junit.runner.RunWith; 485f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 495f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski@SmallTest 505f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski@RunWith(AndroidJUnit4.class) 515f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowskipublic class KeyguardIndicationControllerTest extends SysuiTestCase { 525f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 535f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski private final String ORGANIZATION_NAME = "organization"; 545f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 553cfedd78b1e3704481de27d7354cb29b2fb43781Jason Monk private String mDisclosureWithOrganization; 563cfedd78b1e3704481de27d7354cb29b2fb43781Jason Monk 575f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski private DevicePolicyManager mDevicePolicyManager = mock(DevicePolicyManager.class); 585f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski private ViewGroup mIndicationArea = mock(ViewGroup.class); 595f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski private KeyguardIndicationTextView mDisclosure = mock(KeyguardIndicationTextView.class); 605f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 615f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski private KeyguardIndicationController mController; 62c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos private WakeLockFake mWakeLock; 63c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos private Instrumentation mInstrumentation; 645f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 655f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski @Before 665f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski public void setUp() throws Exception { 67c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos mInstrumentation = InstrumentationRegistry.getInstrumentation(); 68c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos 693cfedd78b1e3704481de27d7354cb29b2fb43781Jason Monk mContext.addMockSystemService(Context.DEVICE_POLICY_SERVICE, mDevicePolicyManager); 703cfedd78b1e3704481de27d7354cb29b2fb43781Jason Monk mContext.addMockSystemService(Context.TRUST_SERVICE, mock(TrustManager.class)); 713cfedd78b1e3704481de27d7354cb29b2fb43781Jason Monk mContext.addMockSystemService(Context.FINGERPRINT_SERVICE, mock(FingerprintManager.class)); 723cfedd78b1e3704481de27d7354cb29b2fb43781Jason Monk mDisclosureWithOrganization = mContext.getString(R.string.do_disclosure_with_name, 733cfedd78b1e3704481de27d7354cb29b2fb43781Jason Monk ORGANIZATION_NAME); 745f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 755f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski when(mIndicationArea.findViewById(R.id.keyguard_indication_enterprise_disclosure)) 765f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski .thenReturn(mDisclosure); 77c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos 78c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos mWakeLock = new WakeLockFake(); 795f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski } 805f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 815f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski private void createController() { 825f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski if (Looper.myLooper() == null) { 835f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski Looper.prepare(); 845f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski } 85c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos mController = new KeyguardIndicationController(mContext, mIndicationArea, null, mWakeLock); 865f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski } 875f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 885f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski @Test 895f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski public void unmanaged() { 905f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski when(mDevicePolicyManager.isDeviceManaged()).thenReturn(false); 915f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski createController(); 925f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 935f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski verify(mDisclosure).setVisibility(View.GONE); 945f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski verifyNoMoreInteractions(mDisclosure); 955f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski } 965f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 975f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski @Test 985f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski public void managedNoOwnerName() { 995f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true); 1005f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(null); 1015f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski createController(); 1025f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 1035f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski verify(mDisclosure).setVisibility(View.VISIBLE); 1045f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski verify(mDisclosure).switchIndication(R.string.do_disclosure_generic); 1055f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski verifyNoMoreInteractions(mDisclosure); 1065f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski } 1075f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 1085f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski @Test 1095f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski public void managedOwnerName() { 1105f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true); 1115f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(ORGANIZATION_NAME); 1125f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski createController(); 1135f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 1145f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski verify(mDisclosure).setVisibility(View.VISIBLE); 1153cfedd78b1e3704481de27d7354cb29b2fb43781Jason Monk verify(mDisclosure).switchIndication(mDisclosureWithOrganization); 1165f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski verifyNoMoreInteractions(mDisclosure); 1175f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski } 1185f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 1195f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski @Test 1205f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski public void updateOnTheFly() { 1215f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski when(mDevicePolicyManager.isDeviceManaged()).thenReturn(false); 1225f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski createController(); 1235f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 124af45b60e90daf83c2a1d4428ccda7a5b6e9bd51cAdrian Roos final KeyguardUpdateMonitorCallback monitor = mController.getKeyguardCallback(); 1255f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski reset(mDisclosure); 1265f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 1275f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true); 1285f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(null); 1295f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski monitor.onKeyguardVisibilityChanged(true); 1305f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 1315f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski verify(mDisclosure).setVisibility(View.VISIBLE); 1325f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski verify(mDisclosure).switchIndication(R.string.do_disclosure_generic); 1335f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski verifyNoMoreInteractions(mDisclosure); 1345f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski reset(mDisclosure); 1355f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 1365f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true); 1375f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(ORGANIZATION_NAME); 1385f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski monitor.onKeyguardVisibilityChanged(false); 1395f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski monitor.onKeyguardVisibilityChanged(true); 1405f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 1415f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski verify(mDisclosure).setVisibility(View.VISIBLE); 1423cfedd78b1e3704481de27d7354cb29b2fb43781Jason Monk verify(mDisclosure).switchIndication(mDisclosureWithOrganization); 1435f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski verifyNoMoreInteractions(mDisclosure); 1445f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski reset(mDisclosure); 1455f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 1465f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski when(mDevicePolicyManager.isDeviceManaged()).thenReturn(false); 1475f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski monitor.onKeyguardVisibilityChanged(false); 1485f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski monitor.onKeyguardVisibilityChanged(true); 1495f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski 1505f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski verify(mDisclosure).setVisibility(View.GONE); 1515f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski verifyNoMoreInteractions(mDisclosure); 1525f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski } 153c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos 154c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos @Test 155c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos public void transientIndication_holdsWakeLock_whenDozing() { 156c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos createController(); 157c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos 158c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos mController.setDozing(true); 159c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos mController.showTransientIndication("Test"); 160c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos 161c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos assertTrue(mWakeLock.isHeld()); 162c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos } 163c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos 164c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos @Test 165c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos public void transientIndication_releasesWakeLock_afterHiding() { 166c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos createController(); 167c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos 168c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos mController.setDozing(true); 169c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos mController.showTransientIndication("Test"); 170c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos mController.hideTransientIndication(); 171c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos 172c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos assertFalse(mWakeLock.isHeld()); 173c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos } 174c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos 175c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos @Test 176c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos public void transientIndication_releasesWakeLock_afterHidingDelayed() throws Throwable { 177c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos mInstrumentation.runOnMainSync(() -> { 178c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos createController(); 179c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos 180c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos mController.setDozing(true); 181c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos mController.showTransientIndication("Test"); 182c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos mController.hideTransientIndicationDelayed(0); 183c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos }); 184c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos mInstrumentation.waitForIdleSync(); 185c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos 186af45b60e90daf83c2a1d4428ccda7a5b6e9bd51cAdrian Roos Boolean[] held = new Boolean[1]; 187c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos mInstrumentation.runOnMainSync(() -> { 188c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos held[0] = mWakeLock.isHeld(); 189c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos }); 190af45b60e90daf83c2a1d4428ccda7a5b6e9bd51cAdrian Roos assertFalse("WakeLock expected: RELEASED, was: HELD", held[0]); 191c1b50324a2286b24b691b8a7190743cbc341727eAdrian Roos } 1925f045007e0cb98d3bc0e6d9a0f0c88e307f2834bBartosz Fabianowski} 193