From 6a603e7f4b267457a6ef8a54fa54b50b8231ddf0 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Thu, 17 Jun 2021 16:31:35 -0400 Subject: [PATCH] Clean up notification settings - Reorganize settings - Fix dividers - Add icons - Fix titles - Fix colors - Fix indentation - Add summaries Fixes: 190079590 Test: manual inspection, robotests Change-Id: Ia03219575d3b0c78f9f9b088aa3cdaa29cfdf412 --- res/drawable/button_border_selected.xml | 3 +- res/drawable/empty_icon.xml | 2 +- res/drawable/ic_demote_conversation.xml | 4 +- res/drawable/ic_notification_dot.xml | 25 +++++++++ res/drawable/ic_notification_min.xml | 25 +++++++++ res/drawable/ic_notification_peek.xml | 25 +++++++++ res/drawable/ic_notification_vis_override.xml | 25 +++++++++ res/drawable/ic_volume_ringer_vibrate.xml | 4 +- res/layout/notif_importance_preference.xml | 2 +- ...notif_priority_conversation_preference.xml | 5 +- res/values/strings.xml | 7 ++- res/xml/app_notification_settings.xml | 27 +++++----- res/xml/channel_notification_settings.xml | 32 ++++++----- res/xml/configure_notification_settings.xml | 15 +++--- .../conversation_notification_settings.xml | 53 ++++++++----------- .../app/AppNotificationSettings.java | 28 ++-------- .../app/ChannelListPreferenceController.java | 4 +- .../app/ChannelNotificationSettings.java | 6 +-- .../app/ConversationNotificationSettings.java | 4 +- .../app/HeaderPreferenceController.java | 48 +++++++++-------- .../app/HeaderPreferenceControllerTest.java | 22 +++++++- 21 files changed, 231 insertions(+), 135 deletions(-) create mode 100644 res/drawable/ic_notification_dot.xml create mode 100644 res/drawable/ic_notification_min.xml create mode 100644 res/drawable/ic_notification_peek.xml create mode 100644 res/drawable/ic_notification_vis_override.xml diff --git a/res/drawable/button_border_selected.xml b/res/drawable/button_border_selected.xml index 29acbcea8e1..5d2388a42d4 100644 --- a/res/drawable/button_border_selected.xml +++ b/res/drawable/button_border_selected.xml @@ -15,9 +15,10 @@ limitations under the License. --> + android:color="?androidprv:attr/colorSurface" /> diff --git a/res/drawable/empty_icon.xml b/res/drawable/empty_icon.xml index db55af58d6d..8e5fd201187 100644 --- a/res/drawable/empty_icon.xml +++ b/res/drawable/empty_icon.xml @@ -16,6 +16,6 @@ - + diff --git a/res/drawable/ic_demote_conversation.xml b/res/drawable/ic_demote_conversation.xml index ef25bad859a..056ff5835c1 100644 --- a/res/drawable/ic_demote_conversation.xml +++ b/res/drawable/ic_demote_conversation.xml @@ -17,8 +17,8 @@ + + + \ No newline at end of file diff --git a/res/drawable/ic_notification_min.xml b/res/drawable/ic_notification_min.xml new file mode 100644 index 00000000000..90101dd1754 --- /dev/null +++ b/res/drawable/ic_notification_min.xml @@ -0,0 +1,25 @@ + + + + \ No newline at end of file diff --git a/res/drawable/ic_notification_peek.xml b/res/drawable/ic_notification_peek.xml new file mode 100644 index 00000000000..51d694811e8 --- /dev/null +++ b/res/drawable/ic_notification_peek.xml @@ -0,0 +1,25 @@ + + + + \ No newline at end of file diff --git a/res/drawable/ic_notification_vis_override.xml b/res/drawable/ic_notification_vis_override.xml new file mode 100644 index 00000000000..067128ee04f --- /dev/null +++ b/res/drawable/ic_notification_vis_override.xml @@ -0,0 +1,25 @@ + + + + \ No newline at end of file diff --git a/res/drawable/ic_volume_ringer_vibrate.xml b/res/drawable/ic_volume_ringer_vibrate.xml index 4663b7587bd..cd50414d648 100644 --- a/res/drawable/ic_volume_ringer_vibrate.xml +++ b/res/drawable/ic_volume_ringer_vibrate.xml @@ -17,8 +17,8 @@ diff --git a/res/layout/notif_priority_conversation_preference.xml b/res/layout/notif_priority_conversation_preference.xml index c93abf20bfc..4601c008563 100644 --- a/res/layout/notif_priority_conversation_preference.xml +++ b/res/layout/notif_priority_conversation_preference.xml @@ -21,7 +21,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" - android:padding="@dimen/notification_importance_toggle_marginTop" + android:layout_marginStart="24dp" + android:layout_marginEnd="16dp" + android:paddingTop="@dimen/notification_importance_toggle_marginTop" + android:paddingBottom="@dimen/notification_importance_toggle_marginTop" android:orientation="vertical"> See all from last 7 days - General + Manage App settings + + Control notifications from individual apps + General @@ -9251,7 +9254,7 @@ Device & app notifications - Control which notifications show on your apps and devices + Control which apps and devices can read notifications diff --git a/res/xml/app_notification_settings.xml b/res/xml/app_notification_settings.xml index 5270b09791e..5b744fb694c 100644 --- a/res/xml/app_notification_settings.xml +++ b/res/xml/app_notification_settings.xml @@ -58,7 +58,16 @@ android:key="channels" android:layout="@layout/empty_view" settings:allowDividerAbove="true" - settings:allowDividerBelow="false" /> + settings:allowDividerBelow="true" /> + + + + android:summary="@string/app_notification_override_dnd_summary"/> - - - - - diff --git a/res/xml/channel_notification_settings.xml b/res/xml/channel_notification_settings.xml index 97dcc269220..a3895e38c5e 100644 --- a/res/xml/channel_notification_settings.xml +++ b/res/xml/channel_notification_settings.xml @@ -34,26 +34,26 @@ android:key="allow_sound" android:order="3" android:title="@string/allow_interruption" + android:icon="@drawable/empty_icon" android:summary="@string/allow_interruption_summary" /> + android:title="@string/notification_importance_title" /> @@ -62,14 +62,14 @@ android:order="7" android:icon="@drawable/ic_promote_conversation" android:title="@string/promote_conversation_title" - android:summary="@string/promote_conversation_summary" - settings:allowDividerAbove="true"/> + android:summary="@string/promote_conversation_summary" /> @@ -78,48 +78,46 @@ + android:icon="@drawable/ic_volume_ringer_vibrate" + android:title="@string/notification_vibrate_title" /> + android:icon="@drawable/ic_lightbulb_outline_24" + android:title="@string/notification_show_lights_title" /> + android:summary="@string/app_notification_override_dnd_summary" /> - - - + - - - - - - - - - - + + - @@ -81,27 +63,34 @@ + android:icon="@drawable/ic_lightbulb_outline_24" + android:title="@string/notification_show_lights_title"/> + android:title="@string/notification_vibrate_title" /> + + + diff --git a/src/com/android/settings/notification/app/AppNotificationSettings.java b/src/com/android/settings/notification/app/AppNotificationSettings.java index d7694d7e45e..ebcd261df20 100644 --- a/src/com/android/settings/notification/app/AppNotificationSettings.java +++ b/src/com/android/settings/notification/app/AppNotificationSettings.java @@ -25,9 +25,11 @@ import android.util.Log; import androidx.preference.Preference; import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceScreen; +import androidx.recyclerview.widget.RecyclerView; import com.android.internal.widget.LockPatternUtils; import com.android.settings.R; +import com.android.settings.Utils; import com.android.settingslib.core.AbstractPreferenceController; import java.util.ArrayList; @@ -38,35 +40,11 @@ public class AppNotificationSettings extends NotificationSettings { private static final String TAG = "AppNotificationSettings"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); - private static String KEY_ADVANCED_CATEGORY = "app_advanced"; - private static String KEY_BADGE = "badge"; - private static String KEY_APP_LINK = "app_link"; - private static String[] LEGACY_NON_ADVANCED_KEYS = {KEY_BADGE, KEY_APP_LINK}; - @Override public int getMetricsCategory() { return SettingsEnums.NOTIFICATION_APP_NOTIFICATION; } - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - final PreferenceScreen screen = getPreferenceScreen(); - if (mShowLegacyChannelConfig && screen != null) { - // if showing legacy settings, pull advanced settings out of the advanced category - PreferenceGroup advanced = (PreferenceGroup) findPreference(KEY_ADVANCED_CATEGORY); - removePreference(KEY_ADVANCED_CATEGORY); - if (advanced != null) { - for (String key : LEGACY_NON_ADVANCED_KEYS) { - Preference pref = advanced.findPreference(key); - advanced.removePreference(pref); - if (pref != null) { - screen.addPreference(pref); - } - } - } - } - } @Override public void onResume() { @@ -78,6 +56,8 @@ public class AppNotificationSettings extends NotificationSettings { return; } + getActivity().setTitle(mAppRow.label); + for (NotificationPreferenceController controller : mControllers) { controller.onResume(mAppRow, mChannel, mChannelGroup, null, null, mSuspendedAppsAdmin, null); diff --git a/src/com/android/settings/notification/app/ChannelListPreferenceController.java b/src/com/android/settings/notification/app/ChannelListPreferenceController.java index b1109ecbadc..12c15c28ee5 100644 --- a/src/com/android/settings/notification/app/ChannelListPreferenceController.java +++ b/src/com/android/settings/notification/app/ChannelListPreferenceController.java @@ -322,7 +322,7 @@ public class ChannelListPreferenceController extends NotificationPreferenceContr if (channel.getImportance() > IMPORTANCE_LOW) { channelPref.setIcon(getAlertingIcon()); } else { - channelPref.setIcon(null); + channelPref.setIcon(R.drawable.empty_icon); } channelPref.setIconSize(PrimarySwitchPreference.ICON_SIZE_SMALL); channelPref.setTitle(channel.getName()); @@ -350,7 +350,7 @@ public class ChannelListPreferenceController extends NotificationPreferenceContr channel.setImportance(importance); channel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE); PrimarySwitchPreference channelPref1 = (PrimarySwitchPreference) preference; - channelPref1.setIcon(null); + channelPref1.setIcon(R.drawable.empty_icon); if (channel.getImportance() > IMPORTANCE_LOW) { channelPref1.setIcon(getAlertingIcon()); } diff --git a/src/com/android/settings/notification/app/ChannelNotificationSettings.java b/src/com/android/settings/notification/app/ChannelNotificationSettings.java index 296863cc0b2..a7aba5284d6 100644 --- a/src/com/android/settings/notification/app/ChannelNotificationSettings.java +++ b/src/com/android/settings/notification/app/ChannelNotificationSettings.java @@ -66,8 +66,9 @@ public class ChannelNotificationSettings extends NotificationSettings { return; } - if (mChannel != null && !TextUtils.isEmpty(mChannel.getConversationId()) - && !mChannel.isDemoted()) { + getActivity().setTitle(mChannel.getName()); + + if (!TextUtils.isEmpty(mChannel.getConversationId()) && !mChannel.isDemoted()) { Intent intent = new SubSettingLauncher(mContext) .setDestination(ConversationNotificationSettings.class.getName()) .setArguments(getArguments()) @@ -128,7 +129,6 @@ public class ChannelNotificationSettings extends NotificationSettings { mDependentFieldListener, mBackend)); mControllers.add(new VibrationPreferenceController(context, mBackend)); mControllers.add(new AppLinkPreferenceController(context)); - mControllers.add(new DescriptionPreferenceController(context)); mControllers.add(new VisibilityPreferenceController(context, new LockPatternUtils(context), mBackend)); mControllers.add(new LightsPreferenceController(context, mBackend)); diff --git a/src/com/android/settings/notification/app/ConversationNotificationSettings.java b/src/com/android/settings/notification/app/ConversationNotificationSettings.java index d712c84ca69..d659c545cdf 100644 --- a/src/com/android/settings/notification/app/ConversationNotificationSettings.java +++ b/src/com/android/settings/notification/app/ConversationNotificationSettings.java @@ -41,11 +41,13 @@ public class ConversationNotificationSettings extends NotificationSettings { @Override public void onResume() { super.onResume(); - if (mUid < 0 || TextUtils.isEmpty(mPkg) || mPkgInfo == null || mChannel == null) { + if (mUid < 0 || TextUtils.isEmpty(mPkg) || mPkgInfo == null || mChannel == null + || mConversationInfo == null) { Log.w(TAG, "Missing package or uid or packageinfo or channel"); finish(); return; } + getActivity().setTitle(mConversationInfo.getLabel()); for (NotificationPreferenceController controller : mControllers) { controller.onResume(mAppRow, mChannel, mChannelGroup, mConversationDrawable, diff --git a/src/com/android/settings/notification/app/HeaderPreferenceController.java b/src/com/android/settings/notification/app/HeaderPreferenceController.java index 974ac79be08..7379d55395b 100644 --- a/src/com/android/settings/notification/app/HeaderPreferenceController.java +++ b/src/com/android/settings/notification/app/HeaderPreferenceController.java @@ -84,6 +84,7 @@ public class HeaderPreferenceController extends NotificationPreferenceController pref = mHeaderController.setIcon(mAppRow.icon) .setLabel(getLabel()) .setSummary(getSummary()) + .setSecondSummary(getSecondSummary()) .setPackageName(mAppRow.pkg) .setUid(mAppRow.uid) .setButtonActions(EntityHeaderController.ActionType.ACTION_NOTIF_PREFERENCE, @@ -96,25 +97,11 @@ public class HeaderPreferenceController extends NotificationPreferenceController } } - @Override - public CharSequence getSummary() { + public CharSequence getLabel() { if (mChannel != null && !isDefaultChannel()) { - if (mChannelGroup != null - && !TextUtils.isEmpty(mChannelGroup.getName())) { - final SpannableStringBuilder summary = new SpannableStringBuilder(); - BidiFormatter bidi = BidiFormatter.getInstance(); - summary.append(bidi.unicodeWrap(mAppRow.label.toString())); - summary.append(bidi.unicodeWrap(mContext.getText( - R.string.notification_header_divider_symbol_with_spaces))); - summary.append(bidi.unicodeWrap(mChannelGroup.getName().toString())); - return summary.toString(); - } else { - return mAppRow.label.toString(); - } - } else if (mChannelGroup != null) { - return mAppRow.label.toString(); + return mChannel.getName(); } else { - return ""; + return mAppRow.label; } } @@ -123,11 +110,26 @@ public class HeaderPreferenceController extends NotificationPreferenceController mStarted = true; } - @VisibleForTesting - CharSequence getLabel() { - return (mChannel != null && !isDefaultChannel()) ? mChannel.getName() - : mChannelGroup != null - ? mChannelGroup.getName() - : mAppRow.label; + @Override + public CharSequence getSummary() { + if (mChannel != null) { + if (mChannelGroup != null + && !TextUtils.isEmpty(mChannelGroup.getName())) { + final SpannableStringBuilder summary = new SpannableStringBuilder(); + BidiFormatter bidi = BidiFormatter.getInstance(); + summary.append(bidi.unicodeWrap(mAppRow.label)); + summary.append(bidi.unicodeWrap(mContext.getText( + R.string.notification_header_divider_symbol_with_spaces))); + summary.append(bidi.unicodeWrap(mChannelGroup.getName().toString())); + return summary.toString(); + } else { + return mAppRow.label.toString(); + } + } + return ""; + } + + public CharSequence getSecondSummary() { + return mChannel == null ? null : mChannel.getDescription(); } } diff --git a/tests/robotests/src/com/android/settings/notification/app/HeaderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/app/HeaderPreferenceControllerTest.java index 9f90a16175b..e0a221a5000 100644 --- a/tests/robotests/src/com/android/settings/notification/app/HeaderPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/app/HeaderPreferenceControllerTest.java @@ -118,7 +118,7 @@ public class HeaderPreferenceControllerTest { NotificationChannelGroup group = new NotificationChannelGroup("id", "name"); mController.onResume(appRow, null, group, null, null, null, null); - assertEquals(group.getName(), mController.getLabel()); + assertEquals(appRow.label, mController.getLabel()); NotificationChannel channel = new NotificationChannel("cid", "cname", IMPORTANCE_NONE); mController.onResume(appRow, channel, group, null, null, null, null); @@ -155,4 +155,24 @@ public class HeaderPreferenceControllerTest { mController.onResume(appRow, defaultChannel, null, null, null, null, null); assertEquals("", mController.getSummary()); } + + @Test + public void testGetSecondSummary() { + NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); + appRow.label = "bananas"; + mController.onResume(appRow, null, null, null, null, null, null); + assertEquals("", mController.getSecondSummary()); + + NotificationChannelGroup group = new NotificationChannelGroup("id", "name"); + mController.onResume(appRow, null, group, null, null, null, null); + assertEquals("", mController.getSecondSummary()); + + NotificationChannel channel = new NotificationChannel("cid", "cname", IMPORTANCE_NONE); + mController.onResume(appRow, channel, group, null, null, null, null); + assertEquals("", mController.getSecondSummary()); + + channel.setDescription("description"); + mController.onResume(appRow, channel, group, null, null, null, null); + assertEquals("description", mController.getSecondSummary()); + } }