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

Commit df3b6434 authored by Wilson Wu's avatar Wilson Wu Committed by Android (Google) Code Review
Browse files

Merge "Fix keyboard vibration on unsupported device" into main

parents b4f14c44 761251b9
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);