summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/provider/Settings.java58
1 files changed, 34 insertions, 24 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index f5260ef34986..009e68a4bd38 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -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;
@@ -3586,10 +3585,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;
@@ -3619,10 +3620,13 @@ 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) {
+ // mValues can contain "null" values, need to use containsKey.
if (mValues.containsKey(name)) {
- keyValues.put(name, mValues.get(name));
+ keyValues.put(
+ name.substring(substringLength),
+ mValues.get(name));
}
}
} else {
@@ -3631,7 +3635,10 @@ 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));
+ String value = mValues.valueAt(i);
+ keyValues.put(
+ key.substring(substringLength),
+ value);
}
}
}
@@ -3691,14 +3698,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) {
+ // flagsToValues can contain "null" values, need to use containsKey.
+ if (flagsToValues.containsKey(name)) {
+ keyValues.put(
+ name.substring(substringLength),
+ flagsToValues.get(name));
}
}
} 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) {
@@ -19854,21 +19869,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;
}
@@ -20194,12 +20203,13 @@ public final class Settings {
private static String createCompositeName(@NonNull String namespace, @NonNull String name) {
Preconditions.checkNotNull(namespace);
Preconditions.checkNotNull(name);
- return createPrefix(namespace) + name;
+ var sb = new StringBuilder(namespace.length() + 1 + name.length());
+ return sb.append(namespace).append('/').append(name).toString();
}
private static String createPrefix(@NonNull String namespace) {
Preconditions.checkNotNull(namespace);
- return namespace + "/";
+ return namespace + '/';
}
private static Uri createNamespaceUri(@NonNull String namespace) {