diff options
7 files changed, 150 insertions, 76 deletions
diff --git a/packages/SystemUI/res/drawable/button_border_selected.xml b/packages/SystemUI/res/drawable/button_border_selected.xml index d9299ec0622b..1e40adefca2a 100644 --- a/packages/SystemUI/res/drawable/button_border_selected.xml +++ b/packages/SystemUI/res/drawable/button_border_selected.xml @@ -20,6 +20,6 @@ android:color="@color/notification_guts_selection_bg" /> <stroke android:width="2dp" - android:color="?android:attr/colorAccent"/> + android:color="@color/GM2_grey_300"/> <corners android:radius="@dimen/rect_button_radius" /> </shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/notification_info.xml b/packages/SystemUI/res/layout/notification_info.xml index 58af4a2c24b6..087e0bd8089f 100644 --- a/packages/SystemUI/res/layout/notification_info.xml +++ b/packages/SystemUI/res/layout/notification_info.xml @@ -103,7 +103,6 @@ asked for it --> android:id="@+id/channel_info" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/notification_guts_button_spacing" android:paddingEnd="@*android:dimen/notification_content_margin_end" android:gravity="center" android:orientation="vertical"> @@ -127,6 +126,7 @@ asked for it --> android:id="@+id/blocking_helper" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="@dimen/notification_guts_button_spacing" android:layout_marginBottom="@dimen/notification_guts_button_spacing" android:paddingEnd="@*android:dimen/notification_content_margin_end" android:clipChildren="false" @@ -216,67 +216,107 @@ asked for it --> android:id="@+id/interruptiveness_settings" android:layout_width="match_parent" android:layout_height="wrap_content" + android:gravity="center" android:orientation="vertical"> - <LinearLayout - android:id="@+id/buttons" + <RelativeLayout + android:id="@+id/alert" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="horizontal" - android:gravity="center"> - - <Button - android:id="@+id/alert" - android:minWidth="@dimen/notification_importance_button_width" + android:padding="@dimen/notification_importance_button_padding" + android:clickable="true" + android:focusable="true"> + <ImageView + android:id="@+id/alert_icon" + android:src="@drawable/ic_notification_interruptive" + android:background="@android:color/transparent" + android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:minHeight="@dimen/notification_importance_toggle_size" - android:paddingStart="@dimen/notification_importance_button_horiz_padding" - android:paddingEnd="@dimen/notification_importance_button_horiz_padding" - android:drawablePadding="@dimen/notification_importance_drawable_padding" - android:foreground="@drawable/button_ripple_radius" - android:drawableLeft="@drawable/ic_notification_interruptive" - android:text="@string/notification_alert_title" /> - - <Button - android:id="@+id/silence" - android:minWidth="@dimen/notification_importance_button_width" - android:layout_width="wrap_content" + android:clickable="false" + android:focusable="false"/> + <TextView + android:id="@+id/alert_label" + android:layout_width="match_parent" android:layout_height="wrap_content" - android:minHeight="@dimen/notification_importance_toggle_size" - android:paddingStart="@dimen/notification_importance_button_horiz_padding" - android:paddingEnd="@dimen/notification_importance_button_horiz_padding" - android:drawablePadding="@dimen/notification_importance_drawable_padding" - android:foreground="@drawable/button_ripple_radius" - android:layout_marginStart="@dimen/notification_importance_button_separation" - android:drawableLeft="@drawable/ic_notification_gentle" - android:text="@string/notification_silence_title" /> - </LinearLayout> + android:ellipsize="end" + android:maxLines="1" + android:clickable="false" + android:focusable="false" + android:layout_toEndOf="@id/alert_icon" + android:layout_marginStart="@dimen/notification_importance_drawable_padding" + android:textAppearance="@style/TextAppearance.NotificationImportanceButton.Unselected" + android:text="@string/notification_alert_title"/> + <TextView + android:id="@+id/alert_summary" + android:paddingTop="@dimen/notification_importance_button_padding" + android:text="@string/notification_channel_summary_default" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:clickable="false" + android:focusable="false" + android:ellipsize="end" + android:maxLines="2" + android:layout_below="@id/alert_icon" + android:textAppearance="@style/TextAppearance.NotificationImportanceDetail"/> + </RelativeLayout> - <TextView - android:id="@+id/description" + <RelativeLayout + android:id="@+id/silence" android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/notification_alert_title" - android:gravity="center" - android:layout_marginTop="@dimen/notification_importance_text_marginTop" - android:paddingStart="@dimen/notification_importance_description_padding" - android:paddingEnd="@dimen/notification_importance_description_padding" - android:textAppearance="@style/TextAppearance.NotificationImportanceDetail" /> + android:padding="@dimen/notification_importance_button_padding" + android:layout_marginTop="@dimen/notification_importance_button_separation" + android:clickable="true" + android:focusable="true"> + <ImageView + android:id="@+id/silence_icon" + android:src="@drawable/ic_notification_gentle" + android:background="@android:color/transparent" + android:layout_gravity="center" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:clickable="false" + android:focusable="false"/> + <TextView + android:id="@+id/silence_label" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ellipsize="end" + android:maxLines="1" + android:clickable="false" + android:focusable="false" + android:layout_toEndOf="@id/silence_icon" + android:layout_marginStart="@dimen/notification_importance_drawable_padding" + android:textAppearance="@style/TextAppearance.NotificationImportanceButton.Unselected" + android:text="@string/notification_silence_title"/> + <TextView + android:id="@+id/silence_summary" + android:paddingTop="@dimen/notification_importance_button_padding" + android:text="@string/notification_channel_summary_default" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:clickable="false" + android:focusable="false" + android:ellipsize="end" + android:maxLines="2" + android:layout_below="@id/silence_icon" + android:textAppearance="@style/TextAppearance.NotificationImportanceDetail"/> + </RelativeLayout> + </LinearLayout> <RelativeLayout android:id="@+id/bottom_buttons" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingTop="@dimen/notification_guts_button_spacing" > + android:layout_marginTop="@dimen/notification_guts_button_spacing" > <TextView android:id="@+id/turn_off_notifications" android:text="@string/inline_turn_off_notifications" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentStart="true" - android:layout_centerVertical="true" android:minWidth="@dimen/notification_importance_toggle_size" android:minHeight="@dimen/notification_importance_toggle_size" android:maxWidth="200dp" @@ -286,11 +326,11 @@ asked for it --> android:text="@string/inline_ok_button" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_centerVertical="true" + android:layout_alignParentEnd="true" + android:gravity="center_vertical|end" android:maxWidth="125dp" android:minWidth="@dimen/notification_importance_toggle_size" android:minHeight="@dimen/notification_importance_toggle_size" - android:layout_alignParentEnd="true" style="@style/TextAppearance.NotificationInfo.Button"/> </RelativeLayout> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 84d3a38c41f1..ce958ab3f739 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -212,7 +212,7 @@ <dimen name="notification_guts_option_horizontal_padding">15dp</dimen> <!-- The vertical space between items in the alert selections in the inline settings --> - <dimen name="notification_guts_option_vertical_padding">24dp</dimen> + <dimen name="notification_guts_option_vertical_padding">20dp</dimen> <!-- The vertical space between the alert selections in the inline settings --> <dimen name="notification_guts_option_vertical_margin">6dp</dimen> @@ -226,10 +226,12 @@ <dimen name="notification_importance_button_horiz_padding">28dp</dimen> <dimen name="notification_importance_drawable_padding">8dp</dimen> <dimen name="notification_importance_description_padding">20dp</dimen> - <dimen name="notification_importance_description_text">12sp</dimen> + <dimen name="notification_importance_header_text">12sp</dimen> + <dimen name="notification_importance_description_text">14sp</dimen> <dimen name="notification_importance_channel_text">16sp</dimen> <dimen name="notification_importance_channel_group_text">14sp</dimen> <dimen name="notification_importance_button_text">16sp</dimen> + <dimen name="notification_importance_button_padding">14dp</dimen> <dimen name="rect_button_radius">8dp</dimen> <!-- The minimum height for the snackbar shown after the snooze option has been chosen. --> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 60d71260058f..cea336c82327 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1659,19 +1659,19 @@ <string name="notification_alert_title">Prioritized</string> <!-- [CHAR LIMIT=150] Notification Importance title: low importance level summary --> - <string name="notification_channel_summary_low">Always silent. Displays in pull-down shade.</string> + <string name="notification_channel_summary_low">Helps you focus with notifications only in the pull-down shade. Always silent.</string> <!-- [CHAR LIMIT=150] Notification Importance title: low importance level summary --> - <string name="notification_channel_summary_low_status">Always silent. Displays in pull-down shade & status bar.</string> + <string name="notification_channel_summary_low_status">Displays below priority notifications. Always silent.</string> <!-- [CHAR LIMIT=150] Notification Importance title: low importance level summary --> - <string name="notification_channel_summary_low_lock">Always silent. Displays in pull-down shade & on lock screen.</string> + <string name="notification_channel_summary_low_lock">Displays below priority notifications. Always silent.</string> <!-- [CHAR LIMIT=150] Notification Importance title: low importance level summary --> - <string name="notification_channel_summary_low_status_lock">Always silent. Displays in pull-down shade, status bar & on lock screen.</string> + <string name="notification_channel_summary_low_status_lock">Displays below priority notifications. Always silent.</string> <!-- [CHAR LIMIT=150] Notification Importance title: normal importance level summary --> - <string name="notification_channel_summary_default">Makes sound and displays in pull-down shade, status bar & on lock screen.</string> + <string name="notification_channel_summary_default">Gets your attention with sound & a status bar icon. Shows on lock screen.</string> <!-- Notification: Control panel: Label that displays when the app's notifications cannot be blocked. --> <string name="notification_unblockable_desc">These notifications can\'t be modified.</string> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index d765f0c157bd..23de2acf14c9 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -473,7 +473,7 @@ </style> <style name="TextAppearance.NotificationImportanceHeader"> - <item name="android:textSize">@dimen/notification_importance_description_text</item> + <item name="android:textSize">@dimen/notification_importance_header_text</item> <item name="android:fontFamily">@*android:string/config_bodyFontFamily</item> <item name="android:textColor">@color/notification_guts_header_text_color</item> </style> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java index 1f8ca37315bf..d49f1685e34a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java @@ -40,8 +40,11 @@ import android.graphics.drawable.Drawable; import android.metrics.LogMaker; import android.os.Handler; import android.os.RemoteException; +import android.provider.Settings; import android.service.notification.StatusBarNotification; import android.text.TextUtils; +import android.transition.AutoTransition; +import android.transition.TransitionManager; import android.util.AttributeSet; import android.util.Log; import android.view.View; @@ -88,6 +91,8 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G // standard controls private static final int ACTION_ALERT = 5; + private static final int BUTTON_ANIM_TIME_MS = 200; + private INotificationManager mINotificationManager; private PackageManager mPm; private MetricsLogger mMetricsLogger; @@ -102,6 +107,8 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G private boolean mWasShownHighPriority; private boolean mShowOnLockscreen; private boolean mShowInStatusBar; + private boolean mPressedApply; + /** * The last importance level chosen by the user. Null if the user has not chosen an importance * level; non-null once the user takes an action which indicates an explicit preference. @@ -132,7 +139,7 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G private OnClickListener mOnAlert = v -> { mExitReason = NotificationCounters.BLOCKING_HELPER_KEEP_SHOWING; mChosenImportance = IMPORTANCE_DEFAULT; - setImportanceSummary(ACTION_ALERT); + setImportanceSummary(ACTION_ALERT, true); updateButtons(ACTION_ALERT); }; @@ -140,12 +147,13 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G private OnClickListener mOnSilent = v -> { mExitReason = NotificationCounters.BLOCKING_HELPER_DELIVER_SILENTLY; mChosenImportance = IMPORTANCE_LOW; - setImportanceSummary(ACTION_TOGGLE_SILENT); + setImportanceSummary(ACTION_TOGGLE_SILENT, true); updateButtons(ACTION_TOGGLE_SILENT); }; // used by standard ui private OnClickListener mOnDismissSettings = v -> { + mPressedApply = true; closeControls(v); }; @@ -294,7 +302,8 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G mShowInStatusBar = !mINotificationManager.shouldHideSilentStatusIcons( mContext.getPackageName()); - // TODO: b/128445911 use show on lockscreen setting + mShowOnLockscreen = Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS, 0) == 1; bindHeader(); bindChannelDetails(); @@ -334,6 +343,7 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G findViewById(R.id.non_configurable_multichannel_text).setVisibility(GONE); findViewById(R.id.interruptiveness_settings).setVisibility(GONE); ((TextView) findViewById(R.id.done)).setText(R.string.inline_done_button); + findViewById(R.id.turn_off_notifications).setVisibility(GONE); } else if (mNumUniqueChannelsInRow > 1) { findViewById(R.id.non_configurable_text).setVisibility(GONE); findViewById(R.id.interruptiveness_settings).setVisibility(GONE); @@ -360,10 +370,10 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G if (mWasShownHighPriority) { updateButtons(ACTION_ALERT); - setImportanceSummary(ACTION_ALERT); + setImportanceSummary(ACTION_ALERT, false); } else { updateButtons(ACTION_TOGGLE_SILENT); - setImportanceSummary(ACTION_TOGGLE_SILENT); + setImportanceSummary(ACTION_TOGGLE_SILENT, false); } } @@ -484,14 +494,6 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G } } - private boolean hasImportanceChanged() { - return mSingleNotificationChannel != null - && mChosenImportance != null - && (mStartingChannelImportance == IMPORTANCE_UNSPECIFIED - || (mWasShownHighPriority && mChosenImportance < IMPORTANCE_DEFAULT) - || (!mWasShownHighPriority && mChosenImportance >= IMPORTANCE_DEFAULT)); - } - private void saveImportance() { if (!mIsNonblockable || mExitReason != NotificationCounters.BLOCKING_HELPER_STOP_NOTIFICATIONS) { @@ -526,8 +528,8 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G } private void updateButtons(int blockState) { - TextView silence = findViewById(R.id.silence); - TextView alert = findViewById(R.id.alert); + View silence = findViewById(R.id.silence); + View alert = findViewById(R.id.alert); TextView done = findViewById(R.id.done); switch (blockState) { case ACTION_TOGGLE_SILENT: @@ -549,22 +551,28 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G } } - private void updateButtons(TextView selected, TextView unselected) { + private void updateButtons(View selected, View unselected) { selected.setBackground(mSelectedBackground); selected.setSelected(true); - selected.setTextAppearance( - R.style.TextAppearance_NotificationImportanceButton_Selected); unselected.setBackground(mUnselectedBackground); unselected.setSelected(false); - unselected.setTextAppearance( - R.style.TextAppearance_NotificationImportanceButton_Unselected); } - void setImportanceSummary(int blockState) { - TextView view = findViewById(R.id.description); + void setImportanceSummary(int blockState, boolean userTriggered) { + if (userTriggered) { + AutoTransition transition = new AutoTransition(); + transition.setDuration(BUTTON_ANIM_TIME_MS); + TransitionManager.beginDelayedTransition(this, transition); + } if (blockState == ACTION_ALERT) { + TextView view = findViewById(R.id.alert_summary); + view.setVisibility(VISIBLE); + findViewById(R.id.silence_summary).setVisibility(GONE); view.setText(R.string.notification_channel_summary_default); } else { + TextView view = findViewById(R.id.silence_summary); + view.setVisibility(VISIBLE); + findViewById(R.id.alert_summary).setVisibility(GONE); if (mShowInStatusBar) { if (mShowOnLockscreen) { view.setText(R.string.notification_channel_summary_low_status_lock); @@ -742,12 +750,12 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G @Override public boolean willBeRemoved() { - return hasImportanceChanged(); + return false; } @Override public boolean shouldBeSaved() { - return hasImportanceChanged(); + return mPressedApply; } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java index 25995eb59d80..7bd25808a9c5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java @@ -891,7 +891,31 @@ public class NotificationInfoTest extends SysuiTestCase { } @Test - public void testWillBeRemovedReturnsFalseBeforeBind() throws Exception { + public void testCloseControls_withoutHittingApply() throws Exception { + mNotificationChannel.setImportance(IMPORTANCE_LOW); + mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, + TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, + (Runnable saveImportance, StatusBarNotification sbn) -> { + saveImportance.run(); + }, null, null, true, false, IMPORTANCE_LOW, false + ); + + mNotificationInfo.findViewById(R.id.alert).performClick(); + + assertFalse(mNotificationInfo.shouldBeSaved()); + } + + @Test + public void testWillBeRemovedReturnsFalse() throws Exception { + assertFalse(mNotificationInfo.willBeRemoved()); + + mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, + TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, + (Runnable saveImportance, StatusBarNotification sbn) -> { + saveImportance.run(); + }, null, null, true, false, IMPORTANCE_LOW, false + ); + assertFalse(mNotificationInfo.willBeRemoved()); } } |