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

Commit 27b16136 authored by Wilson Wu's avatar Wilson Wu
Browse files

Fix keyboard vibration on unsupported device

Add the fixed keyboard amplitude check to ensure
we only depend on keyboard vibration settings for
supported devices.

Bug: 326027376
Test: atest VibrationSettingsTest
Change-Id: I2c6f6272abe7d39f02647456e3adfffd00bac660
parent 093939b8
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -70,6 +70,8 @@ public class VibrationConfig {

    private final boolean mDefaultKeyboardVibrationEnabled;

    private final boolean mHasFixedKeyboardAmplitude;

    /** @hide */
    public VibrationConfig(@Nullable Resources resources) {
        mHapticChannelMaxVibrationAmplitude = loadFloat(resources,
@@ -87,6 +89,8 @@ public class VibrationConfig {
                com.android.internal.R.bool.config_ignoreVibrationsOnWirelessCharger, false);
        mDefaultKeyboardVibrationEnabled = loadBoolean(resources,
                com.android.internal.R.bool.config_defaultKeyboardVibrationEnabled, true);
        mHasFixedKeyboardAmplitude = loadFloat(resources,
                com.android.internal.R.dimen.config_keyboardHapticFeedbackFixedAmplitude, -1) > 0;

        mDefaultAlarmVibrationIntensity = loadDefaultIntensity(resources,
                com.android.internal.R.integer.config_defaultAlarmVibrationIntensity);
@@ -197,6 +201,14 @@ public class VibrationConfig {
        return mDefaultKeyboardVibrationEnabled;
    }

    /**
     * Whether the device has a fixed amplitude for keyboard.
     * @hide
     */
    public boolean hasFixedKeyboardAmplitude() {
        return mHasFixedKeyboardAmplitude;
    }

    /** Get the default vibration intensity for given usage. */
    @VibrationIntensity
    public int getDefaultVibrationIntensity(@VibrationAttributes.Usage int usage) {
+1 −1
Original line number Diff line number Diff line
@@ -532,7 +532,7 @@ final class VibrationSettings {
            return false;
        }

        if (Flags.keyboardCategoryEnabled()) {
        if (Flags.keyboardCategoryEnabled() && mVibrationConfig.hasFixedKeyboardAmplitude()) {
            int category = callerInfo.attrs.getCategory();
            if (usage == USAGE_TOUCH && category == CATEGORY_KEYBOARD) {
                // Keyboard touch has a different user setting.
+27 −2
Original line number Diff line number Diff line
@@ -604,7 +604,8 @@ public class VibrationSettingsTest {
    @RequiresFlagsEnabled(Flags.FLAG_KEYBOARD_CATEGORY_ENABLED)
    public void shouldIgnoreVibration_withKeyboardSettingsOff_shouldIgnoreKeyboardVibration() {
        setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_MEDIUM);
        setUserSetting(Settings.System.KEYBOARD_VIBRATION_ENABLED, 0);
        setUserSetting(Settings.System.KEYBOARD_VIBRATION_ENABLED, 0 /* OFF*/);
        setHasFixedKeyboardAmplitudeIntensity(true);

        // Keyboard touch ignored.
        assertVibrationIgnoredForAttributes(
@@ -628,7 +629,8 @@ public class VibrationSettingsTest {
    @RequiresFlagsEnabled(Flags.FLAG_KEYBOARD_CATEGORY_ENABLED)
    public void shouldIgnoreVibration_withKeyboardSettingsOn_shouldNotIgnoreKeyboardVibration() {
        setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
        setUserSetting(Settings.System.KEYBOARD_VIBRATION_ENABLED, 1);
        setUserSetting(Settings.System.KEYBOARD_VIBRATION_ENABLED, 1 /* ON */);
        setHasFixedKeyboardAmplitudeIntensity(true);

        // General touch ignored.
        assertVibrationIgnoredForUsage(USAGE_TOUCH, Vibration.Status.IGNORED_FOR_SETTINGS);
@@ -641,6 +643,25 @@ public class VibrationSettingsTest {
                        .build());
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_KEYBOARD_CATEGORY_ENABLED)
    public void shouldIgnoreVibration_noFixedKeyboardAmplitude_ignoresKeyboardTouchVibration() {
        setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
        setUserSetting(Settings.System.KEYBOARD_VIBRATION_ENABLED, 1 /* ON */);
        setHasFixedKeyboardAmplitudeIntensity(false);

        // General touch ignored.
        assertVibrationIgnoredForUsage(USAGE_TOUCH, Vibration.Status.IGNORED_FOR_SETTINGS);

        // Keyboard touch ignored.
        assertVibrationIgnoredForAttributes(
                new VibrationAttributes.Builder()
                        .setUsage(USAGE_TOUCH)
                        .setCategory(VibrationAttributes.CATEGORY_KEYBOARD)
                        .build(),
                Vibration.Status.IGNORED_FOR_SETTINGS);
    }

    @Test
    public void shouldIgnoreVibrationFromVirtualDevices_defaultDevice_neverIgnored() {
        // Vibrations from the primary device is never ignored.
@@ -953,6 +974,10 @@ public class VibrationSettingsTest {
        when(mVibrationConfigMock.ignoreVibrationsOnWirelessCharger()).thenReturn(ignore);
    }

    private void setHasFixedKeyboardAmplitudeIntensity(boolean hasFixedAmplitude) {
        when(mVibrationConfigMock.hasFixedKeyboardAmplitude()).thenReturn(hasFixedAmplitude);
    }

    private void deleteUserSetting(String settingName) {
        Settings.System.putStringForUser(
                mContextSpy.getContentResolver(), settingName, null, UserHandle.USER_CURRENT);