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() { + } + } +}