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