1 /*
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 
17 package com.android.settings.accessibility;
18 
19 import static android.content.Context.MODE_PRIVATE;
20 
21 import static com.android.settings.accessibility.ToggleAutoclickPreferenceController.AUTOCLICK_CUSTOM_MODE;
22 import static com.android.settings.accessibility.ToggleAutoclickPreferenceController.AUTOCLICK_OFF_MODE;
23 import static com.android.settings.accessibility.ToggleAutoclickPreferenceController.KEY_AUTOCLICK_CUSTOM_SEEKBAR;
24 import static com.android.settings.accessibility.ToggleAutoclickPreferenceController.KEY_DELAY_MODE;
25 import static com.android.settings.core.BasePreferenceController.AVAILABLE;
26 
27 import static com.google.common.truth.Truth.assertThat;
28 
29 import static org.mockito.ArgumentMatchers.any;
30 import static org.mockito.Mockito.mock;
31 import static org.mockito.Mockito.verify;
32 import static org.mockito.Mockito.when;
33 
34 import android.content.Context;
35 import android.content.SharedPreferences;
36 import android.provider.Settings.Secure;
37 
38 import androidx.lifecycle.LifecycleObserver;
39 import androidx.preference.PreferenceScreen;
40 import androidx.test.core.app.ApplicationProvider;
41 
42 import com.android.settings.accessibility.ToggleAutoclickPreferenceController.OnChangeListener;
43 import com.android.settingslib.core.lifecycle.Lifecycle;
44 import com.android.settingslib.widget.LayoutPreference;
45 import com.android.settingslib.widget.RadioButtonPreference;
46 import com.android.settingslib.widget.RadioButtonPreference.OnClickListener;
47 
48 import org.junit.Before;
49 import org.junit.Test;
50 import org.junit.runner.RunWith;
51 import org.mockito.Mock;
52 import org.mockito.MockitoAnnotations;
53 import org.robolectric.RobolectricTestRunner;
54 
55 import java.util.Map;
56 
57 /** Tests for {@link ToggleAutoclickPreferenceController}. */
58 @RunWith(RobolectricTestRunner.class)
59 public class ToggleAutoclickPreferenceControllerTest {
60 
61     @Mock
62     private PreferenceScreen mScreen;
63 
64     @Mock
65     private RadioButtonPreference mDelayModePref;
66 
67     @Mock
68     private OnChangeListener mOnChangeListener;
69 
70     @Mock
71     private LayoutPreference mSeekBarPref;
72 
73     @Mock
74     private Map<String, Integer> mAccessibilityAutoclickKeyToValueMap;
75 
76     private ToggleAutoclickPreferenceController mController;
77     private SharedPreferences mSharedPreferences;
78     private final String mPrefKey = "prefKey";
79     private final Context mContext = ApplicationProvider.getApplicationContext();
80 
81     @Before
setUp()82     public void setUp() {
83         MockitoAnnotations.initMocks(this);
84 
85         mController = new ToggleAutoclickPreferenceController(mContext, mPrefKey);
86         mController.mAccessibilityAutoclickKeyToValueMap = mAccessibilityAutoclickKeyToValueMap;
87         mSharedPreferences =
88                 mContext.getSharedPreferences(mContext.getPackageName(), MODE_PRIVATE);
89 
90         when(mScreen.findPreference(mPrefKey)).thenReturn(mDelayModePref);
91         when(mScreen.findPreference(KEY_AUTOCLICK_CUSTOM_SEEKBAR)).thenReturn(mSeekBarPref);
92         when(mAccessibilityAutoclickKeyToValueMap.get(mDelayModePref.getKey())).thenReturn(
93                 AUTOCLICK_OFF_MODE);
94     }
95 
96     @Test
getAvailabilityStatus_available()97     public void getAvailabilityStatus_available() {
98         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
99     }
100 
101     @Test
setClickListenerOnDelayModePref_whenDisplay_success()102     public void setClickListenerOnDelayModePref_whenDisplay_success() {
103         mController.displayPreference(mScreen);
104 
105         verify(mDelayModePref).setOnClickListener(any(OnClickListener.class));
106     }
107 
108     @Test
constructor_hasLifecycle_addObserver()109     public void constructor_hasLifecycle_addObserver() {
110         final Lifecycle lifecycle = mock(Lifecycle.class);
111         mController = new ToggleAutoclickPreferenceController(mContext, lifecycle, mPrefKey);
112 
113         verify(lifecycle).addObserver(any(LifecycleObserver.class));
114     }
115 
116     @Test
onRadioButtonClicked_offMode_disableAutoClick()117     public void onRadioButtonClicked_offMode_disableAutoClick() {
118         when(mAccessibilityAutoclickKeyToValueMap.get(mPrefKey)).thenReturn(AUTOCLICK_OFF_MODE);
119 
120         mController.displayPreference(mScreen);
121         mController.onRadioButtonClicked(any(RadioButtonPreference.class));
122         final boolean isEnabled = Secure.getInt(mContext.getContentResolver(),
123                 Secure.ACCESSIBILITY_AUTOCLICK_ENABLED, /* def= */ 0) == 1;
124         final int delayMs = Secure.getInt(mContext.getContentResolver(),
125                 Secure.ACCESSIBILITY_AUTOCLICK_DELAY, /* def= */ 0);
126         final int keyDelayMode = mSharedPreferences.getInt(KEY_DELAY_MODE, AUTOCLICK_CUSTOM_MODE);
127 
128         assertThat(keyDelayMode).isEqualTo(AUTOCLICK_OFF_MODE);
129         assertThat(delayMs).isEqualTo(/* expected= */ 0);
130         assertThat(isEnabled).isFalse();
131     }
132 
133     @Test
onRadioButtonClicked_customMode_enableAutoClick()134     public void onRadioButtonClicked_customMode_enableAutoClick() {
135         when(mAccessibilityAutoclickKeyToValueMap.get(mDelayModePref.getKey())).thenReturn(
136                 AUTOCLICK_CUSTOM_MODE);
137         when(mAccessibilityAutoclickKeyToValueMap.get(mPrefKey)).thenReturn(AUTOCLICK_CUSTOM_MODE);
138 
139         mController.displayPreference(mScreen);
140         mController.onRadioButtonClicked(any(RadioButtonPreference.class));
141         final boolean isEnabled = Secure.getInt(mContext.getContentResolver(),
142                 Secure.ACCESSIBILITY_AUTOCLICK_ENABLED, /* def= */ 0) == 1;
143         final int keyDelayMode = mSharedPreferences.getInt(KEY_DELAY_MODE, AUTOCLICK_CUSTOM_MODE);
144 
145         assertThat(keyDelayMode).isEqualTo(AUTOCLICK_CUSTOM_MODE);
146         assertThat(isEnabled).isTrue();
147     }
148 
149     @Test
onRadioButtonClicked_hasListener_runOnCheckedChanged()150     public void onRadioButtonClicked_hasListener_runOnCheckedChanged() {
151         when(mAccessibilityAutoclickKeyToValueMap.get(mDelayModePref.getKey())).thenReturn(
152                 AUTOCLICK_CUSTOM_MODE);
153         when(mAccessibilityAutoclickKeyToValueMap.get(mPrefKey)).thenReturn(AUTOCLICK_CUSTOM_MODE);
154 
155         mController.setOnChangeListener(mOnChangeListener);
156         mController.displayPreference(mScreen);
157         mController.onRadioButtonClicked(any(RadioButtonPreference.class));
158 
159         verify(mOnChangeListener).onCheckedChanged(mDelayModePref);
160     }
161 }
162