1 /* 2 * Copyright (C) 2016 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.settings.gestures; 18 19 import static android.provider.Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED; 20 import static android.provider.Settings.Secure.DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED; 21 22 import static com.android.settings.gestures.DoubleTapPowerPreferenceController.isSuggestionComplete; 23 import static com.android.settings.gestures.DoubleTapPowerSettingsUtils.DOUBLE_TAP_POWER_DISABLED_MODE; 24 import static com.android.settings.gestures.DoubleTapPowerSettingsUtils.DOUBLE_TAP_POWER_LAUNCH_CAMERA_MODE; 25 import static com.android.settings.gestures.DoubleTapPowerSettingsUtils.DOUBLE_TAP_POWER_MULTI_TARGET_MODE; 26 import static com.android.settings.gestures.DoubleTapPowerToOpenCameraPreferenceController.OFF; 27 import static com.android.settings.gestures.DoubleTapPowerToOpenCameraPreferenceController.ON; 28 29 import static com.google.common.truth.Truth.assertThat; 30 31 import static org.mockito.Mockito.mock; 32 import static org.mockito.Mockito.when; 33 34 import android.content.ContentResolver; 35 import android.content.Context; 36 import android.content.SharedPreferences; 37 import android.platform.test.annotations.DisableFlags; 38 import android.platform.test.annotations.EnableFlags; 39 import android.platform.test.flag.junit.SetFlagsRule; 40 import android.provider.Settings; 41 import android.service.quickaccesswallet.Flags; 42 import android.text.TextUtils; 43 44 import androidx.preference.Preference; 45 import androidx.preference.PreferenceScreen; 46 47 import com.android.settings.R; 48 import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl; 49 import com.android.settings.testutils.shadow.SettingsShadowResources; 50 51 import org.junit.After; 52 import org.junit.Before; 53 import org.junit.Rule; 54 import org.junit.Test; 55 import org.junit.runner.RunWith; 56 import org.robolectric.RobolectricTestRunner; 57 import org.robolectric.RuntimeEnvironment; 58 import org.robolectric.annotation.Config; 59 60 @RunWith(RobolectricTestRunner.class) 61 @Config(shadows = SettingsShadowResources.class) 62 public class DoubleTapPowerPreferenceControllerTest { 63 64 @Rule 65 public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); 66 private Context mContext; 67 private ContentResolver mContentResolver; 68 private DoubleTapPowerPreferenceController mController; 69 private Preference mPreference; 70 private PreferenceScreen mScreen; 71 private static final String KEY_DOUBLE_TAP_POWER = "gesture_double_tap_power"; 72 73 @Before setUp()74 public void setUp() { 75 mContext = RuntimeEnvironment.getApplication(); 76 mContentResolver = mContext.getContentResolver(); 77 mController = new DoubleTapPowerPreferenceController(mContext, KEY_DOUBLE_TAP_POWER); 78 mPreference = new Preference(mContext); 79 mScreen = mock(PreferenceScreen.class); 80 when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); 81 } 82 83 @After tearDown()84 public void tearDown() { 85 SettingsShadowResources.reset(); 86 } 87 88 @Test 89 @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) isAvailable_flagEnabled_configIsMultiTargetMode_returnsTrue()90 public void isAvailable_flagEnabled_configIsMultiTargetMode_returnsTrue() { 91 SettingsShadowResources.overrideResource( 92 com.android.internal.R.integer.config_doubleTapPowerGestureMode, 93 DOUBLE_TAP_POWER_MULTI_TARGET_MODE); 94 95 assertThat(mController.isAvailable()).isTrue(); 96 } 97 98 @Test 99 @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) isAvailable_flagEnabled_configIsCameraLaunchMode_returnsTrue()100 public void isAvailable_flagEnabled_configIsCameraLaunchMode_returnsTrue() { 101 SettingsShadowResources.overrideResource( 102 com.android.internal.R.integer.config_doubleTapPowerGestureMode, 103 DOUBLE_TAP_POWER_LAUNCH_CAMERA_MODE); 104 105 assertThat(mController.isAvailable()).isTrue(); 106 } 107 108 @Test 109 @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) isAvailable_flagEnabled_configIsDisabledMode_returnsFalse()110 public void isAvailable_flagEnabled_configIsDisabledMode_returnsFalse() { 111 SettingsShadowResources.overrideResource( 112 com.android.internal.R.integer.config_doubleTapPowerGestureMode, 113 DOUBLE_TAP_POWER_DISABLED_MODE); 114 115 assertThat(mController.isAvailable()).isFalse(); 116 } 117 118 @Test 119 @DisableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) isAvailable_flagDisabled_configIsTrue_returnsTrue()120 public void isAvailable_flagDisabled_configIsTrue_returnsTrue() { 121 SettingsShadowResources.overrideResource( 122 com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled, 123 Boolean.TRUE); 124 125 assertThat(mController.isAvailable()).isTrue(); 126 } 127 128 @Test 129 @DisableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) isAvailable_flagDisabled_configIsFalse_returnsFalse()130 public void isAvailable_flagDisabled_configIsFalse_returnsFalse() { 131 SettingsShadowResources.overrideResource( 132 com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled, 133 Boolean.FALSE); 134 135 assertThat(mController.isAvailable()).isFalse(); 136 } 137 138 @Test 139 @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) isSuggestionCompleted_flagEnabled_configIsMultiTargetMode_trueWhenNotAvailable()140 public void isSuggestionCompleted_flagEnabled_configIsMultiTargetMode_trueWhenNotAvailable() { 141 SettingsShadowResources.overrideResource( 142 com.android.internal.R.integer.config_doubleTapPowerGestureMode, 143 DOUBLE_TAP_POWER_DISABLED_MODE); 144 145 assertThat(isSuggestionComplete(mContext, null /* prefs */)).isTrue(); 146 } 147 148 @Test 149 @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) isSuggestionCompleted_enableFlag_configIsMultiTargetMode_falseWhenNotVisited()150 public void isSuggestionCompleted_enableFlag_configIsMultiTargetMode_falseWhenNotVisited() { 151 SettingsShadowResources.overrideResource( 152 com.android.internal.R.integer.config_doubleTapPowerGestureMode, 153 DOUBLE_TAP_POWER_MULTI_TARGET_MODE); 154 // No stored value in shared preferences if not visited yet. 155 final SharedPreferences prefs = 156 new SuggestionFeatureProviderImpl().getSharedPrefs(mContext); 157 158 assertThat(isSuggestionComplete(mContext, prefs)).isFalse(); 159 } 160 161 @Test 162 @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) isSuggestionCompleted_enableFlag_configIsMultiTargetMode_trueWhenVisited()163 public void isSuggestionCompleted_enableFlag_configIsMultiTargetMode_trueWhenVisited() { 164 SettingsShadowResources.overrideResource( 165 com.android.internal.R.integer.config_doubleTapPowerGestureMode, 166 DOUBLE_TAP_POWER_MULTI_TARGET_MODE); 167 // No stored value in shared preferences if not visited yet. 168 final SharedPreferences prefs = 169 new SuggestionFeatureProviderImpl().getSharedPrefs(mContext); 170 prefs.edit().putBoolean(DoubleTapPowerSettings.PREF_KEY_SUGGESTION_COMPLETE, true).commit(); 171 172 assertThat(isSuggestionComplete(mContext, prefs)).isTrue(); 173 } 174 175 @Test 176 @DisableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) isSuggestionCompleted_disableFlag_doubleTapPower_trueWhenNotAvailable()177 public void isSuggestionCompleted_disableFlag_doubleTapPower_trueWhenNotAvailable() { 178 SettingsShadowResources.overrideResource( 179 com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled, false); 180 181 assertThat(isSuggestionComplete(mContext, null /* prefs */)).isTrue(); 182 } 183 184 @Test 185 @DisableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) isSuggestionCompleted_disableFlag_doubleTapPower_falseWhenNotVisited()186 public void isSuggestionCompleted_disableFlag_doubleTapPower_falseWhenNotVisited() { 187 SettingsShadowResources.overrideResource( 188 com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled, true); 189 // No stored value in shared preferences if not visited yet. 190 final SharedPreferences prefs = 191 new SuggestionFeatureProviderImpl().getSharedPrefs(mContext); 192 193 assertThat(isSuggestionComplete(mContext, prefs)).isFalse(); 194 } 195 196 @Test 197 @DisableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) isSuggestionCompleted_disableFlag_doubleTapPower_trueWhenVisited()198 public void isSuggestionCompleted_disableFlag_doubleTapPower_trueWhenVisited() { 199 SettingsShadowResources.overrideResource( 200 com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled, true); 201 // No stored value in shared preferences if not visited yet. 202 final SharedPreferences prefs = 203 new SuggestionFeatureProviderImpl().getSharedPrefs(mContext); 204 prefs.edit().putBoolean(DoubleTapPowerSettings.PREF_KEY_SUGGESTION_COMPLETE, true).commit(); 205 206 assertThat(isSuggestionComplete(mContext, prefs)).isTrue(); 207 } 208 209 @Test 210 @DisableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) displayPreference_flagDisabled_cameraLaunchTitleIsDisplayed()211 public void displayPreference_flagDisabled_cameraLaunchTitleIsDisplayed() { 212 mController.displayPreference(mScreen); 213 214 assertThat( 215 TextUtils.equals( 216 mPreference.getTitle(), 217 mContext.getText(R.string.double_tap_power_for_camera_title))) 218 .isTrue(); 219 } 220 221 @Test 222 @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) 223 public void displayPreference_flagEnabled_configIsCameraLaunchMode_cameraLaunchTitleIsDisplayed()224 displayPreference_flagEnabled_configIsCameraLaunchMode_cameraLaunchTitleIsDisplayed() { 225 SettingsShadowResources.overrideResource( 226 com.android.internal.R.integer.config_doubleTapPowerGestureMode, 227 DOUBLE_TAP_POWER_LAUNCH_CAMERA_MODE); 228 229 mController.displayPreference(mScreen); 230 231 assertThat( 232 TextUtils.equals( 233 mPreference.getTitle(), 234 mContext.getText(R.string.double_tap_power_for_camera_title))) 235 .isTrue(); 236 } 237 238 @Test 239 @DisableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) getSummary_flagDisabled_doubleTapPowerEnabled_returnsOn()240 public void getSummary_flagDisabled_doubleTapPowerEnabled_returnsOn() { 241 // Set the setting to be enabled. 242 Settings.Secure.putInt(mContentResolver, CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, ON); 243 244 assertThat( 245 TextUtils.equals( 246 mController.getSummary(), 247 mContext.getText(R.string.gesture_setting_on))) 248 .isTrue(); 249 } 250 251 @Test 252 @DisableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) getSummary_flagDisabled_doubleTapPowerDisabled_returnsOff()253 public void getSummary_flagDisabled_doubleTapPowerDisabled_returnsOff() { 254 // Set the setting to be disabled. 255 Settings.Secure.putInt(mContentResolver, CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, OFF); 256 257 assertThat( 258 TextUtils.equals( 259 mController.getSummary(), 260 mContext.getText(R.string.gesture_setting_off))) 261 .isTrue(); 262 } 263 264 @Test 265 @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) getSummary_flagEnabled_doubleTapPowerEnabled_configIsCameraLaunchMode_returnsOn()266 public void getSummary_flagEnabled_doubleTapPowerEnabled_configIsCameraLaunchMode_returnsOn() { 267 // Set the setting to be enabled. 268 Settings.Secure.putInt(mContentResolver, CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, ON); 269 SettingsShadowResources.overrideResource( 270 com.android.internal.R.integer.config_doubleTapPowerGestureMode, 271 DOUBLE_TAP_POWER_LAUNCH_CAMERA_MODE); 272 273 assertThat( 274 TextUtils.equals( 275 mController.getSummary(), 276 mContext.getText(R.string.gesture_setting_on))) 277 .isTrue(); 278 } 279 280 @Test 281 @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) 282 public void getSummary_flagEnabled_doubleTapPowerDisabled_configIsCameraLaunchMode_returnsOff()283 getSummary_flagEnabled_doubleTapPowerDisabled_configIsCameraLaunchMode_returnsOff() { 284 // Set the setting to be disabled. 285 Settings.Secure.putInt(mContentResolver, CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, OFF); 286 SettingsShadowResources.overrideResource( 287 com.android.internal.R.integer.config_doubleTapPowerGestureMode, 288 DOUBLE_TAP_POWER_LAUNCH_CAMERA_MODE); 289 290 assertThat( 291 TextUtils.equals( 292 mController.getSummary(), 293 mContext.getText(R.string.gesture_setting_off))) 294 .isTrue(); 295 } 296 297 @Test 298 @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) getSummary_flagEnabled_doubleTapPowerDisabled_returnsOff()299 public void getSummary_flagEnabled_doubleTapPowerDisabled_returnsOff() { 300 // Set the setting to be disabled. 301 Settings.Secure.putInt( 302 mContentResolver, DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED, 0 /* OFF */); 303 304 assertThat( 305 TextUtils.equals( 306 mController.getSummary(), 307 mContext.getText(R.string.gesture_setting_off))) 308 .isTrue(); 309 } 310 311 @Test 312 @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) getSummary_flagEnabled_doubleTapPowerEnabled_cameraTargetAction_returnsSummary()313 public void getSummary_flagEnabled_doubleTapPowerEnabled_cameraTargetAction_returnsSummary() { 314 // Set the setting to be enabled. 315 Settings.Secure.putInt( 316 mContentResolver, DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED, 1 /* ON */); 317 DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonForCameraLaunch(mContext); 318 319 assertThat( 320 TextUtils.equals( 321 mController.getSummary(), 322 mContext.getString( 323 R.string.double_tap_power_summary, 324 mContext.getText(R.string.gesture_setting_on), 325 mContext.getText( 326 R.string.double_tap_power_camera_action_summary)))) 327 .isTrue(); 328 } 329 330 @Test 331 @EnableFlags(Flags.FLAG_LAUNCH_WALLET_OPTION_ON_POWER_DOUBLE_TAP) getSummary_flagEnabled_doubleTapPowerEnabled_walletTargetAction_returnsSummary()332 public void getSummary_flagEnabled_doubleTapPowerEnabled_walletTargetAction_returnsSummary() { 333 // Set the setting to be enabled. 334 Settings.Secure.putInt( 335 mContentResolver, DOUBLE_TAP_POWER_BUTTON_GESTURE_ENABLED, 1 /* ON */); 336 DoubleTapPowerSettingsUtils.setDoubleTapPowerButtonForWalletLaunch(mContext); 337 338 assertThat( 339 TextUtils.equals( 340 mController.getSummary(), 341 mContext.getString( 342 R.string.double_tap_power_summary, 343 mContext.getText(R.string.gesture_setting_on), 344 mContext.getText( 345 R.string.double_tap_power_wallet_action_summary)))) 346 .isTrue(); 347 } 348 } 349