diff options
author | Eugene Susla <eugenesusla@google.com> | 2017-07-06 11:12:52 -0700 |
---|---|---|
committer | Eugene Susla <eugenesusla@google.com> | 2017-07-07 14:37:37 -0700 |
commit | 612311ef41ea2304c7d487b321b88c60fbfe9d6c (patch) | |
tree | a4b55cfb7aaa08262826fa198b8003be3448fd21 /services/companion | |
parent | 3afabd30fd3735b20a9e3063d801d4ad28ad1379 (diff) |
[Companion] Dont store duplicate association records
Fixes: 62675985
Test: Assosiate the same item twice and ensure getAssociations lists it
only once
Change-Id: I028c08010740baaa04464647dffa701fc066a4fe
Diffstat (limited to 'services/companion')
-rw-r--r-- | services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java | 43 |
1 files changed, 21 insertions, 22 deletions
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index f47b0d3c6e73..f2f01cfa19b0 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java @@ -57,6 +57,7 @@ import android.os.UserHandle; import android.provider.Settings; import android.provider.SettingsStringUtil.ComponentNameSet; import android.text.BidiFormatter; +import android.util.ArraySet; import android.util.AtomicFile; import android.util.ExceptionUtils; import android.util.Log; @@ -83,6 +84,7 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.function.Function; @@ -247,9 +249,9 @@ public class CompanionDeviceManagerService extends SystemService implements Bind throws RemoteException { checkCallerIsSystemOr(callingPackage, userId); checkUsesFeature(callingPackage, getCallingUserId()); - return CollectionUtils.map( + return new ArrayList<>(CollectionUtils.map( readAllAssociations(userId, callingPackage), - a -> a.deviceAddress); + a -> a.deviceAddress)); } //TODO also revoke notification access @@ -495,20 +497,20 @@ public class CompanionDeviceManagerService extends SystemService implements Bind new Association(userId, deviceAddress, priviledgedPackage))); } - private void updateAssociations(Function<List<Association>, List<Association>> update) { + private void updateAssociations(Function<Set<Association>, Set<Association>> update) { updateAssociations(update, getCallingUserId()); } - private void updateAssociations(Function<List<Association>, List<Association>> update, + private void updateAssociations(Function<Set<Association>, Set<Association>> update, int userId) { final AtomicFile file = getStorageFileForUser(userId); synchronized (file) { - List<Association> associations = readAllAssociations(userId); - final List<Association> old = CollectionUtils.copyOf(associations); + Set<Association> associations = readAllAssociations(userId); + final Set<Association> old = CollectionUtils.copyOf(associations); associations = update.apply(associations); if (size(old) == size(associations)) return; - List<Association> finalAssociations = associations; + Set<Association> finalAssociations = associations; file.write((out) -> { XmlSerializer xml = Xml.newSerializer(); try { @@ -517,13 +519,12 @@ public class CompanionDeviceManagerService extends SystemService implements Bind xml.startDocument(null, true); xml.startTag(null, XML_TAG_ASSOCIATIONS); - for (int i = 0; i < size(finalAssociations); i++) { - Association association = finalAssociations.get(i); + CollectionUtils.forEach(finalAssociations, association -> { xml.startTag(null, XML_TAG_ASSOCIATION) - .attribute(null, XML_ATTR_PACKAGE, association.companionAppPackage) - .attribute(null, XML_ATTR_DEVICE, association.deviceAddress) - .endTag(null, XML_TAG_ASSOCIATION); - } + .attribute(null, XML_ATTR_PACKAGE, association.companionAppPackage) + .attribute(null, XML_ATTR_DEVICE, association.deviceAddress) + .endTag(null, XML_TAG_ASSOCIATION); + }); xml.endTag(null, XML_TAG_ASSOCIATIONS); xml.endDocument(); @@ -545,17 +546,17 @@ public class CompanionDeviceManagerService extends SystemService implements Bind } @Nullable - private ArrayList<Association> readAllAssociations(int userId) { + private Set<Association> readAllAssociations(int userId) { return readAllAssociations(userId, null); } @Nullable - private ArrayList<Association> readAllAssociations(int userId, @Nullable String packageFilter) { + private Set<Association> readAllAssociations(int userId, @Nullable String packageFilter) { final AtomicFile file = getStorageFileForUser(userId); if (!file.getBaseFile().exists()) return null; - ArrayList<Association> result = null; + ArraySet<Association> result = null; final XmlPullParser parser = Xml.newPullParser(); synchronized (file) { try (FileInputStream in = file.openRead()) { @@ -627,12 +628,10 @@ public class CompanionDeviceManagerService extends SystemService implements Bind public int onCommand(String cmd) { switch (cmd) { case "list": { - ArrayList<Association> associations = readAllAssociations(getNextArgInt()); - for (int i = 0; i < size(associations); i++) { - Association a = associations.get(i); - getOutPrintWriter() - .println(a.companionAppPackage + " " + a.deviceAddress); - } + CollectionUtils.forEach( + readAllAssociations(getNextArgInt()), + a -> getOutPrintWriter() + .println(a.companionAppPackage + " " + a.deviceAddress)); } break; case "associate": { |