blob: 64acdcc30a12ea6c99be181561a339171321bff6 [file] [log] [blame]
Chris Wren65a70c92020-04-02 10:43:46 -04001/*
2 * Copyright (C) 2020 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 com.android.systemui.globalactions;
18
Aran Inkcf038272020-03-31 17:48:37 -040019import static junit.framework.Assert.assertEquals;
20
21import static org.mockito.ArgumentMatchers.any;
22import static org.mockito.Mockito.doReturn;
23import static org.mockito.Mockito.spy;
Chris Wren65a70c92020-04-02 10:43:46 -040024import static org.mockito.Mockito.times;
25import static org.mockito.Mockito.verify;
Fabian Kozynskib6a20372020-04-01 09:36:43 -040026import static org.mockito.Mockito.when;
Chris Wren65a70c92020-04-02 10:43:46 -040027
28import android.app.IActivityManager;
29import android.app.admin.DevicePolicyManager;
30import android.app.trust.TrustManager;
31import android.content.ContentResolver;
32import android.content.res.Resources;
33import android.media.AudioManager;
34import android.net.ConnectivityManager;
Matt Pietal677981d2020-04-24 14:38:32 -040035import android.os.Handler;
Chris Wren65a70c92020-04-02 10:43:46 -040036import android.os.UserManager;
37import android.service.dreams.IDreamManager;
38import android.telephony.TelephonyManager;
39import android.testing.AndroidTestingRunner;
40import android.testing.TestableLooper;
Chris Wrenaf4ce8462020-04-06 17:36:10 -040041import android.util.FeatureFlagUtils;
Chris Wren65a70c92020-04-02 10:43:46 -040042import android.view.IWindowManager;
43
44import androidx.test.filters.SmallTest;
45
46import com.android.internal.logging.MetricsLogger;
47import com.android.internal.logging.UiEventLogger;
48import com.android.internal.statusbar.IStatusBarService;
49import com.android.internal.widget.LockPatternUtils;
50import com.android.systemui.SysuiTestCase;
51import com.android.systemui.broadcast.BroadcastDispatcher;
52import com.android.systemui.colorextraction.SysuiColorExtractor;
53import com.android.systemui.controls.controller.ControlsController;
54import com.android.systemui.controls.management.ControlsListingController;
55import com.android.systemui.controls.ui.ControlsUiController;
56import com.android.systemui.plugins.ActivityStarter;
57import com.android.systemui.plugins.GlobalActions;
58import com.android.systemui.statusbar.BlurUtils;
59import com.android.systemui.statusbar.NotificationShadeDepthController;
60import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
61import com.android.systemui.statusbar.policy.ConfigurationController;
62import com.android.systemui.statusbar.policy.KeyguardStateController;
Fabian Kozynskib6a20372020-04-01 09:36:43 -040063import com.android.systemui.util.RingerModeLiveData;
64import com.android.systemui.util.RingerModeTracker;
Chris Wren65a70c92020-04-02 10:43:46 -040065
66import org.junit.Before;
67import org.junit.Test;
68import org.junit.runner.RunWith;
69import org.mockito.Mock;
70import org.mockito.MockitoAnnotations;
71
72import java.util.concurrent.Executor;
73
74@SmallTest
75@RunWith(AndroidTestingRunner.class)
Chris Wrenaf4ce8462020-04-06 17:36:10 -040076@TestableLooper.RunWithLooper()
Chris Wren65a70c92020-04-02 10:43:46 -040077public class GlobalActionsDialogTest extends SysuiTestCase {
78 private GlobalActionsDialog mGlobalActionsDialog;
79
80 @Mock private GlobalActions.GlobalActionsManager mWindowManagerFuncs;
81 @Mock private AudioManager mAudioManager;
82 @Mock private IDreamManager mDreamManager;
83 @Mock private DevicePolicyManager mDevicePolicyManager;
84 @Mock private LockPatternUtils mLockPatternUtils;
85 @Mock private BroadcastDispatcher mBroadcastDispatcher;
86 @Mock private ConnectivityManager mConnectivityManager;
87 @Mock private TelephonyManager mTelephonyManager;
88 @Mock private ContentResolver mContentResolver;
89 @Mock private Resources mResources;
90 @Mock private ConfigurationController mConfigurationController;
91 @Mock private ActivityStarter mActivityStarter;
92 @Mock private KeyguardStateController mKeyguardStateController;
93 @Mock private UserManager mUserManager;
94 @Mock private TrustManager mTrustManager;
95 @Mock private IActivityManager mActivityManager;
96 @Mock private MetricsLogger mMetricsLogger;
97 @Mock private NotificationShadeDepthController mDepthController;
98 @Mock private SysuiColorExtractor mColorExtractor;
99 @Mock private IStatusBarService mStatusBarService;
100 @Mock private BlurUtils mBlurUtils;
101 @Mock private NotificationShadeWindowController mNotificationShadeWindowController;
102 @Mock private ControlsUiController mControlsUiController;
103 @Mock private IWindowManager mWindowManager;
104 @Mock private Executor mBackgroundExecutor;
105 @Mock private ControlsListingController mControlsListingController;
106 @Mock private ControlsController mControlsController;
107 @Mock private UiEventLogger mUiEventLogger;
Fabian Kozynskib6a20372020-04-01 09:36:43 -0400108 @Mock private RingerModeTracker mRingerModeTracker;
109 @Mock private RingerModeLiveData mRingerModeLiveData;
Matt Pietal677981d2020-04-24 14:38:32 -0400110 @Mock private Handler mHandler;
Chris Wren65a70c92020-04-02 10:43:46 -0400111
112 private TestableLooper mTestableLooper;
113
114 @Before
115 public void setUp() throws Exception {
116 MockitoAnnotations.initMocks(this);
117 mTestableLooper = TestableLooper.get(this);
118 allowTestableLooperAsMainThread();
Fabian Kozynskib6a20372020-04-01 09:36:43 -0400119
120 when(mRingerModeTracker.getRingerMode()).thenReturn(mRingerModeLiveData);
Chris Wren65a70c92020-04-02 10:43:46 -0400121 mGlobalActionsDialog = new GlobalActionsDialog(mContext,
122 mWindowManagerFuncs,
123 mAudioManager,
124 mDreamManager,
125 mDevicePolicyManager,
126 mLockPatternUtils,
127 mBroadcastDispatcher,
128 mConnectivityManager,
129 mTelephonyManager,
130 mContentResolver,
131 null,
132 mResources,
133 mConfigurationController,
134 mActivityStarter,
135 mKeyguardStateController,
136 mUserManager,
137 mTrustManager,
138 mActivityManager,
139 null,
140 mMetricsLogger,
141 mDepthController,
142 mColorExtractor,
143 mStatusBarService,
144 mBlurUtils,
145 mNotificationShadeWindowController,
146 mControlsUiController,
147 mWindowManager,
148 mBackgroundExecutor,
149 mControlsListingController,
150 mControlsController,
Fabian Kozynskib6a20372020-04-01 09:36:43 -0400151 mUiEventLogger,
Matt Pietal677981d2020-04-24 14:38:32 -0400152 mRingerModeTracker,
153 mHandler
Chris Wren65a70c92020-04-02 10:43:46 -0400154 );
Chris Wrenaf4ce8462020-04-06 17:36:10 -0400155 mGlobalActionsDialog.setZeroDialogPressDelayForTesting();
Chris Wren65a70c92020-04-02 10:43:46 -0400156 }
Chris Wrenaf4ce8462020-04-06 17:36:10 -0400157
Chris Wren65a70c92020-04-02 10:43:46 -0400158 @Test
159 public void testShouldLogVisibility() {
160 mGlobalActionsDialog.onShow(null);
Chris Wrenaf4ce8462020-04-06 17:36:10 -0400161 mTestableLooper.processAllMessages();
162 verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_POWER_MENU_OPEN);
163 }
164
165 @Test
166 public void testShouldLogBugreportPress() throws InterruptedException {
167 GlobalActionsDialog.BugReportAction bugReportAction =
168 mGlobalActionsDialog.makeBugReportActionForTesting();
169 bugReportAction.onPress();
170 verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_BUGREPORT_PRESS);
171 }
172
173 @Test
174 public void testShouldLogBugreportLongPress() {
175 GlobalActionsDialog.BugReportAction bugReportAction =
176 mGlobalActionsDialog.makeBugReportActionForTesting();
177 bugReportAction.onLongPress();
178 verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_BUGREPORT_LONG_PRESS);
179 }
180
181 @Test
182 public void testShouldLogEmergencyDialerPress() {
183 GlobalActionsDialog.EmergencyDialerAction emergencyDialerAction =
184 mGlobalActionsDialog.makeEmergencyDialerActionForTesting();
185 emergencyDialerAction.onPress();
186 verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_EMERGENCY_DIALER_PRESS);
187 }
188
189 @Test
190 public void testShouldLogScreenshotPress() {
191 GlobalActionsDialog.ScreenshotAction screenshotAction =
192 mGlobalActionsDialog.makeScreenshotActionForTesting();
193 screenshotAction.onPress();
194 verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_SCREENSHOT_PRESS);
195 }
196
197 @Test
198 public void testShouldLogScreenshotLongPress() {
199 FeatureFlagUtils.setEnabled(mContext, FeatureFlagUtils.SCREENRECORD_LONG_PRESS, true);
200 GlobalActionsDialog.ScreenshotAction screenshotAction =
201 mGlobalActionsDialog.makeScreenshotActionForTesting();
202 screenshotAction.onLongPress();
203 verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_SCREENSHOT_LONG_PRESS);
204 }
205
206 private void verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent event) {
207 mTestableLooper.processAllMessages();
Chris Wren65a70c92020-04-02 10:43:46 -0400208 verify(mUiEventLogger, times(1))
Chris Wrenaf4ce8462020-04-06 17:36:10 -0400209 .log(event);
Chris Wren65a70c92020-04-02 10:43:46 -0400210 }
Aran Inkcf038272020-03-31 17:48:37 -0400211
212 @Test
213 public void testCreateActionItems_maxThree() {
214 mGlobalActionsDialog = spy(mGlobalActionsDialog);
215 // allow 3 items to be shown
216 doReturn(3).when(mGlobalActionsDialog).getMaxShownPowerItems();
217 // ensure items are not blocked by keyguard or device provisioning
218 doReturn(true).when(mGlobalActionsDialog).shouldShowAction(any());
219 String[] actions = {
220 GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY,
221 GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER,
222 GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART,
223 GlobalActionsDialog.GLOBAL_ACTION_KEY_SCREENSHOT,
224 };
225 doReturn(actions).when(mGlobalActionsDialog).getDefaultActions();
226 mGlobalActionsDialog.createActionItems();
227
228 assertEquals(3, mGlobalActionsDialog.mItems.size());
229 assertEquals(1, mGlobalActionsDialog.mOverflowItems.size());
230 }
231
232 @Test
233 public void testCreateActionItems_maxAny() {
234 mGlobalActionsDialog = spy(mGlobalActionsDialog);
235 // allow any number of power menu items to be shown
236 doReturn(Integer.MAX_VALUE).when(mGlobalActionsDialog).getMaxShownPowerItems();
237 // ensure items are not blocked by keyguard or device provisioning
238 doReturn(true).when(mGlobalActionsDialog).shouldShowAction(any());
239 String[] actions = {
240 GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY,
241 GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER,
242 GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART,
243 GlobalActionsDialog.GLOBAL_ACTION_KEY_SCREENSHOT,
244 };
245 doReturn(actions).when(mGlobalActionsDialog).getDefaultActions();
246 mGlobalActionsDialog.createActionItems();
247
248 assertEquals(4, mGlobalActionsDialog.mItems.size());
249 assertEquals(0, mGlobalActionsDialog.mOverflowItems.size());
250 }
251
252 @Test
253 public void testCreateActionItems_maxThree_itemNotShown() {
254 mGlobalActionsDialog = spy(mGlobalActionsDialog);
255 // allow only 3 items to be shown
256 doReturn(3).when(mGlobalActionsDialog).getMaxShownPowerItems();
257 String[] actions = {
258 GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY,
259 // screenshot blocked because device not provisioned
260 GlobalActionsDialog.GLOBAL_ACTION_KEY_SCREENSHOT,
261 GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER,
262 GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART,
263 };
264 doReturn(actions).when(mGlobalActionsDialog).getDefaultActions();
265 mGlobalActionsDialog.createActionItems();
266
267 assertEquals(3, mGlobalActionsDialog.mItems.size());
268 assertEquals(0, mGlobalActionsDialog.mOverflowItems.size());
269 }
Chris Wren65a70c92020-04-02 10:43:46 -0400270}