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

Commit 21da5458 authored by Svetoslav Ganov's avatar Svetoslav Ganov Committed by Android (Google) Code Review
Browse files

Merge "[DO NOT MERGE] Fix associations serialization optimization bug" into oc-dev

parents 2a05c5ed 4df89bcb
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -127,4 +127,29 @@ public class CollectionUtils {
        }
        return null;
    }

    /**
     * Similar to {@link List#add}, but with support for list values of {@code null} and
     * {@link Collections#emptyList}
     */
    public static @NonNull <T> List<T> add(@Nullable List<T> cur, T val) {
        if (cur == null || cur == Collections.emptyList()) {
            cur = new ArrayList<>();
        }
        cur.add(val);
        return cur;
    }

    /**
     * Similar to {@link List#remove}, but with support for list values of {@code null} and
     * {@link Collections#emptyList}
     */
    public static @NonNull <T> List<T> remove(@Nullable List<T> cur, T val) {
        if (cur == null || cur == Collections.emptyList()) {
            return Collections.emptyList();
        }
        cur.remove(val);
        return cur;
    }

}
+12 −9
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@

package com.android.server.print;

import static com.android.internal.util.CollectionUtils.size;
import static com.android.internal.util.Preconditions.checkArgument;
import static com.android.internal.util.Preconditions.checkNotNull;

@@ -221,7 +222,7 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
                throws RemoteException {
            checkNotNull(deviceMacAddress);
            checkCallerIsSystemOr(callingPackage);
            updateAssociations(associations -> ArrayUtils.remove(associations,
            updateAssociations(associations -> CollectionUtils.remove(associations,
                    new Association(getCallingUserId(), deviceMacAddress, callingPackage)));
        }

@@ -350,22 +351,24 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
    }

    private void recordAssociation(String priviledgedPackage, String deviceAddress) {
        updateAssociations((associations) -> ArrayUtils.add(associations,
        updateAssociations(associations -> CollectionUtils.add(associations,
                new Association(getCallingUserId(), deviceAddress, priviledgedPackage)));
    }

    private void updateAssociations(Function<ArrayList<Association>, List<Association>> update) {
    private void updateAssociations(Function<List<Association>, List<Association>> update) {
        updateAssociations(update, getCallingUserId());
    }

    private void updateAssociations(Function<ArrayList<Association>, List<Association>> update,
    private void updateAssociations(Function<List<Association>, List<Association>> update,
            int userId) {
        final AtomicFile file = getStorageFileForUser(userId);
        synchronized (file) {
            final ArrayList<Association> old = readAllAssociations(userId);
            final List<Association> associations = update.apply(old);
            if (Objects.equals(old, associations)) return;
            List<Association> associations = readAllAssociations(userId);
            final ArrayList<Association> old = new ArrayList<>(associations);
            associations = update.apply(associations);
            if (size(old) == size(associations)) return;

            List<Association> finalAssociations = associations;
            file.write((out) -> {
                XmlSerializer xml = Xml.newSerializer();
                try {
@@ -374,8 +377,8 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
                    xml.startDocument(null, true);
                    xml.startTag(null, XML_TAG_ASSOCIATIONS);

                    for (int i = 0; i < CollectionUtils.size(associations); i++) {
                        Association association = associations.get(i);
                    for (int i = 0; i < size(finalAssociations); i++) {
                        Association association = finalAssociations.get(i);
                        xml.startTag(null, XML_TAG_ASSOCIATION)
                            .attribute(null, XML_ATTR_PACKAGE, association.companionAppPackage)
                            .attribute(null, XML_ATTR_DEVICE, association.deviceAddress)