diff options
| -rw-r--r-- | core/java/android/os/VibrationEffect.java | 58 | ||||
| -rw-r--r-- | services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java | 7 |
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); } |