diff --git a/res/values/strings.xml b/res/values/strings.xml index 5cd42c35abc..a809c78ab41 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6926,7 +6926,7 @@ Notification category group - Importance + Behavior Allow sound @@ -6991,6 +6991,9 @@ Urgent importance + + Show notifications + Notification assistant @@ -7087,13 +7090,13 @@ Loading apps... - Android is blocking this app\'s notifications from appearing on this device + At your request, Android is blocking this app\'s notifications from appearing on this device - Android is blocking this category of notifications from appearing on this device + At your request, Android is blocking this category of notifications from appearing on this device - Android is blocking this group of notifications from appearing on this device + At your request, Android is blocking this group of notifications from appearing on this device Categories diff --git a/res/xml/channel_notification_settings.xml b/res/xml/channel_notification_settings.xml index fb2705ad333..c799c8b3948 100644 --- a/res/xml/channel_notification_settings.xml +++ b/res/xml/channel_notification_settings.xml @@ -15,7 +15,8 @@ --> + xmlns:settings="http://schemas.android.com/apk/res-auto" + settings:initialExpandedChildrenCount="3"> + android:title="@string/notification_importance_high" /> + android:title="@string/notification_importance_default" /> + android:title="@string/notification_importance_low" /> + android:title="@string/notification_importance_min" /> diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java index af168d60c80..ef0f40bb571 100644 --- a/src/com/android/settings/notification/AppNotificationSettings.java +++ b/src/com/android/settings/notification/AppNotificationSettings.java @@ -135,7 +135,6 @@ public class AppNotificationSettings extends NotificationSettingsBase { return new ArrayList<>(mControllers); } - private void populateList() { if (!mDynamicPreferences.isEmpty()) { // If there's anything in mChannelGroups, we've called populateChannelList twice. @@ -164,61 +163,41 @@ public class AppNotificationSettings extends NotificationSettingsBase { } private void populateGroupList() { - PreferenceCategory groupCategory = new PreferenceCategory(getPrefContext()); - groupCategory.setTitle(R.string.notification_channels); - groupCategory.setKey(KEY_GENERAL_CATEGORY); - groupCategory.setOrderingAsAdded(true); - getPreferenceScreen().addPreference(groupCategory); - mDynamicPreferences.add(groupCategory); for (NotificationChannelGroup group : mChannelGroupList) { - final List channels = group.getChannels(); - int N = channels.size(); - // app defined groups with one channel and channels with no group display the channel - // name and no summary and link directly to the channel page unless the group is blocked - if ((group.getId() == null || N < 2) && !group.isBlocked()) { - Collections.sort(channels, mChannelComparator); - for (int i = 0; i < N; i++) { - final NotificationChannel channel = channels.get(i); - populateSingleChannelPrefs(groupCategory, channel, ""); - } + PreferenceCategory groupCategory = new PreferenceCategory(getPrefContext()); + groupCategory.setOrderingAsAdded(true); + getPreferenceScreen().addPreference(groupCategory); + mDynamicPreferences.add(groupCategory); + if (group.getId() == null) { + groupCategory.setTitle(mChannelGroupList.size() > 1 + ? R.string.notification_channels_other + : R.string.notification_channels); + groupCategory.setKey(KEY_GENERAL_CATEGORY); } else { - populateGroupPreference(groupCategory, group, N); + groupCategory.setTitle(group.getName()); + groupCategory.setKey(group.getId()); + Bundle groupArgs = new Bundle(); + groupArgs.putInt(AppInfoBase.ARG_PACKAGE_UID, mUid); + groupArgs.putString(AppInfoBase.ARG_PACKAGE_NAME, mPkg); + groupArgs.putString(Settings.EXTRA_CHANNEL_GROUP_ID, group.getId()); + Intent channelIntent = Utils.onBuildStartFragmentIntent(getActivity(), + ChannelGroupNotificationSettings.class.getName(), + groupArgs, null, R.string.notification_group_title, + null, false, getMetricsCategory()); + groupCategory.setIntent(channelIntent); + populateGroupToggle(groupCategory, group); + } + + final List channels = group.getChannels(); + Collections.sort(channels, mChannelComparator); + int N = channels.size(); + for (int i = 0; i < N; i++) { + final NotificationChannel channel = channels.get(i); + populateSingleChannelPrefs(groupCategory, channel, group.isBlocked()); } } } - void populateGroupPreference(PreferenceGroup parent, - final NotificationChannelGroup group, int channelCount) { - MasterSwitchPreference groupPref = new MasterSwitchPreference( - getPrefContext()); - groupPref.setSwitchEnabled(mSuspendedAppsAdmin == null - && isChannelGroupBlockable(group)); - groupPref.setKey(group.getId()); - groupPref.setTitle(group.getName()); - groupPref.setChecked(!group.isBlocked()); - groupPref.setSummary(getResources().getQuantityString( - R.plurals.notification_group_summary, channelCount, channelCount)); - Bundle groupArgs = new Bundle(); - groupArgs.putInt(AppInfoBase.ARG_PACKAGE_UID, mUid); - groupArgs.putString(AppInfoBase.ARG_PACKAGE_NAME, mPkg); - groupArgs.putString(Settings.EXTRA_CHANNEL_GROUP_ID, group.getId()); - Intent groupIntent = Utils.onBuildStartFragmentIntent(getActivity(), - ChannelGroupNotificationSettings.class.getName(), - groupArgs, null, R.string.notification_group_title, null, false, - getMetricsCategory()); - groupPref.setIntent(groupIntent); - - groupPref.setOnPreferenceChangeListener( - (preference, o) -> { - boolean value = (Boolean) o; - group.setBlocked(!value); - mBackend.updateChannelGroup(mPkg, mUid, group); - - return true; - }); - parent.addPreference(groupPref); - } - private Comparator mChannelGroupComparator = new Comparator() { diff --git a/src/com/android/settings/notification/BlockPreferenceController.java b/src/com/android/settings/notification/BlockPreferenceController.java index 5c366eafc96..6b65b0fdff5 100644 --- a/src/com/android/settings/notification/BlockPreferenceController.java +++ b/src/com/android/settings/notification/BlockPreferenceController.java @@ -67,6 +67,8 @@ public class BlockPreferenceController extends NotificationPreferenceController LayoutPreference pref = (LayoutPreference) preference; SwitchBar bar = pref.findViewById(R.id.switch_bar); if (bar != null) { + bar.setSwitchBarText(R.string.notification_switch_label, + R.string.notification_switch_label); bar.show(); try { bar.addOnSwitchChangeListener(this); diff --git a/src/com/android/settings/notification/ChannelGroupNotificationSettings.java b/src/com/android/settings/notification/ChannelGroupNotificationSettings.java index 68dd91bfdfc..707a559234a 100644 --- a/src/com/android/settings/notification/ChannelGroupNotificationSettings.java +++ b/src/com/android/settings/notification/ChannelGroupNotificationSettings.java @@ -19,7 +19,6 @@ package com.android.settings.notification; import android.app.NotificationChannel; import android.content.Context; import android.support.v7.preference.Preference; -import android.text.TextUtils; import android.util.Log; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; @@ -98,9 +97,7 @@ public class ChannelGroupNotificationSettings extends NotificationSettingsBase { Collections.sort(channels, mChannelComparator); for (NotificationChannel channel : channels) { mDynamicPreferences.add(populateSingleChannelPrefs( - getPreferenceScreen(), channel, - ImportancePreferenceController.getImportanceSummary( - getPrefContext(), channel))); + getPreferenceScreen(), channel, mChannelGroup.isBlocked())); } } diff --git a/src/com/android/settings/notification/ImportancePreferenceController.java b/src/com/android/settings/notification/ImportancePreferenceController.java index ba47c54a4e2..977cd9a1fb2 100644 --- a/src/com/android/settings/notification/ImportancePreferenceController.java +++ b/src/com/android/settings/notification/ImportancePreferenceController.java @@ -73,7 +73,8 @@ public class ImportancePreferenceController extends NotificationPreferenceContro if (preference.isEnabled()) { Intent channelIntent = Utils.onBuildStartFragmentIntent(mContext, ChannelImportanceSettings.class.getName(), - channelArgs, null, R.string.notification_importance_title, null, + channelArgs, null, + R.string.notification_importance_title, null, false, getMetricsCategory()); preference.setIntent(channelIntent); preference.setSummary(getImportanceSummary(mContext, mChannel)); @@ -82,23 +83,19 @@ public class ImportancePreferenceController extends NotificationPreferenceContro } protected static String getImportanceSummary(Context context, NotificationChannel channel) { - String title; - String summary = null; + String summary = ""; int importance = channel.getImportance(); switch (importance) { case IMPORTANCE_UNSPECIFIED: - title = context.getString(R.string.notification_importance_unspecified); + summary = context.getString(R.string.notification_importance_unspecified); break; case NotificationManager.IMPORTANCE_MIN: - title = context.getString(R.string.notification_importance_min_title); summary = context.getString(R.string.notification_importance_min); break; case NotificationManager.IMPORTANCE_LOW: - title = context.getString(R.string.notification_importance_low_title); summary = context.getString(R.string.notification_importance_low); break; case NotificationManager.IMPORTANCE_DEFAULT: - title = context.getString(R.string.notification_importance_default_title); if (SoundPreferenceController.hasValidSound(channel)) { summary = context.getString(R.string.notification_importance_default); } else { @@ -107,7 +104,6 @@ public class ImportancePreferenceController extends NotificationPreferenceContro break; case NotificationManager.IMPORTANCE_HIGH: case NotificationManager.IMPORTANCE_MAX: - title = context.getString(R.string.notification_importance_high_title); if (SoundPreferenceController.hasValidSound(channel)) { summary = context.getString(R.string.notification_importance_high); } else { @@ -118,10 +114,6 @@ public class ImportancePreferenceController extends NotificationPreferenceContro return ""; } - if (summary != null) { - return context.getString(R.string.notification_importance_divider, title, summary); - } else { - return title; - } + return summary; } } diff --git a/src/com/android/settings/notification/NotificationSettingsBase.java b/src/com/android/settings/notification/NotificationSettingsBase.java index 9afb61845ee..2a7e7d55848 100644 --- a/src/com/android/settings/notification/NotificationSettingsBase.java +++ b/src/com/android/settings/notification/NotificationSettingsBase.java @@ -61,6 +61,7 @@ import android.os.UserManager; import android.provider.SearchIndexableResource; import android.provider.Settings; import android.service.notification.NotificationListenerService; +import android.support.v14.preference.SwitchPreference; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceGroup; import android.support.v7.preference.PreferenceScreen; @@ -214,7 +215,6 @@ abstract public class NotificationSettingsBase extends DashboardFragment { } for (ResolveInfo ri : resolveInfos) { final ActivityInfo activityInfo = ri.activityInfo; - final ApplicationInfo appInfo = activityInfo.applicationInfo; if (mAppRow.settingsIntent != null) { if (DEBUG) { Log.d(TAG, "Ignoring duplicate notification preference activity (" @@ -225,7 +225,8 @@ abstract public class NotificationSettingsBase extends DashboardFragment { } mAppRow.settingsIntent = intent .setPackage(null) - .setClassName(activityInfo.packageName, activityInfo.name); + .setClassName(activityInfo.packageName, activityInfo.name) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (mChannel != null) { mAppRow.settingsIntent.putExtra(Notification.EXTRA_CHANNEL_ID, mChannel.getId()); } @@ -257,17 +258,41 @@ abstract public class NotificationSettingsBase extends DashboardFragment { return null; } + protected void populateGroupToggle(final PreferenceGroup parent, + NotificationChannelGroup group) { + RestrictedSwitchPreference preference = new RestrictedSwitchPreference(getPrefContext()); + preference.setTitle(R.string.notification_switch_label); + preference.setEnabled(mSuspendedAppsAdmin == null + && isChannelGroupBlockable(group)); + preference.setChecked(!group.isBlocked()); + preference.setOnPreferenceClickListener(preference1 -> { + final boolean allowGroup = ((SwitchPreference) preference1).isChecked(); + group.setBlocked(!allowGroup); + mBackend.updateChannelGroup(mAppRow.pkg, mAppRow.uid, group); + + for (int i = 0; i < parent.getPreferenceCount(); i++) { + Preference pref = parent.getPreference(i); + if (pref instanceof MasterSwitchPreference) { + ((MasterSwitchPreference) pref).setSwitchEnabled(allowGroup); + } + } + return true; + }); + + parent.addPreference(preference); + } + protected Preference populateSingleChannelPrefs(PreferenceGroup parent, - final NotificationChannel channel, String summary) { + final NotificationChannel channel, final boolean groupBlocked) { MasterSwitchPreference channelPref = new MasterSwitchPreference( getPrefContext()); channelPref.setSwitchEnabled(mSuspendedAppsAdmin == null && isChannelBlockable(channel) - && isChannelConfigurable(channel)); + && isChannelConfigurable(channel) + && !groupBlocked); channelPref.setKey(channel.getId()); channelPref.setTitle(channel.getName()); channelPref.setChecked(channel.getImportance() != IMPORTANCE_NONE); - channelPref.setSummary(summary); Bundle channelArgs = new Bundle(); channelArgs.putInt(AppInfoBase.ARG_PACKAGE_UID, mUid); channelArgs.putString(AppInfoBase.ARG_PACKAGE_NAME, mPkg); @@ -288,7 +313,6 @@ abstract public class NotificationSettingsBase extends DashboardFragment { channel.setImportance(importance); channel.lockFields( NotificationChannel.USER_LOCKED_IMPORTANCE); - channelPref.setSummary(summary); mBackend.updateChannel(mPkg, mUid, channel); return true;