1b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang/* 2b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang * Copyright (C) 2016 The Android Open Source Project 3b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang * 4b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang * Licensed under the Apache License, Version 2.0 (the "License"); 5b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang * you may not use this file except in compliance with the License. 6b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang * You may obtain a copy of the License at 7b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang * 8b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang * http://www.apache.org/licenses/LICENSE-2.0 9b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang * 10b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang * Unless required by applicable law or agreed to in writing, software 11b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang * distributed under the License is distributed on an "AS IS" BASIS, 12b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang * See the License for the specific language governing permissions and 14b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang * limitations under the License. 15b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang */ 16b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang 17b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhangpackage com.android.settings.gestures; 18b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang 19469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritzeimport android.content.ContentResolver; 20b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhangimport android.content.Context; 21b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhangimport android.provider.Settings; 22b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhangimport android.support.v7.preference.PreferenceScreen; 23b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang 24469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritzeimport com.android.settings.search.InlinePayload; 25469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritzeimport com.android.settings.search.InlineSwitchPayload; 26469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritzeimport com.android.settings.search.ResultPayload; 279f1e911759dc6fedaac9fa65afb79f6a93022bf4Andrew Sappersteinimport com.android.settings.testutils.SettingsRobolectricTestRunner; 28b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhangimport com.android.settings.TestConfig; 29b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang 30469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritzeimport com.android.settings.testutils.shadow.ShadowSecureSettings; 31b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhangimport org.junit.Before; 32b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhangimport org.junit.Test; 33b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhangimport org.junit.runner.RunWith; 34b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhangimport org.mockito.Answers; 35b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhangimport org.mockito.Mock; 36b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhangimport org.mockito.MockitoAnnotations; 37469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritzeimport org.robolectric.RuntimeEnvironment; 38b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhangimport org.robolectric.annotation.Config; 39b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhangimport org.robolectric.shadows.ShadowApplication; 40b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang 41b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhangimport static android.provider.Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED; 4233b0d91d74bb29cbfd49e3f4c3ebd9d99001bfa9Fan Zhangimport static com.google.common.truth.Truth.assertThat; 43b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhangimport static org.mockito.Mockito.when; 44b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang 45b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang@RunWith(SettingsRobolectricTestRunner.class) 46b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) 47b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhangpublic class DoubleTapPowerPreferenceControllerTest { 48b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang 49b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang @Mock(answer = Answers.RETURNS_DEEP_STUBS) 50b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang private Context mContext; 51b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang @Mock(answer = Answers.RETURNS_DEEP_STUBS) 52b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang private PreferenceScreen mScreen; 53b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang private DoubleTapPowerPreferenceController mController; 54742467ec9f384983f37d9a0e4e9775c27451816bMatthew Fritze private static final String KEY_DOUBLE_TAP_POWER = "gesture_double_tap_power"; 55b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang 56b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang @Before 57b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang public void setUp() { 58b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang MockitoAnnotations.initMocks(this); 59742467ec9f384983f37d9a0e4e9775c27451816bMatthew Fritze mController = new DoubleTapPowerPreferenceController(mContext, null, KEY_DOUBLE_TAP_POWER); 60b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang } 61b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang 62b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang @Test 6333b0d91d74bb29cbfd49e3f4c3ebd9d99001bfa9Fan Zhang public void isAvailable_configIsTrue_shouldReturnTrue() { 64b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang when(mContext.getResources(). 65b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang getBoolean(com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled)) 66b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang .thenReturn(true); 67b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang 6833b0d91d74bb29cbfd49e3f4c3ebd9d99001bfa9Fan Zhang assertThat(mController.isAvailable()).isTrue(); 69b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang } 70b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang 71b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang @Test 7233b0d91d74bb29cbfd49e3f4c3ebd9d99001bfa9Fan Zhang public void isAvailable_configIsTrue_shouldReturnFalse() { 73b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang when(mContext.getResources(). 74b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang getBoolean(com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled)) 75b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang .thenReturn(false); 76b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang 7733b0d91d74bb29cbfd49e3f4c3ebd9d99001bfa9Fan Zhang assertThat(mController.isAvailable()).isFalse(); 78b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang } 79b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang 80b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang @Test 8133b0d91d74bb29cbfd49e3f4c3ebd9d99001bfa9Fan Zhang public void testSwitchEnabled_configIsNotSet_shouldReturnTrue() { 82b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang // Set the setting to be enabled. 83b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang final Context context = ShadowApplication.getInstance().getApplicationContext(); 84b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang Settings.System.putInt(context.getContentResolver(), 85b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 0); 86742467ec9f384983f37d9a0e4e9775c27451816bMatthew Fritze mController = new DoubleTapPowerPreferenceController(context, null, KEY_DOUBLE_TAP_POWER); 87b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang 8833b0d91d74bb29cbfd49e3f4c3ebd9d99001bfa9Fan Zhang assertThat(mController.isSwitchPrefEnabled()).isTrue(); 89b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang } 90b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang 91b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang @Test 9233b0d91d74bb29cbfd49e3f4c3ebd9d99001bfa9Fan Zhang public void testSwitchEnabled_configIsSet_shouldReturnFalse() { 93b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang // Set the setting to be disabled. 94b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang final Context context = ShadowApplication.getInstance().getApplicationContext(); 95b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang Settings.System.putInt(context.getContentResolver(), 96b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 1); 97742467ec9f384983f37d9a0e4e9775c27451816bMatthew Fritze mController = new DoubleTapPowerPreferenceController(context, null, KEY_DOUBLE_TAP_POWER); 98b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang 9933b0d91d74bb29cbfd49e3f4c3ebd9d99001bfa9Fan Zhang assertThat(mController.isSwitchPrefEnabled()).isFalse(); 100b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang } 101469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze 102469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze @Test 103469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze public void testPreferenceController_ProperResultPayloadType() { 104469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze final Context context = RuntimeEnvironment.application; 105469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze DoubleTapPowerPreferenceController controller = 106469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze new DoubleTapPowerPreferenceController(context, null /* lifecycle */, 107469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze KEY_DOUBLE_TAP_POWER); 108469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze ResultPayload payload = controller.getResultPayload(); 109469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze assertThat(payload).isInstanceOf(InlineSwitchPayload.class); 110469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze } 111469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze 112469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze @Test 113469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze @Config(shadows = ShadowSecureSettings.class) 114469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze public void testSetValue_updatesCorrectly() { 115469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze int newValue = 1; 116469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze ContentResolver resolver = mContext.getContentResolver(); 117469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze Settings.Secure.putInt(resolver, Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 118469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze 0); 119469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze 120469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze InlinePayload payload = ((InlineSwitchPayload) mController.getResultPayload()); 121469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze payload.setValue(mContext, newValue); 122469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze int updatedValue = Settings.Secure.getInt(resolver, 123469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, -1); 124469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze updatedValue = 1 - updatedValue; // DoubleTapPower is a non-standard switch 125469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze 126469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze assertThat(updatedValue).isEqualTo(newValue); 127469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze } 128469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze 129469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze @Test 130469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze @Config(shadows = ShadowSecureSettings.class) 131469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze public void testGetValue_correctValueReturned() { 132469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze int currentValue = 1; 133469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze ContentResolver resolver = mContext.getContentResolver(); 134469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze Settings.Secure.putInt(resolver, 135469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, currentValue); 136469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze 137469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze int newValue = ((InlinePayload) mController.getResultPayload()).getValue(mContext); 138469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze newValue = 1 - newValue; // DoubleTapPower is a non-standard switch 139469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze assertThat(newValue).isEqualTo(currentValue); 140469e4ea228234aa169f9463ea41ae89f47089459Matthew Fritze } 141b99ea900463af1b4ecc92dbd138670f0f182ff46Fan Zhang} 142