From 347f944a22513d8fb6b41ef185fd8ea872ebcfee Mon Sep 17 00:00:00 2001 From: Dan Sandler Date: Tue, 11 Mar 2014 01:32:47 -0400 Subject: [PATCH] Finally, a place for notification settings. Consolidated under the new Notifications settings are: - Ringtone (from Sound) - Zen Mode (from Sound) - Pulse LED (from Display) - Heads-Up Notifications (from Display) - Notification Access (from Security) - Show when locked (from Security) Change-Id: I214d03ba1e356e088323a3058d98d390b8a8f988 --- AndroidManifest.xml | 20 +- CleanSpec.mk | 2 + .../ic_settings_notifications.png | Bin 1307 -> 412 bytes .../ic_settings_notifications.png | Bin 967 -> 338 bytes .../ic_settings_notifications.png | Bin 4637 -> 549 bytes .../ic_settings_notifications.png | Bin 0 -> 706 bytes res/values/strings.xml | 32 ++- res/xml/display_settings.xml | 11 - res/xml/notification_settings.xml | 88 ++++++ res/xml/security_settings_biometric_weak.xml | 7 - res/xml/security_settings_misc.xml | 6 - res/xml/security_settings_password.xml | 7 - res/xml/security_settings_pattern.xml | 7 - res/xml/security_settings_pin.xml | 7 - res/xml/settings_headers.xml | 7 + res/xml/sound_settings.xml | 9 - src/com/android/settings/DisplaySettings.java | 53 ---- .../settings/NotificationSettings.java | 255 ++++++++++++++++++ .../android/settings/SecuritySettings.java | 61 ----- src/com/android/settings/Settings.java | 1 + src/com/android/settings/SoundSettings.java | 16 +- 21 files changed, 402 insertions(+), 187 deletions(-) create mode 100644 res/drawable-xxhdpi/ic_settings_notifications.png create mode 100644 res/xml/notification_settings.xml create mode 100644 src/com/android/settings/NotificationSettings.java 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" /> + + + + + + + + + + + + eSaefwW^{L9a%BKPWN%_+AW3auXJt}l zVPtu6$z?nM00BNpL_t(|+U!}24T3NbrA$yqa050_Ht7b&4OqbmbQ5p`M{on!pdLwM zz@!%29=*!F#wAK<13Pi5Fw*llPgnt-h=Q5o&=?T#Z}3UCdlVLGT+`YEmp$bM3GEk_XQ~)3)TfH^qZ@$>?P5lu4&-iGdH^|6 zuST0M>zW*jIe&6s0!(1*1jvU`S234;B3t4@=S1z|V4nTo;L&2Pqs8eM1=TXHVy+A@ zZ*7Ej$7E?Vs)@eBY!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq8sKd6mGxU^Rn*LA+qju0R{0zQO>X z5Lcjr|D%A8A<)rOITIM@RV6`w!N5ph=VW4L6}Arwwq)ThX;5go^zzl2bV0HA{IwrM zO^zk~c+L^`HPG;g9N*&$Ka>& zmps$8-~X)8`nytn!xF_E3uVRaTwSi3pWeykv1RMFrOjo$?r)tw-bswOmaH)cl&~0+ zyxm*nCLvE3#}JR>cc=XhzU&}yytw-2?k-=g z8FozDI>K}p{ovA?7cpTQ$B!fBwPG$uze~T2e}7l?WsmWf9r7~@kDX63x;gXrxwmiY zHg`V$qc7n5exd!|uM6}m7q4UFdRdjyQV^najCX?x@0mA}H)emGU}(Snyu&&7t?UO6 zF8u4bFF>bIjIW%Rr@hCMu}4N@wSmU3I8_7ArY<1?8C!|tt&VxB1;_c0etgKdK`5kO z#+T*z1-+%WDrEZQw|kvb6t>*^=7{HRXKNO<;^ltxEvxlDU0AhdQ(^Gd&*FMPY)9tr zOG&WGn-k;_U9sZKk(G>$oqwmic3?LMG%}dP@uaGsYun_lqM2TQKAo9rrOK23e4W&c z*;m`kIArJMo1{k_N`Bb1(u;eSS4&5B_u0Ji%%4?P&(*v+_Q+RMPxt;Np#{-0 zS>w(l+unUW-=uYWu)s6l)U&U(F7}qc)V|$#VG;kC)qDRh`0-<9imJmJ{@QCbKeJ3v ztoW_lxxc*QEZ?GEi(~$+{2>~3HtfjBvu6#DzUSSta?+bH)1NJhZqdu^a$Gw$eh*N7 z+a8#qaOhslrswhh72mMcGpt^^-Am=NJ*Y@hEpd$~Nl7e8wMs5Z1yT$~28PDE28OzZ z<{^e=R)&^VCT6+@rd9?9FD@)zkD?(rKP5A*61Rq#z0$yh$iU#~>gTe~DWM4fa5eI~ diff --git a/res/drawable-mdpi/ic_settings_notifications.png b/res/drawable-mdpi/ic_settings_notifications.png index fa7a07c0202b35134020b8afcc79b18bb7641b36..b8022fde89df35d8e9b2fd9e70a902cf9844a512 100644 GIT binary patch delta 322 zcmV-I0logm2hswN8Gi-<0047(dh`GQ02y>eSaefwW^{L9a%BKPWN%_+AW3auXJt}l zVPtu6$z?nM008t!L_t(|+G1cB1%na%|NlSXKlMQZHoKT`xFH^i{Q-z4K=B6({1uN) zkcEIIkcEnjjEoHA4Mz(iMjQ^<52PHR<-i3rX#+CT!2w`4b|f_sUO?A` z5K03E&^Sj=grfz~$Z8S68YUko^jAE&xd3FbBNTt2cQyoD4lE5pCE^8I zIAYM31E5N0KRYl1!Rmwk)NYWl5TQl@YB2*XT0^*^U?CPqP-^+Y(JtSh1ONdB05&Y? U&*bH08~^|S07*qoM6N<$f^05$ng9R* literal 967 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 diff --git a/res/drawable-xxhdpi/ic_settings_notifications.png b/res/drawable-xxhdpi/ic_settings_notifications.png new file mode 100644 index 0000000000000000000000000000000000000000..6f5d5c120dfd5af75feaa21b45a50b897ae50129 GIT binary patch literal 706 zcmV;z0zLhSP)>aPK4Wp=I1J65TH^WKsSzBa>ZaCk!xm02_fjeLF~dy z(u}-U?+LXf4_MuKe9c(n%fmDhrdS6g@PIzfKixV_lTh_Fmz+?t2Q)ErWa(qZ3+^ev zhf-ezI0-=-eGvf45MZs;7XgHgQeUQ_Ohd~FL5GNb2SQLfylgLwef#@sy)#6PSx`N8 zGtSLyAE@*ka49D=j_v5=0&pOs9D+mhw=!30Du4p00@8pfB*;p z2!H^900;n?xa)4H^{wh$9$>jPrY%7LN)so*p?o})CMt#?3`e0-PBi5%LOf z(fEjvM}Vuww=Tk}1moig6Q`j=-;17b&)UkjqdAmca0v1-ULbuu0w{=J&G@-O&?pfs z8b4QAQ6rj7r*_)M@6<3L6^1W}r(>;W9g oYkB~si2wiq0000mD}DqR0MEs@dY{5o(f|Me07*qoM6N<$f+RyH^#A|> literal 0 HcmV?d00001 diff --git a/res/values/strings.xml b/res/values/strings.xml index f95f881fa21..5b50de00137 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5006,25 +5006,37 @@ - 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() {