diff --git a/AndroidManifest.xml b/AndroidManifest.xml index cc1208e2a02..deebc57e0e9 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -575,7 +575,7 @@ + android:resource="@id/notification_settings" /> + + + + + + + + + + + + - Show notifications + the secure lockscreen [CHAR LIMIT=25] --> + Show when locked - Sensitive notification contents will be hidden when locked + Sensitive notification contents will be hidden on the lock screen - All notification contents will be shown when locked + All notification contents will be shown on the lock screen - Zen mode - - %1$s - - Zen mode + Limited interruptions - Configure Zen mode + Configure limited interruptions Limited Interruptions + + + Notifications + + + General + + + Security + + + Tweaks + + + Apps diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml index 53d9915ce4e..67cd7d380ef 100644 --- a/res/xml/display_settings.xml +++ b/res/xml/display_settings.xml @@ -48,17 +48,6 @@ android:entryValues="@array/entryvalues_font_size" android:dialogTitle="@string/dialog_title_font_size" /> - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/xml/security_settings_biometric_weak.xml b/res/xml/security_settings_biometric_weak.xml index d9949223130..c2e8ab7cb8d 100644 --- a/res/xml/security_settings_biometric_weak.xml +++ b/res/xml/security_settings_biometric_weak.xml @@ -66,13 +66,6 @@ android:title="@string/nfc_unlock_title" android:persistent="false"/> - - diff --git a/res/xml/security_settings_misc.xml b/res/xml/security_settings_misc.xml index 21cf88f347a..299bdf65f19 100644 --- a/res/xml/security_settings_misc.xml +++ b/res/xml/security_settings_misc.xml @@ -59,12 +59,6 @@ android:summaryOn="@string/verify_applications_summary" android:persistent="false" /> - - - - diff --git a/res/xml/security_settings_pattern.xml b/res/xml/security_settings_pattern.xml index c02df7a4274..0584e4ae247 100644 --- a/res/xml/security_settings_pattern.xml +++ b/res/xml/security_settings_pattern.xml @@ -57,13 +57,6 @@ android:title="@string/nfc_unlock_title" android:persistent="false"/> - - diff --git a/res/xml/security_settings_pin.xml b/res/xml/security_settings_pin.xml index 2636fa41e76..1417e217853 100644 --- a/res/xml/security_settings_pin.xml +++ b/res/xml/security_settings_pin.xml @@ -53,13 +53,6 @@ android:title="@string/nfc_unlock_title" android:persistent="false"/> - - diff --git a/res/xml/settings_headers.xml b/res/xml/settings_headers.xml index 19cff905051..c4b5eac7311 100644 --- a/res/xml/settings_headers.xml +++ b/res/xml/settings_headers.xml @@ -89,6 +89,13 @@ android:fragment="com.android.settings.DisplaySettings" android:title="@string/display_settings" /> + +
+
- - diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java index efd47059583..afe5b681973 100644 --- a/src/com/android/settings/DisplaySettings.java +++ b/src/com/android/settings/DisplaySettings.java @@ -49,21 +49,17 @@ public class DisplaySettings extends SettingsPreferenceFragment implements private static final String KEY_SCREEN_TIMEOUT = "screen_timeout"; private static final String KEY_FONT_SIZE = "font_size"; - private static final String KEY_NOTIFICATION_PULSE = "notification_pulse"; - private static final String KEY_HEADS_UP = "heads_up"; private static final String KEY_SCREEN_SAVER = "screensaver"; private static final int DLG_GLOBAL_CHANGE_WARNING = 1; private WarnedListPreference mFontSizePref; - private CheckBoxPreference mNotificationPulse; private final Configuration mCurConfig = new Configuration(); private final Handler mHandler = new Handler(); private ListPreference mScreenTimeoutPreference; private Preference mScreenSaverPreference; - private CheckBoxPreference mHeadsUp; @Override public void onCreate(Bundle savedInstanceState) { @@ -90,33 +86,6 @@ public class DisplaySettings extends SettingsPreferenceFragment implements mFontSizePref = (WarnedListPreference) findPreference(KEY_FONT_SIZE); mFontSizePref.setOnPreferenceChangeListener(this); mFontSizePref.setOnPreferenceClickListener(this); - mNotificationPulse = (CheckBoxPreference) findPreference(KEY_NOTIFICATION_PULSE); - if (mNotificationPulse != null - && getResources().getBoolean( - com.android.internal.R.bool.config_intrusiveNotificationLed) == false) { - getPreferenceScreen().removePreference(mNotificationPulse); - } else { - try { - mNotificationPulse.setChecked(Settings.System.getInt(resolver, - Settings.System.NOTIFICATION_LIGHT_PULSE) == 1); - mNotificationPulse.setOnPreferenceChangeListener(this); - } catch (SettingNotFoundException snfe) { - Log.e(TAG, Settings.System.NOTIFICATION_LIGHT_PULSE + " not found"); - } - } - mHeadsUp = (CheckBoxPreference) findPreference(KEY_HEADS_UP); - if (mHeadsUp != null) { - updateHeadsUpMode(resolver); - mHeadsUp.setOnPreferenceChangeListener(this); - resolver.registerContentObserver( - Settings.Global.getUriFor(Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED), - false, new ContentObserver(mHandler) { - @Override - public void onChange(boolean selfChange) { - updateHeadsUpMode(resolver); - } - }); - } } private void updateTimeoutPreferenceDescription(long currentTimeout) { @@ -250,16 +219,6 @@ public class DisplaySettings extends SettingsPreferenceFragment implements } } - private void updateHeadsUpMode(ContentResolver resolver) { - mHeadsUp.setChecked(Settings.Global.HEADS_UP_ON == Settings.Global.getInt(resolver, - Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED, Settings.Global.HEADS_UP_OFF)); - } - - private void setHeadsUpMode(ContentResolver resolver, boolean value) { - Settings.Global.putInt(resolver, Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED, - value ? Settings.Global.HEADS_UP_ON : Settings.Global.HEADS_UP_OFF); - } - public void writeFontSizePreference(Object objValue) { try { mCurConfig.fontScale = Float.parseFloat(objValue.toString()); @@ -271,18 +230,6 @@ public class DisplaySettings extends SettingsPreferenceFragment implements @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { - if (preference == mNotificationPulse) { - boolean value = mNotificationPulse.isChecked(); - Settings.System.putInt(getContentResolver(), Settings.System.NOTIFICATION_LIGHT_PULSE, - value ? 1 : 0); - return true; - } - if (preference == mHeadsUp) { - final boolean value = mHeadsUp.isChecked(); - Log.d(TAG, "onPreferenceTreeClick mHeadsUp: " + value); - setHeadsUpMode(getContentResolver(), value); - return true; - } return super.onPreferenceTreeClick(preferenceScreen, preference); } diff --git a/src/com/android/settings/NotificationSettings.java b/src/com/android/settings/NotificationSettings.java new file mode 100644 index 00000000000..c8ba39a00a7 --- /dev/null +++ b/src/com/android/settings/NotificationSettings.java @@ -0,0 +1,255 @@ +/* + * Copyright (C) 2014 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 android.content.ContentResolver; +import android.content.pm.PackageManager; +import android.database.ContentObserver; +import android.media.RingtoneManager; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.preference.CheckBoxPreference; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceClickListener; +import android.preference.PreferenceGroup; +import android.preference.PreferenceScreen; +import android.provider.Settings; +import android.util.Log; + +public class NotificationSettings extends SettingsPreferenceFragment implements + Preference.OnPreferenceChangeListener, OnPreferenceClickListener { + private static final String TAG = "NotificationSettings"; + + private static final String KEY_NOTIFICATION_SOUND = "notification_sound"; + private static final String KEY_ZEN_MODE = "zen_mode"; + private static final String KEY_NOTIFICATION_ACCESS = "manage_notification_access"; + private static final String KEY_LOCK_SCREEN_NOTIFICATIONS = "toggle_lock_screen_notifications"; + private static final String KEY_HEADS_UP = "heads_up"; + private static final String KEY_NOTIFICATION_PULSE = "notification_pulse"; + + private static final String KEY_SECURITY_CATEGORY = "category_security"; + private static final String KEY_TWEAKS_CATEGORY = "category_tweaks"; // power toys, eng only + + private static final int MSG_UPDATE_SOUND_SUMMARY = 2; + + private PackageManager mPM; + + private Preference mNotificationSoundPreference; + private Preference mNotificationAccess; + private CheckBoxPreference mLockscreenNotifications; + private CheckBoxPreference mHeadsUp; + private CheckBoxPreference mNotificationPulse; + + private final Runnable mRingtoneLookupRunnable = new Runnable() { + @Override + public void run() { + if (mNotificationSoundPreference != null) { + final CharSequence summary = SoundSettings.updateRingtoneName( + getActivity(), RingtoneManager.TYPE_NOTIFICATION); + if (summary != null) { + mHandler.sendMessage( + mHandler.obtainMessage(MSG_UPDATE_SOUND_SUMMARY, summary)); + } + } + } + }; + + private final Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_UPDATE_SOUND_SUMMARY: + mNotificationSoundPreference.setSummary((CharSequence) msg.obj); + break; + } + } + }; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + final ContentResolver resolver = getActivity().getContentResolver(); + + mPM = getActivity().getPackageManager(); + + addPreferencesFromResource(R.xml.notification_settings); + + final PreferenceScreen root = getPreferenceScreen(); + final PreferenceGroup securityCategory = (PreferenceGroup) + root.findPreference(KEY_SECURITY_CATEGORY); + + PreferenceGroup tweaksCategory = (PreferenceGroup) + root.findPreference(KEY_TWEAKS_CATEGORY); + + if (tweaksCategory != null + && !(Build.TYPE.equals("eng") || Build.TYPE.equals("userdebug"))) { + root.removePreference(tweaksCategory); + tweaksCategory = null; + } + + mNotificationSoundPreference = findPreference(KEY_NOTIFICATION_SOUND); + + mNotificationAccess = findPreference(KEY_NOTIFICATION_ACCESS); + refreshNotificationListeners(); + + mLockscreenNotifications + = (CheckBoxPreference) root.findPreference(KEY_LOCK_SCREEN_NOTIFICATIONS); + if (mLockscreenNotifications != null) { + if (!getDeviceLockscreenNotificationsEnabled()) { + if (securityCategory != null) { + securityCategory.removePreference(mLockscreenNotifications); + } + } else { + mLockscreenNotifications.setChecked(getLockscreenAllowPrivateNotifications()); + } + } + + mHeadsUp = (CheckBoxPreference) findPreference(KEY_HEADS_UP); + if (mHeadsUp != null) { + updateHeadsUpMode(resolver); + mHeadsUp.setOnPreferenceChangeListener(this); + resolver.registerContentObserver( + Settings.Global.getUriFor(Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED), + false, new ContentObserver(mHandler) { + @Override + public void onChange(boolean selfChange) { + updateHeadsUpMode(resolver); + } + }); + } + mNotificationPulse = (CheckBoxPreference) findPreference(KEY_NOTIFICATION_PULSE); + + if (mNotificationPulse != null + && getResources().getBoolean( + com.android.internal.R.bool.config_intrusiveNotificationLed) == false) { + getPreferenceScreen().removePreference(mNotificationPulse); + } else { + try { + mNotificationPulse.setChecked(Settings.System.getInt(resolver, + Settings.System.NOTIFICATION_LIGHT_PULSE) == 1); + mNotificationPulse.setOnPreferenceChangeListener(this); + } catch (Settings.SettingNotFoundException snfe) { + Log.e(TAG, Settings.System.NOTIFICATION_LIGHT_PULSE + " not found"); + } + } + } + + @Override + public void onResume() { + super.onResume(); + + refreshNotificationListeners(); + lookupRingtoneNames(); + } + + @Override + public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { + final String key = preference.getKey(); + + if (KEY_LOCK_SCREEN_NOTIFICATIONS.equals(key)) { + Settings.Secure.putInt(getContentResolver(), + Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, + mLockscreenNotifications.isChecked() ? 1 : 0); + } else if (KEY_HEADS_UP.equals(key)) { + setHeadsUpMode(getContentResolver(), mHeadsUp.isChecked()); + } else if (KEY_NOTIFICATION_PULSE.equals(key)) { + Settings.System.putInt(getContentResolver(), + Settings.System.NOTIFICATION_LIGHT_PULSE, + mNotificationPulse.isChecked() ? 1 : 0); + } else { + return super.onPreferenceTreeClick(preferenceScreen, preference); + } + + return true; + } + + @Override + public boolean onPreferenceChange(Preference preference, Object objValue) { + return true; + } + + @Override + public boolean onPreferenceClick(Preference preference) { + return false; + } + + // === Heads-up notifications === + + private void updateHeadsUpMode(ContentResolver resolver) { + mHeadsUp.setChecked(Settings.Global.HEADS_UP_ON == Settings.Global.getInt(resolver, + Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED, Settings.Global.HEADS_UP_OFF)); + } + + private void setHeadsUpMode(ContentResolver resolver, boolean value) { + Settings.Global.putInt(resolver, Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED, + value ? Settings.Global.HEADS_UP_ON : Settings.Global.HEADS_UP_OFF); + } + + // === Lockscreen (public / private) notifications === + + private boolean getDeviceLockscreenNotificationsEnabled() { + return 0 != Settings.Global.getInt(getContentResolver(), + Settings.Global.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0); + } + + private boolean getLockscreenAllowPrivateNotifications() { + return 0 != Settings.Secure.getInt(getContentResolver(), + Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0); + } + + // === Notification listeners === + + private int getNumEnabledNotificationListeners() { + final String flat = Settings.Secure.getString(getContentResolver(), + Settings.Secure.ENABLED_NOTIFICATION_LISTENERS); + if (flat == null || "".equals(flat)) return 0; + final String[] components = flat.split(":"); + return components.length; + } + + private void refreshNotificationListeners() { + if (mNotificationAccess != null) { + final PreferenceGroup securityCategory + = (PreferenceGroup) getPreferenceScreen().findPreference(KEY_SECURITY_CATEGORY); + + final int total = NotificationAccessSettings.getListenersCount(mPM); + if (total == 0) { + if (securityCategory != null) { + securityCategory.removePreference(mNotificationAccess); + } + } else { + final int n = getNumEnabledNotificationListeners(); + if (n == 0) { + mNotificationAccess.setSummary(getResources().getString( + R.string.manage_notification_access_summary_zero)); + } else { + mNotificationAccess.setSummary(String.format(getResources().getQuantityString( + R.plurals.manage_notification_access_summary_nonzero, + n, n))); + } + } + } + } + + // === Ringtone === + + private void lookupRingtoneNames() { + new Thread(mRingtoneLookupRunnable).start(); + } +} diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java index 84a07f235db..c4f0c7f42c8 100644 --- a/src/com/android/settings/SecuritySettings.java +++ b/src/com/android/settings/SecuritySettings.java @@ -84,8 +84,6 @@ public class SecuritySettings extends RestrictedSettingsFragment private static final String KEY_TOGGLE_VERIFY_APPLICATIONS = "toggle_verify_applications"; private static final String KEY_POWER_INSTANTLY_LOCKS = "power_button_instantly_locks"; private static final String KEY_CREDENTIALS_MANAGER = "credentials_management"; - private static final String KEY_NOTIFICATION_ACCESS = "manage_notification_access"; - private static final String KEY_LOCK_SCREEN_NOTIFICATIONS = "toggle_lock_screen_notifications"; private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive"; private PackageManager mPM; @@ -109,9 +107,6 @@ public class SecuritySettings extends RestrictedSettingsFragment private CheckBoxPreference mPowerButtonInstantlyLocks; private CheckBoxPreference mEnableKeyguardWidgets; - private Preference mNotificationAccess; - private CheckBoxPreference mLockscreenNotifications; - private boolean mIsPrimary; public SecuritySettings() { @@ -330,26 +325,6 @@ public class SecuritySettings extends RestrictedSettingsFragment } } - mNotificationAccess = findPreference(KEY_NOTIFICATION_ACCESS); - if (mNotificationAccess != null) { - final int total = NotificationAccessSettings.getListenersCount(mPM); - if (total == 0) { - if (deviceAdminCategory != null) { - deviceAdminCategory.removePreference(mNotificationAccess); - } - } else { - final int n = getNumEnabledNotificationListeners(); - if (n == 0) { - mNotificationAccess.setSummary(getResources().getString( - R.string.manage_notification_access_summary_zero)); - } else { - mNotificationAccess.setSummary(String.format(getResources().getQuantityString( - R.plurals.manage_notification_access_summary_nonzero, - n, n))); - } - } - } - if (shouldBePinProtected(RESTRICTIONS_PIN_SET)) { protectByRestrictions(mToggleAppInstallation); protectByRestrictions(mToggleVerifyApps); @@ -357,41 +332,9 @@ public class SecuritySettings extends RestrictedSettingsFragment protectByRestrictions(root.findPreference(KEY_CREDENTIALS_INSTALL)); } - mLockscreenNotifications - = (CheckBoxPreference) root.findPreference(KEY_LOCK_SCREEN_NOTIFICATIONS); - if (mLockscreenNotifications != null) { - if (!getDeviceLockscreenNotificationsEnabled()) { - final PreferenceGroup lockscreenCategory = - (PreferenceGroup) root.findPreference(KEY_SECURITY_CATEGORY); - if (lockscreenCategory != null) { - lockscreenCategory.removePreference(mLockscreenNotifications); - } - } else { - mLockscreenNotifications.setChecked(getLockscreenAllowPrivateNotifications()); - } - } - return root; } - private boolean getDeviceLockscreenNotificationsEnabled() { - return 0 != Settings.Global.getInt(getContentResolver(), - Settings.Global.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0); - } - - private boolean getLockscreenAllowPrivateNotifications() { - return 0 != Settings.Secure.getInt(getContentResolver(), - Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0); - } - - private int getNumEnabledNotificationListeners() { - final String flat = Settings.Secure.getString(getContentResolver(), - Settings.Secure.ENABLED_NOTIFICATION_LISTENERS); - if (flat == null || "".equals(flat)) return 0; - final String[] components = flat.split(":"); - return components.length; - } - private boolean isNonMarketAppsAllowed() { return Settings.Global.getInt(getContentResolver(), Settings.Global.INSTALL_NON_MARKET_APPS, 0) > 0; @@ -617,10 +560,6 @@ public class SecuritySettings extends RestrictedSettingsFragment } else if (KEY_TOGGLE_VERIFY_APPLICATIONS.equals(key)) { Settings.Global.putInt(getContentResolver(), Settings.Global.PACKAGE_VERIFIER_ENABLE, mToggleVerifyApps.isChecked() ? 1 : 0); - } else if (KEY_LOCK_SCREEN_NOTIFICATIONS.equals(key)) { - Settings.Secure.putInt(getContentResolver(), - Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, - mLockscreenNotifications.isChecked() ? 1 : 0); } else { // If we didn't handle it, let preferences handle it. return super.onPreferenceTreeClick(preferenceScreen, preference); diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 1c7bb59c429..0d5839b2de7 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -86,6 +86,7 @@ public class Settings extends SettingsActivity { public static class PrintSettingsActivity extends SettingsActivity { /* empty */ } public static class PrintJobSettingsActivity extends SettingsActivity { /* empty */ } public static class ZenModeSettingsActivity extends SettingsActivity { /* empty */ } + public static class NotificationSettingsActivity extends SettingsActivity { /* empty */ } public static class TopLevelSettings extends SettingsActivity { /* empty */ } } diff --git a/src/com/android/settings/SoundSettings.java b/src/com/android/settings/SoundSettings.java index d50686486b6..45fd0dbeecf 100644 --- a/src/com/android/settings/SoundSettings.java +++ b/src/com/android/settings/SoundSettings.java @@ -75,7 +75,6 @@ public class SoundSettings extends SettingsPreferenceFragment implements private static final String KEY_DOCK_AUDIO_SETTINGS = "dock_audio"; private static final String KEY_DOCK_SOUNDS = "dock_sounds"; private static final String KEY_DOCK_AUDIO_MEDIA_ENABLED = "dock_audio_media_enabled"; - private static final String KEY_ZEN_MODE = "zen_mode"; private static final String[] NEED_VOICE_CAPABILITY = { KEY_RINGTONE, KEY_DTMF_TONE, KEY_CATEGORY_CALLS, @@ -102,7 +101,6 @@ public class SoundSettings extends SettingsPreferenceFragment implements private CheckBoxPreference mDockSounds; private Intent mDockIntent; private CheckBoxPreference mDockAudioMediaEnabled; - private ZenModeListPreference mZenModeListPreference; private Handler mHandler = new Handler() { public void handleMessage(Message msg) { @@ -229,9 +227,6 @@ public class SoundSettings extends SettingsPreferenceFragment implements }; initDockSettings(); - - mZenModeListPreference = (ZenModeListPreference) findPreference(KEY_ZEN_MODE); - mZenModeListPreference.init(); } @Override @@ -253,8 +248,13 @@ public class SoundSettings extends SettingsPreferenceFragment implements private void updateRingtoneName(int type, Preference preference, int msg) { if (preference == null) return; - Context context = getActivity(); - if (context == null) return; + final CharSequence summary = updateRingtoneName(getActivity(), type); + if (summary == null) return; + mHandler.sendMessage(mHandler.obtainMessage(msg, summary)); + } + + public static CharSequence updateRingtoneName(Context context, int type) { + if (context == null) return null; Uri ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, type); CharSequence summary = context.getString(com.android.internal.R.string.ringtone_unknown); // Is it a silent ringtone? @@ -275,7 +275,7 @@ public class SoundSettings extends SettingsPreferenceFragment implements // Unknown title for the ringtone } } - mHandler.sendMessage(mHandler.obtainMessage(msg, summary)); + return summary; } private void lookupRingtoneNames() {