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