Merge "Avoid over logging preference changes."
diff --git a/src/com/android/settings/core/instrumentation/SharedPreferencesLogger.java b/src/com/android/settings/core/instrumentation/SharedPreferencesLogger.java
index 6a67e45..101f1b5 100644
--- a/src/com/android/settings/core/instrumentation/SharedPreferencesLogger.java
+++ b/src/com/android/settings/core/instrumentation/SharedPreferencesLogger.java
@@ -21,6 +21,7 @@
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;
@@ -33,11 +34,13 @@
private final String mTag;
private final Context mContext;
private final MetricsFeatureProvider mMetricsFeature;
+ private final Set<String> mPreferenceKeySet;
public SharedPreferencesLogger(Context context, String tag) {
mContext = context;
mTag = tag;
mMetricsFeature = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
+ mPreferenceKeySet = new ArraySet<>();
}
@Override
@@ -96,7 +99,15 @@
}
private void logValue(String key, String value) {
- mMetricsFeature.count(mContext, mTag + "/" + key + "|" + value, 1);
+ final String prefKey = mTag + "/" + key;
+ if (!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);
+ return;
+ }
+ // Pref key exists in set, log it's change in metrics.
+ mMetricsFeature.count(mContext, prefKey + "|" + value, 1);
}
private void logPackageName(String key, String value) {
diff --git a/tests/robotests/src/com/android/settings/core/instrumentation/SharedPreferenceLoggerTest.java b/tests/robotests/src/com/android/settings/core/instrumentation/SharedPreferenceLoggerTest.java
index 11f2784..a3e0e45 100644
--- a/tests/robotests/src/com/android/settings/core/instrumentation/SharedPreferenceLoggerTest.java
+++ b/tests/robotests/src/com/android/settings/core/instrumentation/SharedPreferenceLoggerTest.java
@@ -16,6 +16,7 @@
package com.android.settings.core.instrumentation;
import android.content.Context;
+import android.content.SharedPreferences;
import com.android.settings.TestConfig;
import com.android.settings.overlay.FeatureFactory;
@@ -32,7 +33,7 @@
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@RunWith(RobolectricTestRunner.class)
@@ -62,27 +63,53 @@
}
@Test
- public void putInt_shouldLogCount() {
- mSharedPrefLogger.edit().putInt(TEST_KEY, 1);
- verify(mLogWriter).count(any(Context.class), anyString(), anyInt());
+ public void putInt_shouldNotLogInitialPut() {
+ final SharedPreferences.Editor editor = mSharedPrefLogger.edit();
+ editor.putInt(TEST_KEY, 1);
+ editor.putInt(TEST_KEY, 1);
+ editor.putInt(TEST_KEY, 1);
+ editor.putInt(TEST_KEY, 2);
+ editor.putInt(TEST_KEY, 2);
+ editor.putInt(TEST_KEY, 2);
+ editor.putInt(TEST_KEY, 2);
+
+ verify(mLogWriter, times(6)).count(any(Context.class), anyString(), anyInt());
}
@Test
- public void putBoolean_shouldLogCount() {
- mSharedPrefLogger.edit().putBoolean(TEST_KEY, true);
- verify(mLogWriter).count(any(Context.class), anyString(), anyInt());
+ public void putBoolean_shouldNotLogInitialPut() {
+ final SharedPreferences.Editor editor = mSharedPrefLogger.edit();
+ editor.putBoolean(TEST_KEY, true);
+ editor.putBoolean(TEST_KEY, true);
+ editor.putBoolean(TEST_KEY, false);
+ editor.putBoolean(TEST_KEY, false);
+ editor.putBoolean(TEST_KEY, false);
+
+ verify(mLogWriter, times(4)).count(any(Context.class), anyString(), anyInt());
}
@Test
- public void putLong_shouldLogCount() {
- mSharedPrefLogger.edit().putLong(TEST_KEY, 1);
- verify(mLogWriter).count(any(Context.class), anyString(), anyInt());
+ public void putLong_shouldNotLogInitialPut() {
+ final SharedPreferences.Editor editor = mSharedPrefLogger.edit();
+ editor.putLong(TEST_KEY, 1);
+ editor.putLong(TEST_KEY, 1);
+ editor.putLong(TEST_KEY, 1);
+ editor.putLong(TEST_KEY, 1);
+ editor.putLong(TEST_KEY, 2);
+
+ verify(mLogWriter, times(4)).count(any(Context.class), anyString(), anyInt());
}
@Test
- public void putFloat_shouldLogCount() {
- mSharedPrefLogger.edit().putInt(TEST_KEY, 1);
- verify(mLogWriter).count(any(Context.class), anyString(), anyInt());
+ public void putFloat_shouldNotLogInitialPut() {
+ final SharedPreferences.Editor editor = mSharedPrefLogger.edit();
+ editor.putFloat(TEST_KEY, 1);
+ editor.putFloat(TEST_KEY, 1);
+ editor.putFloat(TEST_KEY, 1);
+ editor.putFloat(TEST_KEY, 1);
+ editor.putFloat(TEST_KEY, 2);
+
+ verify(mLogWriter, times(4)).count(any(Context.class), anyString(), anyInt());
}
}