From 4bcf419a0dae3bc95e04525a95977f55c1278d92 Mon Sep 17 00:00:00 2001 From: Lais Andrade Date: Tue, 30 Jul 2024 18:21:17 +0100 Subject: Fix VibrationEffect creation from parcel Fix creators for concrete VibrationEffect types to skip the int token used to identify the different implementation while reading from parcel. Add unit tests to the individial CREATOR instances to make sure they're able to create an instance when they're triggered by Bundle.getParcelable. Fix: 356352552 Test: android.os.VibrationEffectTest Flag: android.os.vibrator.vendor_vibration_effects Change-Id: If3a42c8c49f045ce699c7d571ee53e278fcfad36 --- core/java/android/os/VibrationEffect.java | 2 ++ .../src/android/os/VibrationEffectTest.java | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/core/java/android/os/VibrationEffect.java b/core/java/android/os/VibrationEffect.java index 475984e4a751..f3ef9e15b8f0 100644 --- a/core/java/android/os/VibrationEffect.java +++ b/core/java/android/os/VibrationEffect.java @@ -1024,6 +1024,7 @@ public abstract class VibrationEffect implements Parcelable { new Creator() { @Override public Composed createFromParcel(Parcel in) { + in.readInt(); // Skip the parcel type token return new Composed(in); } @@ -1298,6 +1299,7 @@ public abstract class VibrationEffect implements Parcelable { new Creator() { @Override public VendorEffect createFromParcel(Parcel in) { + in.readInt(); // Skip the parcel type token return new VendorEffect(in); } diff --git a/core/tests/vibrator/src/android/os/VibrationEffectTest.java b/core/tests/vibrator/src/android/os/VibrationEffectTest.java index 098ade4c1334..bd3d94467ead 100644 --- a/core/tests/vibrator/src/android/os/VibrationEffectTest.java +++ b/core/tests/vibrator/src/android/os/VibrationEffectTest.java @@ -1071,6 +1071,27 @@ public class VibrationEffectTest { .isHapticFeedbackCandidate()); } + @Test + public void testParcelingComposed() { + Parcel p = Parcel.obtain(); + VibrationEffect effect = VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK); + effect.writeToParcel(p, 0); + p.setDataPosition(0); + VibrationEffect parceledEffect = VibrationEffect.Composed.CREATOR.createFromParcel(p); + assertThat(parceledEffect).isEqualTo(effect); + } + + @Test + @RequiresFlagsEnabled(android.os.vibrator.Flags.FLAG_VENDOR_VIBRATION_EFFECTS) + public void testParcelingVendorEffect() { + Parcel p = Parcel.obtain(); + VibrationEffect effect = VibrationEffect.createVendorEffect(createNonEmptyBundle()); + effect.writeToParcel(p, 0); + p.setDataPosition(0); + VibrationEffect parceledEffect = VibrationEffect.VendorEffect.CREATOR.createFromParcel(p); + assertThat(parceledEffect).isEqualTo(effect); + } + private void assertArrayEq(long[] expected, long[] actual) { assertTrue( String.format("Expected pattern %s, but was %s", -- cgit v1.2.3-59-g8ed1b