Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 34b1c584 authored by Yuri Lin's avatar Yuri Lin Committed by Android (Google) Code Review
Browse files

Merge "Clean up large vibration effect related flags" into main

parents 9369d873 173b53c0
Loading
Loading
Loading
Loading
+21 −38
Original line number Diff line number Diff line
@@ -404,35 +404,24 @@ public final class NotificationChannel implements Parcelable {
        mDeletedTime = in.readLong();
        mImportanceLockedDefaultApp = in.readBoolean();

        // Add new fields above this line and not after vibration effect! When
        // notif_channel_estimate_effect_size is true, we use parcel size to detect whether the
        // vibration effect might be too large to handle, so this must remain at the end lest any
        // following fields cause the data to get incorrectly dropped.
        // Add new fields above this line and not after vibration effect! We use parcel size to
        // detect whether the vibration effect might be too large to handle, so this must remain at
        // the end lest any following fields cause the data to get incorrectly dropped.
        mVibrationPattern = in.createLongArray();
        if (mVibrationPattern != null && mVibrationPattern.length > MAX_VIBRATION_LENGTH) {
            mVibrationPattern = Arrays.copyOf(mVibrationPattern, MAX_VIBRATION_LENGTH);
        }
        boolean largeEffect = false;
        if (Flags.notifChannelEstimateEffectSize()) {
        // Note that we must check the length of remaining data in the parcel before reading in
        // the data.
            largeEffect = (in.dataAvail() > MAX_SERIALIZED_VIBRATION_LENGTH);
        }
        boolean largeEffect = (in.dataAvail() > MAX_SERIALIZED_VIBRATION_LENGTH);
        if (Flags.notificationChannelVibrationEffectApi()) {
            mVibrationEffect =
                    in.readInt() != 0 ? VibrationEffect.CREATOR.createFromParcel(in) : null;
            if (Flags.notifChannelCropVibrationEffects() && mVibrationEffect != null) {
                if (Flags.notifChannelEstimateEffectSize()) {
            if (mVibrationEffect != null && largeEffect) {
                // Try trimming the effect if the remaining parcel size is large. If trimming is
                // not applicable for the effect, rather than serializing to XML (expensive) to
                // check the exact serialized length, we just reject the effect.
                    if (largeEffect) {
                        mVibrationEffect = mVibrationEffect.cropToLengthOrNull(
                                MAX_VIBRATION_LENGTH);
                    }
                } else {
                    mVibrationEffect = getTrimmedVibrationEffect(mVibrationEffect);
                }
                mVibrationEffect = mVibrationEffect.cropToLengthOrNull(MAX_VIBRATION_LENGTH);
            }
        }
    }
@@ -751,11 +740,9 @@ public final class NotificationChannel implements Parcelable {
    public void setVibrationPattern(long[] vibrationPattern) {
        this.mVibrationEnabled = vibrationPattern != null && vibrationPattern.length > 0;
        this.mVibrationPattern = vibrationPattern;
        if (Flags.notifChannelCropVibrationEffects()) {
        if (vibrationPattern != null && vibrationPattern.length > MAX_VIBRATION_LENGTH) {
            this.mVibrationPattern = Arrays.copyOf(vibrationPattern, MAX_VIBRATION_LENGTH);
        }
        }
        if (Flags.notificationChannelVibrationEffectApi()) {
            try {
                this.mVibrationEffect =
@@ -802,7 +789,7 @@ public final class NotificationChannel implements Parcelable {
    public void setVibrationEffect(@Nullable VibrationEffect effect) {
        this.mVibrationEnabled = effect != null;
        this.mVibrationEffect = effect;
        if (Flags.notifChannelCropVibrationEffects() && effect != null) {
        if (effect != null) {
            long[] pattern = effect.computeCreateWaveformOffOnTimingsOrNull();
            if (pattern != null) {
                // If this effect has an equivalent pattern, AND the pattern needs to be truncated
@@ -821,9 +808,8 @@ public final class NotificationChannel implements Parcelable {
                this.mVibrationPattern = null;
            }
        } else {
            this.mVibrationPattern =
                    mVibrationEffect == null
                            ? null : mVibrationEffect.computeCreateWaveformOffOnTimingsOrNull();
            // effect is set to null, so also set pattern to null.
            this.mVibrationPattern = null;
        }
    }

@@ -1269,8 +1255,7 @@ public final class NotificationChannel implements Parcelable {
                // Restore the effect only if it is not null. This allows to avoid undoing a
                // `setVibrationPattern` call above, if that was done with a non-null pattern
                // (e.g. back up from a version that did not support `setVibrationEffect`), or
                // when notif_channel_crop_vibration_effects is true, if there is an equivalent
                // vibration pattern available.
                // if there is an equivalent vibration pattern available.
                setVibrationEffect(vibrationEffect);
            }
        }
@@ -1467,13 +1452,11 @@ public final class NotificationChannel implements Parcelable {
        if (getVibrationPattern() != null) {
            out.attribute(null, ATT_VIBRATION, longArrayToString(getVibrationPattern()));
        }
        if (getVibrationEffect() != null) {
            if (!Flags.notifChannelCropVibrationEffects() || getVibrationPattern() == null) {
                // When notif_channel_crop_vibration_effects is on, only serialize the vibration
                // effect if we do not already have an equivalent vibration pattern.
        if (getVibrationEffect() != null && getVibrationPattern() == null) {
            // Only serialize the vibration effect if we do not already have an equivalent
            // vibration pattern.
            out.attribute(null, ATT_VIBRATION_EFFECT, vibrationToString(getVibrationEffect()));
        }
        }
        if (getUserLockedFields() != 0) {
            out.attributeInt(null, ATT_USER_LOCKED, getUserLockedFields());
        }
+0 −20
Original line number Diff line number Diff line
@@ -106,26 +106,6 @@ flag {
  bug: "368817201"
}

flag {
  name: "notif_channel_crop_vibration_effects"
  namespace: "systemui"
  description: "Limits the size of vibration effects that can be stored in a NotificationChannel"
  bug: "345881518"
  metadata {
    purpose: PURPOSE_BUGFIX
  }
}

flag {
  name: "notif_channel_estimate_effect_size"
  namespace: "systemui"
  description: "When reading vibration effects from parcel, estimate size instead of unnecessarily serializing to XML"
  bug: "391908451"
  metadata {
    purpose: PURPOSE_BUGFIX
  }
}

flag {
  name: "evenly_divided_call_style_action_layout"
  namespace: "systemui"
+5 −14
Original line number Diff line number Diff line
@@ -91,9 +91,7 @@ public class NotificationChannelTest {

    @Parameters(name = "{0}")
    public static List<FlagsParameterization> getParams() {
        return FlagsParameterization.allCombinationsOf(
                Flags.FLAG_NOTIF_CHANNEL_CROP_VIBRATION_EFFECTS,
                Flags.FLAG_NOTIF_CHANNEL_ESTIMATE_EFFECT_SIZE);
        return FlagsParameterization.allCombinationsOf();
    }

    @Rule
@@ -286,8 +284,7 @@ public class NotificationChannelTest {
    }

    @Test
    @EnableFlags({Flags.FLAG_NOTIFICATION_CHANNEL_VIBRATION_EFFECT_API,
            Flags.FLAG_NOTIF_CHANNEL_CROP_VIBRATION_EFFECTS})
    @EnableFlags(Flags.FLAG_NOTIFICATION_CHANNEL_VIBRATION_EFFECT_API)
    public void testLongVibrationFields_canWriteToXml() throws Exception {
        NotificationChannel channel = new NotificationChannel("id", "name", 3);
        // populate pattern with contents
@@ -313,9 +310,7 @@ public class NotificationChannelTest {
    }

    @Test
    @EnableFlags({Flags.FLAG_NOTIFICATION_CHANNEL_VIBRATION_EFFECT_API,
            Flags.FLAG_NOTIF_CHANNEL_CROP_VIBRATION_EFFECTS,
            Flags.FLAG_NOTIF_CHANNEL_ESTIMATE_EFFECT_SIZE})
    @EnableFlags(Flags.FLAG_NOTIFICATION_CHANNEL_VIBRATION_EFFECT_API)
    public void testVibrationEffect_droppedIfTooLargeAndNotTrimmable() {
        NotificationChannel channel = new NotificationChannel("id", "name", 3);
        // populate pattern with contents
@@ -332,9 +327,7 @@ public class NotificationChannelTest {
    }

    @Test
    @EnableFlags({Flags.FLAG_NOTIFICATION_CHANNEL_VIBRATION_EFFECT_API,
            Flags.FLAG_NOTIF_CHANNEL_CROP_VIBRATION_EFFECTS,
            Flags.FLAG_NOTIF_CHANNEL_ESTIMATE_EFFECT_SIZE})
    @EnableFlags(Flags.FLAG_NOTIFICATION_CHANNEL_VIBRATION_EFFECT_API)
    public void testVibrationEffect_trimmedIfLargeAndTrimmable() {
        NotificationChannel channel = new NotificationChannel("id", "name", 3);
        // populate pattern with contents
@@ -353,9 +346,7 @@ public class NotificationChannelTest {
    }

    @Test
    @EnableFlags({Flags.FLAG_NOTIFICATION_CHANNEL_VIBRATION_EFFECT_API,
            Flags.FLAG_NOTIF_CHANNEL_CROP_VIBRATION_EFFECTS,
            Flags.FLAG_NOTIF_CHANNEL_ESTIMATE_EFFECT_SIZE})
    @EnableFlags(Flags.FLAG_NOTIFICATION_CHANNEL_VIBRATION_EFFECT_API)
    public void testVibrationEffect_keptIfSmall() {
        NotificationChannel channel = new NotificationChannel("id", "name", 3);
        VibrationEffect effect = VibrationEffect.createOneShot(1, 100);