diff --git a/res/xml/accessibility_daltonizer_settings.xml b/res/xml/accessibility_daltonizer_settings.xml
index 62c0dfc5f0d..9f084003827 100644
--- a/res/xml/accessibility_daltonizer_settings.xml
+++ b/res/xml/accessibility_daltonizer_settings.xml
@@ -27,7 +27,6 @@
android:entries="@array/daltonizer_type_entries"
android:entryValues="@array/daltonizer_type_values"
android:key="type"
- android:persistent="false"
android:summary="%s"
android:title="@string/daltonizer_type" />
diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml
index a59fbdca9ce..32b78c5941d 100644
--- a/res/xml/accessibility_settings.xml
+++ b/res/xml/accessibility_settings.xml
@@ -55,8 +55,7 @@
+ android:summary="@string/experimental_preference"/>
+
+ android:summaryOn="@string/advanced_settings_summary" />
diff --git a/res/xml/battery_saver_settings.xml b/res/xml/battery_saver_settings.xml
index cc6d9afb738..832da58ee00 100644
--- a/res/xml/battery_saver_settings.xml
+++ b/res/xml/battery_saver_settings.xml
@@ -22,8 +22,7 @@
+ android:summary="%s" />
@@ -34,13 +33,11 @@
android:entries="@array/captioning_font_size_selector_titles"
android:entryValues="@array/captioning_font_size_selector_values"
android:key="captioning_font_size"
- android:persistent="false"
android:summary="%s"
android:title="@string/captioning_text_size" />
diff --git a/res/xml/configure_notification_settings.xml b/res/xml/configure_notification_settings.xml
index 4ba0d39c545..88d42df2f5f 100644
--- a/res/xml/configure_notification_settings.xml
+++ b/res/xml/configure_notification_settings.xml
@@ -22,15 +22,13 @@
+ android:title="@string/notification_pulse_title" />
+ android:summary="%s" />
@@ -77,8 +76,7 @@
+ android:summary="@string/picture_color_mode_desc" />
+ android:summary="@string/color_temperature_desc" />
@@ -220,28 +217,24 @@
@@ -268,14 +261,12 @@
@@ -293,7 +284,6 @@
android:entries="@array/simulate_color_space_entries"
android:entryValues="@array/simulate_color_space_values"
android:key="simulate_color_space"
- android:persistent="false"
android:summary="%s"
android:title="@string/simulate_color_space" />
@@ -325,14 +315,12 @@
@@ -349,7 +337,6 @@
diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml
index 0543ac1ee76..039cc404a18 100644
--- a/res/xml/display_settings.xml
+++ b/res/xml/display_settings.xml
@@ -30,8 +30,7 @@
android:key="auto_brightness"
android:title="@string/auto_brightness_title"
settings:keywords="@string/keywords_display_auto_brightness"
- android:summary="@string/auto_brightness_summary"
- android:persistent="false" />
+ android:summary="@string/auto_brightness_summary" />
@@ -53,21 +51,18 @@
android:key="screen_timeout"
android:title="@string/screen_timeout"
android:summary="@string/screen_timeout_summary"
- android:persistent="false"
android:entries="@array/screen_timeout_entries"
android:entryValues="@array/screen_timeout_values" />
+ android:summary="@string/camera_gesture_desc" />
+ android:summary="@string/camera_double_tap_power_gesture_desc" />
+ android:title="@string/lift_to_wake_title" />
+ android:summary="@string/doze_summary" />
+ android:summary="@string/tap_to_wake_summary" />
diff --git a/res/xml/installed_app_launch_settings.xml b/res/xml/installed_app_launch_settings.xml
index dee56ef9b2e..7342cc0d1de 100644
--- a/res/xml/installed_app_launch_settings.xml
+++ b/res/xml/installed_app_launch_settings.xml
@@ -22,14 +22,12 @@
@@ -40,7 +38,6 @@
diff --git a/res/xml/language_settings.xml b/res/xml/language_settings.xml
index 9cc01456b1d..dae20af1d7f 100644
--- a/res/xml/language_settings.xml
+++ b/res/xml/language_settings.xml
@@ -103,7 +103,6 @@
android:title="@string/vibrate_input_devices"
android:summaryOn="@string/vibrate_input_devices_summary"
android:summaryOff="@string/vibrate_input_devices_summary"
- android:persistent="false"
/>
diff --git a/res/xml/location_mode.xml b/res/xml/location_mode.xml
index 3627f119b01..b1b05bba8dd 100644
--- a/res/xml/location_mode.xml
+++ b/res/xml/location_mode.xml
@@ -20,17 +20,14 @@
+ android:summary="@string/location_mode_high_accuracy_description" />
+ android:summary="@string/location_mode_battery_saving_description" />
+ android:summary="@string/location_mode_sensors_only_description" />
diff --git a/res/xml/location_scanning.xml b/res/xml/location_scanning.xml
index 74e6d3b5ee9..f82500bf8e9 100644
--- a/res/xml/location_scanning.xml
+++ b/res/xml/location_scanning.xml
@@ -21,14 +21,12 @@
android:title="@string/location_scanning_wifi_always_scanning_title"
android:summary="@string/location_scanning_wifi_always_scanning_description"
android:defaultValue="true"
- android:key="wifi_always_scanning"
- android:persistent="false" />
+ android:key="wifi_always_scanning" />
+ android:key="bluetooth_always_scanning" />
diff --git a/res/xml/location_settings.xml b/res/xml/location_settings.xml
index d22d32a88d5..9fd0826e87d 100644
--- a/res/xml/location_settings.xml
+++ b/res/xml/location_settings.xml
@@ -31,7 +31,6 @@
android:key="managed_profile_location_switch"
android:title="@string/managed_profile_location_switch_title"
settings:useAdminDisabledSummary="true"
- android:persistent="false"
android:enabled="false"
android:selectable="true" />
diff --git a/res/xml/manage_assist.xml b/res/xml/manage_assist.xml
index 7669d2678eb..97a06eaebf5 100644
--- a/res/xml/manage_assist.xml
+++ b/res/xml/manage_assist.xml
@@ -28,14 +28,12 @@
+ android:summary="@string/assist_access_context_summary"/>
+ android:summary="@string/assist_access_screenshot_summary"/>
+ android:title="@string/dial_pad_tones_title" />
+ android:title="@string/screen_locking_sounds_title" />
+ android:title="@string/charging_sounds_title" />
+ android:title="@string/docking_sounds_title" />
+ android:title="@string/touch_sounds_title" />
+ android:title="@string/vibrate_on_touch_title" />
+ android:summary="%s" />
+ android:summary="%s" />
diff --git a/res/xml/privacy_settings.xml b/res/xml/privacy_settings.xml
index 461d24232dd..6a6b548e5b6 100644
--- a/res/xml/privacy_settings.xml
+++ b/res/xml/privacy_settings.xml
@@ -41,8 +41,7 @@
+ android:summary="@string/auto_restore_summary" />
+ android:title="@string/screen_pinning_unlock_none" />
diff --git a/res/xml/security_settings_misc.xml b/res/xml/security_settings_misc.xml
index a4375476168..b2256822d35 100644
--- a/res/xml/security_settings_misc.xml
+++ b/res/xml/security_settings_misc.xml
@@ -37,8 +37,7 @@
android:persistent="false">
+ android:title="@string/show_password"/>
@@ -55,8 +54,7 @@
+ android:summaryOn="@string/install_unknown_applications" />
diff --git a/res/xml/security_settings_password.xml b/res/xml/security_settings_password.xml
index d96ca4b1080..6c4d4ffd958 100644
--- a/res/xml/security_settings_password.xml
+++ b/res/xml/security_settings_password.xml
@@ -26,8 +26,7 @@
android:key="unlock_set_or_change"
android:title="@string/unlock_set_unlock_launch_picker_title"
android:summary="@string/unlock_set_unlock_mode_password"
- settings:keywords="@string/keywords_lockscreen"
- android:persistent="false"/>
+ settings:keywords="@string/keywords_lockscreen" />
diff --git a/res/xml/security_settings_pattern.xml b/res/xml/security_settings_pattern.xml
index d3fd97d2e31..3b463d81d96 100644
--- a/res/xml/security_settings_pattern.xml
+++ b/res/xml/security_settings_pattern.xml
@@ -26,8 +26,7 @@
android:key="unlock_set_or_change"
android:title="@string/unlock_set_unlock_launch_picker_title"
android:summary="@string/unlock_set_unlock_mode_pattern"
- settings:keywords="@string/keywords_lockscreen"
- android:persistent="false"/>
+ settings:keywords="@string/keywords_lockscreen" />
diff --git a/res/xml/security_settings_pin.xml b/res/xml/security_settings_pin.xml
index ba19c43ac3c..404a2e4de21 100644
--- a/res/xml/security_settings_pin.xml
+++ b/res/xml/security_settings_pin.xml
@@ -26,8 +26,7 @@
android:key="unlock_set_or_change"
android:title="@string/unlock_set_unlock_launch_picker_title"
android:summary="@string/unlock_set_unlock_mode_pin"
- settings:keywords="@string/keywords_lockscreen"
- android:persistent="false"/>
+ settings:keywords="@string/keywords_lockscreen" />
diff --git a/res/xml/sim_lock_settings.xml b/res/xml/sim_lock_settings.xml
index ee25fdfeabb..0246ea25a87 100644
--- a/res/xml/sim_lock_settings.xml
+++ b/res/xml/sim_lock_settings.xml
@@ -21,7 +21,6 @@
@@ -31,7 +30,6 @@
android:title="@string/sim_pin_change"
android:dialogTitle="@string/sim_change_pin"
android:dialogMessage="@string/sim_enter_old"
- android:persistent="false"
android:positiveButtonText="@string/sim_enter_ok"
android:negativeButtonText="@string/sim_enter_cancel"/>
diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml
index 2b8ae136295..47b4db12c2e 100644
--- a/res/xml/sound_settings.xml
+++ b/res/xml/sound_settings.xml
@@ -47,14 +47,12 @@
+ android:title="@string/vibrate_when_ringing_title" />
@@ -71,7 +69,6 @@
android:key="ringtone"
android:title="@string/ringtone_title"
android:dialogTitle="@string/ringtone_title"
- android:persistent="false"
android:ringtoneType="ringtone" />
@@ -79,7 +76,6 @@
android:key="notification_ringtone"
android:title="@string/notification_ringtone_title"
android:dialogTitle="@string/notification_ringtone_title"
- android:persistent="false"
android:ringtoneType="notification" />
diff --git a/res/xml/tether_prefs.xml b/res/xml/tether_prefs.xml
index 7a7030616d6..3a39d8a1136 100644
--- a/res/xml/tether_prefs.xml
+++ b/res/xml/tether_prefs.xml
@@ -18,13 +18,11 @@
+ android:title="@string/usb_tethering_button_text" />
+ android:title="@string/wifi_tether_checkbox_text" />
+ android:title="@string/bluetooth_tether_checkbox_text" />
diff --git a/res/xml/tts_engine_settings.xml b/res/xml/tts_engine_settings.xml
index 176bdbcb057..d00c102123e 100644
--- a/res/xml/tts_engine_settings.xml
+++ b/res/xml/tts_engine_settings.xml
@@ -19,7 +19,6 @@
android:key="tts_default_lang"
android:title="@string/tts_default_lang_title"
android:summary="@string/tts_default_lang_summary"
- android:persistent="false"
android:order="100" />
+ android:title="@string/user_enable_calling_sms" />
-
\ No newline at end of file
+
diff --git a/res/xml/wifi_configure_settings.xml b/res/xml/wifi_configure_settings.xml
index 15e524a082d..b99caf0c199 100644
--- a/res/xml/wifi_configure_settings.xml
+++ b/res/xml/wifi_configure_settings.xml
@@ -26,13 +26,11 @@
+ android:summary="@string/wifi_notify_open_networks_summary" />
@@ -40,14 +38,12 @@
android:key="wifi_assistant"
android:title="@string/wifi_automatically_connect_title"
android:summary="@string/wifi_automatically_connect_summary"
- android:dialogTitle="@string/wifi_select_assistant_dialog_title"
- android:persistent="false" />
+ android:dialogTitle="@string/wifi_select_assistant_dialog_title" />
diff --git a/res/xml/wireless_settings.xml b/res/xml/wireless_settings.xml
index d0d429a754b..0461bf832b4 100644
--- a/res/xml/wireless_settings.xml
+++ b/res/xml/wireless_settings.xml
@@ -21,14 +21,12 @@
+ android:summary="@string/nfc_quick_toggle_summary" />
+ android:summary="%s" />
+ android:summary="%s" />
+ android:summary="%s" />
diff --git a/res/xml/zen_mode_external_rule_settings.xml b/res/xml/zen_mode_external_rule_settings.xml
index e3fafbdb952..0869cb03b71 100644
--- a/res/xml/zen_mode_external_rule_settings.xml
+++ b/res/xml/zen_mode_external_rule_settings.xml
@@ -40,7 +40,6 @@
+ android:title="@string/zen_mode_settings_title" />
diff --git a/res/xml/zen_mode_priority_settings.xml b/res/xml/zen_mode_priority_settings.xml
index 6d9f36fbd5c..e2b8f48a079 100644
--- a/res/xml/zen_mode_priority_settings.xml
+++ b/res/xml/zen_mode_priority_settings.xml
@@ -24,39 +24,33 @@
android:key="alarms"
android:title="@string/zen_mode_alarms"
android:enabled="false"
- android:defaultValue="true"
- android:persistent="false"/>
+ android:defaultValue="true"/>
+ android:title="@string/zen_mode_reminders"/>
+ android:title="@string/zen_mode_events"/>
+ android:summary="%s" />
+ android:summary="%s" />
+ android:title="@string/zen_mode_repeat_callers"/>
diff --git a/res/xml/zen_mode_schedule_rule_settings.xml b/res/xml/zen_mode_schedule_rule_settings.xml
index 3c62b5b16d7..80a9d664bc7 100644
--- a/res/xml/zen_mode_schedule_rule_settings.xml
+++ b/res/xml/zen_mode_schedule_rule_settings.xml
@@ -37,7 +37,6 @@
android:key="zen_mode"
android:title="@string/zen_mode_settings_title"
android:order="100"
- android:summary="%s"
- android:persistent="false" />
+ android:summary="%s" />
diff --git a/res/xml/zen_mode_visual_interruptions_settings.xml b/res/xml/zen_mode_visual_interruptions_settings.xml
index 8f67e08322e..42a043b9aea 100644
--- a/res/xml/zen_mode_visual_interruptions_settings.xml
+++ b/res/xml/zen_mode_visual_interruptions_settings.xml
@@ -20,17 +20,14 @@
+ android:summary="@string/zen_mode_peek_summary" />
+ android:summary="@string/zen_mode_lights_summary" />
+ android:summary="@string/zen_mode_screen_on_summary" />
diff --git a/src/com/android/settings/InstrumentedFragment.java b/src/com/android/settings/InstrumentedFragment.java
index db14a9cff3a..b5f99b5ce32 100644
--- a/src/com/android/settings/InstrumentedFragment.java
+++ b/src/com/android/settings/InstrumentedFragment.java
@@ -16,11 +16,11 @@
package com.android.settings;
+import com.android.internal.logging.MetricsLogger;
+
import android.os.Bundle;
import android.support.v14.preference.PreferenceFragment;
-import com.android.internal.logging.MetricsLogger;
-
/**
* Instrumented fragment that logs visibility state.
*/
@@ -44,6 +44,10 @@ public abstract class InstrumentedFragment extends PreferenceFragment {
public static final int DATA_SAVER_SUMMARY = UNDECLARED + 14;
public static final int DATA_USAGE_UNRESTRICTED_ACCESS = UNDECLARED + 15;
+ // Used for generic logging of Settings Preference Persistence, should not be used
+ // outside SharedPreferencesLogger.
+ public static final int ACTION_GENERIC_PACKAGE = UNDECLARED + 16;
+
/**
* Declare the view of this category.
*
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index ce70f4c01a2..38537fbbd8a 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -457,6 +457,21 @@ public class SettingsActivity extends SettingsDrawerActivity
return true;
}
+ @Override
+ public SharedPreferences getSharedPreferences(String name, int mode) {
+ if (name.equals(getPackageName() + "_preferences")) {
+ String tag = getClass().getName();
+ if (getIntent() != null && getIntent().hasExtra(EXTRA_SHOW_FRAGMENT)) {
+ tag = getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT);
+ }
+ if (tag.startsWith("com.android.settings.")) {
+ tag = tag.replace("com.android.settings.", "");
+ }
+ return new SharedPreferencesLogger(this, tag);
+ }
+ return super.getSharedPreferences(name, mode);
+ }
+
private static boolean isShortCutIntent(final Intent intent) {
Set categories = intent.getCategories();
return (categories != null) && categories.contains("com.android.settings.SHORTCUT");
diff --git a/src/com/android/settings/SharedPreferencesLogger.java b/src/com/android/settings/SharedPreferencesLogger.java
new file mode 100644
index 00000000000..ae2c4e54966
--- /dev/null
+++ b/src/com/android/settings/SharedPreferencesLogger.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.settings;
+
+import com.android.internal.logging.MetricsLogger;
+
+import android.annotation.Nullable;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.os.AsyncTask;
+import android.text.TextUtils;
+import android.util.Log;
+
+import java.util.Map;
+import java.util.Set;
+
+public class SharedPreferencesLogger implements SharedPreferences {
+
+ private final String mTag;
+ private final Context mContext;
+
+ public SharedPreferencesLogger(Context context, String tag) {
+ mContext = context;
+ mTag = tag;
+ }
+
+ @Override
+ public Map getAll() {
+ return null;
+ }
+
+ @Override
+ public String getString(String key, @Nullable String defValue) {
+ return defValue;
+ }
+
+ @Override
+ public Set getStringSet(String key, @Nullable Set defValues) {
+ return defValues;
+ }
+
+ @Override
+ public int getInt(String key, int defValue) {
+ return defValue;
+ }
+
+ @Override
+ public long getLong(String key, long defValue) {
+ return defValue;
+ }
+
+ @Override
+ public float getFloat(String key, float defValue) {
+ return defValue;
+ }
+
+ @Override
+ public boolean getBoolean(String key, boolean defValue) {
+ return defValue;
+ }
+
+ @Override
+ public boolean contains(String key) {
+ return false;
+ }
+
+ @Override
+ public Editor edit() {
+ return new EditorLogger();
+ }
+
+ @Override
+ public void registerOnSharedPreferenceChangeListener(
+ OnSharedPreferenceChangeListener listener) {
+ }
+
+ @Override
+ public void unregisterOnSharedPreferenceChangeListener(
+ OnSharedPreferenceChangeListener listener) {
+ }
+
+ private void logValue(String key, String value) {
+ MetricsLogger.histogram(mContext, mTag + "/" + key + "|" + value, 1);
+ }
+
+ private void logPackageName(String key, String value) {
+ MetricsLogger.histogram(mContext, mTag + "/" + key, 1);
+ MetricsLogger.action(mContext, InstrumentedFragment.ACTION_GENERIC_PACKAGE,
+ mTag + "/" + key + "|" + value);
+ }
+
+ private void safeLogValue(String key, String value) {
+ new AsyncPackageCheck().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, key, value);
+ }
+
+ private class AsyncPackageCheck extends AsyncTask {
+ @Override
+ protected Void doInBackground(String... params) {
+ String key = params[0];
+ String value = params[1];
+ PackageManager pm = mContext.getPackageManager();
+ try {
+ // Check if this might be a component.
+ ComponentName name = ComponentName.unflattenFromString(value);
+ if (value != null) {
+ value = name.getPackageName();
+ }
+ } catch (Exception e) {
+ }
+ try {
+ pm.getPackageInfo(value, PackageManager.MATCH_UNINSTALLED_PACKAGES);
+ logPackageName(key, value);
+ } catch (PackageManager.NameNotFoundException e) {
+ // Clearly not a package, lets log it.
+ logValue(key, value);
+ }
+ return null;
+ }
+ }
+
+ public class EditorLogger implements Editor {
+ @Override
+ public Editor putString(String key, @Nullable String value) {
+ safeLogValue(key, value);
+ return this;
+ }
+
+ @Override
+ public Editor putStringSet(String key, @Nullable Set values) {
+ safeLogValue(key, TextUtils.join(",", values));
+ return this;
+ }
+
+ @Override
+ public Editor putInt(String key, int value) {
+ logValue(key, String.valueOf(value));
+ return this;
+ }
+
+ @Override
+ public Editor putLong(String key, long value) {
+ logValue(key, String.valueOf(value));
+ return this;
+ }
+
+ @Override
+ public Editor putFloat(String key, float value) {
+ logValue(key, String.valueOf(value));
+ return this;
+ }
+
+ @Override
+ public Editor putBoolean(String key, boolean value) {
+ logValue(key, String.valueOf(value));
+ return this;
+ }
+
+ @Override
+ public Editor remove(String key) {
+ return this;
+ }
+
+ @Override
+ public Editor clear() {
+ return this;
+ }
+
+ @Override
+ public boolean commit() {
+ return true;
+ }
+
+ @Override
+ public void apply() {
+ }
+ }
+}