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;