1 /*
2  * Copyright (C) 2018 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 
17 package com.android.keyguard;
18 
19 import static org.junit.Assert.assertEquals;
20 import static org.junit.Assert.assertFalse;
21 import static org.junit.Assert.assertTrue;
22 import static org.mockito.ArgumentMatchers.any;
23 import static org.mockito.Mockito.mock;
24 import static org.mockito.Mockito.verify;
25 import static org.mockito.Mockito.when;
26 
27 import android.media.AudioManager;
28 import android.telephony.TelephonyManager;
29 import android.test.suitebuilder.annotation.SmallTest;
30 import android.testing.AndroidTestingRunner;
31 import android.testing.TestableLooper;
32 import android.testing.TestableResources;
33 import android.view.Gravity;
34 import android.view.ViewGroup;
35 import android.widget.FrameLayout;
36 
37 import com.android.systemui.R;
38 import com.android.systemui.SysuiTestCase;
39 import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
40 
41 import org.junit.Before;
42 import org.junit.Rule;
43 import org.junit.Test;
44 import org.junit.runner.RunWith;
45 import org.mockito.Mock;
46 import org.mockito.junit.MockitoJUnit;
47 import org.mockito.junit.MockitoRule;
48 
49 @SmallTest
50 @RunWith(AndroidTestingRunner.class)
51 @TestableLooper.RunWithLooper
52 public class KeyguardHostViewControllerTest extends SysuiTestCase {
53     @Mock
54     private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
55 
56     private KeyguardHostView mKeyguardHostView;
57     @Mock
58     private AudioManager mAudioManager;
59     @Mock
60     private TelephonyManager mTelephonyManager;
61     @Mock
62     private ViewMediatorCallback mViewMediatorCallback;
63     @Mock
64     KeyguardSecurityContainerController.Factory mKeyguardSecurityContainerControllerFactory;
65     @Mock
66     private KeyguardSecurityContainerController mKeyguardSecurityContainerController;
67 
68     @Rule
69     public MockitoRule mMockitoRule = MockitoJUnit.rule();
70 
71     private TestableResources mTestableResources;
72     private KeyguardHostViewController mKeyguardHostViewController;
73 
74     @Before
setup()75     public void setup() {
76         mTestableResources = mContext.getOrCreateTestableResources();
77 
78         mKeyguardHostView = new KeyguardHostView(mContext);
79 
80         // Explicitly disable one handed keyguard.
81         mTestableResources.addOverride(
82                 R.bool.can_use_one_handed_bouncer, false);
83         mTestableResources.addOverride(
84                 com.android.internal.R.bool.config_enableDynamicKeyguardPositioning, false);
85 
86         when(mKeyguardSecurityContainerControllerFactory.create(any(
87                 KeyguardSecurityContainer.SecurityCallback.class)))
88                 .thenReturn(mKeyguardSecurityContainerController);
89         mKeyguardHostViewController = new KeyguardHostViewController(
90                 mKeyguardHostView, mKeyguardUpdateMonitor, mAudioManager, mTelephonyManager,
91                 mViewMediatorCallback, mKeyguardSecurityContainerControllerFactory);
92     }
93 
94     @Test
testHasDismissActions()95     public void testHasDismissActions() {
96         assertFalse("Action not set yet", mKeyguardHostViewController.hasDismissActions());
97         mKeyguardHostViewController.setOnDismissAction(mock(OnDismissAction.class),
98                 null /* cancelAction */);
99         assertTrue("Action should exist", mKeyguardHostViewController.hasDismissActions());
100     }
101 
102     @Test
testOnStartingToHide()103     public void testOnStartingToHide() {
104         mKeyguardHostViewController.onStartingToHide();
105         verify(mKeyguardSecurityContainerController).onStartingToHide();
106     }
107 
108     @Test
testGravityReappliedOnConfigurationChange()109     public void testGravityReappliedOnConfigurationChange() {
110         FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
111                 ViewGroup.LayoutParams.MATCH_PARENT,
112                 ViewGroup.LayoutParams.MATCH_PARENT);
113         mKeyguardHostView.setLayoutParams(lp);
114 
115         // Set initial gravity
116         mTestableResources.addOverride(R.integer.keyguard_host_view_gravity,
117                 Gravity.CENTER);
118 
119         // Kick off the initial pass...
120         mKeyguardHostViewController.init();
121         assertEquals(
122                 ((FrameLayout.LayoutParams) mKeyguardHostView.getLayoutParams()).gravity,
123                 Gravity.CENTER);
124 
125         // Now simulate a config change
126         mTestableResources.addOverride(R.integer.keyguard_host_view_gravity,
127                 Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);
128 
129         mKeyguardHostViewController.updateResources();
130         assertEquals(
131                 ((FrameLayout.LayoutParams) mKeyguardHostView.getLayoutParams()).gravity,
132                 Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);
133     }
134 
135     @Test
testGravityUsesOneHandGravityWhenApplicable()136     public void testGravityUsesOneHandGravityWhenApplicable() {
137         FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
138                 ViewGroup.LayoutParams.MATCH_PARENT,
139                 ViewGroup.LayoutParams.MATCH_PARENT);
140         mKeyguardHostView.setLayoutParams(lp);
141 
142         mTestableResources.addOverride(
143                 R.integer.keyguard_host_view_gravity,
144                 Gravity.CENTER);
145         mTestableResources.addOverride(
146                 R.integer.keyguard_host_view_one_handed_gravity,
147                 Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);
148 
149         // Start disabled.
150         mTestableResources.addOverride(
151                 R.bool.can_use_one_handed_bouncer, false);
152         mTestableResources.addOverride(
153                 com.android.internal.R.bool.config_enableDynamicKeyguardPositioning, false);
154 
155         mKeyguardHostViewController.init();
156         assertEquals(
157                 ((FrameLayout.LayoutParams) mKeyguardHostView.getLayoutParams()).gravity,
158                 Gravity.CENTER);
159 
160         // And enable
161         mTestableResources.addOverride(
162                 R.bool.can_use_one_handed_bouncer, true);
163         mTestableResources.addOverride(
164                 com.android.internal.R.bool.config_enableDynamicKeyguardPositioning, true);
165 
166         mKeyguardHostViewController.updateResources();
167         assertEquals(
168                 ((FrameLayout.LayoutParams) mKeyguardHostView.getLayoutParams()).gravity,
169                 Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);
170     }
171 
172     @Test
testUpdateKeyguardPositionDelegatesToSecurityContainer()173     public void testUpdateKeyguardPositionDelegatesToSecurityContainer() {
174         mKeyguardHostViewController.updateKeyguardPosition(1.0f);
175 
176         verify(mKeyguardSecurityContainerController).updateKeyguardPosition(1.0f);
177     }
178 }
179