1 /* 2 * Copyright (C) 2022 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 com.google.common.truth.Truth.assertThat; 20 21 import static org.mockito.Mockito.spy; 22 import static org.mockito.Mockito.when; 23 24 import android.content.Context; 25 import android.media.AudioManager; 26 import android.os.VibrationAttributes; 27 import android.os.Vibrator; 28 import android.provider.Settings; 29 30 import androidx.preference.PreferenceScreen; 31 import androidx.preference.SwitchPreference; 32 import androidx.test.core.app.ApplicationProvider; 33 34 import com.android.settings.core.BasePreferenceController; 35 import com.android.settingslib.core.lifecycle.Lifecycle; 36 37 import org.junit.Before; 38 import org.junit.Test; 39 import org.junit.runner.RunWith; 40 import org.mockito.Mock; 41 import org.mockito.MockitoAnnotations; 42 import org.robolectric.RobolectricTestRunner; 43 44 @RunWith(RobolectricTestRunner.class) 45 public class AlarmVibrationTogglePreferenceControllerTest { 46 47 private static final String PREFERENCE_KEY = "preference_key"; 48 49 @Mock private PreferenceScreen mScreen; 50 @Mock AudioManager mAudioManager; 51 52 private Lifecycle mLifecycle; 53 private Context mContext; 54 private Vibrator mVibrator; 55 private AlarmVibrationTogglePreferenceController mController; 56 private SwitchPreference mPreference; 57 58 @Before setUp()59 public void setUp() { 60 MockitoAnnotations.initMocks(this); 61 mLifecycle = new Lifecycle(() -> mLifecycle); 62 mContext = spy(ApplicationProvider.getApplicationContext()); 63 when(mContext.getSystemService(Context.AUDIO_SERVICE)).thenReturn(mAudioManager); 64 when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL); 65 mVibrator = mContext.getSystemService(Vibrator.class); 66 mController = new AlarmVibrationTogglePreferenceController(mContext, PREFERENCE_KEY); 67 mLifecycle.addObserver(mController); 68 mPreference = new SwitchPreference(mContext); 69 mPreference.setSummary("Test summary"); 70 when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); 71 mController.displayPreference(mScreen); 72 } 73 74 @Test verifyConstants()75 public void verifyConstants() { 76 assertThat(mController.getPreferenceKey()).isEqualTo(PREFERENCE_KEY); 77 assertThat(mController.getAvailabilityStatus()) 78 .isEqualTo(BasePreferenceController.AVAILABLE); 79 } 80 81 @Test missingSetting_shouldReturnDefault()82 public void missingSetting_shouldReturnDefault() { 83 Settings.System.putString(mContext.getContentResolver(), 84 Settings.System.ALARM_VIBRATION_INTENSITY, /* value= */ null); 85 86 mController.updateState(mPreference); 87 88 assertThat(mPreference.isChecked()).isTrue(); 89 } 90 91 @Test updateState_ringerModeUpdates_shouldNotAffectSettings()92 public void updateState_ringerModeUpdates_shouldNotAffectSettings() { 93 updateSetting(Settings.System.ALARM_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW); 94 95 when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL); 96 mController.updateState(mPreference); 97 assertThat(mPreference.isChecked()).isTrue(); 98 assertThat(mPreference.isEnabled()).isTrue(); 99 100 when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_SILENT); 101 mController.updateState(mPreference); 102 assertThat(mPreference.isChecked()).isTrue(); 103 assertThat(mPreference.isEnabled()).isTrue(); 104 105 when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_VIBRATE); 106 mController.updateState(mPreference); 107 assertThat(mPreference.isChecked()).isTrue(); 108 assertThat(mPreference.isEnabled()).isTrue(); 109 } 110 111 @Test updateState_shouldDisplayOnOffState()112 public void updateState_shouldDisplayOnOffState() { 113 updateSetting(Settings.System.ALARM_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH); 114 mController.updateState(mPreference); 115 assertThat(mPreference.isChecked()).isTrue(); 116 117 updateSetting(Settings.System.ALARM_VIBRATION_INTENSITY, 118 Vibrator.VIBRATION_INTENSITY_MEDIUM); 119 mController.updateState(mPreference); 120 assertThat(mPreference.isChecked()).isTrue(); 121 122 updateSetting(Settings.System.ALARM_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW); 123 mController.updateState(mPreference); 124 assertThat(mPreference.isChecked()).isTrue(); 125 126 updateSetting(Settings.System.ALARM_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF); 127 mController.updateState(mPreference); 128 assertThat(mPreference.isChecked()).isFalse(); 129 } 130 131 @Test setChecked_updatesIntensityAndDependentSettings()132 public void setChecked_updatesIntensityAndDependentSettings() throws Exception { 133 updateSetting(Settings.System.ALARM_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF); 134 mController.updateState(mPreference); 135 assertThat(mPreference.isChecked()).isFalse(); 136 137 mController.setChecked(true); 138 assertThat(readSetting(Settings.System.ALARM_VIBRATION_INTENSITY)).isEqualTo( 139 mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_ALARM)); 140 141 mController.setChecked(false); 142 assertThat(readSetting(Settings.System.ALARM_VIBRATION_INTENSITY)) 143 .isEqualTo(Vibrator.VIBRATION_INTENSITY_OFF); 144 } 145 updateSetting(String key, int value)146 private void updateSetting(String key, int value) { 147 Settings.System.putInt(mContext.getContentResolver(), key, value); 148 } 149 readSetting(String settingKey)150 private int readSetting(String settingKey) throws Settings.SettingNotFoundException { 151 return Settings.System.getInt(mContext.getContentResolver(), settingKey); 152 } 153 } 154