Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 23460d03 authored by Michael Wright's avatar Michael Wright Committed by android-build-merger
Browse files

Merge "Hide haptic intensity settings for devices without enough dynamic range." into pi-dev

am: 8c60fc69

Change-Id: I036caa9e233f74c71c2dddef9e58c036b250a968
parents 6a090b46 8c60fc69
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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>
+21 −11
Original line number Diff line number Diff line
@@ -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);
@@ -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() {
+21 −11
Original line number Diff line number Diff line
@@ -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();
+40 −17
Original line number Diff line number Diff line
@@ -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,
@@ -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
@@ -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();
            }
        }
+51 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -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() {
@@ -68,7 +75,6 @@ public class NotificationVibrationIntensityPreferenceControllerTest {
        mPreference.setSummary("Test");
        when(mScreen.findPreference(mController.getPreferenceKey()))
                .thenReturn(mPreference);
        mController.displayPreference(mScreen);
    }

    @Test
@@ -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);
@@ -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