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