Enable touch feedback settings when the phone is in silent mode

Allow users to change this settings when the phone is in silent mode, if
they prefer to make all interactions as silent as possible in that
context.

Fix: 165478128
Test: [Alarm|HapticFeedback|Media]Vibration[Intensity|Toggle]PreferenceControllerTest
Change-Id: I68f90559b2bf8088f22397412c149e2a4b91cf13
This commit is contained in:
Lais Andrade
2022-02-22 18:42:41 +00:00
parent 6368af8bdf
commit e000a21064
7 changed files with 110 additions and 29 deletions

View File

@@ -37,12 +37,6 @@ public class HapticFeedbackIntensityPreferenceController
VibrationAttributes.USAGE_TOUCH); VibrationAttributes.USAGE_TOUCH);
} }
@Override
public boolean isRestrictedByRingerModeSilent() {
// Touch feedback is disabled when the phone is in silent mode.
return true;
}
@Override @Override
public int readIntensity() { public int readIntensity() {
final int hapticFeedbackEnabled = Settings.System.getInt(mContentResolver, final int hapticFeedbackEnabled = Settings.System.getInt(mContentResolver,

View File

@@ -18,9 +18,11 @@ package com.android.settings.accessibility;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.media.AudioManager;
import android.os.VibrationAttributes; import android.os.VibrationAttributes;
import android.os.Vibrator; import android.os.Vibrator;
import android.provider.Settings; import android.provider.Settings;
@@ -45,6 +47,7 @@ public class AlarmVibrationIntensityPreferenceControllerTest {
private static final String PREFERENCE_KEY = "preference_key"; private static final String PREFERENCE_KEY = "preference_key";
@Mock private PreferenceScreen mScreen; @Mock private PreferenceScreen mScreen;
@Mock private AudioManager mAudioManager;
private Lifecycle mLifecycle; private Lifecycle mLifecycle;
private Context mContext; private Context mContext;
@@ -56,7 +59,9 @@ public class AlarmVibrationIntensityPreferenceControllerTest {
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mLifecycle = new Lifecycle(() -> mLifecycle); mLifecycle = new Lifecycle(() -> mLifecycle);
mContext = ApplicationProvider.getApplicationContext(); mContext = spy(ApplicationProvider.getApplicationContext());
when(mContext.getSystemService(Context.AUDIO_SERVICE)).thenReturn(mAudioManager);
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
mVibrator = mContext.getSystemService(Vibrator.class); mVibrator = mContext.getSystemService(Vibrator.class);
mController = new AlarmVibrationIntensityPreferenceController(mContext, PREFERENCE_KEY, mController = new AlarmVibrationIntensityPreferenceController(mContext, PREFERENCE_KEY,
Vibrator.VIBRATION_INTENSITY_HIGH); Vibrator.VIBRATION_INTENSITY_HIGH);
@@ -87,6 +92,26 @@ public class AlarmVibrationIntensityPreferenceControllerTest {
mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_ALARM)); mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_ALARM));
} }
@Test
public void updateState_ringerModeUpdates_shouldNotAffectSettings() {
updateSetting(Settings.System.ALARM_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW);
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
mController.updateState(mPreference);
assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_LOW);
assertThat(mPreference.isEnabled()).isTrue();
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_SILENT);
mController.updateState(mPreference);
assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_LOW);
assertThat(mPreference.isEnabled()).isTrue();
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_VIBRATE);
mController.updateState(mPreference);
assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_LOW);
assertThat(mPreference.isEnabled()).isTrue();
}
@Test @Test
public void updateState_shouldDisplayIntensityInSliderPosition() { public void updateState_shouldDisplayIntensityInSliderPosition() {
updateSetting(Settings.System.ALARM_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH); updateSetting(Settings.System.ALARM_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH);

View File

@@ -18,9 +18,11 @@ package com.android.settings.accessibility;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.media.AudioManager;
import android.os.VibrationAttributes; import android.os.VibrationAttributes;
import android.os.Vibrator; import android.os.Vibrator;
import android.provider.Settings; import android.provider.Settings;
@@ -45,6 +47,7 @@ public class AlarmVibrationTogglePreferenceControllerTest {
private static final String PREFERENCE_KEY = "preference_key"; private static final String PREFERENCE_KEY = "preference_key";
@Mock private PreferenceScreen mScreen; @Mock private PreferenceScreen mScreen;
@Mock AudioManager mAudioManager;
private Lifecycle mLifecycle; private Lifecycle mLifecycle;
private Context mContext; private Context mContext;
@@ -56,7 +59,9 @@ public class AlarmVibrationTogglePreferenceControllerTest {
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mLifecycle = new Lifecycle(() -> mLifecycle); mLifecycle = new Lifecycle(() -> mLifecycle);
mContext = ApplicationProvider.getApplicationContext(); mContext = spy(ApplicationProvider.getApplicationContext());
when(mContext.getSystemService(Context.AUDIO_SERVICE)).thenReturn(mAudioManager);
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
mVibrator = mContext.getSystemService(Vibrator.class); mVibrator = mContext.getSystemService(Vibrator.class);
mController = new AlarmVibrationTogglePreferenceController(mContext, PREFERENCE_KEY); mController = new AlarmVibrationTogglePreferenceController(mContext, PREFERENCE_KEY);
mLifecycle.addObserver(mController); mLifecycle.addObserver(mController);
@@ -83,6 +88,26 @@ public class AlarmVibrationTogglePreferenceControllerTest {
assertThat(mPreference.isChecked()).isTrue(); assertThat(mPreference.isChecked()).isTrue();
} }
@Test
public void updateState_ringerModeUpdates_shouldNotAffectSettings() {
updateSetting(Settings.System.ALARM_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW);
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
mController.updateState(mPreference);
assertThat(mPreference.isChecked()).isTrue();
assertThat(mPreference.isEnabled()).isTrue();
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_SILENT);
mController.updateState(mPreference);
assertThat(mPreference.isChecked()).isTrue();
assertThat(mPreference.isEnabled()).isTrue();
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_VIBRATE);
mController.updateState(mPreference);
assertThat(mPreference.isChecked()).isTrue();
assertThat(mPreference.isEnabled()).isTrue();
}
@Test @Test
public void updateState_shouldDisplayOnOffState() { public void updateState_shouldDisplayOnOffState() {
updateSetting(Settings.System.ALARM_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH); updateSetting(Settings.System.ALARM_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH);

View File

@@ -94,28 +94,22 @@ public class HapticFeedbackIntensityPreferenceControllerTest {
} }
@Test @Test
public void updateState_ringerModeUpdates_shouldPreserveSettingAndDisplaySummary() { public void updateState_ringerModeUpdates_shouldNotAffectSettings() {
updateSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW); updateSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW);
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL); when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
mController.updateState(mPreference); mController.updateState(mPreference);
assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_LOW); assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_LOW);
assertThat(mPreference.getSummary()).isNull();
assertThat(mPreference.isEnabled()).isTrue(); assertThat(mPreference.isEnabled()).isTrue();
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_SILENT); when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_SILENT);
mController.updateState(mPreference); mController.updateState(mPreference);
assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_OFF); assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_LOW);
// TODO(b/136805769): summary is broken in SeekBarPreference, enable this once fixed assertThat(mPreference.isEnabled()).isTrue();
// assertThat(mPreference.getSummary()).isNotNull();
// assertThat(mPreference.getSummary().toString()).isEqualTo(mContext.getString(
// R.string.accessibility_vibration_setting_disabled_for_silent_mode_summary));
assertThat(mPreference.isEnabled()).isFalse();
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_VIBRATE); when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_VIBRATE);
mController.updateState(mPreference); mController.updateState(mPreference);
assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_LOW); assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_LOW);
assertThat(mPreference.getSummary()).isNull();
assertThat(mPreference.isEnabled()).isTrue(); assertThat(mPreference.isEnabled()).isTrue();
} }

View File

@@ -31,7 +31,6 @@ import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference; import androidx.preference.SwitchPreference;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -90,29 +89,23 @@ public class HapticFeedbackTogglePreferenceControllerTest {
assertThat(mPreference.isChecked()).isTrue(); assertThat(mPreference.isChecked()).isTrue();
} }
@Test @Test
public void updateState_ringerModeUpdates_shouldPreserveSettingAndDisplaySummary() { public void updateState_ringerModeUpdates_shouldNotAffectSettings() {
updateSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW); updateSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW);
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL); when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
mController.updateState(mPreference); mController.updateState(mPreference);
assertThat(mPreference.isChecked()).isTrue(); assertThat(mPreference.isChecked()).isTrue();
assertThat(mPreference.getSummary()).isNull();
assertThat(mPreference.isEnabled()).isTrue(); assertThat(mPreference.isEnabled()).isTrue();
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_SILENT); when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_SILENT);
mController.updateState(mPreference); mController.updateState(mPreference);
assertThat(mPreference.isChecked()).isFalse(); assertThat(mPreference.isChecked()).isTrue();
assertThat(mPreference.getSummary()).isNotNull(); assertThat(mPreference.isEnabled()).isTrue();
assertThat(mPreference.getSummary().toString()).isEqualTo(mContext.getString(
R.string.accessibility_vibration_setting_disabled_for_silent_mode_summary));
assertThat(mPreference.isEnabled()).isFalse();
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_VIBRATE); when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_VIBRATE);
mController.updateState(mPreference); mController.updateState(mPreference);
assertThat(mPreference.isChecked()).isTrue(); assertThat(mPreference.isChecked()).isTrue();
assertThat(mPreference.getSummary()).isNull();
assertThat(mPreference.isEnabled()).isTrue(); assertThat(mPreference.isEnabled()).isTrue();
} }

View File

@@ -18,9 +18,11 @@ package com.android.settings.accessibility;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.media.AudioManager;
import android.os.VibrationAttributes; import android.os.VibrationAttributes;
import android.os.Vibrator; import android.os.Vibrator;
import android.provider.Settings; import android.provider.Settings;
@@ -46,6 +48,7 @@ public class MediaVibrationIntensityPreferenceControllerTest {
private static final String PREFERENCE_KEY = "preference_key"; private static final String PREFERENCE_KEY = "preference_key";
@Mock private PreferenceScreen mScreen; @Mock private PreferenceScreen mScreen;
@Mock private AudioManager mAudioManager;
private Lifecycle mLifecycle; private Lifecycle mLifecycle;
private Context mContext; private Context mContext;
@@ -57,7 +60,9 @@ public class MediaVibrationIntensityPreferenceControllerTest {
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mLifecycle = new Lifecycle(() -> mLifecycle); mLifecycle = new Lifecycle(() -> mLifecycle);
mContext = ApplicationProvider.getApplicationContext(); mContext = spy(ApplicationProvider.getApplicationContext());
when(mContext.getSystemService(Context.AUDIO_SERVICE)).thenReturn(mAudioManager);
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
mVibrator = mContext.getSystemService(Vibrator.class); mVibrator = mContext.getSystemService(Vibrator.class);
mController = new MediaVibrationIntensityPreferenceController(mContext, PREFERENCE_KEY, mController = new MediaVibrationIntensityPreferenceController(mContext, PREFERENCE_KEY,
Vibrator.VIBRATION_INTENSITY_HIGH); Vibrator.VIBRATION_INTENSITY_HIGH);
@@ -88,6 +93,26 @@ public class MediaVibrationIntensityPreferenceControllerTest {
mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_MEDIA)); mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_MEDIA));
} }
@Test
public void updateState_ringerModeUpdates_shouldNotAffectSettings() {
updateSetting(Settings.System.MEDIA_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW);
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
mController.updateState(mPreference);
assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_LOW);
assertThat(mPreference.isEnabled()).isTrue();
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_SILENT);
mController.updateState(mPreference);
assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_LOW);
assertThat(mPreference.isEnabled()).isTrue();
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_VIBRATE);
mController.updateState(mPreference);
assertThat(mPreference.getProgress()).isEqualTo(Vibrator.VIBRATION_INTENSITY_LOW);
assertThat(mPreference.isEnabled()).isTrue();
}
@Test @Test
public void updateState_shouldDisplayIntensityInSliderPosition() { public void updateState_shouldDisplayIntensityInSliderPosition() {
updateSetting(Settings.System.MEDIA_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH); updateSetting(Settings.System.MEDIA_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH);

View File

@@ -18,9 +18,11 @@ package com.android.settings.accessibility;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.media.AudioManager;
import android.os.VibrationAttributes; import android.os.VibrationAttributes;
import android.os.Vibrator; import android.os.Vibrator;
import android.provider.Settings; import android.provider.Settings;
@@ -46,6 +48,7 @@ public class MediaVibrationTogglePreferenceControllerTest {
private static final String PREFERENCE_KEY = "preference_key"; private static final String PREFERENCE_KEY = "preference_key";
@Mock private PreferenceScreen mScreen; @Mock private PreferenceScreen mScreen;
@Mock AudioManager mAudioManager;
private Lifecycle mLifecycle; private Lifecycle mLifecycle;
private Context mContext; private Context mContext;
@@ -57,7 +60,9 @@ public class MediaVibrationTogglePreferenceControllerTest {
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mLifecycle = new Lifecycle(() -> mLifecycle); mLifecycle = new Lifecycle(() -> mLifecycle);
mContext = ApplicationProvider.getApplicationContext(); mContext = spy(ApplicationProvider.getApplicationContext());
when(mContext.getSystemService(Context.AUDIO_SERVICE)).thenReturn(mAudioManager);
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
mVibrator = mContext.getSystemService(Vibrator.class); mVibrator = mContext.getSystemService(Vibrator.class);
mController = new MediaVibrationTogglePreferenceController(mContext, PREFERENCE_KEY); mController = new MediaVibrationTogglePreferenceController(mContext, PREFERENCE_KEY);
mLifecycle.addObserver(mController); mLifecycle.addObserver(mController);
@@ -84,6 +89,26 @@ public class MediaVibrationTogglePreferenceControllerTest {
assertThat(mPreference.isChecked()).isTrue(); assertThat(mPreference.isChecked()).isTrue();
} }
@Test
public void updateState_ringerModeUpdates_shouldNotAffectSettings() {
updateSetting(Settings.System.MEDIA_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW);
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
mController.updateState(mPreference);
assertThat(mPreference.isChecked()).isTrue();
assertThat(mPreference.isEnabled()).isTrue();
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_SILENT);
mController.updateState(mPreference);
assertThat(mPreference.isChecked()).isTrue();
assertThat(mPreference.isEnabled()).isTrue();
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_VIBRATE);
mController.updateState(mPreference);
assertThat(mPreference.isChecked()).isTrue();
assertThat(mPreference.isEnabled()).isTrue();
}
@Test @Test
public void updateState_shouldDisplayOnOffState() { public void updateState_shouldDisplayOnOffState() {
updateSetting(Settings.System.MEDIA_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH); updateSetting(Settings.System.MEDIA_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH);