Make Media Vibration setting configurable

Add a configuration boolean to control whether or not to display
Media Vibration switch (default: display the switch).
This configuration can then be overriden by OEMs for devices
that don't support media vibration.

Bug: 268657239
Test: make RunSettingsRoboTests ROBOTEST_FILTER=
        "com.android.settings.accessibility.MediaVibration"
Change-Id: I91857fbb04abc97b290559895010c3cbeef7ebab
This commit is contained in:
David Magno
2023-02-13 15:55:27 +01:00
parent cfde422f91
commit 4e816be889
5 changed files with 82 additions and 3 deletions

View File

@@ -217,6 +217,10 @@
--> -->
<integer name="config_vibration_supported_intensity_levels">1</integer> <integer name="config_vibration_supported_intensity_levels">1</integer>
<!-- Whether or not to show Media vibration settings in the vibration and haptics screen.
Can be overridden for specific product builds if the target device does not support it -->
<bool name="config_media_vibration_supported">true</bool>
<!-- <!--
Whether or not the homepage should be powered by legacy suggestion (versus contextual cards) Whether or not the homepage should be powered by legacy suggestion (versus contextual cards)
Default to true as not all devices support contextual cards. Default to true as not all devices support contextual cards.

View File

@@ -20,6 +20,8 @@ import android.content.Context;
import android.os.VibrationAttributes; import android.os.VibrationAttributes;
import android.provider.Settings; import android.provider.Settings;
import com.android.settings.R;
/** Preference controller for am vibration intensity */ /** Preference controller for am vibration intensity */
public class MediaVibrationIntensityPreferenceController public class MediaVibrationIntensityPreferenceController
extends VibrationIntensityPreferenceController { extends VibrationIntensityPreferenceController {
@@ -46,6 +48,7 @@ public class MediaVibrationIntensityPreferenceController
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus() {
return AVAILABLE; return mContext.getResources().getBoolean(R.bool.config_media_vibration_supported) ?
AVAILABLE : UNSUPPORTED_ON_DEVICE;
} }
} }

View File

@@ -19,6 +19,7 @@ package com.android.settings.accessibility;
import android.content.Context; import android.content.Context;
import com.android.settings.accessibility.MediaVibrationIntensityPreferenceController.MediaVibrationPreferenceConfig; import com.android.settings.accessibility.MediaVibrationIntensityPreferenceController.MediaVibrationPreferenceConfig;
import com.android.settings.R;
/** Preference controller for alarm vibration with only a toggle for on/off states. */ /** Preference controller for alarm vibration with only a toggle for on/off states. */
public class MediaVibrationTogglePreferenceController extends VibrationTogglePreferenceController { public class MediaVibrationTogglePreferenceController extends VibrationTogglePreferenceController {
@@ -29,6 +30,7 @@ public class MediaVibrationTogglePreferenceController extends VibrationTogglePre
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus() {
return AVAILABLE; return mContext.getResources().getBoolean(R.bool.config_media_vibration_supported) ?
AVAILABLE : UNSUPPORTED_ON_DEVICE;
} }
} }

View File

@@ -31,10 +31,13 @@ import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import com.android.settings.R;
import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor; import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.widget.SeekBarPreference; import com.android.settings.widget.SeekBarPreference;
import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.Lifecycle;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -45,7 +48,7 @@ import org.robolectric.annotation.Config;
/** Test for {@link MediaVibrationIntensityPreferenceController}. */ /** Test for {@link MediaVibrationIntensityPreferenceController}. */
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowInteractionJankMonitor.class}) @Config(shadows = {ShadowInteractionJankMonitor.class, SettingsShadowResources.class})
public class MediaVibrationIntensityPreferenceControllerTest { public class MediaVibrationIntensityPreferenceControllerTest {
private static final String PREFERENCE_KEY = "preference_key"; private static final String PREFERENCE_KEY = "preference_key";
@@ -76,6 +79,11 @@ public class MediaVibrationIntensityPreferenceControllerTest {
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
} }
@After
public void tearDown() {
SettingsShadowResources.reset();
}
@Test @Test
public void verifyConstants() { public void verifyConstants() {
assertThat(mController.getPreferenceKey()).isEqualTo(PREFERENCE_KEY); assertThat(mController.getPreferenceKey()).isEqualTo(PREFERENCE_KEY);
@@ -156,6 +164,32 @@ public class MediaVibrationIntensityPreferenceControllerTest {
.isEqualTo(Vibrator.VIBRATION_INTENSITY_HIGH); .isEqualTo(Vibrator.VIBRATION_INTENSITY_HIGH);
} }
@Test
public void configForMediaVibration_enabled_shouldShowSlider() {
SettingsShadowResources.overrideResource(R.bool.config_media_vibration_supported, true);
mController.updateState(mPreference);
final boolean mediaVibrationConfig = mContext.getResources()
.getBoolean(R.bool.config_media_vibration_supported);
assertThat(mediaVibrationConfig).isTrue();
assertThat(mController.isAvailable()).isTrue();
assertThat(mController.isSupported()).isTrue();
}
@Test
public void configForMediaVibration_disabled_shouldHideSlider() {
SettingsShadowResources.overrideResource(R.bool.config_media_vibration_supported, false);
mController.updateState(mPreference);
final boolean mediaVibrationConfig = mContext.getResources()
.getBoolean(R.bool.config_media_vibration_supported);
assertThat(mediaVibrationConfig).isFalse();
assertThat(mController.isAvailable()).isFalse();
assertThat(mController.isSupported()).isFalse();
}
private void updateSetting(String key, int value) { private void updateSetting(String key, int value) {
Settings.System.putInt(mContext.getContentResolver(), key, value); Settings.System.putInt(mContext.getContentResolver(), key, value);
} }

View File

@@ -32,17 +32,22 @@ import androidx.preference.SwitchPreference;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.R;
import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.Lifecycle;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
/** Test for {@link MediaVibrationIntensityPreferenceController}. */ /** Test for {@link MediaVibrationIntensityPreferenceController}. */
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = {SettingsShadowResources.class})
public class MediaVibrationTogglePreferenceControllerTest { public class MediaVibrationTogglePreferenceControllerTest {
private static final String PREFERENCE_KEY = "preference_key"; private static final String PREFERENCE_KEY = "preference_key";
@@ -72,6 +77,11 @@ public class MediaVibrationTogglePreferenceControllerTest {
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
} }
@After
public void tearDown() {
SettingsShadowResources.reset();
}
@Test @Test
public void verifyConstants() { public void verifyConstants() {
assertThat(mController.getPreferenceKey()).isEqualTo(PREFERENCE_KEY); assertThat(mController.getPreferenceKey()).isEqualTo(PREFERENCE_KEY);
@@ -144,6 +154,32 @@ public class MediaVibrationTogglePreferenceControllerTest {
.isEqualTo(Vibrator.VIBRATION_INTENSITY_OFF); .isEqualTo(Vibrator.VIBRATION_INTENSITY_OFF);
} }
@Test
public void configForMediaVibration_enabled_shouldShowToogle() {
SettingsShadowResources.overrideResource(R.bool.config_media_vibration_supported, true);
mController.updateState(mPreference);
final boolean mediaVibrationConfig = mContext.getResources()
.getBoolean(R.bool.config_media_vibration_supported);
assertThat(mediaVibrationConfig).isTrue();
assertThat(mController.isAvailable()).isTrue();
assertThat(mController.isSupported()).isTrue();
}
@Test
public void configForMediaVibration_disabled_shouldHideToggle() {
SettingsShadowResources.overrideResource(R.bool.config_media_vibration_supported, false);
mController.updateState(mPreference);
final boolean mediaVibrationConfig = mContext.getResources()
.getBoolean(R.bool.config_media_vibration_supported);
assertThat(mediaVibrationConfig).isFalse();
assertThat(mController.isAvailable()).isFalse();
assertThat(mController.isSupported()).isFalse();
}
private void updateSetting(String key, int value) { private void updateSetting(String key, int value) {
Settings.System.putInt(mContext.getContentResolver(), key, value); Settings.System.putInt(mContext.getContentResolver(), key, value);
} }