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

Commit 43ddf1e4 authored by Alex Buynytskyy's avatar Alex Buynytskyy Committed by Android (Google) Code Review
Browse files

Merge "Speed up large settings requests." into main

parents 7db36b9a f8af62a4
Loading
Loading
Loading
Loading
+29 −22
Original line number Diff line number Diff line
@@ -108,7 +108,6 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -3585,10 +3584,12 @@ public final class Settings {
                    || applicationInfo.isSignedWithPlatformKey();
        }
        public ArrayMap<String, String> getStringsForPrefix(ContentResolver cr, String prefix,
                List<String> names) {
        private ArrayMap<String, String> getStringsForPrefixStripPrefix(
                ContentResolver cr, String prefix, String[] names) {
            String namespace = prefix.substring(0, prefix.length() - 1);
            ArrayMap<String, String> keyValues = new ArrayMap<>();
            int substringLength = prefix.length();
            int currentGeneration = -1;
            boolean needsGenerationTracker = false;
@@ -3613,10 +3614,12 @@ public final class Settings {
                            if (DEBUG) {
                                Log.i(TAG, "Cache hit for prefix:" + prefix);
                            }
                            if (!names.isEmpty()) {
                            if (names.length > 0) {
                                for (String name : names) {
                                    if (mValues.containsKey(name)) {
                                        keyValues.put(name, mValues.get(name));
                                        keyValues.put(
                                                name.substring(substringLength),
                                                mValues.get(name));
                                    }
                                }
                            } else {
@@ -3625,7 +3628,9 @@ public final class Settings {
                                    // Explicitly exclude the prefix as it is only there to
                                    // signal that the prefix has been cached.
                                    if (key.startsWith(prefix) && !key.equals(prefix)) {
                                        keyValues.put(key, mValues.get(key));
                                        keyValues.put(
                                                key.substring(substringLength),
                                                mValues.get(key));
                                    }
                                }
                            }
@@ -3685,14 +3690,22 @@ public final class Settings {
                Map<String, String> flagsToValues =
                        (HashMap) b.getSerializable(Settings.NameValueTable.VALUE, java.util.HashMap.class);
                // Only the flags requested by the caller
                if (!names.isEmpty()) {
                    for (Map.Entry<String, String> flag : flagsToValues.entrySet()) {
                        if (names.contains(flag.getKey())) {
                            keyValues.put(flag.getKey(), flag.getValue());
                if (names.length > 0) {
                    for (String name : names) {
                        String value = flagsToValues.get(name);
                        if (value != null) {
                            keyValues.put(
                                    name.substring(substringLength),
                                    value);
                        }
                    }
                } else {
                    keyValues.putAll(flagsToValues);
                    keyValues.ensureCapacity(keyValues.size() + flagsToValues.size());
                    for (Map.Entry<String, String> flag : flagsToValues.entrySet()) {
                        keyValues.put(
                                flag.getKey().substring(substringLength),
                                flag.getValue());
                    }
                }
                synchronized (NameValueCache.this) {
@@ -19834,21 +19847,15 @@ public final class Settings {
        @RequiresPermission(Manifest.permission.READ_DEVICE_CONFIG)
        public static Map<String, String> getStrings(@NonNull ContentResolver resolver,
                @NonNull String namespace, @NonNull List<String> names) {
            List<String> compositeNames = new ArrayList<>(names.size());
            for (String name : names) {
                compositeNames.add(createCompositeName(namespace, name));
            String[] compositeNames = new String[names.size()];
            for (int i = 0, size = names.size(); i < size; ++i) {
                compositeNames[i] = createCompositeName(namespace, names.get(i));
            }
            String prefix = createPrefix(namespace);
            ArrayMap<String, String> rawKeyValues = sNameValueCache.getStringsForPrefix(
            ArrayMap<String, String> keyValues = sNameValueCache.getStringsForPrefixStripPrefix(
                    resolver, prefix, compositeNames);
            int size = rawKeyValues.size();
            int substringLength = prefix.length();
            ArrayMap<String, String> keyValues = new ArrayMap<>(size);
            for (int i = 0; i < size; ++i) {
                keyValues.put(rawKeyValues.keyAt(i).substring(substringLength),
                        rawKeyValues.valueAt(i));
            }
            return keyValues;
        }