Loading res/values/config.xml +5 −0 Original line number Diff line number Diff line Loading @@ -134,4 +134,9 @@ <!-- Whether or not to show the night light suggestion. --> <bool name="config_night_light_suggestion_enabled">true</bool> <!-- Whether or not the device is capable of multiple levels of vibration intensity. Note that this is different from whether it can control the vibration amplitude as some devices will be able to vary their amplitude but do not possess enough dynamic range to have distinct intensity levels --> <bool name="config_vibration_supports_multiple_intensities">false</bool> </resources> src/com/android/settings/accessibility/AccessibilitySettings.java +21 −11 Original line number Diff line number Diff line Loading @@ -779,6 +779,9 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements } private String getVibrationSummary(Context context, @VibrationIntensity int intensity) { final boolean supportsMultipleIntensities = context.getResources().getBoolean( R.bool.config_vibration_supports_multiple_intensities); if (supportsMultipleIntensities) { switch (intensity) { case Vibrator.VIBRATION_INTENSITY_OFF: return context.getString(R.string.accessibility_vibration_summary_off); Loading @@ -791,6 +794,13 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements default: return ""; } } else { if (intensity == Vibrator.VIBRATION_INTENSITY_OFF) { return context.getString(R.string.switch_on_text); } else { return context.getString(R.string.switch_off_text); } } } private void updateLockScreenRotationCheckbox() { Loading src/com/android/settings/accessibility/VibrationIntensityPreferenceController.java +21 −11 Original line number Diff line number Diff line Loading @@ -81,18 +81,28 @@ public abstract class VibrationIntensityPreferenceController extends BasePrefere } public static CharSequence getIntensityString(Context context, int intensity) { final boolean supportsMultipleIntensities = context.getResources().getBoolean( R.bool.config_vibration_supports_multiple_intensities); if (supportsMultipleIntensities) { switch (intensity) { case Vibrator.VIBRATION_INTENSITY_OFF: return context.getText(R.string.accessibility_vibration_intensity_off); return context.getString(R.string.accessibility_vibration_intensity_off); case Vibrator.VIBRATION_INTENSITY_LOW: return context.getText(R.string.accessibility_vibration_intensity_low); return context.getString(R.string.accessibility_vibration_intensity_low); case Vibrator.VIBRATION_INTENSITY_MEDIUM: return context.getText(R.string.accessibility_vibration_intensity_medium); return context.getString(R.string.accessibility_vibration_intensity_medium); case Vibrator.VIBRATION_INTENSITY_HIGH: return context.getText(R.string.accessibility_vibration_intensity_high); return context.getString(R.string.accessibility_vibration_intensity_high); default: return ""; } } else { if (intensity == Vibrator.VIBRATION_INTENSITY_OFF) { return context.getString(R.string.switch_off_text); } else { return context.getString(R.string.switch_on_text); } } } protected abstract int getDefaultIntensity(); Loading src/com/android/settings/accessibility/VibrationPreferenceFragment.java +40 −17 Original line number Diff line number Diff line Loading @@ -55,12 +55,31 @@ public abstract class VibrationPreferenceFragment extends RadioButtonPickerFragm final static String KEY_INTENSITY_MEDIUM = "intensity_medium"; @VisibleForTesting final static String KEY_INTENSITY_HIGH = "intensity_high"; // KEY_INTENSITY_ON is only used when the device doesn't support multiple intensity levels. @VisibleForTesting final static String KEY_INTENSITY_ON = "intensity_on"; private final Map<String, VibrationIntensityCandidateInfo> mCandidates; private final SettingsObserver mSettingsObserver; public VibrationPreferenceFragment() { mCandidates = new ArrayMap<>(); mSettingsObserver = new SettingsObserver(); } @Override public void onAttach(Context context) { super.onAttach(context); mSettingsObserver.register(); if (mCandidates.isEmpty()) { loadCandidates(context); } } private void loadCandidates(Context context) { final boolean supportsMultipleIntensities = context.getResources().getBoolean( R.bool.config_vibration_supports_multiple_intensities); if (supportsMultipleIntensities) { mCandidates.put(KEY_INTENSITY_OFF, new VibrationIntensityCandidateInfo(KEY_INTENSITY_OFF, R.string.accessibility_vibration_intensity_off, Loading @@ -77,13 +96,14 @@ public abstract class VibrationPreferenceFragment extends RadioButtonPickerFragm new VibrationIntensityCandidateInfo(KEY_INTENSITY_HIGH, R.string.accessibility_vibration_intensity_high, Vibrator.VIBRATION_INTENSITY_HIGH)); mSettingsObserver = new SettingsObserver(); } else { mCandidates.put(KEY_INTENSITY_OFF, new VibrationIntensityCandidateInfo(KEY_INTENSITY_OFF, R.string.switch_off_text, Vibrator.VIBRATION_INTENSITY_OFF)); mCandidates.put(KEY_INTENSITY_ON, new VibrationIntensityCandidateInfo(KEY_INTENSITY_ON, R.string.switch_on_text, getDefaultVibrationIntensity())); } @Override public void onAttach(Context context) { super.onAttach(context); mSettingsObserver.register(); } @Override Loading Loading @@ -138,7 +158,10 @@ public abstract class VibrationPreferenceFragment extends RadioButtonPickerFragm final int vibrationIntensity = Settings.System.getInt(getContext().getContentResolver(), getVibrationIntensitySetting(), getDefaultVibrationIntensity()); for (VibrationIntensityCandidateInfo candidate : mCandidates.values()) { if (candidate.getIntensity() == vibrationIntensity) { final boolean matchesIntensity = candidate.getIntensity() == vibrationIntensity; final boolean matchesOn = candidate.getKey().equals(KEY_INTENSITY_ON) && vibrationIntensity != Vibrator.VIBRATION_INTENSITY_OFF; if (matchesIntensity || matchesOn) { return candidate.getKey(); } } Loading tests/robotests/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceControllerTest.java +51 −3 Original line number Diff line number Diff line Loading @@ -18,10 +18,12 @@ package com.android.settings.accessibility; import static android.provider.Settings.System.NOTIFICATION_VIBRATION_INTENSITY; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.arch.lifecycle.LifecycleOwner; import android.content.Context; import android.content.res.Resources; import android.os.Vibrator; import android.provider.Settings; import android.support.v7.preference.Preference; Loading @@ -48,6 +50,7 @@ public class NotificationVibrationIntensityPreferenceControllerTest { private LifecycleOwner mLifecycleOwner; private Lifecycle mLifecycle; private Context mContext; private Resources mResources; private NotificationVibrationIntensityPreferenceController mController; private Preference mPreference; Loading @@ -56,7 +59,11 @@ public class NotificationVibrationIntensityPreferenceControllerTest { MockitoAnnotations.initMocks(this); mLifecycleOwner = () -> mLifecycle; mLifecycle = new Lifecycle(mLifecycleOwner); mContext = RuntimeEnvironment.application; mContext = spy(RuntimeEnvironment.application); mResources = spy(mContext.getResources()); when(mContext.getResources()).thenReturn(mResources); when(mResources.getBoolean(R.bool.config_vibration_supports_multiple_intensities)) .thenReturn(true); mController = new NotificationVibrationIntensityPreferenceController(mContext) { @Override protected int getDefaultIntensity() { Loading @@ -68,7 +75,6 @@ public class NotificationVibrationIntensityPreferenceControllerTest { mPreference.setSummary("Test"); when(mScreen.findPreference(mController.getPreferenceKey())) .thenReturn(mPreference); mController.displayPreference(mScreen); } @Test Loading @@ -80,7 +86,10 @@ public class NotificationVibrationIntensityPreferenceControllerTest { } @Test public void updateState_shouldRefreshSummary() { public void updateState_withMultipleIntensitySuport_shouldRefreshSummary() { setSupportsMultipleIntensities(true); showPreference(); Settings.System.putInt(mContext.getContentResolver(), NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW); mController.updateState(mPreference); Loading @@ -105,4 +114,43 @@ public class NotificationVibrationIntensityPreferenceControllerTest { assertThat(mPreference.getSummary()) .isEqualTo(mContext.getString(R.string.accessibility_vibration_intensity_off)); } @Test public void updateState_withoutMultipleIntensitySupport_shouldRefreshSummary() { setSupportsMultipleIntensities(false); showPreference(); Settings.System.putInt(mContext.getContentResolver(), NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW); mController.updateState(mPreference); assertThat(mPreference.getSummary()) .isEqualTo(mContext.getString(R.string.switch_on_text)); Settings.System.putInt(mContext.getContentResolver(), NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH); mController.updateState(mPreference); assertThat(mPreference.getSummary()) .isEqualTo(mContext.getString(R.string.switch_on_text)); Settings.System.putInt(mContext.getContentResolver(), NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_MEDIUM); mController.updateState(mPreference); assertThat(mPreference.getSummary()) .isEqualTo(mContext.getString(R.string.switch_on_text)); Settings.System.putInt(mContext.getContentResolver(), NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF); mController.updateState(mPreference); assertThat(mPreference.getSummary()) .isEqualTo(mContext.getString(R.string.switch_off_text)); } private void setSupportsMultipleIntensities(boolean hasSupport) { when(mResources.getBoolean(R.bool.config_vibration_supports_multiple_intensities)) .thenReturn(hasSupport); } private void showPreference() { mController.displayPreference(mScreen); } } Loading
res/values/config.xml +5 −0 Original line number Diff line number Diff line Loading @@ -134,4 +134,9 @@ <!-- Whether or not to show the night light suggestion. --> <bool name="config_night_light_suggestion_enabled">true</bool> <!-- Whether or not the device is capable of multiple levels of vibration intensity. Note that this is different from whether it can control the vibration amplitude as some devices will be able to vary their amplitude but do not possess enough dynamic range to have distinct intensity levels --> <bool name="config_vibration_supports_multiple_intensities">false</bool> </resources>
src/com/android/settings/accessibility/AccessibilitySettings.java +21 −11 Original line number Diff line number Diff line Loading @@ -779,6 +779,9 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements } private String getVibrationSummary(Context context, @VibrationIntensity int intensity) { final boolean supportsMultipleIntensities = context.getResources().getBoolean( R.bool.config_vibration_supports_multiple_intensities); if (supportsMultipleIntensities) { switch (intensity) { case Vibrator.VIBRATION_INTENSITY_OFF: return context.getString(R.string.accessibility_vibration_summary_off); Loading @@ -791,6 +794,13 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements default: return ""; } } else { if (intensity == Vibrator.VIBRATION_INTENSITY_OFF) { return context.getString(R.string.switch_on_text); } else { return context.getString(R.string.switch_off_text); } } } private void updateLockScreenRotationCheckbox() { Loading
src/com/android/settings/accessibility/VibrationIntensityPreferenceController.java +21 −11 Original line number Diff line number Diff line Loading @@ -81,18 +81,28 @@ public abstract class VibrationIntensityPreferenceController extends BasePrefere } public static CharSequence getIntensityString(Context context, int intensity) { final boolean supportsMultipleIntensities = context.getResources().getBoolean( R.bool.config_vibration_supports_multiple_intensities); if (supportsMultipleIntensities) { switch (intensity) { case Vibrator.VIBRATION_INTENSITY_OFF: return context.getText(R.string.accessibility_vibration_intensity_off); return context.getString(R.string.accessibility_vibration_intensity_off); case Vibrator.VIBRATION_INTENSITY_LOW: return context.getText(R.string.accessibility_vibration_intensity_low); return context.getString(R.string.accessibility_vibration_intensity_low); case Vibrator.VIBRATION_INTENSITY_MEDIUM: return context.getText(R.string.accessibility_vibration_intensity_medium); return context.getString(R.string.accessibility_vibration_intensity_medium); case Vibrator.VIBRATION_INTENSITY_HIGH: return context.getText(R.string.accessibility_vibration_intensity_high); return context.getString(R.string.accessibility_vibration_intensity_high); default: return ""; } } else { if (intensity == Vibrator.VIBRATION_INTENSITY_OFF) { return context.getString(R.string.switch_off_text); } else { return context.getString(R.string.switch_on_text); } } } protected abstract int getDefaultIntensity(); Loading
src/com/android/settings/accessibility/VibrationPreferenceFragment.java +40 −17 Original line number Diff line number Diff line Loading @@ -55,12 +55,31 @@ public abstract class VibrationPreferenceFragment extends RadioButtonPickerFragm final static String KEY_INTENSITY_MEDIUM = "intensity_medium"; @VisibleForTesting final static String KEY_INTENSITY_HIGH = "intensity_high"; // KEY_INTENSITY_ON is only used when the device doesn't support multiple intensity levels. @VisibleForTesting final static String KEY_INTENSITY_ON = "intensity_on"; private final Map<String, VibrationIntensityCandidateInfo> mCandidates; private final SettingsObserver mSettingsObserver; public VibrationPreferenceFragment() { mCandidates = new ArrayMap<>(); mSettingsObserver = new SettingsObserver(); } @Override public void onAttach(Context context) { super.onAttach(context); mSettingsObserver.register(); if (mCandidates.isEmpty()) { loadCandidates(context); } } private void loadCandidates(Context context) { final boolean supportsMultipleIntensities = context.getResources().getBoolean( R.bool.config_vibration_supports_multiple_intensities); if (supportsMultipleIntensities) { mCandidates.put(KEY_INTENSITY_OFF, new VibrationIntensityCandidateInfo(KEY_INTENSITY_OFF, R.string.accessibility_vibration_intensity_off, Loading @@ -77,13 +96,14 @@ public abstract class VibrationPreferenceFragment extends RadioButtonPickerFragm new VibrationIntensityCandidateInfo(KEY_INTENSITY_HIGH, R.string.accessibility_vibration_intensity_high, Vibrator.VIBRATION_INTENSITY_HIGH)); mSettingsObserver = new SettingsObserver(); } else { mCandidates.put(KEY_INTENSITY_OFF, new VibrationIntensityCandidateInfo(KEY_INTENSITY_OFF, R.string.switch_off_text, Vibrator.VIBRATION_INTENSITY_OFF)); mCandidates.put(KEY_INTENSITY_ON, new VibrationIntensityCandidateInfo(KEY_INTENSITY_ON, R.string.switch_on_text, getDefaultVibrationIntensity())); } @Override public void onAttach(Context context) { super.onAttach(context); mSettingsObserver.register(); } @Override Loading Loading @@ -138,7 +158,10 @@ public abstract class VibrationPreferenceFragment extends RadioButtonPickerFragm final int vibrationIntensity = Settings.System.getInt(getContext().getContentResolver(), getVibrationIntensitySetting(), getDefaultVibrationIntensity()); for (VibrationIntensityCandidateInfo candidate : mCandidates.values()) { if (candidate.getIntensity() == vibrationIntensity) { final boolean matchesIntensity = candidate.getIntensity() == vibrationIntensity; final boolean matchesOn = candidate.getKey().equals(KEY_INTENSITY_ON) && vibrationIntensity != Vibrator.VIBRATION_INTENSITY_OFF; if (matchesIntensity || matchesOn) { return candidate.getKey(); } } Loading
tests/robotests/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceControllerTest.java +51 −3 Original line number Diff line number Diff line Loading @@ -18,10 +18,12 @@ package com.android.settings.accessibility; import static android.provider.Settings.System.NOTIFICATION_VIBRATION_INTENSITY; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.arch.lifecycle.LifecycleOwner; import android.content.Context; import android.content.res.Resources; import android.os.Vibrator; import android.provider.Settings; import android.support.v7.preference.Preference; Loading @@ -48,6 +50,7 @@ public class NotificationVibrationIntensityPreferenceControllerTest { private LifecycleOwner mLifecycleOwner; private Lifecycle mLifecycle; private Context mContext; private Resources mResources; private NotificationVibrationIntensityPreferenceController mController; private Preference mPreference; Loading @@ -56,7 +59,11 @@ public class NotificationVibrationIntensityPreferenceControllerTest { MockitoAnnotations.initMocks(this); mLifecycleOwner = () -> mLifecycle; mLifecycle = new Lifecycle(mLifecycleOwner); mContext = RuntimeEnvironment.application; mContext = spy(RuntimeEnvironment.application); mResources = spy(mContext.getResources()); when(mContext.getResources()).thenReturn(mResources); when(mResources.getBoolean(R.bool.config_vibration_supports_multiple_intensities)) .thenReturn(true); mController = new NotificationVibrationIntensityPreferenceController(mContext) { @Override protected int getDefaultIntensity() { Loading @@ -68,7 +75,6 @@ public class NotificationVibrationIntensityPreferenceControllerTest { mPreference.setSummary("Test"); when(mScreen.findPreference(mController.getPreferenceKey())) .thenReturn(mPreference); mController.displayPreference(mScreen); } @Test Loading @@ -80,7 +86,10 @@ public class NotificationVibrationIntensityPreferenceControllerTest { } @Test public void updateState_shouldRefreshSummary() { public void updateState_withMultipleIntensitySuport_shouldRefreshSummary() { setSupportsMultipleIntensities(true); showPreference(); Settings.System.putInt(mContext.getContentResolver(), NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW); mController.updateState(mPreference); Loading @@ -105,4 +114,43 @@ public class NotificationVibrationIntensityPreferenceControllerTest { assertThat(mPreference.getSummary()) .isEqualTo(mContext.getString(R.string.accessibility_vibration_intensity_off)); } @Test public void updateState_withoutMultipleIntensitySupport_shouldRefreshSummary() { setSupportsMultipleIntensities(false); showPreference(); Settings.System.putInt(mContext.getContentResolver(), NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW); mController.updateState(mPreference); assertThat(mPreference.getSummary()) .isEqualTo(mContext.getString(R.string.switch_on_text)); Settings.System.putInt(mContext.getContentResolver(), NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH); mController.updateState(mPreference); assertThat(mPreference.getSummary()) .isEqualTo(mContext.getString(R.string.switch_on_text)); Settings.System.putInt(mContext.getContentResolver(), NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_MEDIUM); mController.updateState(mPreference); assertThat(mPreference.getSummary()) .isEqualTo(mContext.getString(R.string.switch_on_text)); Settings.System.putInt(mContext.getContentResolver(), NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF); mController.updateState(mPreference); assertThat(mPreference.getSummary()) .isEqualTo(mContext.getString(R.string.switch_off_text)); } private void setSupportsMultipleIntensities(boolean hasSupport) { when(mResources.getBoolean(R.bool.config_vibration_supports_multiple_intensities)) .thenReturn(hasSupport); } private void showPreference() { mController.displayPreference(mScreen); } }