1/*
2 * Copyright (C) 2017 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 android.server.am;
18
19import static android.server.am.ActivityManagerState.STATE_RESUMED;
20import static android.server.am.ActivityManagerState.STATE_STOPPED;
21import static android.server.am.Components.DISMISS_KEYGUARD_ACTIVITY;
22import static android.server.am.Components.SHOW_WHEN_LOCKED_ACTIVITY;
23import static android.server.am.Components.TEST_ACTIVITY;
24import static android.server.am.Components.VIRTUAL_DISPLAY_ACTIVITY;
25
26import static org.junit.Assume.assumeTrue;
27
28import android.server.am.ActivityManagerState.ActivityDisplay;
29
30import org.junit.Before;
31import org.junit.Test;
32
33/**
34 * Display tests that require a locked keyguard.
35 *
36 * <p>Build/Install/Run:
37 *     atest CtsActivityManagerDeviceTestCases:ActivityManagerDisplayLockedKeyguardTests
38 */
39public class ActivityManagerDisplayLockedKeyguardTests extends ActivityManagerDisplayTestBase {
40
41    @Before
42    @Override
43    public void setUp() throws Exception {
44        super.setUp();
45
46        assumeTrue(supportsMultiDisplay());
47        assumeTrue(supportsSecureLock());
48    }
49
50    /**
51     * Test that virtual display content is hidden when device is locked.
52     */
53    @Test
54    public void testVirtualDisplayHidesContentWhenLocked() throws Exception {
55        try (final VirtualDisplaySession virtualDisplaySession = new VirtualDisplaySession();
56             final LockScreenSession lockScreenSession = new LockScreenSession()) {
57            lockScreenSession.setLockCredential();
58
59            // Create new usual virtual display.
60            final ActivityDisplay newDisplay = virtualDisplaySession.createDisplay();
61            mAmWmState.assertVisibility(VIRTUAL_DISPLAY_ACTIVITY, true /* visible */);
62
63            // Launch activity on new secondary display.
64            launchActivityOnDisplay(TEST_ACTIVITY, newDisplay.mId);
65            mAmWmState.assertVisibility(TEST_ACTIVITY, true /* visible */);
66
67            // Lock the device.
68            lockScreenSession.gotoKeyguard();
69            mAmWmState.waitForActivityState(TEST_ACTIVITY, STATE_STOPPED);
70            mAmWmState.assertVisibility(TEST_ACTIVITY, false /* visible */);
71
72            // Unlock and check if visibility is back.
73            lockScreenSession.unlockDevice()
74                    .enterAndConfirmLockCredential();
75            mAmWmState.waitForKeyguardGone();
76            mAmWmState.waitForActivityState(TEST_ACTIVITY, STATE_RESUMED);
77            mAmWmState.assertVisibility(TEST_ACTIVITY, true /* visible */);
78        }
79    }
80
81    /**
82     * Tests whether a FLAG_DISMISS_KEYGUARD activity on a secondary display dismisses the keyguard.
83     */
84    @Test
85    public void testDismissKeyguard_secondaryDisplay() throws Exception {
86        try (final VirtualDisplaySession virtualDisplaySession = new VirtualDisplaySession();
87             final LockScreenSession lockScreenSession = new LockScreenSession()) {
88            lockScreenSession.setLockCredential();
89            final ActivityDisplay newDisplay = virtualDisplaySession.createDisplay();
90
91            lockScreenSession.gotoKeyguard();
92            mAmWmState.assertKeyguardShowingAndNotOccluded();
93            launchActivityOnDisplay(DISMISS_KEYGUARD_ACTIVITY, newDisplay.mId);
94            lockScreenSession.enterAndConfirmLockCredential();
95            mAmWmState.waitForKeyguardGone();
96            mAmWmState.assertKeyguardGone();
97            mAmWmState.assertVisibility(DISMISS_KEYGUARD_ACTIVITY, true);
98        }
99    }
100
101    @Test
102    public void testDismissKeyguard_whileOccluded_secondaryDisplay() throws Exception {
103        try (final VirtualDisplaySession virtualDisplaySession = new VirtualDisplaySession();
104             final LockScreenSession lockScreenSession = new LockScreenSession()) {
105            lockScreenSession.setLockCredential();
106            final ActivityDisplay newDisplay = virtualDisplaySession.createDisplay();
107
108            lockScreenSession.gotoKeyguard();
109            mAmWmState.assertKeyguardShowingAndNotOccluded();
110            launchActivity(SHOW_WHEN_LOCKED_ACTIVITY);
111            mAmWmState.computeState(SHOW_WHEN_LOCKED_ACTIVITY);
112            mAmWmState.assertVisibility(SHOW_WHEN_LOCKED_ACTIVITY, true);
113            launchActivityOnDisplay(DISMISS_KEYGUARD_ACTIVITY, newDisplay.mId);
114            lockScreenSession.enterAndConfirmLockCredential();
115            mAmWmState.waitForKeyguardGone();
116            mAmWmState.assertKeyguardGone();
117            mAmWmState.assertVisibility(DISMISS_KEYGUARD_ACTIVITY, true);
118            mAmWmState.assertVisibility(SHOW_WHEN_LOCKED_ACTIVITY, true);
119        }
120    }
121}
122