summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chen Bai <chenbai@google.com> 2024-08-26 23:21:13 -0700
committer Chen Bai <chenbai@google.com> 2024-09-13 14:05:15 -0700
commit2ea8c01def5fd64ee9f5c2f557ed15f0a3062d17 (patch)
tree8ad90a518db010c3ca69882fed0469873059b40f
parent570e23fed99752e2a1eb46bbaf7c8da7efc94df8 (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
-rw-r--r--services/core/java/com/android/server/vibrator/HapticFeedbackVibrationProvider.java59
-rw-r--r--services/core/java/com/android/server/vibrator/VibratorManagerService.java6
-rw-r--r--services/tests/vibrator/src/com/android/server/vibrator/HapticFeedbackVibrationProviderTest.java70
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)