diff options
| author | 2024-08-26 23:21:13 -0700 | |
|---|---|---|
| committer | 2024-09-13 14:05:15 -0700 | |
| commit | 2ea8c01def5fd64ee9f5c2f557ed15f0a3062d17 (patch) | |
| tree | 8ad90a518db010c3ca69882fed0469873059b40f | |
| parent | 570e23fed99752e2a1eb46bbaf7c8da7efc94df8 (diff) | |
haptic: handle attrs for input source custmoized haptic feedback
Follow-up of VibrationEffect handling ag/28623479. This CL handles
VibrationAttributes for the input source haptic feedback customization.
Flag: android.os.vibrator.haptic_feedback_input_source_customization_enabled
Test: atest HapticFeedbackVibrationProviderTest
Bug: 354049335
Change-Id: Ib0388f7072f39454ac164a4a98e48d2a69fdab70
3 files changed, 110 insertions, 25 deletions
diff --git a/services/core/java/com/android/server/vibrator/HapticFeedbackVibrationProvider.java b/services/core/java/com/android/server/vibrator/HapticFeedbackVibrationProvider.java index cae6b34d4c73..006a5bb1d1d0 100644 --- a/services/core/java/com/android/server/vibrator/HapticFeedbackVibrationProvider.java +++ b/services/core/java/com/android/server/vibrator/HapticFeedbackVibrationProvider.java @@ -16,6 +16,8 @@ package com.android.server.vibrator; +import static android.os.vibrator.Flags.hapticFeedbackInputSourceCustomizationEnabled; + import android.annotation.NonNull; import android.annotation.Nullable; import android.content.res.Resources; @@ -121,7 +123,6 @@ public final class HapticFeedbackVibrationProvider { return getVibrationForHapticFeedback(effectId); } - // TODO(b/354049335): handle input source customized VibrationAttributes. /** * Provides the {@link VibrationAttributes} that should be used for a haptic feedback. * @@ -131,7 +132,7 @@ public final class HapticFeedbackVibrationProvider { * @param privFlags Additional private flags as per {@link HapticFeedbackConstants}. * @return the {@link VibrationAttributes} that should be used for the provided haptic feedback. */ - public VibrationAttributes getVibrationAttributesForHapticFeedback(int effectId, + public VibrationAttributes getVibrationAttributes(int effectId, @HapticFeedbackConstants.Flags int flags, @HapticFeedbackConstants.PrivateFlags int privFlags) { VibrationAttributes attrs; @@ -142,10 +143,13 @@ public final class HapticFeedbackVibrationProvider { break; case HapticFeedbackConstants.ASSISTANT_BUTTON: case HapticFeedbackConstants.LONG_PRESS_POWER_BUTTON: + attrs = HARDWARE_FEEDBACK_VIBRATION_ATTRIBUTES; + break; case HapticFeedbackConstants.SCROLL_TICK: case HapticFeedbackConstants.SCROLL_ITEM_FOCUS: case HapticFeedbackConstants.SCROLL_LIMIT: - attrs = HARDWARE_FEEDBACK_VIBRATION_ATTRIBUTES; + attrs = hapticFeedbackInputSourceCustomizationEnabled() ? TOUCH_VIBRATION_ATTRIBUTES + : HARDWARE_FEEDBACK_VIBRATION_ATTRIBUTES; break; case HapticFeedbackConstants.KEYBOARD_TAP: case HapticFeedbackConstants.KEYBOARD_RELEASE: @@ -158,19 +162,32 @@ public final class HapticFeedbackVibrationProvider { default: attrs = TOUCH_VIBRATION_ATTRIBUTES; } + return getVibrationAttributesWithFlags(attrs, effectId, flags); + } - int vibFlags = 0; - boolean bypassVibrationIntensitySetting = - (flags & HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING) != 0; - if (bypassVibrationIntensitySetting) { - vibFlags |= VibrationAttributes.FLAG_BYPASS_USER_VIBRATION_INTENSITY_OFF; - } - if (shouldBypassInterruptionPolicy(effectId)) { - vibFlags |= VibrationAttributes.FLAG_BYPASS_INTERRUPTION_POLICY; + /** + * Similar to {@link #getVibrationAttributes(int, int, int)} but also handles + * input source customization. + * + * @param inputSource the {@link InputDevice.Source} that customizes the + * {@link VibrationAttributes}. + */ + public VibrationAttributes getVibrationAttributes(int effectId, + int inputSource, + @HapticFeedbackConstants.Flags int flags, + @HapticFeedbackConstants.PrivateFlags int privFlags) { + if (hapticFeedbackInputSourceCustomizationEnabled() + && inputSource == InputDevice.SOURCE_ROTARY_ENCODER) { + switch (effectId) { + case HapticFeedbackConstants.SCROLL_TICK, + HapticFeedbackConstants.SCROLL_ITEM_FOCUS, + HapticFeedbackConstants.SCROLL_LIMIT -> { + return getVibrationAttributesWithFlags(HARDWARE_FEEDBACK_VIBRATION_ATTRIBUTES, + effectId, flags); + } + } } - - return vibFlags == 0 ? attrs : new VibrationAttributes.Builder(attrs) - .setFlags(vibFlags).build(); + return getVibrationAttributes(effectId, flags, privFlags); } /** @@ -344,6 +361,20 @@ public final class HapticFeedbackVibrationProvider { return IME_FEEDBACK_VIBRATION_ATTRIBUTES; } + private VibrationAttributes getVibrationAttributesWithFlags(VibrationAttributes attrs, + int effectId, int flags) { + int vibFlags = 0; + if ((flags & HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING) != 0) { + vibFlags |= VibrationAttributes.FLAG_BYPASS_USER_VIBRATION_INTENSITY_OFF; + } + if (shouldBypassInterruptionPolicy(effectId)) { + vibFlags |= VibrationAttributes.FLAG_BYPASS_INTERRUPTION_POLICY; + } + + return vibFlags == 0 ? attrs : new VibrationAttributes.Builder(attrs) + .setFlags(vibFlags).build(); + } + private static boolean shouldBypassInterruptionPolicy(int effectId) { switch (effectId) { case HapticFeedbackConstants.SCROLL_TICK: diff --git a/services/core/java/com/android/server/vibrator/VibratorManagerService.java b/services/core/java/com/android/server/vibrator/VibratorManagerService.java index 799934af54c0..1df4368b98f2 100644 --- a/services/core/java/com/android/server/vibrator/VibratorManagerService.java +++ b/services/core/java/com/android/server/vibrator/VibratorManagerService.java @@ -498,7 +498,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { } return performHapticFeedbackWithEffect(uid, deviceId, opPkg, constant, reason, token, hapticVibrationProvider.getVibration(constant), - hapticVibrationProvider.getVibrationAttributesForHapticFeedback( + hapticVibrationProvider.getVibrationAttributes( constant, flags, privFlags)); } @@ -523,8 +523,8 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { } return performHapticFeedbackWithEffect(uid, deviceId, opPkg, constant, reason, token, hapticVibrationProvider.getVibration(constant, inputSource), - hapticVibrationProvider.getVibrationAttributesForHapticFeedback( - constant, flags, privFlags)); + hapticVibrationProvider.getVibrationAttributes(constant, inputSource, flags, + privFlags)); } private HalVibration performHapticFeedbackWithEffect(int uid, int deviceId, String opPkg, diff --git a/services/tests/vibrator/src/com/android/server/vibrator/HapticFeedbackVibrationProviderTest.java b/services/tests/vibrator/src/com/android/server/vibrator/HapticFeedbackVibrationProviderTest.java index 6076d3318c40..f7127df0ee33 100644 --- a/services/tests/vibrator/src/com/android/server/vibrator/HapticFeedbackVibrationProviderTest.java +++ b/services/tests/vibrator/src/com/android/server/vibrator/HapticFeedbackVibrationProviderTest.java @@ -18,6 +18,7 @@ package com.android.server.vibrator; import static android.os.VibrationAttributes.FLAG_BYPASS_INTERRUPTION_POLICY; import static android.os.VibrationAttributes.FLAG_BYPASS_USER_VIBRATION_INTENSITY_OFF; +import static android.os.VibrationAttributes.USAGE_HARDWARE_FEEDBACK; import static android.os.VibrationAttributes.USAGE_IME_FEEDBACK; import static android.os.VibrationAttributes.USAGE_TOUCH; import static android.os.VibrationEffect.Composition.PRIMITIVE_CLICK; @@ -105,7 +106,7 @@ public class HapticFeedbackVibrationProviderTest { @Before public void setUp() { - mSetFlagsRule.enableFlags(FLAG_HAPTIC_FEEDBACK_INPUT_SOURCE_CUSTOMIZATION_ENABLED); + mSetFlagsRule.disableFlags(FLAG_HAPTIC_FEEDBACK_INPUT_SOURCE_CUSTOMIZATION_ENABLED); } @Test @@ -398,7 +399,7 @@ public class HapticFeedbackVibrationProviderTest { HapticFeedbackVibrationProvider provider = createProviderWithoutCustomizations(); for (int effectId : BIOMETRIC_FEEDBACK_CONSTANTS) { - VibrationAttributes attrs = provider.getVibrationAttributesForHapticFeedback( + VibrationAttributes attrs = provider.getVibrationAttributes( effectId, /* flags */ 0, /* privFlags */ 0); assertThat(attrs.getUsage()).isEqualTo(VibrationAttributes.USAGE_COMMUNICATION_REQUEST); } @@ -408,7 +409,7 @@ public class HapticFeedbackVibrationProviderTest { public void testVibrationAttribute_forNotBypassingIntensitySettings() { HapticFeedbackVibrationProvider provider = createProviderWithoutCustomizations(); - VibrationAttributes attrs = provider.getVibrationAttributesForHapticFeedback( + VibrationAttributes attrs = provider.getVibrationAttributes( SAFE_MODE_ENABLED, /* flags */ 0, /* privFlags */ 0); assertThat(attrs.isFlagSet(FLAG_BYPASS_USER_VIBRATION_INTENSITY_OFF)).isFalse(); @@ -418,7 +419,7 @@ public class HapticFeedbackVibrationProviderTest { public void testVibrationAttribute_forByassingIntensitySettings() { HapticFeedbackVibrationProvider provider = createProviderWithoutCustomizations(); - VibrationAttributes attrs = provider.getVibrationAttributesForHapticFeedback( + VibrationAttributes attrs = provider.getVibrationAttributes( SAFE_MODE_ENABLED, /* flags */ HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING, /* privFlags */ 0); @@ -431,7 +432,7 @@ public class HapticFeedbackVibrationProviderTest { HapticFeedbackVibrationProvider provider = createProviderWithoutCustomizations(); for (int effectId : SCROLL_FEEDBACK_CONSTANTS) { - VibrationAttributes attrs = provider.getVibrationAttributesForHapticFeedback( + VibrationAttributes attrs = provider.getVibrationAttributes( effectId, /* flags */ 0, /* privFlags */ 0); assertWithMessage("Expected FLAG_BYPASS_INTERRUPTION_POLICY for effect " + effectId) .that(attrs.isFlagSet(FLAG_BYPASS_INTERRUPTION_POLICY)).isTrue(); @@ -444,7 +445,7 @@ public class HapticFeedbackVibrationProviderTest { HapticFeedbackVibrationProvider provider = createProviderWithoutCustomizations(); for (int effectId : SCROLL_FEEDBACK_CONSTANTS) { - VibrationAttributes attrs = provider.getVibrationAttributesForHapticFeedback( + VibrationAttributes attrs = provider.getVibrationAttributes( effectId, /* flags */ 0, /* privFlags */ 0); assertWithMessage("Expected no FLAG_BYPASS_INTERRUPTION_POLICY for effect " + effectId) .that(attrs.isFlagSet(FLAG_BYPASS_INTERRUPTION_POLICY)).isFalse(); @@ -452,11 +453,64 @@ public class HapticFeedbackVibrationProviderTest { } @Test + public void testVibrationAttribute_scrollFeedback_inputCustomizedFlag_useTouchUsage() { + mSetFlagsRule.enableFlags(FLAG_HAPTIC_FEEDBACK_INPUT_SOURCE_CUSTOMIZATION_ENABLED); + HapticFeedbackVibrationProvider provider = createProviderWithoutCustomizations(); + + for (int effectId : SCROLL_FEEDBACK_CONSTANTS) { + VibrationAttributes attrs = provider.getVibrationAttributes(effectId, /* flags */ + 0, /* privFlags */ 0); + assertWithMessage("Expected USAGE_TOUCH for scroll effect " + effectId + + ", if no input customization").that(attrs.getUsage()).isEqualTo(USAGE_TOUCH); + } + } + + @Test + public void testVibrationAttribute_scrollFeedback_noInputCustomizedFlag_useHardwareFeedback() { + HapticFeedbackVibrationProvider provider = createProviderWithoutCustomizations(); + + for (int effectId : SCROLL_FEEDBACK_CONSTANTS) { + VibrationAttributes attrs = provider.getVibrationAttributes(effectId, /* flags */ + 0, /* privFlags */ 0); + assertWithMessage("Expected USAGE_HARDWARE_FEEDBACK for scroll effect " + effectId + + ", if no input customization").that(attrs.getUsage()).isEqualTo( + USAGE_HARDWARE_FEEDBACK); + } + } + + @Test + public void testVibrationAttribute_scrollFeedback_rotaryInputSource_useHardwareFeedback() { + mSetFlagsRule.enableFlags(FLAG_HAPTIC_FEEDBACK_INPUT_SOURCE_CUSTOMIZATION_ENABLED); + HapticFeedbackVibrationProvider provider = createProviderWithoutCustomizations(); + + for (int effectId : SCROLL_FEEDBACK_CONSTANTS) { + VibrationAttributes attrs = provider.getVibrationAttributes( + effectId, InputDevice.SOURCE_ROTARY_ENCODER, /* flags */ 0, /* privFlags */ 0); + assertWithMessage( + "Expected USAGE_HARDWARE_FEEDBACK for input source SOURCE_ROTARY_ENCODER").that( + attrs.getUsage()).isEqualTo(USAGE_HARDWARE_FEEDBACK); + } + } + + @Test + public void testVibrationAttribute_scrollFeedback_touchInputSource_useTouchUsage() { + mSetFlagsRule.enableFlags(FLAG_HAPTIC_FEEDBACK_INPUT_SOURCE_CUSTOMIZATION_ENABLED); + HapticFeedbackVibrationProvider provider = createProviderWithoutCustomizations(); + + for (int effectId : SCROLL_FEEDBACK_CONSTANTS) { + VibrationAttributes attrs = provider.getVibrationAttributes( + effectId, InputDevice.SOURCE_TOUCHSCREEN, /* flags */ 0, /* privFlags */ 0); + assertWithMessage("Expected USAGE_TOUCH for input source SOURCE_TOUCHSCREEN").that( + attrs.getUsage()).isEqualTo(USAGE_TOUCH); + } + } + + @Test public void testVibrationAttribute_notIme_useTouchUsage() { HapticFeedbackVibrationProvider provider = createProviderWithoutCustomizations(); for (int effectId : KEYBOARD_FEEDBACK_CONSTANTS) { - VibrationAttributes attrs = provider.getVibrationAttributesForHapticFeedback( + VibrationAttributes attrs = provider.getVibrationAttributes( effectId, /* flags */ 0, /* privFlags */ 0); assertWithMessage("Expected USAGE_TOUCH for effect " + effectId) .that(attrs.getUsage()).isEqualTo(USAGE_TOUCH); @@ -468,7 +522,7 @@ public class HapticFeedbackVibrationProviderTest { HapticFeedbackVibrationProvider provider = createProviderWithoutCustomizations(); for (int effectId : KEYBOARD_FEEDBACK_CONSTANTS) { - VibrationAttributes attrs = provider.getVibrationAttributesForHapticFeedback( + VibrationAttributes attrs = provider.getVibrationAttributes( effectId, /* flags */ 0, HapticFeedbackConstants.PRIVATE_FLAG_APPLY_INPUT_METHOD_SETTINGS); assertWithMessage("Expected USAGE_IME_FEEDBACK for effect " + effectId) |