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

Commit 3965123f authored by Matías Hernández's avatar Matías Hernández
Browse files

Use ParceledListSlice for ZenModeConfig and AutomaticZenRules

Also, use writeString8 for Zen-related parceling. This gives us considerable savings on average (might be slightly bigger for certain fields on non-ASCII charsets -- but even then most of the fields, like package name and rule id, are ~ASCII).

Bug: 387498139
Bug: 393321037
Test: atest NotificationManagerZenTest ZenModeConfigTest
Flag: EXEMPT Serialization change with good test coverage
Change-Id: I9925c9bcc542781832d111660e22181151526127
parent 19566c82
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -17,3 +17,5 @@
package android.app;

parcelable AutomaticZenRule;

parcelable AutomaticZenRule.AzrWithId;
 No newline at end of file
+43 −6
Original line number Diff line number Diff line
@@ -228,7 +228,7 @@ public final class AutomaticZenRule implements Parcelable {
    public AutomaticZenRule(Parcel source) {
        enabled = source.readInt() == ENABLED;
        if (source.readInt() == ENABLED) {
            name = getTrimmedString(source.readString());
            name = getTrimmedString(source.readString8());
        }
        interruptionFilter = source.readInt();
        conditionId = getTrimmedUri(source.readParcelable(null, android.net.Uri.class));
@@ -238,11 +238,11 @@ public final class AutomaticZenRule implements Parcelable {
                source.readParcelable(null, android.content.ComponentName.class));
        creationTime = source.readLong();
        mZenPolicy = source.readParcelable(null, ZenPolicy.class);
        mPkg = source.readString();
        mPkg = source.readString8();
        mDeviceEffects = source.readParcelable(null, ZenDeviceEffects.class);
        mAllowManualInvocation = source.readBoolean();
        mIconResId = source.readInt();
        mTriggerDescription = getTrimmedString(source.readString(), MAX_DESC_LENGTH);
        mTriggerDescription = getTrimmedString(source.readString8(), MAX_DESC_LENGTH);
        mType = source.readInt();
    }

@@ -514,7 +514,7 @@ public final class AutomaticZenRule implements Parcelable {
        dest.writeInt(enabled ? ENABLED : DISABLED);
        if (name != null) {
            dest.writeInt(1);
            dest.writeString(name);
            dest.writeString8(name);
        } else {
            dest.writeInt(0);
        }
@@ -524,11 +524,11 @@ public final class AutomaticZenRule implements Parcelable {
        dest.writeParcelable(configurationActivity, 0);
        dest.writeLong(creationTime);
        dest.writeParcelable(mZenPolicy, 0);
        dest.writeString(mPkg);
        dest.writeString8(mPkg);
        dest.writeParcelable(mDeviceEffects, 0);
        dest.writeBoolean(mAllowManualInvocation);
        dest.writeInt(mIconResId);
        dest.writeString(mTriggerDescription);
        dest.writeString8(mTriggerDescription);
        dest.writeInt(mType);
    }

@@ -843,4 +843,41 @@ public final class AutomaticZenRule implements Parcelable {
            return rule;
        }
    }

    /** @hide */
    public static final class AzrWithId implements Parcelable {
        public final String mId;
        public final AutomaticZenRule mRule;

        public AzrWithId(String id, AutomaticZenRule rule) {
            mId = id;
            mRule = rule;
        }

        public static final Creator<AzrWithId> CREATOR = new Creator<>() {
            @Override
            public AzrWithId createFromParcel(Parcel in) {
                return new AzrWithId(
                        in.readString8(),
                        in.readParcelable(AutomaticZenRule.class.getClassLoader(),
                                AutomaticZenRule.class));
            }

            @Override
            public AzrWithId[] newArray(int size) {
                return new AzrWithId[size];
            }
        };

        @Override
        public void writeToParcel(@NonNull Parcel dest, int flags) {
            dest.writeString8(mId);
            dest.writeParcelable(mRule, flags);
        }

        @Override
        public int describeContents() {
            return 0;
        }
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -224,7 +224,7 @@ interface INotificationManager
    void setNotificationPolicyAccessGrantedForUser(String pkg, int userId, boolean granted);
    ZenPolicy getDefaultZenPolicy();
    AutomaticZenRule getAutomaticZenRule(String id);
    Map<String, AutomaticZenRule> getAutomaticZenRules();
    ParceledListSlice getAutomaticZenRules();
    String addAutomaticZenRule(in AutomaticZenRule automaticZenRule, String pkg, boolean fromUser);
    boolean updateAutomaticZenRule(String id, in AutomaticZenRule automaticZenRule, boolean fromUser);
    boolean removeAutomaticZenRule(String id, boolean fromUser);
+9 −1
Original line number Diff line number Diff line
@@ -1747,7 +1747,15 @@ public class NotificationManager {
    public Map<String, AutomaticZenRule> getAutomaticZenRules() {
        INotificationManager service = service();
        try {
            return service.getAutomaticZenRules();
            Map<String, AutomaticZenRule> result = new HashMap<>();
            ParceledListSlice<AutomaticZenRule.AzrWithId> parceledRules =
                    service.getAutomaticZenRules();
            if (parceledRules != null) {
                for (AutomaticZenRule.AzrWithId rule : parceledRules.getList()) {
                    result.put(rule.mId, rule.mRule);
                }
            }
            return result;
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
+33 −24
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Build;
@@ -460,14 +461,21 @@ public class ZenModeConfig implements Parcelable {
    }

    private static void readRulesFromParcel(ArrayMap<String, ZenRule> ruleMap, Parcel source) {
        final int len = source.readInt();
        int len = source.readInt();
        if (len > 0) {
            final String[] ids = new String[len];
            final ZenRule[] rules = new ZenRule[len];
            source.readStringArray(ids);
            source.readTypedArray(rules, ZenRule.CREATOR);
            source.readString8Array(ids);
            ParceledListSlice<?> parceledRules = source.readParcelable(
                    ZenRule.class.getClassLoader(), ParceledListSlice.class);
            List<?> rules = parceledRules != null ? parceledRules.getList() : new ArrayList<>();
            if (rules.size() != len) {
                Slog.wtf(TAG, String.format(
                        "Unexpected parceled rules count (%s != %s), throwing them out",
                        rules.size(), len));
                len = 0;
            }
            for (int i = 0; i < len; i++) {
                ruleMap.put(ids[i], rules[i]);
                ruleMap.put(ids[i], (ZenRule) rules.get(i));
            }
        }
    }
@@ -485,8 +493,8 @@ public class ZenModeConfig implements Parcelable {
        }
        dest.writeInt(user);
        dest.writeParcelable(manualRule, 0);
        writeRulesToParcel(automaticRules, dest);
        writeRulesToParcel(deletedRules, dest);
        writeRulesToParcel(automaticRules, dest, flags);
        writeRulesToParcel(deletedRules, dest, flags);
        if (!Flags.modesUi()) {
            dest.writeInt(allowAlarms ? 1 : 0);
            dest.writeInt(allowMedia ? 1 : 0);
@@ -501,18 +509,19 @@ public class ZenModeConfig implements Parcelable {
        }
    }

    private static void writeRulesToParcel(ArrayMap<String, ZenRule> ruleMap, Parcel dest) {
    private static void writeRulesToParcel(ArrayMap<String, ZenRule> ruleMap, Parcel dest,
            int flags) {
        if (!ruleMap.isEmpty()) {
            final int len = ruleMap.size();
            final String[] ids = new String[len];
            final ZenRule[] rules = new ZenRule[len];
            final ArrayList<ZenRule> rules = new ArrayList<>();
            for (int i = 0; i < len; i++) {
                ids[i] = ruleMap.keyAt(i);
                rules[i] = ruleMap.valueAt(i);
                rules.add(ruleMap.valueAt(i));
            }
            dest.writeInt(len);
            dest.writeStringArray(ids);
            dest.writeTypedArray(rules, 0);
            dest.writeString8Array(ids);
            dest.writeParcelable(new ParceledListSlice<>(rules), flags);
        } else {
            dest.writeInt(0);
        }
@@ -2636,7 +2645,7 @@ public class ZenModeConfig implements Parcelable {
            enabled = source.readInt() == 1;
            snoozing = source.readInt() == 1;
            if (source.readInt() == 1) {
                name = source.readString();
                name = source.readString8();
            }
            zenMode = source.readInt();
            conditionId = source.readParcelable(null, android.net.Uri.class);
@@ -2644,18 +2653,18 @@ public class ZenModeConfig implements Parcelable {
            component = source.readParcelable(null, android.content.ComponentName.class);
            configurationActivity = source.readParcelable(null, android.content.ComponentName.class);
            if (source.readInt() == 1) {
                id = source.readString();
                id = source.readString8();
            }
            creationTime = source.readLong();
            if (source.readInt() == 1) {
                enabler = source.readString();
                enabler = source.readString8();
            }
            zenPolicy = source.readParcelable(null, android.service.notification.ZenPolicy.class);
            zenDeviceEffects = source.readParcelable(null, ZenDeviceEffects.class);
            pkg = source.readString();
            pkg = source.readString8();
            allowManualInvocation = source.readBoolean();
            iconResName = source.readString();
            triggerDescription = source.readString();
            iconResName = source.readString8();
            triggerDescription = source.readString8();
            type = source.readInt();
            userModifiedFields = source.readInt();
            zenPolicyUserModifiedFields = source.readInt();
@@ -2703,7 +2712,7 @@ public class ZenModeConfig implements Parcelable {
            dest.writeInt(snoozing ? 1 : 0);
            if (name != null) {
                dest.writeInt(1);
                dest.writeString(name);
                dest.writeString8(name);
            } else {
                dest.writeInt(0);
            }
@@ -2714,23 +2723,23 @@ public class ZenModeConfig implements Parcelable {
            dest.writeParcelable(configurationActivity, 0);
            if (id != null) {
                dest.writeInt(1);
                dest.writeString(id);
                dest.writeString8(id);
            } else {
                dest.writeInt(0);
            }
            dest.writeLong(creationTime);
            if (enabler != null) {
                dest.writeInt(1);
                dest.writeString(enabler);
                dest.writeString8(enabler);
            } else {
                dest.writeInt(0);
            }
            dest.writeParcelable(zenPolicy, 0);
            dest.writeParcelable(zenDeviceEffects, 0);
            dest.writeString(pkg);
            dest.writeString8(pkg);
            dest.writeBoolean(allowManualInvocation);
            dest.writeString(iconResName);
            dest.writeString(triggerDescription);
            dest.writeString8(iconResName);
            dest.writeString8(triggerDescription);
            dest.writeInt(type);
            dest.writeInt(userModifiedFields);
            dest.writeInt(zenPolicyUserModifiedFields);
Loading