summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/os/IVibratorManagerService.aidl2
-rw-r--r--core/java/android/os/SystemVibrator.java5
-rw-r--r--core/java/android/os/SystemVibratorManager.java10
-rw-r--r--core/java/android/os/Vibrator.java4
-rw-r--r--core/java/android/os/VibratorManager.java4
-rw-r--r--core/java/android/view/IWindowSession.aidl4
-rw-r--r--core/java/android/view/View.java11
-rw-r--r--core/java/android/view/ViewRootImpl.java6
-rw-r--r--core/java/android/view/WindowlessWindowManager.java6
-rw-r--r--core/tests/coretests/src/android/view/ViewRootImplTest.java2
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java6
-rw-r--r--services/core/java/com/android/server/policy/WindowManagerPolicy.java2
-rw-r--r--services/core/java/com/android/server/vibrator/HapticFeedbackVibrationProvider.java18
-rw-r--r--services/core/java/com/android/server/vibrator/VibratorManagerService.java12
-rw-r--r--services/core/java/com/android/server/wm/Session.java8
-rw-r--r--services/tests/vibrator/src/com/android/server/vibrator/HapticFeedbackVibrationProviderTest.java64
-rw-r--r--services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java2
18 files changed, 110 insertions, 58 deletions
diff --git a/core/java/android/os/IVibratorManagerService.aidl b/core/java/android/os/IVibratorManagerService.aidl
index 65e498e14475..8b1577cb4b1c 100644
--- a/core/java/android/os/IVibratorManagerService.aidl
+++ b/core/java/android/os/IVibratorManagerService.aidl
@@ -41,5 +41,5 @@ interface IVibratorManagerService {
// There is no order guarantee with respect to the two-way APIs above like
// vibrate/isVibrating/cancel.
oneway void performHapticFeedback(int uid, int deviceId, String opPkg, int constant,
- boolean always, String reason);
+ boolean always, String reason, boolean fromIme);
}
diff --git a/core/java/android/os/SystemVibrator.java b/core/java/android/os/SystemVibrator.java
index 04c257b92e29..2a62c24a86e1 100644
--- a/core/java/android/os/SystemVibrator.java
+++ b/core/java/android/os/SystemVibrator.java
@@ -206,12 +206,13 @@ public class SystemVibrator extends Vibrator {
}
@Override
- public void performHapticFeedback(int constant, boolean always, String reason) {
+ public void performHapticFeedback(
+ int constant, boolean always, String reason, boolean fromIme) {
if (mVibratorManager == null) {
Log.w(TAG, "Failed to perform haptic feedback; no vibrator manager.");
return;
}
- mVibratorManager.performHapticFeedback(constant, always, reason);
+ mVibratorManager.performHapticFeedback(constant, always, reason, fromIme);
}
@Override
diff --git a/core/java/android/os/SystemVibratorManager.java b/core/java/android/os/SystemVibratorManager.java
index 8e8392302824..c80bcac2624f 100644
--- a/core/java/android/os/SystemVibratorManager.java
+++ b/core/java/android/os/SystemVibratorManager.java
@@ -147,14 +147,15 @@ public class SystemVibratorManager extends VibratorManager {
}
@Override
- public void performHapticFeedback(int constant, boolean always, String reason) {
+ public void performHapticFeedback(int constant, boolean always, String reason,
+ boolean fromIme) {
if (mService == null) {
Log.w(TAG, "Failed to perform haptic feedback; no vibrator manager service.");
return;
}
try {
mService.performHapticFeedback(
- mUid, mContext.getDeviceId(), mPackageName, constant, always, reason);
+ mUid, mContext.getDeviceId(), mPackageName, constant, always, reason, fromIme);
} catch (RemoteException e) {
Log.w(TAG, "Failed to perform haptic feedback.", e);
}
@@ -244,8 +245,9 @@ public class SystemVibratorManager extends VibratorManager {
}
@Override
- public void performHapticFeedback(int effectId, boolean always, String reason) {
- SystemVibratorManager.this.performHapticFeedback(effectId, always, reason);
+ public void performHapticFeedback(int effectId, boolean always, String reason,
+ boolean fromIme) {
+ SystemVibratorManager.this.performHapticFeedback(effectId, always, reason, fromIme);
}
@Override
diff --git a/core/java/android/os/Vibrator.java b/core/java/android/os/Vibrator.java
index 2fc24142acf2..4b2d4eb833ff 100644
--- a/core/java/android/os/Vibrator.java
+++ b/core/java/android/os/Vibrator.java
@@ -534,10 +534,12 @@ public abstract class Vibrator {
* {@code false} if the vibration for the haptic feedback should respect the applicable
* vibration intensity settings.
* @param reason the reason for this haptic feedback.
+ * @param fromIme the haptic feedback is performed from an IME.
*
* @hide
*/
- public void performHapticFeedback(int constant, boolean always, String reason) {
+ public void performHapticFeedback(int constant, boolean always, String reason,
+ boolean fromIme) {
Log.w(TAG, "performHapticFeedback is not supported");
}
diff --git a/core/java/android/os/VibratorManager.java b/core/java/android/os/VibratorManager.java
index e0b6a9fd28f0..513c4bd7ec0c 100644
--- a/core/java/android/os/VibratorManager.java
+++ b/core/java/android/os/VibratorManager.java
@@ -146,9 +146,11 @@ public abstract class VibratorManager {
* vibration intensity settings applicable to the corresponding vibration.
* {@code false} otherwise.
* @param reason the reason for this haptic feedback.
+ * @param fromIme the haptic feedback is performed from an IME.
* @hide
*/
- public void performHapticFeedback(int constant, boolean always, String reason) {
+ public void performHapticFeedback(int constant, boolean always, String reason,
+ boolean fromIme) {
Log.w(TAG, "performHapticFeedback is not supported");
}
diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl
index d68a47c54d4b..e126836020b4 100644
--- a/core/java/android/view/IWindowSession.aidl
+++ b/core/java/android/view/IWindowSession.aidl
@@ -148,13 +148,13 @@ interface IWindowSession {
int seqId);
@UnsupportedAppUsage
- boolean performHapticFeedback(int effectId, boolean always);
+ boolean performHapticFeedback(int effectId, boolean always, boolean fromIme);
/**
* Called by attached views to perform predefined haptic feedback without requiring VIBRATE
* permission.
*/
- oneway void performHapticFeedbackAsync(int effectId, boolean always);
+ oneway void performHapticFeedbackAsync(int effectId, boolean always, boolean fromIme);
/**
* Initiate the drag operation itself
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 042af1f0fb15..8a85a05a15e9 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -25,6 +25,7 @@ import static android.view.Surface.FRAME_RATE_CATEGORY_LOW;
import static android.view.Surface.FRAME_RATE_CATEGORY_NORMAL;
import static android.view.Surface.FRAME_RATE_CATEGORY_NO_PREFERENCE;
import static android.view.Surface.FRAME_RATE_COMPATIBILITY_FIXED_SOURCE;
+import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.accessibility.AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED;
import static android.view.displayhash.DisplayHashResultCallback.DISPLAY_HASH_ERROR_INVALID_BOUNDS;
import static android.view.displayhash.DisplayHashResultCallback.DISPLAY_HASH_ERROR_MISSING_WINDOW;
@@ -28371,15 +28372,19 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
final boolean always = (flags & HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING) != 0;
+ boolean fromIme = false;
+ if (mAttachInfo.mViewRootImpl != null) {
+ fromIme = mAttachInfo.mViewRootImpl.mWindowAttributes.type == TYPE_INPUT_METHOD;
+ }
if (Flags.useVibratorHapticFeedback()) {
if (!mAttachInfo.canPerformHapticFeedback()) {
return false;
}
getSystemVibrator().performHapticFeedback(
- feedbackConstant, always, "View#performHapticFeedback");
+ feedbackConstant, always, "View#performHapticFeedback", fromIme);
return true;
}
- return mAttachInfo.mRootCallbacks.performHapticFeedback(feedbackConstant, always);
+ return mAttachInfo.mRootCallbacks.performHapticFeedback(feedbackConstant, always, fromIme);
}
private Vibrator getSystemVibrator() {
@@ -31422,7 +31427,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
interface Callbacks {
void playSoundEffect(int effectId);
- boolean performHapticFeedback(int effectId, boolean always);
+ boolean performHapticFeedback(int effectId, boolean always, boolean fromIme);
}
/**
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 333cbb39d9c7..708751a25053 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -9201,18 +9201,18 @@ public final class ViewRootImpl implements ViewParent,
* {@inheritDoc}
*/
@Override
- public boolean performHapticFeedback(int effectId, boolean always) {
+ public boolean performHapticFeedback(int effectId, boolean always, boolean fromIme) {
if ((mDisplay.getFlags() & Display.FLAG_TOUCH_FEEDBACK_DISABLED) != 0) {
return false;
}
try {
if (USE_ASYNC_PERFORM_HAPTIC_FEEDBACK) {
- mWindowSession.performHapticFeedbackAsync(effectId, always);
+ mWindowSession.performHapticFeedbackAsync(effectId, always, fromIme);
return true;
} else {
// Original blocking binder call path.
- return mWindowSession.performHapticFeedback(effectId, always);
+ return mWindowSession.performHapticFeedback(effectId, always, fromIme);
}
} catch (RemoteException e) {
return false;
diff --git a/core/java/android/view/WindowlessWindowManager.java b/core/java/android/view/WindowlessWindowManager.java
index 2b2c50725749..22d8ed91d455 100644
--- a/core/java/android/view/WindowlessWindowManager.java
+++ b/core/java/android/view/WindowlessWindowManager.java
@@ -479,13 +479,13 @@ public class WindowlessWindowManager implements IWindowSession {
}
@Override
- public boolean performHapticFeedback(int effectId, boolean always) {
+ public boolean performHapticFeedback(int effectId, boolean always, boolean fromIme) {
return false;
}
@Override
- public void performHapticFeedbackAsync(int effectId, boolean always) {
- performHapticFeedback(effectId, always);
+ public void performHapticFeedbackAsync(int effectId, boolean always, boolean fromIme) {
+ performHapticFeedback(effectId, always, fromIme);
}
@Override
diff --git a/core/tests/coretests/src/android/view/ViewRootImplTest.java b/core/tests/coretests/src/android/view/ViewRootImplTest.java
index 7c58de67ded6..1a242eff73b1 100644
--- a/core/tests/coretests/src/android/view/ViewRootImplTest.java
+++ b/core/tests/coretests/src/android/view/ViewRootImplTest.java
@@ -451,7 +451,7 @@ public class ViewRootImplTest {
ViewRootImpl viewRootImpl = new ViewRootImpl(sContext, display);
boolean result = viewRootImpl.performHapticFeedback(
- HapticFeedbackConstants.CONTEXT_CLICK, true);
+ HapticFeedbackConstants.CONTEXT_CLICK, true, false /* fromIme */);
assertThat(result).isFalse();
}
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 428fca082f75..e9a7fe1371ac 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -6410,7 +6410,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private boolean performHapticFeedback(int effectId, boolean always, String reason) {
return performHapticFeedback(Process.myUid(), mContext.getOpPackageName(),
- effectId, always, reason);
+ effectId, always, reason, false /* fromIme */);
}
@Override
@@ -6420,7 +6420,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
@Override
public boolean performHapticFeedback(int uid, String packageName, int effectId,
- boolean always, String reason) {
+ boolean always, String reason, boolean fromIme) {
if (!mVibrator.hasVibrator()) {
return false;
}
@@ -6431,7 +6431,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
VibrationAttributes attrs =
mHapticFeedbackVibrationProvider.getVibrationAttributesForHapticFeedback(
- effectId, /* bypassVibrationIntensitySetting= */ always);
+ effectId, /* bypassVibrationIntensitySetting= */ always, fromIme);
VibratorFrameworkStatsLogger.logPerformHapticsFeedbackIfKeyboard(uid, effectId);
mVibrator.vibrate(uid, packageName, effect, reason, attrs);
return true;
diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
index 2174fd62ea00..5956594acd26 100644
--- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java
+++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
@@ -1072,7 +1072,7 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
* Call from application to perform haptic feedback on its window.
*/
public boolean performHapticFeedback(int uid, String packageName, int effectId,
- boolean always, String reason);
+ boolean always, String reason, boolean fromIme);
/**
* Called when we have started keeping the screen on because a window
diff --git a/services/core/java/com/android/server/vibrator/HapticFeedbackVibrationProvider.java b/services/core/java/com/android/server/vibrator/HapticFeedbackVibrationProvider.java
index 519acec2f7b4..126af1fe8496 100644
--- a/services/core/java/com/android/server/vibrator/HapticFeedbackVibrationProvider.java
+++ b/services/core/java/com/android/server/vibrator/HapticFeedbackVibrationProvider.java
@@ -190,10 +190,11 @@ public final class HapticFeedbackVibrationProvider {
* to get.
* @param bypassVibrationIntensitySetting {@code true} if the returned attribute should bypass
* vibration intensity settings. {@code false} otherwise.
+ * @param fromIme the haptic feedback is performed from an IME.
* @return the {@link VibrationAttributes} that should be used for the provided haptic feedback.
*/
public VibrationAttributes getVibrationAttributesForHapticFeedback(
- int effectId, boolean bypassVibrationIntensitySetting) {
+ int effectId, boolean bypassVibrationIntensitySetting, boolean fromIme) {
VibrationAttributes attrs;
switch (effectId) {
case HapticFeedbackConstants.EDGE_SQUEEZE:
@@ -209,7 +210,7 @@ public final class HapticFeedbackVibrationProvider {
break;
case HapticFeedbackConstants.KEYBOARD_TAP:
case HapticFeedbackConstants.KEYBOARD_RELEASE:
- attrs = createKeyboardVibrationAttributes();
+ attrs = createKeyboardVibrationAttributes(fromIme);
break;
default:
attrs = TOUCH_VIBRATION_ATTRIBUTES;
@@ -222,7 +223,7 @@ public final class HapticFeedbackVibrationProvider {
if (shouldBypassInterruptionPolicy(effectId)) {
flags |= VibrationAttributes.FLAG_BYPASS_INTERRUPTION_POLICY;
}
- if (shouldBypassIntensityScale(effectId)) {
+ if (shouldBypassIntensityScale(effectId, fromIme)) {
flags |= VibrationAttributes.FLAG_BYPASS_USER_VIBRATION_INTENSITY_SCALE;
}
@@ -337,9 +338,9 @@ public final class HapticFeedbackVibrationProvider {
/* fallbackForPredefinedEffect= */ predefinedEffectFallback);
}
- private boolean shouldBypassIntensityScale(int effectId) {
- if (!Flags.keyboardCategoryEnabled() || mKeyboardVibrationFixedAmplitude < 0) {
- // shouldn't bypass if not support keyboard category or no fixed amplitude
+ private boolean shouldBypassIntensityScale(int effectId, boolean isIme) {
+ if (!Flags.keyboardCategoryEnabled() || mKeyboardVibrationFixedAmplitude < 0 || !isIme) {
+ // Shouldn't bypass if not support keyboard category, no fixed amplitude or not an IME.
return false;
}
switch (effectId) {
@@ -353,8 +354,9 @@ public final class HapticFeedbackVibrationProvider {
return false;
}
- private static VibrationAttributes createKeyboardVibrationAttributes() {
- if (!Flags.keyboardCategoryEnabled()) {
+ private VibrationAttributes createKeyboardVibrationAttributes(boolean fromIme) {
+ // Use touch attribute when the keyboard category is disable or it's not from an IME.
+ if (!Flags.keyboardCategoryEnabled() || !fromIme) {
return TOUCH_VIBRATION_ATTRIBUTES;
}
diff --git a/services/core/java/com/android/server/vibrator/VibratorManagerService.java b/services/core/java/com/android/server/vibrator/VibratorManagerService.java
index 78e0ebbb53fa..78ebe2457149 100644
--- a/services/core/java/com/android/server/vibrator/VibratorManagerService.java
+++ b/services/core/java/com/android/server/vibrator/VibratorManagerService.java
@@ -416,14 +416,14 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
}
@Override // Binder call
- public void performHapticFeedback(
- int uid, int deviceId, String opPkg, int constant, boolean always, String reason) {
+ public void performHapticFeedback(int uid, int deviceId, String opPkg, int constant,
+ boolean always, String reason, boolean fromIme) {
// Note that the `performHapticFeedback` method does not take a token argument from the
// caller, and instead, uses this service as the token. This is to mitigate performance
// impact that would otherwise be caused due to marshal latency. Haptic feedback effects are
// short-lived, so we don't need to cancel when the process dies.
performHapticFeedbackInternal(
- uid, deviceId, opPkg, constant, always, reason, /* token= */ this);
+ uid, deviceId, opPkg, constant, always, reason, /* token= */ this, fromIme);
}
/**
@@ -435,7 +435,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
@Nullable
HalVibration performHapticFeedbackInternal(
int uid, int deviceId, String opPkg, int constant, boolean always, String reason,
- IBinder token) {
+ IBinder token, boolean fromIme) {
HapticFeedbackVibrationProvider hapticVibrationProvider = getHapticVibrationProvider();
if (hapticVibrationProvider == null) {
Slog.w(TAG, "performHapticFeedback; haptic vibration provider not ready.");
@@ -449,7 +449,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
CombinedVibration combinedVibration = CombinedVibration.createParallel(effect);
VibrationAttributes attrs =
hapticVibrationProvider.getVibrationAttributesForHapticFeedback(
- constant, /* bypassVibrationIntensitySetting= */ always);
+ constant, /* bypassVibrationIntensitySetting= */ always, fromIme);
VibratorFrameworkStatsLogger.logPerformHapticsFeedbackIfKeyboard(uid, constant);
return vibrateWithoutPermissionCheck(uid, deviceId, opPkg, combinedVibration, attrs,
"performHapticFeedback: " + reason, token);
@@ -2300,7 +2300,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
HalVibration vib = performHapticFeedbackInternal(Binder.getCallingUid(),
Context.DEVICE_ID_DEFAULT, SHELL_PACKAGE_NAME, constant,
/* always= */ commonOptions.force, /* reason= */ commonOptions.description,
- deathBinder);
+ deathBinder, false /* fromIme */);
maybeWaitOnVibration(vib, commonOptions);
return 0;
diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java
index 908cbd340236..30134d815fa6 100644
--- a/services/core/java/com/android/server/wm/Session.java
+++ b/services/core/java/com/android/server/wm/Session.java
@@ -336,19 +336,19 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
}
@Override
- public boolean performHapticFeedback(int effectId, boolean always) {
+ public boolean performHapticFeedback(int effectId, boolean always, boolean fromIme) {
final long ident = Binder.clearCallingIdentity();
try {
return mService.mPolicy.performHapticFeedback(mUid, mPackageName,
- effectId, always, null);
+ effectId, always, null, fromIme);
} finally {
Binder.restoreCallingIdentity(ident);
}
}
@Override
- public void performHapticFeedbackAsync(int effectId, boolean always) {
- performHapticFeedback(effectId, always);
+ public void performHapticFeedbackAsync(int effectId, boolean always, boolean fromIme) {
+ performHapticFeedback(effectId, always, fromIme);
}
/* Drag/drop */
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 3d0dca0de87e..e3d45967848a 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/HapticFeedbackVibrationProviderTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/HapticFeedbackVibrationProviderTest.java
@@ -17,9 +17,11 @@
package com.android.server.vibrator;
import static android.os.VibrationAttributes.CATEGORY_KEYBOARD;
+import static android.os.VibrationAttributes.CATEGORY_UNKNOWN;
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.FLAG_BYPASS_USER_VIBRATION_INTENSITY_SCALE;
+import static android.os.VibrationAttributes.USAGE_TOUCH;
import static android.os.VibrationEffect.Composition.PRIMITIVE_CLICK;
import static android.os.VibrationEffect.Composition.PRIMITIVE_TICK;
import static android.os.VibrationEffect.EFFECT_CLICK;
@@ -285,7 +287,8 @@ public class HapticFeedbackVibrationProviderTest {
HapticFeedbackVibrationProvider hapticProvider = createProviderWithDefaultCustomizations();
VibrationAttributes attrs = hapticProvider.getVibrationAttributesForHapticFeedback(
- SAFE_MODE_ENABLED, /* bypassVibrationIntensitySetting= */ false);
+ SAFE_MODE_ENABLED, /* bypassVibrationIntensitySetting= */ false,
+ false /* fromIme*/);
assertThat(attrs.isFlagSet(FLAG_BYPASS_USER_VIBRATION_INTENSITY_OFF)).isFalse();
}
@@ -295,7 +298,7 @@ public class HapticFeedbackVibrationProviderTest {
HapticFeedbackVibrationProvider hapticProvider = createProviderWithDefaultCustomizations();
VibrationAttributes attrs = hapticProvider.getVibrationAttributesForHapticFeedback(
- SAFE_MODE_ENABLED, /* bypassVibrationIntensitySetting= */ true);
+ SAFE_MODE_ENABLED, /* bypassVibrationIntensitySetting= */ true, false /* fromIme*/);
assertThat(attrs.isFlagSet(FLAG_BYPASS_USER_VIBRATION_INTENSITY_OFF)).isTrue();
}
@@ -307,7 +310,7 @@ public class HapticFeedbackVibrationProviderTest {
for (int effectId : SCROLL_FEEDBACK_CONSTANTS) {
VibrationAttributes attrs = hapticProvider.getVibrationAttributesForHapticFeedback(
- effectId, /* bypassVibrationIntensitySetting= */ false);
+ effectId, /* bypassVibrationIntensitySetting= */ false, false /* fromIme*/);
assertWithMessage("Expected FLAG_BYPASS_INTERRUPTION_POLICY for effect " + effectId)
.that(attrs.isFlagSet(FLAG_BYPASS_INTERRUPTION_POLICY)).isTrue();
}
@@ -320,40 +323,59 @@ public class HapticFeedbackVibrationProviderTest {
for (int effectId : SCROLL_FEEDBACK_CONSTANTS) {
VibrationAttributes attrs = hapticProvider.getVibrationAttributesForHapticFeedback(
- effectId, /* bypassVibrationIntensitySetting= */ false);
+ effectId, /* bypassVibrationIntensitySetting= */ false, false /* fromIme*/);
assertWithMessage("Expected no FLAG_BYPASS_INTERRUPTION_POLICY for effect " + effectId)
.that(attrs.isFlagSet(FLAG_BYPASS_INTERRUPTION_POLICY)).isFalse();
}
}
@Test
- public void testVibrationAttribute_keyboardCategoryOff_notUseKeyboardCategory() {
+ public void testVibrationAttribute_keyboardCategoryOff_isIme_notUseKeyboardCategory() {
mSetFlagsRule.disableFlags(Flags.FLAG_KEYBOARD_CATEGORY_ENABLED);
HapticFeedbackVibrationProvider hapticProvider = createProviderWithDefaultCustomizations();
for (int effectId : KEYBOARD_FEEDBACK_CONSTANTS) {
VibrationAttributes attrs = hapticProvider.getVibrationAttributesForHapticFeedback(
- effectId, /* bypassVibrationIntensitySetting= */ false);
+ effectId, /* bypassVibrationIntensitySetting= */ false, true /* fromIme*/);
+ assertWithMessage("Expected USAGE_TOUCH for effect " + effectId)
+ .that(attrs.getUsage()).isEqualTo(USAGE_TOUCH);
assertWithMessage("Expected no CATEGORY_KEYBOARD for effect " + effectId)
- .that(attrs.getCategory()).isEqualTo(0);
+ .that(attrs.getCategory()).isEqualTo(CATEGORY_UNKNOWN);
}
}
@Test
- public void testVibrationAttribute_keyboardCategoryOn_useKeyboardCategory() {
+ public void testVibrationAttribute_keyboardCategoryOn_notIme_notUseKeyboardCategory() {
mSetFlagsRule.enableFlags(Flags.FLAG_KEYBOARD_CATEGORY_ENABLED);
HapticFeedbackVibrationProvider hapticProvider = createProviderWithDefaultCustomizations();
for (int effectId : KEYBOARD_FEEDBACK_CONSTANTS) {
VibrationAttributes attrs = hapticProvider.getVibrationAttributesForHapticFeedback(
- effectId, /* bypassVibrationIntensitySetting= */ false);
+ effectId, /* bypassVibrationIntensitySetting= */ false, false /* fromIme*/);
+ assertWithMessage("Expected USAGE_TOUCH for effect " + effectId)
+ .that(attrs.getUsage()).isEqualTo(USAGE_TOUCH);
+ assertWithMessage("Expected CATEGORY_KEYBOARD for effect " + effectId)
+ .that(attrs.getCategory()).isEqualTo(CATEGORY_UNKNOWN);
+ }
+ }
+
+ @Test
+ public void testVibrationAttribute_keyboardCategoryOn_isIme_useKeyboardCategory() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_KEYBOARD_CATEGORY_ENABLED);
+ HapticFeedbackVibrationProvider hapticProvider = createProviderWithDefaultCustomizations();
+
+ for (int effectId : KEYBOARD_FEEDBACK_CONSTANTS) {
+ VibrationAttributes attrs = hapticProvider.getVibrationAttributesForHapticFeedback(
+ effectId, /* bypassVibrationIntensitySetting= */ false, true /* fromIme*/);
+ assertWithMessage("Expected USAGE_TOUCH for effect " + effectId)
+ .that(attrs.getUsage()).isEqualTo(USAGE_TOUCH);
assertWithMessage("Expected CATEGORY_KEYBOARD for effect " + effectId)
.that(attrs.getCategory()).isEqualTo(CATEGORY_KEYBOARD);
}
}
@Test
- public void testVibrationAttribute_noFixAmplitude_keyboardCategoryOn_noBypassIntensityScale() {
+ public void testVibrationAttribute_noFixAmplitude_notBypassIntensityScale() {
mSetFlagsRule.enableFlags(Flags.FLAG_KEYBOARD_CATEGORY_ENABLED);
mockVibratorPrimitiveSupport(PRIMITIVE_CLICK, PRIMITIVE_TICK);
mockKeyboardVibrationFixedAmplitude(-1);
@@ -361,7 +383,23 @@ public class HapticFeedbackVibrationProviderTest {
for (int effectId : KEYBOARD_FEEDBACK_CONSTANTS) {
VibrationAttributes attrs = hapticProvider.getVibrationAttributesForHapticFeedback(
- effectId, /* bypassVibrationIntensitySetting= */ false);
+ effectId, /* bypassVibrationIntensitySetting= */ false, true /* fromIme*/);
+ assertWithMessage("Expected no FLAG_BYPASS_USER_VIBRATION_INTENSITY_SCALE for effect "
+ + effectId)
+ .that(attrs.isFlagSet(FLAG_BYPASS_USER_VIBRATION_INTENSITY_SCALE)).isFalse();
+ }
+ }
+
+ @Test
+ public void testVibrationAttribute_notIme_notBypassIntensityScale() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_KEYBOARD_CATEGORY_ENABLED);
+ mockVibratorPrimitiveSupport(PRIMITIVE_CLICK, PRIMITIVE_TICK);
+ mockKeyboardVibrationFixedAmplitude(KEYBOARD_VIBRATION_FIXED_AMPLITUDE);
+ HapticFeedbackVibrationProvider hapticProvider = createProviderWithDefaultCustomizations();
+
+ for (int effectId : KEYBOARD_FEEDBACK_CONSTANTS) {
+ VibrationAttributes attrs = hapticProvider.getVibrationAttributesForHapticFeedback(
+ effectId, /* bypassVibrationIntensitySetting= */ false, false /* fromIme*/);
assertWithMessage("Expected no FLAG_BYPASS_USER_VIBRATION_INTENSITY_SCALE for effect "
+ effectId)
.that(attrs.isFlagSet(FLAG_BYPASS_USER_VIBRATION_INTENSITY_SCALE)).isFalse();
@@ -369,7 +407,7 @@ public class HapticFeedbackVibrationProviderTest {
}
@Test
- public void testVibrationAttribute_fixAmplitude_keyboardCategoryOn_bypassIntensityScale() {
+ public void testVibrationAttribute_fixAmplitude_isIme_bypassIntensityScale() {
mSetFlagsRule.enableFlags(Flags.FLAG_KEYBOARD_CATEGORY_ENABLED);
mockVibratorPrimitiveSupport(PRIMITIVE_CLICK, PRIMITIVE_TICK);
mockKeyboardVibrationFixedAmplitude(KEYBOARD_VIBRATION_FIXED_AMPLITUDE);
@@ -377,7 +415,7 @@ public class HapticFeedbackVibrationProviderTest {
for (int effectId : KEYBOARD_FEEDBACK_CONSTANTS) {
VibrationAttributes attrs = hapticProvider.getVibrationAttributesForHapticFeedback(
- effectId, /* bypassVibrationIntensitySetting= */ false);
+ effectId, /* bypassVibrationIntensitySetting= */ false, true /* fromIme*/);
assertWithMessage("Expected FLAG_BYPASS_USER_VIBRATION_INTENSITY_SCALE for effect "
+ effectId)
.that(attrs.isFlagSet(FLAG_BYPASS_USER_VIBRATION_INTENSITY_SCALE)).isTrue();
diff --git a/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java b/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java
index d2ad61f2ba9f..1ea90f55b727 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java
@@ -2526,7 +2526,7 @@ public class VibratorManagerServiceTest {
int constant, boolean always) throws InterruptedException {
HalVibration vib =
service.performHapticFeedbackInternal(UID, Context.DEVICE_ID_DEFAULT, PACKAGE_NAME,
- constant, always, "some reason", service);
+ constant, always, "some reason", service, false /* fromIme */);
if (vib != null) {
vib.waitForEnd();
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java
index 7551b1650ad0..1233686a4b48 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java
@@ -265,7 +265,7 @@ class TestWindowManagerPolicy implements WindowManagerPolicy {
@Override
public boolean performHapticFeedback(int uid, String packageName, int effectId,
- boolean always, String reason) {
+ boolean always, String reason, boolean fromIme) {
return false;
}