summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/os/VibrationEffect.java58
-rw-r--r--services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java7
2 files changed, 59 insertions, 6 deletions
diff --git a/core/java/android/os/VibrationEffect.java b/core/java/android/os/VibrationEffect.java
index 44edf298beeb..475984e4a751 100644
--- a/core/java/android/os/VibrationEffect.java
+++ b/core/java/android/os/VibrationEffect.java
@@ -345,7 +345,10 @@ public abstract class VibrationEffect implements Parcelable {
@FlaggedApi(FLAG_VENDOR_VIBRATION_EFFECTS)
@RequiresPermission(android.Manifest.permission.VIBRATE_VENDOR_EFFECTS)
public static VibrationEffect createVendorEffect(@NonNull PersistableBundle effect) {
- return new VendorEffect(effect, VendorEffect.DEFAULT_STRENGTH, VendorEffect.DEFAULT_SCALE);
+ VibrationEffect vendorEffect = new VendorEffect(effect, VendorEffect.DEFAULT_STRENGTH,
+ VendorEffect.DEFAULT_SCALE);
+ vendorEffect.validate();
+ return vendorEffect;
}
/**
@@ -1204,9 +1207,7 @@ public abstract class VibrationEffect implements Parcelable {
}
return mEffectStrength == other.mEffectStrength
&& (Float.compare(mLinearScale, other.mLinearScale) == 0)
- // Make sure it calls unparcel for both before calling BaseBundle.kindofEquals.
- && mVendorData.size() == other.mVendorData.size()
- && BaseBundle.kindofEquals(mVendorData, other.mVendorData);
+ && isPersistableBundleEquals(mVendorData, other.mVendorData);
}
@Override
@@ -1243,6 +1244,55 @@ public abstract class VibrationEffect implements Parcelable {
out.writeFloat(mLinearScale);
}
+ /**
+ * Compares two {@link PersistableBundle} objects are equals.
+ */
+ private static boolean isPersistableBundleEquals(
+ PersistableBundle first, PersistableBundle second) {
+ if (first == second) {
+ return true;
+ }
+ if (first == null || second == null || first.size() != second.size()) {
+ return false;
+ }
+ for (String key : first.keySet()) {
+ if (!isPersistableBundleSupportedValueEquals(first.get(key), second.get(key))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Compares two values which type is supported by {@link PersistableBundle}.
+ *
+ * <p>If the type isn't supported. The equality is done by {@link Object#equals(Object)}.
+ */
+ private static boolean isPersistableBundleSupportedValueEquals(
+ Object first, Object second) {
+ if (first == second) {
+ return true;
+ } else if (first == null || second == null
+ || !first.getClass().equals(second.getClass())) {
+ return false;
+ } else if (first instanceof PersistableBundle) {
+ return isPersistableBundleEquals(
+ (PersistableBundle) first, (PersistableBundle) second);
+ } else if (first instanceof int[]) {
+ return Arrays.equals((int[]) first, (int[]) second);
+ } else if (first instanceof long[]) {
+ return Arrays.equals((long[]) first, (long[]) second);
+ } else if (first instanceof double[]) {
+ return Arrays.equals((double[]) first, (double[]) second);
+ } else if (first instanceof boolean[]) {
+ return Arrays.equals((boolean[]) first, (boolean[]) second);
+ } else if (first instanceof String[]) {
+ return Arrays.equals((String[]) first, (String[]) second);
+ } else {
+ return Objects.equals(first, second);
+ }
+ }
+
@NonNull
public static final Creator<VendorEffect> CREATOR =
new Creator<VendorEffect>() {
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 1f4a469bdd5a..bea691783a8a 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java
@@ -1603,7 +1603,7 @@ public class VibratorManagerServiceTest {
@Test
@RequiresFlagsEnabled(android.os.vibrator.Flags.FLAG_VENDOR_VIBRATION_EFFECTS)
public void vibrate_vendorEffectsWithPermission_successful() throws Exception {
- // Deny permission to vibrate with vendor effects
+ // Grant permission to vibrate with vendor effects
grantPermission(android.Manifest.permission.VIBRATE_VENDOR_EFFECTS);
mockVibrators(1);
FakeVibratorControllerProvider fakeVibrator = mVibratorProviders.get(1);
@@ -1767,6 +1767,9 @@ public class VibratorManagerServiceTest {
})
public void vibrate_withIntensitySettingsAndAdaptiveHaptics_appliesSettingsToVendorEffects()
throws Exception {
+ // Grant permission to vibrate with vendor effects
+ grantPermission(android.Manifest.permission.VIBRATE_VENDOR_EFFECTS);
+
setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
Vibrator.VIBRATION_INTENSITY_LOW);
@@ -1789,7 +1792,7 @@ public class VibratorManagerServiceTest {
assertThat(fakeVibrator.getAllVendorEffects()).hasSize(1);
VibrationEffect.VendorEffect scaled = fakeVibrator.getAllVendorEffects().get(0);
- assertThat(scaled.getEffectStrength()).isEqualTo(VibrationEffect.EFFECT_STRENGTH_STRONG);
+ assertThat(scaled.getEffectStrength()).isEqualTo(VibrationEffect.EFFECT_STRENGTH_LIGHT);
assertThat(scaled.getLinearScale()).isEqualTo(0.4f);
}