From eb0c8711c650cb4c3e3e8540e75eb0ce7a79070c Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Thu, 13 Oct 2016 15:07:43 -0700 Subject: [PATCH] Use a ConcurrentSet to keep track of preferences in logger. The preference set can be modified across different threads, apparently. Change-Id: I4506066d86f7f7d5570c24511db20471d12b0b4a Fixes: 32156066 Test: manual --- .../instrumentation/SharedPreferencesLogger.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/core/instrumentation/SharedPreferencesLogger.java b/src/com/android/settings/core/instrumentation/SharedPreferencesLogger.java index 101f1b588c4..65b33df372c 100644 --- a/src/com/android/settings/core/instrumentation/SharedPreferencesLogger.java +++ b/src/com/android/settings/core/instrumentation/SharedPreferencesLogger.java @@ -21,13 +21,13 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.AsyncTask; import android.text.TextUtils; -import android.util.ArraySet; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.settings.overlay.FeatureFactory; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentSkipListSet; public class SharedPreferencesLogger implements SharedPreferences { @@ -40,7 +40,7 @@ public class SharedPreferencesLogger implements SharedPreferences { mContext = context; mTag = tag; mMetricsFeature = FeatureFactory.getFactory(context).getMetricsFeatureProvider(); - mPreferenceKeySet = new ArraySet<>(); + mPreferenceKeySet = new ConcurrentSkipListSet<>(); } @Override @@ -99,8 +99,12 @@ public class SharedPreferencesLogger implements SharedPreferences { } private void logValue(String key, String value) { + logValue(key, value, false /* forceLog */); + } + + private void logValue(String key, String value, boolean forceLog) { final String prefKey = mTag + "/" + key; - if (!mPreferenceKeySet.contains(prefKey)) { + if (!forceLog && !mPreferenceKeySet.contains(prefKey)) { // Pref key doesn't exist in set, this is initial display so we skip metrics but // keeps track of this key. mPreferenceKeySet.add(prefKey); @@ -138,8 +142,9 @@ public class SharedPreferencesLogger implements SharedPreferences { pm.getPackageInfo(value, PackageManager.MATCH_UNINSTALLED_PACKAGES); logPackageName(key, value); } catch (PackageManager.NameNotFoundException e) { - // Clearly not a package, lets log it. - logValue(key, value); + // Clearly not a package, and it's unlikely this preference is in prefSet, so + // lets force log it. + logValue(key, value, true /* forceLog */); } return null; }