diff options
| author | 2024-03-06 03:45:54 +0000 | |
|---|---|---|
| committer | 2024-03-06 12:29:03 +0000 | |
| commit | 761251b91bae3ca462111e26b3f9a0a34146d71d (patch) | |
| tree | 10f7ea1f0dd4aa7bcf0495921c11d5f4941eef18 | |
| parent | 4e62d6c3e69e9324a15c5b83f6bb3102b9b708dc (diff) | |
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
3 files changed, 40 insertions, 3 deletions
diff --git a/core/java/android/os/vibrator/VibrationConfig.java b/core/java/android/os/vibrator/VibrationConfig.java index a14a2c7e54ca..555a1204c8a7 100644 --- a/core/java/android/os/vibrator/VibrationConfig.java +++ b/core/java/android/os/vibrator/VibrationConfig.java @@ -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) { diff --git a/services/core/java/com/android/server/vibrator/VibrationSettings.java b/services/core/java/com/android/server/vibrator/VibrationSettings.java index 5b77433fa6d9..2fc183d9113f 100644 --- a/services/core/java/com/android/server/vibrator/VibrationSettings.java +++ b/services/core/java/com/android/server/vibrator/VibrationSettings.java @@ -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. diff --git a/services/tests/vibrator/src/com/android/server/vibrator/VibrationSettingsTest.java b/services/tests/vibrator/src/com/android/server/vibrator/VibrationSettingsTest.java index f54c7e57828b..88a94830e98a 100644 --- a/services/tests/vibrator/src/com/android/server/vibrator/VibrationSettingsTest.java +++ b/services/tests/vibrator/src/com/android/server/vibrator/VibrationSettingsTest.java @@ -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); @@ -642,6 +644,25 @@ public class VibrationSettingsTest { } @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. for (int usage : ALL_USAGES) { @@ -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); |