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