Notification channel settings updates
- Show a deleted count instead of individual deleted channels
- Make the link to app settings more prominent
- Reload settings onresume
Change-Id: I4f493181194943310ba536eb2bca270cec7cafce
Fixes: 36119790
Fixes: 36191444
Test: manual
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4ab6585..b7a8726 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6473,8 +6473,14 @@
<!-- [CHAR LIMIT=NONE] App notification settings: no channels -->
<string name="no_channels">This app has not posted any notifications</string>
- <!-- [CHAR LIMIT=60] App notification settings: Text to display for deleted channels -->
- <string name="deleted_channel_name"><xliff:g id="channel_name" example="Promotions">%1$s</xliff:g> (deleted)</string>
+ <!-- [CHAR LIMIT=NONE] App notification settings: link to app notification settings-->
+ <string name="app_settings_link">Additional settings in the app</string>
+
+ <!-- [CHAR LIMIT=NONE] Footer listing a count of deleted channels. -->
+ <plurals name="deleted_channels">
+ <item quantity="one">%d category deleted</item>
+ <item quantity="other">%d categories deleted</item>
+ </plurals>
<!-- [CHAR LIMIT=NONE] App notification settings: Block option title -->
<string name="app_notification_block_title">Block all</string>
diff --git a/res/xml/channel_notification_settings.xml b/res/xml/channel_notification_settings.xml
index 4af9fe8..fde1bfa 100644
--- a/res/xml/channel_notification_settings.xml
+++ b/res/xml/channel_notification_settings.xml
@@ -23,29 +23,25 @@
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" />
<!-- Importance -->
<com.android.settings.notification.RestrictedDropDownPreference
android:key="importance"
- android:title="@string/notification_importance_title"
- android:order="2"/>
+ android:title="@string/notification_importance_title" />
<!-- Default ringtone -->
<com.android.settings.notification.DefaultNotificationTonePreference
android:key="ringtone"
android:title="@string/notification_ringtone_title"
android:dialogTitle="@string/notification_ringtone_title"
- android:order="3"
android:ringtoneType="notification" />
<!-- Vibration -->
<com.android.settingslib.RestrictedSwitchPreference
android:key="vibrate"
android:title="@string/notification_vibrate_title"
- android:order="4"
settings:useAdditionalSummary="true" />
<!-- Show badge -->
@@ -53,7 +49,6 @@
android:key="badge"
android:title="@string/notification_badge_title"
android:summary="@string/notification_badge_summary"
- android:order="5"
settings:useAdditionalSummary="true"
settings:restrictedSwitchSummary="@string/enabled_by_admin" />
@@ -61,21 +56,18 @@
<com.android.settingslib.RestrictedSwitchPreference
android:key="lights"
android:title="@string/notification_show_lights_title"
- android:order="6"
settings:useAdditionalSummary="true" />
<!-- Visibility Override -->
<com.android.settings.notification.RestrictedDropDownPreference
android:key="visibility_override"
- android:title="@string/app_notification_visibility_override_title"
- android:order="7" />
+ android:title="@string/app_notification_visibility_override_title" />
<!-- Bypass DND -->
<com.android.settingslib.RestrictedSwitchPreference
android:key="bypass_dnd"
android:title="@string/app_notification_override_dnd_title"
android:summary="@string/app_notification_override_dnd_summary"
- android:order="8"
settings:useAdditionalSummary="true" />
</PreferenceScreen>
diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java
index 88d0a47..24405b3 100644
--- a/src/com/android/settings/notification/AppNotificationSettings.java
+++ b/src/com/android/settings/notification/AppNotificationSettings.java
@@ -34,6 +34,7 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.AppHeader;
+import com.android.settings.DimmableIconPreference;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.applications.AppHeaderController;
@@ -66,14 +67,18 @@
}
@Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+ public void onResume() {
+ super.onResume();
+
if (mUid < 0 || TextUtils.isEmpty(mPkg) || mPkgInfo == null) {
Log.w(TAG, "Missing package or uid or packageinfo");
- toastAndFinish();
+ finish();
return;
}
- final Activity activity = getActivity();
+
+ if (getPreferenceScreen() != null) {
+ getPreferenceScreen().removeAll();
+ }
addPreferencesFromResource(R.xml.app_notification_settings);
getPreferenceScreen().setOrderingAsAdded(true);
@@ -81,44 +86,38 @@
mBlock = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_BLOCK);
mBadge = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_BADGE);
- if (mPkgInfo != null) {
- setupBlock();
- setupBadge();
- // load settings intent
- ArrayMap<String, AppRow> rows = new ArrayMap<String, AppRow>();
- rows.put(mAppRow.pkg, mAppRow);
- collectConfigActivities(rows);
- new AsyncTask<Void, Void, Void>() {
- @Override
- protected Void doInBackground(Void... unused) {
- mChannelGroupList = mBackend.getChannelGroups(mPkg, mUid).getList();
- Collections.sort(mChannelGroupList, mChannelGroupComparator);
- return null;
- }
+ setupBlock();
+ setupBadge();
+ // load settings intent
+ ArrayMap<String, AppRow> rows = new ArrayMap<String, AppRow>();
+ rows.put(mAppRow.pkg, mAppRow);
+ collectConfigActivities(rows);
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... unused) {
+ mChannelGroupList = mBackend.getChannelGroups(mPkg, mUid).getList();
+ Collections.sort(mChannelGroupList, mChannelGroupComparator);
+ return null;
+ }
- @Override
- protected void onPostExecute(Void unused) {
- populateChannelList();
- }
- }.execute();
- }
- final Preference pref = FeatureFactory.getFactory(activity)
- .getApplicationFeatureProvider(activity)
- .newAppHeaderController(this /* fragment */, null /* appHeader */)
- .setIcon(mAppRow.icon)
- .setLabel(mAppRow.label)
- .setPackageName(mAppRow.pkg)
- .setUid(mAppRow.uid)
- .setAppNotifPrefIntent(mAppRow.settingsIntent)
- .setButtonActions(AppHeaderController.ActionType.ACTION_APP_INFO,
- AppHeaderController.ActionType.ACTION_NOTIF_PREFERENCE)
- .done(getPrefContext());
+ @Override
+ protected void onPostExecute(Void unused) {
+ populateChannelList();
+ }
+ }.execute();
+
+ final Preference pref = FeatureFactory.getFactory(getActivity())
+ .getApplicationFeatureProvider(getActivity())
+ .newAppHeaderController(this /* fragment */, null /* appHeader */)
+ .setIcon(mAppRow.icon)
+ .setLabel(mAppRow.label)
+ .setPackageName(mAppRow.pkg)
+ .setUid(mAppRow.uid)
+ .setButtonActions(AppHeaderController.ActionType.ACTION_APP_INFO,
+ AppHeaderController.ActionType.ACTION_NOTIF_PREFERENCE)
+ .done(getPrefContext());
getPreferenceScreen().addPreference(pref);
- }
- @Override
- public void onResume() {
- super.onResume();
if (mUid < 0 || TextUtils.isEmpty(mPkg) || mPkgInfo == null) {
Log.w(TAG, "Missing package or uid or packageinfo");
finish();
@@ -164,42 +163,52 @@
channelPref.setTitle(channel.getName());
channelPref.setChecked(channel.getImportance() != IMPORTANCE_NONE);
channelPref.setMultiLine(true);
+ channelPref.setSummary(getImportanceSummary(channel.getImportance()));
+ Bundle channelArgs = new Bundle();
+ channelArgs.putInt(AppInfoBase.ARG_PACKAGE_UID, mUid);
+ channelArgs.putBoolean(AppHeader.EXTRA_HIDE_INFO_BUTTON, true);
+ channelArgs.putString(AppInfoBase.ARG_PACKAGE_NAME, mPkg);
+ channelArgs.putString(Settings.EXTRA_CHANNEL_ID, channel.getId());
+ Intent channelIntent = Utils.onBuildStartFragmentIntent(getActivity(),
+ ChannelNotificationSettings.class.getName(),
+ channelArgs, null, 0, null, false, getMetricsCategory());
+ channelPref.setIntent(channelIntent);
- if (channel.isDeleted()) {
- channelPref.setTitle(getString(R.string.deleted_channel_name,
- channel.getName()));
- channelPref.setEnabled(false);
- } else {
- channelPref.setSummary(getImportanceSummary(channel.getImportance()));
- Bundle channelArgs = new Bundle();
- channelArgs.putInt(AppInfoBase.ARG_PACKAGE_UID, mUid);
- channelArgs.putBoolean(AppHeader.EXTRA_HIDE_INFO_BUTTON, true);
- channelArgs.putString(AppInfoBase.ARG_PACKAGE_NAME, mPkg);
- channelArgs.putString(Settings.EXTRA_CHANNEL_ID, channel.getId());
- Intent channelIntent = Utils.onBuildStartFragmentIntent(getActivity(),
- ChannelNotificationSettings.class.getName(),
- channelArgs, null, 0, null, false, getMetricsCategory());
- channelPref.setIntent(channelIntent);
+ channelPref.setOnPreferenceChangeListener(
+ new Preference.OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference,
+ Object o) {
+ boolean value = (Boolean) o;
+ int importance = value ? IMPORTANCE_LOW : IMPORTANCE_NONE;
+ channel.setImportance(importance);
+ channel.lockFields(
+ NotificationChannel.USER_LOCKED_IMPORTANCE);
+ mBackend.updateChannel(mPkg, mUid, channel);
- channelPref.setOnPreferenceChangeListener(
- new Preference.OnPreferenceChangeListener() {
- @Override
- public boolean onPreferenceChange(Preference preference,
- Object o) {
- boolean value = (Boolean) o;
- int importance = value ? IMPORTANCE_LOW : IMPORTANCE_NONE;
- channel.setImportance(importance);
- channel.lockFields(
- NotificationChannel.USER_LOCKED_IMPORTANCE);
- mBackend.updateChannel(mPkg, mUid, channel);
-
- return true;
- }
- });
- }
+ return true;
+ }
+ });
groupCategory.addPreference(channelPref);
}
}
+
+ if (mAppRow.settingsIntent != null) {
+ Preference intentPref = new Preference(getPrefContext());
+ intentPref.setIntent(mAppRow.settingsIntent);
+ intentPref.setTitle(mContext.getString(R.string.app_settings_link));
+ getPreferenceScreen().addPreference(intentPref);
+ }
+
+ int deletedChannelCount = mBackend.getDeletedChannelCount(mAppRow.pkg, mAppRow.uid);
+ if (deletedChannelCount > 0) {
+ DimmableIconPreference deletedPref = new DimmableIconPreference(getPrefContext());
+ deletedPref.setEnabled(false);
+ deletedPref.setTitle(getResources().getQuantityString(
+ R.plurals.deleted_channels, deletedChannelCount, deletedChannelCount));
+ deletedPref.setIcon(R.drawable.ic_info);
+ getPreferenceScreen().addPreference(deletedPref);
+ }
}
updateDependents(mAppRow.banned);
}
diff --git a/src/com/android/settings/notification/ChannelNotificationSettings.java b/src/com/android/settings/notification/ChannelNotificationSettings.java
index 9ca1d86..7f7aa08 100644
--- a/src/com/android/settings/notification/ChannelNotificationSettings.java
+++ b/src/com/android/settings/notification/ChannelNotificationSettings.java
@@ -73,19 +73,22 @@
}
@Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+ public void onResume() {
+ super.onResume();
if (mUid < 0 || TextUtils.isEmpty(mPkg) || mPkgInfo == null || mChannel == null) {
Log.w(TAG, "Missing package or uid or packageinfo or channel");
- toastAndFinish();
+ finish();
return;
}
- final Activity activity = getActivity();
+
+ if (getPreferenceScreen() != null) {
+ getPreferenceScreen().removeAll();
+ }
addPreferencesFromResource(R.xml.channel_notification_settings);
+ getPreferenceScreen().setOrderingAsAdded(true);
// load settings intent
- ArrayMap<String, NotificationBackend.AppRow>
- rows = new ArrayMap<String, NotificationBackend.AppRow>();
+ ArrayMap<String, NotificationBackend.AppRow> rows = new ArrayMap<String, NotificationBackend.AppRow>();
rows.put(mAppRow.pkg, mAppRow);
collectConfigActivities(rows);
@@ -109,36 +112,25 @@
setupBlockAndImportance();
updateDependents();
}
- final Preference pref = FeatureFactory.getFactory(activity)
- .getApplicationFeatureProvider(activity)
- .newAppHeaderController(this /* fragment */, null /* appHeader */)
- .setIcon(mAppRow.icon)
- .setLabel(mChannel.getName())
- .setSummary(mAppRow.label)
- .setPackageName(mAppRow.pkg)
- .setUid(mAppRow.uid)
- .setAppNotifPrefIntent(mAppRow.settingsIntent)
- .setButtonActions(AppHeaderController.ActionType.ACTION_APP_INFO,
- AppHeaderController.ActionType.ACTION_NOTIF_PREFERENCE)
- .done(getPrefContext());
+ final Preference pref = FeatureFactory.getFactory(getActivity())
+ .getApplicationFeatureProvider(getActivity())
+ .newAppHeaderController(this /* fragment */, null /* appHeader */)
+ .setIcon(mAppRow.icon)
+ .setLabel(mChannel.getName())
+ .setSummary(mAppRow.label)
+ .setPackageName(mAppRow.pkg)
+ .setUid(mAppRow.uid)
+ .setButtonActions(AppHeaderController.ActionType.ACTION_APP_INFO,
+ AppHeaderController.ActionType.ACTION_NOTIF_PREFERENCE)
+ .done(getPrefContext());
getPreferenceScreen().addPreference(pref);
- }
- @Override
- public void onResume() {
- super.onResume();
- if (mUid < 0 || TextUtils.isEmpty(mPkg) || mPkgInfo == null || mChannel == null) {
- Log.w(TAG, "Missing package or uid or packageinfo or channel");
- finish();
- return;
+ if (mAppRow.settingsIntent != null) {
+ Preference intentPref = new Preference(getPrefContext());
+ intentPref.setIntent(mAppRow.settingsIntent);
+ intentPref.setTitle(mContext.getString(R.string.app_settings_link));
+ getPreferenceScreen().addPreference(intentPref);
}
- mLights.setDisabledByAdmin(mSuspendedAppsAdmin);
- mVibrate.setDisabledByAdmin(mSuspendedAppsAdmin);
- if (mImportance.isEnabled()) {
- mImportance.setDisabledByAdmin(mSuspendedAppsAdmin);
- }
- mPriority.setDisabledByAdmin(mSuspendedAppsAdmin);
- mVisibilityOverride.setDisabledByAdmin(mSuspendedAppsAdmin);
}
private void setupLights() {
@@ -321,6 +313,7 @@
return true;
}
});
+ mVisibilityOverride.setDisabledByAdmin(mSuspendedAppsAdmin);
}
private void setRestrictedIfNotificationFeaturesDisabled(CharSequence entry,
diff --git a/src/com/android/settings/notification/NotificationBackend.java b/src/com/android/settings/notification/NotificationBackend.java
index 0881eb7..c1ef018 100644
--- a/src/com/android/settings/notification/NotificationBackend.java
+++ b/src/com/android/settings/notification/NotificationBackend.java
@@ -124,7 +124,7 @@
public ParceledListSlice<NotificationChannelGroup> getChannelGroups(String pkg, int uid) {
try {
- return sINM.getNotificationChannelGroupsForPackage(pkg, uid, true);
+ return sINM.getNotificationChannelGroupsForPackage(pkg, uid, false);
} catch (Exception e) {
Log.w(TAG, "Error calling NoMan", e);
return ParceledListSlice.emptyList();
@@ -139,6 +139,15 @@
}
}
+ public int getDeletedChannelCount(String pkg, int uid) {
+ try {
+ return sINM.getDeletedChannelCount(pkg, uid);
+ } catch (Exception e) {
+ Log.w(TAG, "Error calling NoMan", e);
+ return 0;
+ }
+ }
+
static class Row {
public String section;
}
diff --git a/src/com/android/settings/notification/NotificationSettingsBase.java b/src/com/android/settings/notification/NotificationSettingsBase.java
index c666b72..960c3b8 100644
--- a/src/com/android/settings/notification/NotificationSettingsBase.java
+++ b/src/com/android/settings/notification/NotificationSettingsBase.java
@@ -127,15 +127,6 @@
}
mUserId = UserHandle.getUserId(mUid);
- mAppRow = mBackend.loadAppRow(mContext, mPm, mPkgInfo);
- mChannel = (args != null && args.containsKey(Settings.EXTRA_CHANNEL_ID)) ?
- mBackend.getChannel(mPkg, mUid, args.getString(Settings.EXTRA_CHANNEL_ID)) : null;
-
- mSuspendedAppsAdmin = RestrictedLockUtils.checkIfApplicationIsSuspended(
- mContext, mPkg, mUserId);
- NotificationManager.Policy policy =
- NotificationManager.from(mContext).getNotificationPolicy();
- mDndVisualEffectsSuppressed = policy == null ? false : policy.suppressedVisualEffects != 0;
}
@Override
@@ -146,12 +137,19 @@
finish();
return;
}
+ mAppRow = mBackend.loadAppRow(mContext, mPm, mPkgInfo);
+ Bundle args = getArguments();
+ mChannel = (args != null && args.containsKey(Settings.EXTRA_CHANNEL_ID)) ?
+ mBackend.getChannel(mPkg, mUid, args.getString(Settings.EXTRA_CHANNEL_ID)) : null;
+
mSuspendedAppsAdmin = RestrictedLockUtils.checkIfApplicationIsSuspended(
mContext, mPkg, mUserId);
- if (mBlock.isEnabled()) {
- mBlock.setDisabledByAdmin(mSuspendedAppsAdmin);
- }
- mBadge.setDisabledByAdmin(mSuspendedAppsAdmin);
+ NotificationManager.Policy policy =
+ NotificationManager.from(mContext).getNotificationPolicy();
+ mDndVisualEffectsSuppressed = policy == null ? false : policy.suppressedVisualEffects != 0;
+
+ mSuspendedAppsAdmin = RestrictedLockUtils.checkIfApplicationIsSuspended(
+ mContext, mPkg, mUserId);
}
protected void setVisible(Preference p, boolean visible) {