From: Julia Reynolds Date: Fri, 16 Dec 2016 20:51:59 +0000 (-0500) Subject: Support showing notifications as badges. X-Git-Tag: android-x86-8.1-r1~1228^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=d6835a20fcff318187213bdc2e96fafb0e1ab1ef;p=android-x86%2Fpackages-apps-Settings.git Support showing notifications as badges. And remove unneeded app level settings. Change-Id: I88f506b0704195181d1748a3135f8ee0f39b774f Test: manual for now. will add tests when have real mocks for the pages --- diff --git a/res/values/strings.xml b/res/values/strings.xml index a5248f6a24..c8f0baf4c0 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6220,25 +6220,19 @@ Not set - Never show notifications from this app + Never show notifications - No full screen interruption, peeking, sound, or vibration. Show at the bottom of the notification list. Hide from lock screen and status bar. + No sound or visual interruption - No full screen interruption, peeking, sound, or vibration. + Show silently - No full screen interruption or peeking. + Make sound - Always peek. No full screen interruption. - - - Always peek, and allow full screen interruption. Show at the top of the notification list. - - - App determines importance for each notification + Make sound and pop on screen Reset @@ -6329,13 +6323,19 @@ Block all - Never show notifications from this app + Never show these notifications - Block all + Show notifications - Never show notifications from this channel + Never show notifications in the shade or on peripheral devices + + + Show badge + + + Show notifications as badges on the Home app, if supported. Override Do Not Disturb @@ -6346,7 +6346,7 @@ On the lock screen - + Blocked @@ -6788,14 +6788,6 @@ Blocked With domain URLs - - Overrides Do Not Disturb - - No sensitive content on lock screen - - Never shown on lock screen - - Shown silently Advanced diff --git a/res/xml/app_notification_settings.xml b/res/xml/app_notification_settings.xml index 2b2fc318d2..82660dc81d 100644 --- a/res/xml/app_notification_settings.xml +++ b/res/xml/app_notification_settings.xml @@ -18,46 +18,18 @@ xmlns:settings="http://schemas.android.com/apk/res/com.android.settings" android:title="@string/app_notifications_title" android:key="app_notification_settings"> - - - - - - - - - - - - + android:key="block" + android:title="@string/app_notification_block_title" + android:summary="@string/app_notification_block_summary" + android:order="2" + settings:useAdditionalSummary="true" + settings:restrictedSwitchSummary="@string/enabled_by_admin" /> + android:order="3" /> diff --git a/res/xml/channel_notification_settings.xml b/res/xml/channel_notification_settings.xml index de0b9c7b2b..c2d1f73fca 100644 --- a/res/xml/channel_notification_settings.xml +++ b/res/xml/channel_notification_settings.xml @@ -20,21 +20,33 @@ - + android:key="block" + android:title="@string/app_notification_block_title" + android:summary="@string/app_notification_block_summary" + android:order="1" + settings:useAdditionalSummary="true" + settings:restrictedSwitchSummary="@string/enabled_by_admin" /> + + - - + + + + + + diff --git a/src/com/android/settings/applications/AppStateNotificationBridge.java b/src/com/android/settings/applications/AppStateNotificationBridge.java index 5fff175be0..b0c065ae0c 100644 --- a/src/com/android/settings/applications/AppStateNotificationBridge.java +++ b/src/com/android/settings/applications/AppStateNotificationBridge.java @@ -81,64 +81,4 @@ public class AppStateNotificationBridge extends AppStateBaseBridge { return false; } }; - - public static final AppFilter FILTER_APP_NOTIFICATION_SILENCED = new AppFilter() { - @Override - public void init() { - } - - @Override - public boolean filterApp(AppEntry info) { - if (info == null || info.extraInfo == null) { - return false; - } - AppRow row = (AppRow) info.extraInfo; - return row.appImportance > NotificationManager.IMPORTANCE_NONE - && row.appImportance < NotificationManager.IMPORTANCE_DEFAULT; - } - }; - - public static final AppFilter FILTER_APP_NOTIFICATION_PRIORITY = new AppFilter() { - @Override - public void init() { - } - - @Override - public boolean filterApp(AppEntry info) { - if (info == null || info.extraInfo == null) { - return false; - } - return ((AppRow) info.extraInfo).appBypassDnd; - } - }; - - public static final AppFilter FILTER_APP_NOTIFICATION_HIDE_SENSITIVE = new AppFilter() { - @Override - public void init() { - } - - @Override - public boolean filterApp(AppEntry info) { - if (info == null || info.extraInfo == null) { - return false; - } - return ((AppRow) info.extraInfo).lockScreenSecure - && ((AppRow) info.extraInfo).appVisOverride == Notification.VISIBILITY_PRIVATE; - } - }; - - public static final AppFilter FILTER_APP_NOTIFICATION_HIDE_ALL = new AppFilter() { - @Override - public void init() { - } - - @Override - public boolean filterApp(AppEntry info) { - if (info == null || info.extraInfo == null) { - return false; - } - return ((AppRow) info.extraInfo).lockScreenSecure - && ((AppRow) info.extraInfo).appVisOverride == Notification.VISIBILITY_SECRET; - } - }; } diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java index 2569eacae5..d689ee46ad 100755 --- a/src/com/android/settings/applications/InstalledAppDetails.java +++ b/src/com/android/settings/applications/InstalledAppDetails.java @@ -1088,10 +1088,6 @@ public class InstalledAppDetails extends AppInfoBase return NetworkTemplate.buildTemplateEthernet(); } - public static CharSequence getNotificationSummary(AppEntry appEntry, Context context) { - return getNotificationSummary(appEntry, context, new NotificationBackend()); - } - public static CharSequence getNotificationSummary(AppEntry appEntry, Context context, NotificationBackend backend) { AppRow appRow = backend.loadAppRow(context, context.getPackageManager(), appEntry.info); @@ -1099,43 +1095,8 @@ public class InstalledAppDetails extends AppInfoBase } public static CharSequence getNotificationSummary(AppRow appRow, Context context) { - boolean showSlider = Settings.Secure.getInt( - context.getContentResolver(), NOTIFICATION_TUNER_SETTING, 0) == 1; - List summaryAttributes = new ArrayList<>(); - StringBuffer summary = new StringBuffer(); - if (showSlider) { - if (appRow.appImportance != NotificationManager.IMPORTANCE_UNSPECIFIED) { - summaryAttributes.add(context.getString( - R.string.notification_summary_level, appRow.appImportance)); - } - } else { - if (appRow.banned) { - summaryAttributes.add(context.getString(R.string.notifications_disabled)); - } else if (appRow.appImportance > NotificationManager.IMPORTANCE_NONE - && appRow.appImportance < NotificationManager.IMPORTANCE_DEFAULT) { - summaryAttributes.add(context.getString(R.string.notifications_silenced)); - } - } - final boolean lockscreenSecure = new LockPatternUtils(context).isSecure( - UserHandle.myUserId()); - if (lockscreenSecure) { - if (appRow.appVisOverride == Notification.VISIBILITY_PRIVATE) { - summaryAttributes.add(context.getString(R.string.notifications_redacted)); - } else if (appRow.appVisOverride == Notification.VISIBILITY_SECRET) { - summaryAttributes.add(context.getString(R.string.notifications_hidden)); - } - } - if (appRow.appBypassDnd) { - summaryAttributes.add(context.getString(R.string.notifications_priority)); - } - final int N = summaryAttributes.size(); - for (int i = 0; i < N; i++) { - if (i > 0) { - summary.append(context.getString(R.string.notifications_summary_divider)); - } - summary.append(summaryAttributes.get(i)); - } - return summary.toString(); + // TODO: implement summary when it is known what it should say + return ""; } @Override diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java index 099d30efad..d8ee6b7f01 100644 --- a/src/com/android/settings/applications/ManageApplications.java +++ b/src/com/android/settings/applications/ManageApplications.java @@ -131,15 +131,11 @@ public class ManageApplications extends InstrumentedPreferenceFragment public static final int FILTER_APPS_ENABLED = 3; public static final int FILTER_APPS_DISABLED = 4; public static final int FILTER_APPS_BLOCKED = 5; - public static final int FILTER_APPS_SILENT = 6; - public static final int FILTER_APPS_SENSITIVE = 7; - public static final int FILTER_APPS_HIDE_NOTIFICATIONS = 8; - public static final int FILTER_APPS_PRIORITY = 9; - public static final int FILTER_APPS_PERSONAL = 10; - public static final int FILTER_APPS_WORK = 11; - public static final int FILTER_APPS_USAGE_ACCESS = 13; - public static final int FILTER_APPS_WITH_OVERLAY = 14; - public static final int FILTER_APPS_WRITE_SETTINGS = 15; + public static final int FILTER_APPS_PERSONAL = 6; + public static final int FILTER_APPS_WORK = 7; + public static final int FILTER_APPS_USAGE_ACCESS = 8; + public static final int FILTER_APPS_WITH_OVERLAY = 9; + public static final int FILTER_APPS_WRITE_SETTINGS = 10; // This is the string labels for the filter modes above, the order must be kept in sync. public static final int[] FILTER_LABELS = new int[]{ @@ -149,10 +145,6 @@ public class ManageApplications extends InstrumentedPreferenceFragment R.string.filter_enabled_apps, // Enabled R.string.filter_apps_disabled, // Disabled R.string.filter_notif_blocked_apps, // Blocked Notifications - R.string.filter_notif_silent, // Silenced Notifications - R.string.filter_notif_sensitive_apps, // Sensitive Notifications - R.string.filter_notif_hide_notifications_apps, // Sensitive Notifications - R.string.filter_notif_priority_apps, // Priority Notifications R.string.filter_personal_apps, // Personal R.string.filter_work_apps, // Work R.string.filter_with_domain_urls_apps, // Domain URLs @@ -171,10 +163,6 @@ public class ManageApplications extends InstrumentedPreferenceFragment ApplicationsState.FILTER_ALL_ENABLED, // Enabled ApplicationsState.FILTER_DISABLED, // Disabled AppStateNotificationBridge.FILTER_APP_NOTIFICATION_BLOCKED, // Blocked Notifications - AppStateNotificationBridge.FILTER_APP_NOTIFICATION_SILENCED, // Silenced Notifications - AppStateNotificationBridge.FILTER_APP_NOTIFICATION_HIDE_SENSITIVE, // Sensitive Notifications - AppStateNotificationBridge.FILTER_APP_NOTIFICATION_HIDE_ALL, // Hide all Notifications - AppStateNotificationBridge.FILTER_APP_NOTIFICATION_PRIORITY, // Priority Notifications ApplicationsState.FILTER_PERSONAL, // Personal ApplicationsState.FILTER_WORK, // Work ApplicationsState.FILTER_WITH_DOMAIN_URLS, // Apps with Domain URLs @@ -356,10 +344,6 @@ public class ManageApplications extends InstrumentedPreferenceFragment } if (mListType == LIST_TYPE_NOTIFICATION) { mFilterAdapter.enableFilter(FILTER_APPS_BLOCKED); - mFilterAdapter.enableFilter(FILTER_APPS_SILENT); - mFilterAdapter.enableFilter(FILTER_APPS_SENSITIVE); - mFilterAdapter.enableFilter(FILTER_APPS_HIDE_NOTIFICATIONS); - mFilterAdapter.enableFilter(FILTER_APPS_PRIORITY); } if (mListType == LIST_TYPE_HIGH_POWER) { mFilterAdapter.enableFilter(FILTER_APPS_POWER_WHITELIST_ALL); diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java index c38a72fc25..c720bb5c30 100644 --- a/src/com/android/settings/notification/AppNotificationSettings.java +++ b/src/com/android/settings/notification/AppNotificationSettings.java @@ -54,12 +54,12 @@ public class AppNotificationSettings extends NotificationSettingsBase { .addCategory(Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES); private static final String KEY_CHANNELS = "channels"; + private static final String KEY_BLOCK = "block"; private DashboardFeatureProvider mDashboardFeatureProvider; private PreferenceCategory mChannels; private List mChannelList; - @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -84,28 +84,17 @@ public class AppNotificationSettings extends NotificationSettingsBase { addPreferencesFromResource(R.xml.app_notification_settings); - mImportance = (ImportanceSeekBarPreference) findPreference(KEY_IMPORTANCE); - mPriority = - (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_BYPASS_DND); - mVisibilityOverride = - (RestrictedDropDownPreference) getPreferenceScreen().findPreference( - KEY_VISIBILITY_OVERRIDE); mBlock = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_BLOCK); - mSilent = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_SILENT); mChannels = (PreferenceCategory) findPreference(KEY_CHANNELS); if (mPkgInfo != null) { + setupBlock(mAppRow.systemApp, mAppRow.banned); // load settings intent ArrayMap rows = new ArrayMap(); rows.put(mAppRow.pkg, mAppRow); collectConfigActivities(rows); mChannelList = mBackend.getChannels(mPkg, mUid).getList(); - setupImportancePrefs(mAppRow.systemApp, mAppRow.appImportance, mAppRow.banned, - NotificationManager.IMPORTANCE_HIGH); - setupPriorityPref(mAppRow.appBypassDnd); - setupVisOverridePref(mAppRow.appVisOverride); - if (mChannelList.isEmpty()) { setVisible(mChannels, false); } else { @@ -129,7 +118,7 @@ public class AppNotificationSettings extends NotificationSettingsBase { mChannels.addPreference(channelPref); } } - updateDependents(mAppRow.appImportance); + updateDependents(mAppRow.banned); } if (mDashboardFeatureProvider.isEnabled()) { final Preference pref = FeatureFactory.getFactory(activity) @@ -148,10 +137,40 @@ public class AppNotificationSettings extends NotificationSettingsBase { } @Override - protected void updateDependents(int importance) { - super.updateDependents(importance); - setVisible(mChannels, - !(mChannelList.isEmpty() || importance == NotificationManager.IMPORTANCE_NONE)); + public void onResume() { + super.onResume(); + if ((mUid != -1 && getPackageManager().getPackagesForUid(mUid) == null)) { + // App isn't around anymore, must have been removed. + finish(); + return; + } + if (mBlock != null) { + mBlock.setDisabledByAdmin(mSuspendedAppsAdmin); + } + } + + private void setupBlock(boolean notBlockable, boolean banned) { + if (notBlockable) { + setVisible(mBlock, false); + } else { + mBlock.setChecked(banned); + mBlock.setOnPreferenceChangeListener( + new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, + Object newValue) { + final boolean blocked = (Boolean) newValue; + mBackend.setNotificationsEnabledForPackage(mPkgInfo.packageName, mUid, + !blocked); + updateDependents(blocked); + return true; + } + }); + } + } + + private void updateDependents(boolean banned) { + setVisible(mChannels, !(mChannelList.isEmpty() || banned)); } private List queryNotificationConfigActivities() { diff --git a/src/com/android/settings/notification/ChannelNotificationSettings.java b/src/com/android/settings/notification/ChannelNotificationSettings.java index 02cc4365cb..77bf6be8ad 100644 --- a/src/com/android/settings/notification/ChannelNotificationSettings.java +++ b/src/com/android/settings/notification/ChannelNotificationSettings.java @@ -16,17 +16,27 @@ package com.android.settings.notification; +import static android.app.NotificationManager.IMPORTANCE_HIGH; +import static android.app.NotificationManager.IMPORTANCE_LOW; +import static android.app.NotificationManager.IMPORTANCE_MIN; +import static android.app.NotificationManager.IMPORTANCE_NONE; + import android.app.Activity; +import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; +import android.app.admin.DevicePolicyManager; import android.content.Intent; +import android.content.pm.UserInfo; import android.net.Uri; import android.os.Bundle; +import android.os.UserHandle; import android.provider.Settings; import android.service.notification.NotificationListenerService.Ranking; import android.support.v7.preference.Preference; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.internal.widget.LockPatternUtils; import com.android.settings.AppHeader; import com.android.settings.R; import com.android.settings.RingtonePreference; @@ -36,17 +46,26 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedSwitchPreference; +import java.util.ArrayList; + public class ChannelNotificationSettings extends NotificationSettingsBase { + protected static final String KEY_BYPASS_DND = "bypass_dnd"; + protected static final String KEY_VISIBILITY_OVERRIDE = "visibility_override"; + protected static final String KEY_IMPORTANCE = "importance"; protected static final String KEY_LIGHTS = "lights"; protected static final String KEY_VIBRATE = "vibrate"; protected static final String KEY_RINGTONE = "ringtone"; + protected static final String KEY_SHOW = "show"; + protected static final String KEY_BADGE = "badge"; protected RestrictedSwitchPreference mLights; protected RestrictedSwitchPreference mVibrate; protected DefaultNotificationTonePreference mRingtone; + protected RestrictedDropDownPreference mImportance; + protected RestrictedSwitchPreference mPriority; + protected RestrictedDropDownPreference mVisibilityOverride; private DashboardFeatureProvider mDashboardFeatureProvider; - private int mMaxImportance; @Override public void onActivityCreated(Bundle savedInstanceState) { @@ -71,34 +90,26 @@ public class ChannelNotificationSettings extends NotificationSettingsBase { FeatureFactory.getFactory(activity).getDashboardFeatureProvider(activity); addPreferencesFromResource(R.xml.channel_notification_settings); - mImportance = (ImportanceSeekBarPreference) findPreference(KEY_IMPORTANCE); + mBlock = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_BLOCK); + mShow = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_SHOW); + mBadge = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_BADGE); + mImportance = (RestrictedDropDownPreference) findPreference(KEY_IMPORTANCE); mPriority = (RestrictedSwitchPreference) findPreference(KEY_BYPASS_DND); mVisibilityOverride = (RestrictedDropDownPreference) findPreference(KEY_VISIBILITY_OVERRIDE); - mBlock = (RestrictedSwitchPreference) findPreference(KEY_BLOCK); - mSilent = (RestrictedSwitchPreference) findPreference(KEY_SILENT); mLights = (RestrictedSwitchPreference) findPreference(KEY_LIGHTS); mVibrate = (RestrictedSwitchPreference) findPreference(KEY_VIBRATE); mRingtone = (DefaultNotificationTonePreference) findPreference(KEY_RINGTONE); if (mPkgInfo != null) { setupPriorityPref(mChannel.canBypassDnd()); - if (mAppRow.appBypassDnd) { - mPriority.setShouldDisableView(true); - } setupVisOverridePref(mChannel.getLockscreenVisibility()); - if (mAppRow.appVisOverride != Ranking.VISIBILITY_NO_OVERRIDE) { - mVisibilityOverride.setShouldDisableView(true); - } setupLights(); setupVibrate(); setupRingtone(); - mMaxImportance = mAppRow.appImportance == NotificationManager.IMPORTANCE_UNSPECIFIED - ? NotificationManager.IMPORTANCE_HIGH : mAppRow.appImportance; - setupImportancePrefs(false, mChannel.getImportance(), - mChannel.getImportance() == NotificationManager.IMPORTANCE_NONE, - mMaxImportance); + setupBlockAndImportance(); + updateDependents(); } if (mDashboardFeatureProvider.isEnabled()) { final Preference pref = FeatureFactory.getFactory(activity) @@ -124,14 +135,14 @@ public class ChannelNotificationSettings extends NotificationSettingsBase { finish(); return; } - mSuspendedAppsAdmin = RestrictedLockUtils.checkIfApplicationIsSuspended( - mContext, mPkg, mUserId); - if (mLights != null) { - mLights.setDisabledByAdmin(mSuspendedAppsAdmin); - } - if (mVibrate != null) { - mVibrate.setDisabledByAdmin(mSuspendedAppsAdmin); - } + mLights.setDisabledByAdmin(mSuspendedAppsAdmin); + mVibrate.setDisabledByAdmin(mSuspendedAppsAdmin); + mImportance.setDisabledByAdmin(mSuspendedAppsAdmin); + mPriority.setDisabledByAdmin(mSuspendedAppsAdmin); + mVisibilityOverride.setDisabledByAdmin(mSuspendedAppsAdmin); + mBlock.setDisabledByAdmin(mSuspendedAppsAdmin); + mShow.setDisabledByAdmin(mSuspendedAppsAdmin); + mBadge.setDisabledByAdmin(mSuspendedAppsAdmin); } private void setupLights() { @@ -179,6 +190,209 @@ public class ChannelNotificationSettings extends NotificationSettingsBase { }); } + protected void setupBlockAndImportance() { + mBlock.setDisabledByAdmin(mSuspendedAppsAdmin); + mBlock.setChecked(!mChannel.isAllowed()); + mBlock.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + final boolean value = (Boolean) newValue; + mChannel.setAllowed(!value); + mChannel.lockFields(NotificationChannel.USER_LOCKED_ALLOWED); + mBackend.updateChannel(mPkg, mUid, mChannel); + updateDependents(); + return true; + } + }); + + mShow.setDisabledByAdmin(mSuspendedAppsAdmin); + mShow.setChecked(mChannel.getImportance() != NotificationManager.IMPORTANCE_NONE); + mShow.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + final boolean value = (Boolean) newValue; + int importance = value ? IMPORTANCE_LOW : IMPORTANCE_NONE; + mImportance.setValue(String.valueOf(importance)); + mChannel.setImportance(importance); + mChannel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE); + mBackend.updateChannel(mPkg, mUid, mChannel); + updateDependents(); + return true; + } + }); + mBadge.setDisabledByAdmin(mSuspendedAppsAdmin); + mBadge.setChecked(mChannel.canShowBadge()); + mBadge.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + final boolean value = (Boolean) newValue; + mChannel.setShowBadge(value); + mChannel.lockFields(NotificationChannel.USER_LOCKED_SHOW_BADGE); + mBackend.updateChannel(mPkg, mUid, mChannel); + return true; + } + }); + + mImportance.setDisabledByAdmin(mSuspendedAppsAdmin); + final int numImportances = IMPORTANCE_HIGH - IMPORTANCE_MIN + 1; + String[] summaries = new String[numImportances]; + String[] values = new String[numImportances]; + for (int i = 0; i < numImportances; i++) { + int importance = i + 1; + summaries[i] = getSummary(importance); + values[i] = String.valueOf(importance); + } + mImportance.setEntryValues(values); + mImportance.setEntries(summaries); + mImportance.setValue(String.valueOf(mChannel.getImportance())); + mImportance.setSummary("%s"); + + mImportance.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + int importance = Integer.parseInt((String) newValue); + mChannel.setImportance(importance); + mChannel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE); + mBackend.updateChannel(mPkg, mUid, mChannel); + updateDependents(); + return true; + } + }); + } + + private String getSummary(int importance) { + switch (importance) { + case NotificationManager.IMPORTANCE_NONE: + return getContext().getString(R.string.notification_importance_blocked); + case NotificationManager.IMPORTANCE_MIN: + return getContext().getString(R.string.notification_importance_min); + case NotificationManager.IMPORTANCE_LOW: + return getContext().getString(R.string.notification_importance_low); + case NotificationManager.IMPORTANCE_DEFAULT: + return getContext().getString(R.string.notification_importance_default); + case NotificationManager.IMPORTANCE_HIGH: + case NotificationManager.IMPORTANCE_MAX: + default: + return getContext().getString(R.string.notification_importance_high); + } + } + + protected void setupPriorityPref(boolean priority) { + mPriority.setDisabledByAdmin(mSuspendedAppsAdmin); + mPriority.setChecked(priority); + mPriority.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + final boolean bypassZenMode = (Boolean) newValue; + mChannel.setBypassDnd(bypassZenMode); + mChannel.lockFields(NotificationChannel.USER_LOCKED_PRIORITY); + mBackend.updateChannel(mPkg, mUid, mChannel); + return true; + } + }); + } + + protected void setupVisOverridePref(int sensitive) { + ArrayList entries = new ArrayList<>(); + ArrayList values = new ArrayList<>(); + + mVisibilityOverride.clearRestrictedItems(); + if (getLockscreenNotificationsEnabled() && getLockscreenAllowPrivateNotifications()) { + final String summaryShowEntry = + getString(R.string.lock_screen_notifications_summary_show); + final String summaryShowEntryValue = + Integer.toString(NotificationManager.VISIBILITY_NO_OVERRIDE); + entries.add(summaryShowEntry); + values.add(summaryShowEntryValue); + setRestrictedIfNotificationFeaturesDisabled(summaryShowEntry, summaryShowEntryValue, + DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS + | DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS); + } + + final String summaryHideEntry = getString(R.string.lock_screen_notifications_summary_hide); + final String summaryHideEntryValue = Integer.toString(Notification.VISIBILITY_PRIVATE); + entries.add(summaryHideEntry); + values.add(summaryHideEntryValue); + setRestrictedIfNotificationFeaturesDisabled(summaryHideEntry, summaryHideEntryValue, + DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS); + entries.add(getString(R.string.lock_screen_notifications_summary_disable)); + values.add(Integer.toString(Notification.VISIBILITY_SECRET)); + mVisibilityOverride.setEntries(entries.toArray(new CharSequence[entries.size()])); + mVisibilityOverride.setEntryValues(values.toArray(new CharSequence[values.size()])); + + if (sensitive == Ranking.VISIBILITY_NO_OVERRIDE) { + mVisibilityOverride.setValue(Integer.toString(getGlobalVisibility())); + } else { + mVisibilityOverride.setValue(Integer.toString(sensitive)); + } + mVisibilityOverride.setSummary("%s"); + + mVisibilityOverride.setOnPreferenceChangeListener( + new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + int sensitive = Integer.parseInt((String) newValue); + if (sensitive == getGlobalVisibility()) { + sensitive = Ranking.VISIBILITY_NO_OVERRIDE; + } + mChannel.setLockscreenVisibility(sensitive); + mChannel.lockFields(NotificationChannel.USER_LOCKED_VISIBILITY); + mBackend.updateChannel(mPkg, mUid, mChannel); + return true; + } + }); + } + + private void setRestrictedIfNotificationFeaturesDisabled(CharSequence entry, + CharSequence entryValue, int keyguardNotificationFeatures) { + RestrictedLockUtils.EnforcedAdmin admin = + RestrictedLockUtils.checkIfKeyguardFeaturesDisabled( + mContext, keyguardNotificationFeatures, mUserId); + if (admin != null) { + RestrictedDropDownPreference.RestrictedItem item = + new RestrictedDropDownPreference.RestrictedItem(entry, entryValue, admin); + mVisibilityOverride.addRestrictedItem(item); + } + } + + private int getGlobalVisibility() { + int globalVis = Ranking.VISIBILITY_NO_OVERRIDE; + if (!getLockscreenNotificationsEnabled()) { + globalVis = Notification.VISIBILITY_SECRET; + } else if (!getLockscreenAllowPrivateNotifications()) { + globalVis = Notification.VISIBILITY_PRIVATE; + } + return globalVis; + } + + private boolean getLockscreenNotificationsEnabled() { + return Settings.Secure.getInt(getContentResolver(), + Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0) != 0; + } + + private boolean getLockscreenAllowPrivateNotifications() { + return Settings.Secure.getInt(getContentResolver(), + Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0) != 0; + } + + private boolean isLockScreenSecure() { + LockPatternUtils utils = new LockPatternUtils(getActivity()); + boolean lockscreenSecure = utils.isSecure(UserHandle.myUserId()); + UserInfo parentUser = mUm.getProfileParent(UserHandle.myUserId()); + if (parentUser != null){ + lockscreenSecure |= utils.isSecure(parentUser.id); + } + + return lockscreenSecure; + } + + protected boolean checkCanBeVisible(int minImportanceVisible, int importance) { + if (importance == NotificationManager.IMPORTANCE_UNSPECIFIED) { + return true; + } + return importance >= minImportanceVisible; + } + @Override public boolean onPreferenceTreeClick(Preference preference) { if (preference instanceof RingtonePreference) { @@ -205,22 +419,24 @@ public class ChannelNotificationSettings extends NotificationSettingsBase { Settings.System.NOTIFICATION_LIGHT_PULSE, 0) == 1; } - @Override - protected void updateDependents(int importance) { - if (importance == NotificationManager.IMPORTANCE_UNSPECIFIED) { - importance = mMaxImportance; - } - importance = Math.min(mMaxImportance, importance); - - super.updateDependents(importance); - setVisible(mLights, checkCanBeVisible( + private void updateDependents() { + boolean allowed = mChannel.isAllowed(); + int importance = mChannel.getImportance(); + setVisible(mShow, allowed); + setVisible(mBadge, allowed); + setVisible(mImportance, allowed && importance != NotificationManager.IMPORTANCE_NONE); + setVisible(mLights, allowed && checkCanBeVisible( NotificationManager.IMPORTANCE_LOW, importance) && canPulseLight()); - setVisible(mVibrate, checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT, importance)); - setVisible(mRingtone, checkCanBeVisible( + setVisible(mVibrate, allowed + && checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT, importance)); + setVisible(mRingtone, allowed && checkCanBeVisible( NotificationManager.IMPORTANCE_DEFAULT, importance)); - if (mMaxImportance == NotificationManager.IMPORTANCE_LOW - && getPreferenceScreen().findPreference(mBlock.getKey()) != null) { - setVisible(mSilent, false); - } + setVisible(mPriority, allowed + && (checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT, importance) + || (checkCanBeVisible(NotificationManager.IMPORTANCE_LOW, importance) + && mDndVisualEffectsSuppressed))); + setVisible(mVisibilityOverride, allowed + && checkCanBeVisible(NotificationManager.IMPORTANCE_MIN, importance) + && isLockScreenSecure()); } } diff --git a/src/com/android/settings/notification/ImportanceSeekBarPreference.java b/src/com/android/settings/notification/ImportanceSeekBarPreference.java deleted file mode 100644 index 568dc1cdd1..0000000000 --- a/src/com/android/settings/notification/ImportanceSeekBarPreference.java +++ /dev/null @@ -1,204 +0,0 @@ -/** - * Copyright (C) 2015 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.notification; - -import com.android.settings.R; -import com.android.settings.SeekBarPreference; - -import android.app.NotificationManager; -import android.content.Context; -import android.content.res.ColorStateList; -import android.content.res.TypedArray; -import android.graphics.drawable.Drawable; -import android.os.Handler; -import android.service.notification.NotificationListenerService; -import android.support.v7.preference.PreferenceViewHolder; -import android.util.AttributeSet; -import android.view.View; -import android.widget.ImageView; -import android.widget.SeekBar; -import android.widget.TextView; -import com.android.settings.Utils; - -/** - * A slider preference that controls notification importance. - **/ -public class ImportanceSeekBarPreference extends SeekBarPreference implements - SeekBar.OnSeekBarChangeListener { - private static final String TAG = "ImportanceSeekBarPref"; - - private Callback mCallback; - private int mMinProgress; - private TextView mSummaryTextView; - private String mSummary; - private SeekBar mSeekBar; - private ColorStateList mActiveSliderTint; - private ColorStateList mInactiveSliderTint; - private float mActiveSliderAlpha = 1.0f; - private float mInactiveSliderAlpha; - private boolean mAutoOn; - private Handler mHandler; - - public ImportanceSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr, - int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - setLayoutResource(R.layout.preference_importance_slider); - mActiveSliderTint = ColorStateList.valueOf(Utils.getColorAccent(context)); - mInactiveSliderTint = ColorStateList.valueOf( - context.getColor(R.color.importance_disabled_slider_color)); - mHandler = new Handler(); - final TypedArray ta = - context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.Theme, 0, 0); - mInactiveSliderAlpha = - ta.getFloat(com.android.internal.R.styleable.Theme_disabledAlpha, 0.5f); - ta.recycle(); - } - - public ImportanceSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) { - this(context, attrs, defStyleAttr, 0); - } - - public ImportanceSeekBarPreference(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public ImportanceSeekBarPreference(Context context) { - this(context, null); - } - - public void setCallback(Callback callback) { - mCallback = callback; - } - - public void setMinimumProgress(int minProgress) { - mMinProgress = minProgress; - notifyChanged(); - } - - @Override - public void setProgress(int progress) { - mSummary = getProgressSummary(progress); - super.setProgress(progress); - } - - public void setAutoOn(boolean autoOn) { - mAutoOn = autoOn; - notifyChanged(); - } - - @Override - public void onBindViewHolder(PreferenceViewHolder view) { - super.onBindViewHolder(view); - mSummaryTextView = (TextView) view.findViewById(com.android.internal.R.id.summary); - mSeekBar = (SeekBar) view.findViewById( - com.android.internal.R.id.seekbar); - - final ImageView autoButton = (ImageView) view.findViewById(R.id.auto_importance); - applyAutoUi(autoButton); - autoButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - applyAuto(autoButton); - } - }); - } - - private void applyAuto(ImageView autoButton) { - mAutoOn = !mAutoOn; - if (!mAutoOn) { - setProgress(NotificationManager.IMPORTANCE_DEFAULT); - mCallback.onImportanceChanged(NotificationManager.IMPORTANCE_DEFAULT, true); - } else { - mCallback.onImportanceChanged(NotificationManager.IMPORTANCE_UNSPECIFIED, true); - } - applyAutoUi(autoButton); - } - - private void applyAutoUi(ImageView autoButton) { - mSeekBar.setEnabled(!mAutoOn); - - final float alpha = mAutoOn ? mInactiveSliderAlpha : mActiveSliderAlpha; - final ColorStateList starTint = mAutoOn ? mActiveSliderTint : mInactiveSliderTint; - Drawable icon = autoButton.getDrawable().mutate(); - icon.setTintList(starTint); - autoButton.setImageDrawable(icon); - mSeekBar.setAlpha(alpha); - - if (mAutoOn) { - setProgress(NotificationManager.IMPORTANCE_DEFAULT); - mSummary = getProgressSummary(NotificationManager.IMPORTANCE_UNSPECIFIED); - } - mSummaryTextView.setText(mSummary); - } - - @Override - public CharSequence getSummary() { - return mSummary; - } - - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { - super.onProgressChanged(seekBar, progress, fromTouch); - if (progress < mMinProgress) { - seekBar.setProgress(mMinProgress); - progress = mMinProgress; - } - if (mSummaryTextView != null) { - mSummary = getProgressSummary(progress); - mSummaryTextView.setText(mSummary); - } - mCallback.onImportanceChanged(progress, fromTouch); - } - - private String getProgressSummary(int progress) { - switch (progress) { - case NotificationManager.IMPORTANCE_NONE: - return getContext().getString(R.string.notification_importance_blocked); - case NotificationManager.IMPORTANCE_MIN: - return getContext().getString(R.string.notification_importance_min); - case NotificationManager.IMPORTANCE_LOW: - return getContext().getString(R.string.notification_importance_low); - case NotificationManager.IMPORTANCE_DEFAULT: - return getContext().getString(R.string.notification_importance_default); - case NotificationManager.IMPORTANCE_HIGH: - case NotificationManager.IMPORTANCE_MAX: - return getContext().getString(R.string.notification_importance_high); - default: - return getContext().getString(R.string.notification_importance_unspecified); - } - } - - @Override - protected void notifyChanged() { - mHandler.post(mNotifyChanged); - } - - private void postNotifyChanged() { - super.notifyChanged(); - } - - private final Runnable mNotifyChanged = new Runnable() { - @Override - public void run() { - postNotifyChanged(); - } - }; - - public interface Callback { - void onImportanceChanged(int progress, boolean fromTouch); - } -} diff --git a/src/com/android/settings/notification/NotificationBackend.java b/src/com/android/settings/notification/NotificationBackend.java index 5d69203def..4013971f28 100644 --- a/src/com/android/settings/notification/NotificationBackend.java +++ b/src/com/android/settings/notification/NotificationBackend.java @@ -16,7 +16,6 @@ package com.android.settings.notification; import android.app.INotificationManager; -import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Context; @@ -27,11 +26,8 @@ import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.graphics.drawable.Drawable; import android.os.ServiceManager; -import android.os.UserHandle; -import android.service.notification.NotificationListenerService; import android.util.Log; -import com.android.internal.widget.LockPatternUtils; import com.android.settingslib.Utils; public class NotificationBackend { @@ -52,11 +48,6 @@ public class NotificationBackend { } row.icon = app.loadIcon(pm); row.banned = getNotificationsBanned(row.pkg, row.uid); - row.appImportance = getImportance(row.pkg, row.uid); - row.appBypassDnd = getBypassZenMode(row.pkg, row.uid); - row.appVisOverride = getVisibilityOverride(row.pkg, row.uid); - row.lockScreenSecure = new LockPatternUtils(context).isSecure( - UserHandle.myUserId()); return row; } @@ -86,19 +77,9 @@ public class NotificationBackend { } } - public boolean getBypassZenMode(String pkg, int uid) { + public boolean setNotificationsEnabledForPackage(String pkg, int uid, boolean enabled) { try { - return sINM.getPriority(pkg, uid) == Notification.PRIORITY_MAX; - } catch (Exception e) { - Log.w(TAG, "Error calling NoMan", e); - return false; - } - } - - public boolean setBypassZenMode(String pkg, int uid, boolean bypassZen) { - try { - sINM.setPriority(pkg, uid, - bypassZen ? Notification.PRIORITY_MAX : Notification.PRIORITY_DEFAULT); + sINM.setNotificationsEnabledForPackage(pkg, uid, enabled); return true; } catch (Exception e) { Log.w(TAG, "Error calling NoMan", e); @@ -106,44 +87,6 @@ public class NotificationBackend { } } - public int getVisibilityOverride(String pkg, int uid) { - try { - return sINM.getVisibilityOverride(pkg, uid); - } catch (Exception e) { - Log.w(TAG, "Error calling NoMan", e); - return NotificationListenerService.Ranking.VISIBILITY_NO_OVERRIDE; - } - } - - public boolean setVisibilityOverride(String pkg, int uid, int override) { - try { - sINM.setVisibilityOverride(pkg, uid, override); - return true; - } catch (Exception e) { - Log.w(TAG, "Error calling NoMan", e); - return false; - } - } - - public boolean setImportance(String pkg, int uid, int importance) { - try { - sINM.setImportance(pkg, uid, importance); - return true; - } catch (Exception e) { - Log.w(TAG, "Error calling NoMan", e); - return false; - } - } - - public int getImportance(String pkg, int uid) { - try { - return sINM.getImportance(pkg, uid); - } catch (Exception e) { - Log.w(TAG, "Error calling NoMan", e); - return NotificationManager.IMPORTANCE_UNSPECIFIED; - } - } - public NotificationChannel getChannel(String pkg, int uid, String channelId) { if (channelId == null) { return null; @@ -186,10 +129,6 @@ public class NotificationBackend { public boolean banned; public boolean first; // first app in section public boolean systemApp; - public int appImportance; - public boolean appBypassDnd; - public int appVisOverride; - public boolean lockScreenSecure; } public static class ChannelRow extends AppRow { diff --git a/src/com/android/settings/notification/NotificationSettingsBase.java b/src/com/android/settings/notification/NotificationSettingsBase.java index 5d6f5982a7..046c5e6d49 100644 --- a/src/com/android/settings/notification/NotificationSettingsBase.java +++ b/src/com/android/settings/notification/NotificationSettingsBase.java @@ -51,15 +51,10 @@ import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; abstract public class NotificationSettingsBase extends SettingsPreferenceFragment { private static final String TAG = "NotifiSettingsBase"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); - private static final String TUNER_SETTING = "show_importance_slider"; protected static final String ARG_CHANNEL = "channel"; - protected static final String KEY_BYPASS_DND = "bypass_dnd"; - protected static final String KEY_VISIBILITY_OVERRIDE = "visibility_override"; - protected static final String KEY_IMPORTANCE = "importance"; protected static final String KEY_BLOCK = "block"; - protected static final String KEY_SILENT = "silent"; protected PackageManager mPm; protected UserManager mUm; @@ -70,13 +65,10 @@ abstract public class NotificationSettingsBase extends SettingsPreferenceFragmen protected int mUserId; protected String mPkg; protected PackageInfo mPkgInfo; - protected ImportanceSeekBarPreference mImportance; - protected RestrictedSwitchPreference mPriority; - protected RestrictedDropDownPreference mVisibilityOverride; protected RestrictedSwitchPreference mBlock; - protected RestrictedSwitchPreference mSilent; + protected RestrictedSwitchPreference mShow; + protected RestrictedSwitchPreference mBadge; protected EnforcedAdmin mSuspendedAppsAdmin; - protected boolean mShowSlider = false; protected boolean mDndVisualEffectsSuppressed; protected NotificationChannel mChannel; @@ -138,7 +130,6 @@ abstract public class NotificationSettingsBase extends SettingsPreferenceFragmen mSuspendedAppsAdmin = RestrictedLockUtils.checkIfApplicationIsSuspended( mContext, mPkg, mUserId); - mShowSlider = Settings.Secure.getInt(getContentResolver(), TUNER_SETTING, 0) == 1; NotificationManager.Policy policy = NotificationManager.from(mContext).getNotificationPolicy(); mDndVisualEffectsSuppressed = policy == null ? false : policy.suppressedVisualEffects != 0; @@ -154,237 +145,7 @@ abstract public class NotificationSettingsBase extends SettingsPreferenceFragmen } mSuspendedAppsAdmin = RestrictedLockUtils.checkIfApplicationIsSuspended( mContext, mPkg, mUserId); - if (mImportance != null) { - mImportance.setDisabledByAdmin(mSuspendedAppsAdmin); - } - if (mPriority != null) { - mPriority.setDisabledByAdmin(mSuspendedAppsAdmin); - } - if (mBlock != null) { - mBlock.setDisabledByAdmin(mSuspendedAppsAdmin); - } - if (mSilent != null) { - mSilent.setDisabledByAdmin(mSuspendedAppsAdmin); - } - if (mVisibilityOverride != null) { - mVisibilityOverride.setDisabledByAdmin(mSuspendedAppsAdmin); - } - } - - protected void setupImportancePrefs(boolean notBlockable, int importance, boolean banned, - int maxImportance) { - if (mShowSlider) { - setVisible(mBlock, false); - setVisible(mSilent, false); - mImportance.setDisabledByAdmin(mSuspendedAppsAdmin); - mImportance.setMinimumProgress( - notBlockable ? NotificationManager.IMPORTANCE_MIN - : NotificationManager.IMPORTANCE_NONE); - mImportance.setMax(maxImportance); - mImportance.setProgress(Math.min(importance, maxImportance)); - mImportance.setAutoOn(importance == NotificationManager.IMPORTANCE_UNSPECIFIED); - mImportance.setCallback(new ImportanceSeekBarPreference.Callback() { - @Override - public void onImportanceChanged(int progress, boolean fromUser) { - if (fromUser) { - if (mChannel != null) { - mChannel.setImportance(progress); - mChannel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE); - mBackend.updateChannel(mPkg, mUid, mChannel); - } else { - mBackend.setImportance(mPkg, mUid, progress); - } - } - updateDependents(progress); - } - }); - } else { - setVisible(mImportance, false); - if (notBlockable) { - setVisible(mBlock, false); - } else { - mBlock.setChecked(banned); - mBlock.setOnPreferenceChangeListener( - new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, - Object newValue) { - final boolean blocked = (Boolean) newValue; - final int importance = blocked - ? NotificationManager.IMPORTANCE_NONE - : NotificationManager.IMPORTANCE_UNSPECIFIED; - if (mChannel != null) { - mChannel.setImportance(importance); - mChannel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE); - mBackend.updateChannel(mPkg, mUid, mChannel); - } else { - mBackend.setImportance(mPkgInfo.packageName, mUid, - importance); - } - updateDependents(importance); - return true; - } - }); - } - // app silenced; cannot un-silence a channel - if (maxImportance == NotificationManager.IMPORTANCE_LOW) { - setVisible(mSilent, false); - updateDependents(banned ? NotificationManager.IMPORTANCE_NONE - : NotificationManager.IMPORTANCE_LOW); - } else { - mSilent.setChecked(importance == NotificationManager.IMPORTANCE_LOW); - mSilent.setOnPreferenceChangeListener( - new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, - Object newValue) { - final boolean silenced = (Boolean) newValue; - final int importance = silenced - ? NotificationManager.IMPORTANCE_LOW - : NotificationManager.IMPORTANCE_UNSPECIFIED; - if (mChannel != null) { - mChannel.setImportance(importance); - mChannel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE); - mBackend.updateChannel(mPkg, mUid, mChannel); - } else { - mBackend.setImportance(mPkgInfo.packageName, mUid, - importance); - } - updateDependents(importance); - return true; - } - }); - updateDependents(banned ? NotificationManager.IMPORTANCE_NONE : importance); - } - } - } - - protected void setupPriorityPref(boolean priority) { - mPriority.setDisabledByAdmin(mSuspendedAppsAdmin); - mPriority.setChecked(priority); - mPriority.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - final boolean bypassZenMode = (Boolean) newValue; - if (mChannel != null) { - mChannel.setBypassDnd(bypassZenMode); - mChannel.lockFields(NotificationChannel.USER_LOCKED_PRIORITY); - mBackend.updateChannel(mPkg, mUid, mChannel); - return true; - } else { - return mBackend.setBypassZenMode(mPkgInfo.packageName, mUid, bypassZenMode); - } - } - }); - } - - protected void setupVisOverridePref(int sensitive) { - ArrayList entries = new ArrayList<>(); - ArrayList values = new ArrayList<>(); - - mVisibilityOverride.clearRestrictedItems(); - if (getLockscreenNotificationsEnabled() && getLockscreenAllowPrivateNotifications()) { - final String summaryShowEntry = - getString(R.string.lock_screen_notifications_summary_show); - final String summaryShowEntryValue = - Integer.toString(NotificationManager.VISIBILITY_NO_OVERRIDE); - entries.add(summaryShowEntry); - values.add(summaryShowEntryValue); - setRestrictedIfNotificationFeaturesDisabled(summaryShowEntry, summaryShowEntryValue, - DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS - | DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS); - } - - final String summaryHideEntry = getString(R.string.lock_screen_notifications_summary_hide); - final String summaryHideEntryValue = Integer.toString(Notification.VISIBILITY_PRIVATE); - entries.add(summaryHideEntry); - values.add(summaryHideEntryValue); - setRestrictedIfNotificationFeaturesDisabled(summaryHideEntry, summaryHideEntryValue, - DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS); - entries.add(getString(R.string.lock_screen_notifications_summary_disable)); - values.add(Integer.toString(Notification.VISIBILITY_SECRET)); - mVisibilityOverride.setEntries(entries.toArray(new CharSequence[entries.size()])); - mVisibilityOverride.setEntryValues(values.toArray(new CharSequence[values.size()])); - - if (sensitive == Ranking.VISIBILITY_NO_OVERRIDE) { - mVisibilityOverride.setValue(Integer.toString(getGlobalVisibility())); - } else { - mVisibilityOverride.setValue(Integer.toString(sensitive)); - } - mVisibilityOverride.setSummary("%s"); - - mVisibilityOverride.setOnPreferenceChangeListener( - new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - int sensitive = Integer.parseInt((String) newValue); - if (sensitive == getGlobalVisibility()) { - sensitive = Ranking.VISIBILITY_NO_OVERRIDE; - } - if (mChannel != null) { - mChannel.setLockscreenVisibility(sensitive); - mChannel.lockFields(NotificationChannel.USER_LOCKED_VISIBILITY); - mBackend.updateChannel(mPkg, mUid, mChannel); - } else { - mBackend.setVisibilityOverride(mPkgInfo.packageName, mUid, sensitive); - } - return true; - } - }); - } - - private void setRestrictedIfNotificationFeaturesDisabled(CharSequence entry, - CharSequence entryValue, int keyguardNotificationFeatures) { - EnforcedAdmin admin = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled( - mContext, keyguardNotificationFeatures, mUserId); - if (admin != null) { - RestrictedItem item = new RestrictedItem(entry, entryValue, admin); - mVisibilityOverride.addRestrictedItem(item); - } - } - - private int getGlobalVisibility() { - int globalVis = Ranking.VISIBILITY_NO_OVERRIDE; - if (!getLockscreenNotificationsEnabled()) { - globalVis = Notification.VISIBILITY_SECRET; - } else if (!getLockscreenAllowPrivateNotifications()) { - globalVis = Notification.VISIBILITY_PRIVATE; - } - return globalVis; - } - - private boolean getLockscreenNotificationsEnabled() { - return Settings.Secure.getInt(getContentResolver(), - Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0) != 0; - } - - private boolean getLockscreenAllowPrivateNotifications() { - return Settings.Secure.getInt(getContentResolver(), - Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0) != 0; - } - - private boolean isLockScreenSecure() { - LockPatternUtils utils = new LockPatternUtils(getActivity()); - boolean lockscreenSecure = utils.isSecure(UserHandle.myUserId()); - UserInfo parentUser = mUm.getProfileParent(UserHandle.myUserId()); - if (parentUser != null){ - lockscreenSecure |= utils.isSecure(parentUser.id); - } - - return lockscreenSecure; - } - - protected void updateDependents(int importance) { - if (getPreferenceScreen().findPreference(mBlock.getKey()) != null) { - setVisible(mSilent, checkCanBeVisible(NotificationManager.IMPORTANCE_MIN, importance)); - mSilent.setChecked(importance == NotificationManager.IMPORTANCE_LOW); - } - setVisible(mPriority, checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT, importance) - || (checkCanBeVisible(NotificationManager.IMPORTANCE_LOW, importance) - && mDndVisualEffectsSuppressed)); - setVisible(mVisibilityOverride, - checkCanBeVisible(NotificationManager.IMPORTANCE_MIN, importance) - && isLockScreenSecure()); + mBlock.setDisabledByAdmin(mSuspendedAppsAdmin); } protected void setVisible(Preference p, boolean visible) { @@ -397,13 +158,6 @@ abstract public class NotificationSettingsBase extends SettingsPreferenceFragmen } } - protected boolean checkCanBeVisible(int minImportanceVisible, int importance) { - if (importance == NotificationManager.IMPORTANCE_UNSPECIFIED) { - return true; - } - return importance >= minImportanceVisible; - } - protected void toastAndFinish() { Toast.makeText(mContext, R.string.app_not_found_dlg_text, Toast.LENGTH_SHORT).show(); getActivity().finish();