diff --git a/packages/SystemUI/res/drawable/button_border_selected.xml b/packages/SystemUI/res/drawable/button_border_selected.xml new file mode 100644 index 0000000000000..d9299ec0622b2 --- /dev/null +++ b/packages/SystemUI/res/drawable/button_border_selected.xml @@ -0,0 +1,25 @@ + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/drawable/button_border_unselected.xml b/packages/SystemUI/res/drawable/button_border_unselected.xml new file mode 100644 index 0000000000000..4ea37640780ff --- /dev/null +++ b/packages/SystemUI/res/drawable/button_border_unselected.xml @@ -0,0 +1,25 @@ + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/drawable/button_ripple_radius.xml b/packages/SystemUI/res/drawable/button_ripple_radius.xml new file mode 100644 index 0000000000000..5c2857a4765c7 --- /dev/null +++ b/packages/SystemUI/res/drawable/button_ripple_radius.xml @@ -0,0 +1,26 @@ + + + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_notification_gentle.xml b/packages/SystemUI/res/drawable/ic_notification_gentle.xml index 7074130a63ce3..de54b1040b03d 100644 --- a/packages/SystemUI/res/drawable/ic_notification_gentle.xml +++ b/packages/SystemUI/res/drawable/ic_notification_gentle.xml @@ -18,18 +18,18 @@ Copyright (C) 2019 The Android Open Source Project android:id="@+id/back"> + android:color="@color/notification_silence_color" /> + android:height="24dp" + android:width="24dp"/> + android:color="@color/notification_alert_color" /> + android:height="24dp" + android:width="24dp"/> @@ -39,69 +39,62 @@ android:layout_width="@dimen/notification_guts_header_height" android:layout_height="@dimen/notification_guts_header_height" android:layout_centerVertical="true" + android:layout_alignParentStart="true" android:layout_marginEnd="3dp" /> + android:layout_toEndOf="@id/pkgicon" + android:singleLine="true" /> + android:layout_toEndOf="@id/pkgname" + android:text="@*android:string/notification_header_divider_symbol" /> - - - - - - + + @@ -111,40 +104,22 @@ asked for it --> 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"> - - - - - - + + + android:id="@+id/inline_controls" 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:layout_marginTop="@dimen/notification_guts_option_vertical_padding" android:clipChildren="false" android:clipToPadding="false" android:orientation="vertical"> @@ -225,7 +200,6 @@ asked for it --> android:visibility="gone" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingTop="@dimen/notification_guts_option_vertical_padding" style="@*android:style/TextAppearance.DeviceDefault.Notification" /> @@ -235,7 +209,6 @@ asked for it --> android:visibility="gone" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingTop="@dimen/notification_guts_option_vertical_padding" style="@*android:style/TextAppearance.DeviceDefault.Notification" /> android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> - + + android:orientation="horizontal" + android:gravity="center"> - + 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" /> - - - - + 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" /> - - - - - - - - + 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:paddingTop="@dimen/notification_guts_button_spacing" > android:layout_height="wrap_content" android:layout_centerVertical="true" 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"/> @@ -376,6 +314,8 @@ asked for it --> android:id="@+id/undo" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:minWidth="@dimen/notification_importance_toggle_size" + android:minHeight="@dimen/notification_importance_toggle_size" android:layout_marginTop="@dimen/notification_guts_button_spacing" android:layout_marginBottom="@dimen/notification_guts_button_spacing" android:layout_marginStart="@dimen/notification_guts_button_side_margin" diff --git a/packages/SystemUI/res/values-night/colors.xml b/packages/SystemUI/res/values-night/colors.xml index 8a0aaea77d52a..f9bf47bb7d08d 100644 --- a/packages/SystemUI/res/values-night/colors.xml +++ b/packages/SystemUI/res/values-night/colors.xml @@ -45,6 +45,8 @@ #202124 #669DF6 @color/GM2_grey_200 + @color/GM2_grey_200 + @color/GM2_grey_100 @color/GM2_grey_900 diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index b2a507549cced..d2a005fc55df2 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -90,7 +90,11 @@ #FFFFFF #4285F4 - @color/GM2_grey_900 + @color/GM2_grey_700 + @color/GM2_grey_700 + @color/GM2_grey_900 + #FF32c1de + #FFF87B2B #ffffff diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 7d76160f82423..5e84549655fb8 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -206,11 +206,26 @@ 15dp - 15dp + 24dp 6dp + 48dp + 28dp + 28dp + 20dp + 16dp + 178dp + 28dp + 8dp + 20dp + 12sp + 16sp + 14sp + 16sp + 8dp + 56dp diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 96aa6ab441184..a2039d07ad591 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1651,17 +1651,29 @@ Keep showing notifications from this app? - - Blocked notifications do not appear anywhere or play a sound. You can unblock notifications in settings. + + Gentle - - Silent notifications appear in the shade, but do not appear on the lock screen, present a banner, or play a sound. + + Prioritized - - These notifications will make a sound and show in the notification drawer, status bar, and lock screen + + Always silent. Displays in pull-down shade. + + + Always silent. Displays in pull-down shade & status bar. + + + Always silent. Displays in pull-down shade & on lock screen. + + + Always silent. Displays in pull-down shade, status bar & on lock screen. + + + Makes sound and displays in pull-down shade, status bar & on lock screen. - These notifications can\'t be turned off + These notifications can\'t be modified. This group of notifications cannot be configured here diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index eb68b0f0b6309..9b471c9c17dcc 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -426,57 +426,71 @@ - - - - + + - - - - - - - - + + + + + + + + + + + + + + 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 622b869c9e4c5..e6875e4d8dc30 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 @@ -18,8 +18,7 @@ package com.android.systemui.statusbar.notification.row; import static android.app.NotificationManager.IMPORTANCE_DEFAULT; import static android.app.NotificationManager.IMPORTANCE_LOW; -import static android.app.NotificationManager.IMPORTANCE_MIN; -import static android.app.NotificationManager.IMPORTANCE_NONE; +import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -37,9 +36,7 @@ import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; -import android.graphics.Color; import android.graphics.drawable.Drawable; -import android.graphics.drawable.GradientDrawable; import android.metrics.LogMaker; import android.os.Handler; import android.os.RemoteException; @@ -60,7 +57,6 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.Dependency; import com.android.systemui.Interpolators; import com.android.systemui.R; -import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.notification.logging.NotificationCounters; import java.util.List; @@ -104,6 +100,8 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G private NotificationChannel mSingleNotificationChannel; private int mStartingChannelImportance; private boolean mWasShownHighPriority; + private boolean mShowOnLockscreen; + private boolean mShowInStatusBar; /** * 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. @@ -119,7 +117,8 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G private OnSettingsClickListener mOnSettingsClickListener; private OnAppSettingsClickListener mAppSettingsClickListener; private NotificationGuts mGutsContainer; - private GradientDrawable mSelectedBackground; + private Drawable mSelectedBackground; + private Drawable mUnselectedBackground; /** Whether this view is being shown as part of the blocking helper. */ private boolean mIsForBlockingHelper; @@ -133,6 +132,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); updateButtons(ACTION_ALERT); }; @@ -140,6 +140,7 @@ 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); updateButtons(ACTION_TOGGLE_SILENT); }; @@ -276,14 +277,8 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G mDelegatePkg = mSbn.getOpPkg(); mIsDeviceProvisioned = isDeviceProvisioned; - mSelectedBackground = new GradientDrawable(); - mSelectedBackground.setShape(GradientDrawable.RECTANGLE); - mSelectedBackground.setColor(mContext.getColor(R.color.notification_guts_selection_bg)); - final float cornerRadii = getResources().getDisplayMetrics().density * 8; - mSelectedBackground.setCornerRadii(new float[]{cornerRadii, cornerRadii, cornerRadii, - cornerRadii, cornerRadii, cornerRadii, cornerRadii, cornerRadii}); - mSelectedBackground.setStroke((int) (getResources().getDisplayMetrics().density * 2), - mContext.getColor(R.color.notification_guts_selection_border)); + mSelectedBackground = mContext.getDrawable(R.drawable.button_border_selected); + mUnselectedBackground = mContext.getDrawable(R.drawable.button_border_unselected); int numTotalChannels = mINotificationManager.getNumNotificationChannelsForPackage( pkg, mAppUid, false /* includeDeleted */); @@ -297,6 +292,10 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G && numTotalChannels == 1; } + mShowInStatusBar = !mINotificationManager.shouldHideSilentStatusIcons( + mContext.getPackageName()); + // TODO: b/128445911 use show on lockscreen setting + bindHeader(); bindChannelDetails(); @@ -334,6 +333,7 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G findViewById(R.id.non_configurable_text).setVisibility(VISIBLE); 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); } else if (mNumUniqueChannelsInRow > 1) { findViewById(R.id.non_configurable_text).setVisibility(GONE); findViewById(R.id.interruptiveness_settings).setVisibility(GONE); @@ -353,15 +353,17 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G done.setOnClickListener(mOnDismissSettings); - View silent = findViewById(R.id.silent_row); - View alert = findViewById(R.id.alert_row); + View silent = findViewById(R.id.silence); + View alert = findViewById(R.id.alert); silent.setOnClickListener(mOnSilent); alert.setOnClickListener(mOnAlert); if (mWasShownHighPriority) { updateButtons(ACTION_ALERT); + setImportanceSummary(ACTION_ALERT); } else { updateButtons(ACTION_TOGGLE_SILENT); + setImportanceSummary(ACTION_TOGGLE_SILENT); } } @@ -482,14 +484,11 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G } } TextView groupNameView = findViewById(R.id.group_name); - TextView groupDividerView = findViewById(R.id.pkg_group_divider); if (groupName != null) { groupNameView.setText(groupName); groupNameView.setVisibility(View.VISIBLE); - groupDividerView.setVisibility(View.VISIBLE); } else { groupNameView.setVisibility(View.GONE); - groupDividerView.setVisibility(View.GONE); } } @@ -504,9 +503,9 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G private boolean hasImportanceChanged() { return mSingleNotificationChannel != null && mChosenImportance != null - && (mStartingChannelImportance != mChosenImportance - || (mWasShownHighPriority && mChosenImportance < IMPORTANCE_DEFAULT) - || (!mWasShownHighPriority && mChosenImportance >= IMPORTANCE_DEFAULT)); + && (mStartingChannelImportance == IMPORTANCE_UNSPECIFIED + || (mWasShownHighPriority && mChosenImportance < IMPORTANCE_DEFAULT) + || (!mWasShownHighPriority && mChosenImportance >= IMPORTANCE_DEFAULT)); } private void saveImportance() { @@ -526,29 +525,76 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G if (mChosenImportance != null) { mMetricsLogger.write(importanceChangeLogMaker()); + int newImportance = mChosenImportance; + if (mStartingChannelImportance != IMPORTANCE_UNSPECIFIED) { + if ((mWasShownHighPriority && mChosenImportance >= IMPORTANCE_DEFAULT) + || (!mWasShownHighPriority && mChosenImportance < IMPORTANCE_DEFAULT)) { + newImportance = mStartingChannelImportance; + } + } + Handler bgHandler = new Handler(Dependency.get(Dependency.BG_LOOPER)); bgHandler.post( new UpdateImportanceRunnable(mINotificationManager, mPackageName, mAppUid, mNumUniqueChannelsInRow == 1 ? mSingleNotificationChannel : null, - mStartingChannelImportance, mChosenImportance)); + mStartingChannelImportance, newImportance)); } } private void updateButtons(int blockState) { - View silent = findViewById(R.id.silent_row); - View alert = findViewById(R.id.alert_row); + TextView silence = findViewById(R.id.silence); + TextView alert = findViewById(R.id.alert); + TextView done = findViewById(R.id.done); switch (blockState) { case ACTION_TOGGLE_SILENT: - silent.setBackground(mSelectedBackground); - alert.setBackground(null); + updateButtons(silence, alert); + if (mWasShownHighPriority) { + done.setText(R.string.inline_ok_button); + } else { + done.setText(R.string.inline_done_button); + } break; case ACTION_ALERT: - alert.setBackground(mSelectedBackground); - silent.setBackground(null); + updateButtons(alert, silence); + if (mWasShownHighPriority) { + done.setText(R.string.inline_done_button); + } else { + done.setText(R.string.inline_ok_button); + } break; } } + private void updateButtons(TextView selected, TextView 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); + if (blockState == ACTION_ALERT) { + view.setText(R.string.notification_channel_summary_default); + } else { + if (mShowInStatusBar) { + if (mShowOnLockscreen) { + view.setText(R.string.notification_channel_summary_low_status_lock); + } else { + view.setText(R.string.notification_channel_summary_low_status); + } + } else if (mShowOnLockscreen) { + view.setText(R.string.notification_channel_summary_low_lock); + } else { + view.setText(R.string.notification_channel_summary_low); + } + } + } + private void saveImportanceAndExitReason(@NotificationInfoAction int action) { switch (action) { case ACTION_UNDO: @@ -556,15 +602,8 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G break; case ACTION_DELIVER_SILENTLY: mExitReason = NotificationCounters.BLOCKING_HELPER_DELIVER_SILENTLY; - mChosenImportance = IMPORTANCE_LOW; - break; - case ACTION_TOGGLE_SILENT: - mExitReason = NotificationCounters.BLOCKING_HELPER_TOGGLE_SILENT; - if (mWasShownHighPriority) { - mChosenImportance = IMPORTANCE_LOW; - } else { - mChosenImportance = IMPORTANCE_DEFAULT; - } + mChosenImportance = mWasShownHighPriority + ? IMPORTANCE_LOW : mStartingChannelImportance; break; default: throw new IllegalArgumentException(); 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 d2f8e02311e67..02731c0e8e188 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 @@ -250,8 +250,6 @@ public class NotificationInfoTest extends SysuiTestCase { IMPORTANCE_DEFAULT, true); final TextView groupNameView = mNotificationInfo.findViewById(R.id.group_name); assertEquals(GONE, groupNameView.getVisibility()); - final TextView groupDividerView = mNotificationInfo.findViewById(R.id.pkg_group_divider); - assertEquals(GONE, groupDividerView.getVisibility()); } @Test @@ -268,8 +266,6 @@ public class NotificationInfoTest extends SysuiTestCase { final TextView groupNameView = mNotificationInfo.findViewById(R.id.group_name); assertEquals(View.VISIBLE, groupNameView.getVisibility()); assertEquals("Test Group Name", groupNameView.getText()); - final TextView groupDividerView = mNotificationInfo.findViewById(R.id.pkg_group_divider); - assertEquals(View.VISIBLE, groupDividerView.getVisibility()); } @Test @@ -486,7 +482,7 @@ public class NotificationInfoTest extends SysuiTestCase { TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false, IMPORTANCE_LOW, false); - mNotificationInfo.findViewById(R.id.alert_row).performClick(); + mNotificationInfo.findViewById(R.id.alert).performClick(); mTestableLooper.processAllMessages(); verify(mMockINotificationManager, never()).updateNotificationChannelForPackage( anyString(), eq(TEST_UID), any()); @@ -500,7 +496,7 @@ public class NotificationInfoTest extends SysuiTestCase { TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false, IMPORTANCE_DEFAULT, true); - mNotificationInfo.findViewById(R.id.silent_row).performClick(); + mNotificationInfo.findViewById(R.id.silence).performClick(); mTestableLooper.processAllMessages(); verify(mMockINotificationManager, never()).updateNotificationChannelForPackage( anyString(), eq(TEST_UID), any()); @@ -527,7 +523,7 @@ public class NotificationInfoTest extends SysuiTestCase { mNotificationChannel.setImportance(IMPORTANCE_UNSPECIFIED); mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false, - IMPORTANCE_DEFAULT, true); + IMPORTANCE_UNSPECIFIED, true); mNotificationInfo.handleCloseControls(true, false); @@ -542,6 +538,7 @@ public class NotificationInfoTest extends SysuiTestCase { throws Exception { NotificationInfo.CheckSaveListener listener = mock(NotificationInfo.CheckSaveListener.class); + mNotificationChannel.setImportance(IMPORTANCE_DEFAULT); mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */, 10 /* numUniqueChannelsInRow */, mSbn, listener /* checkSaveListener */, @@ -570,6 +567,7 @@ public class NotificationInfoTest extends SysuiTestCase { throws Exception { NotificationInfo.CheckSaveListener listener = mock(NotificationInfo.CheckSaveListener.class); + mNotificationChannel.setImportance(IMPORTANCE_DEFAULT); mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */, 10 /* numUniqueChannelsInRow */, mSbn, listener /* checkSaveListener */, @@ -588,6 +586,7 @@ public class NotificationInfoTest extends SysuiTestCase { throws Exception { NotificationInfo.CheckSaveListener listener = mock(NotificationInfo.CheckSaveListener.class); + mNotificationChannel.setImportance(IMPORTANCE_DEFAULT); mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */, 10 /* numUniqueChannelsInRow */, mSbn, listener /* checkSaveListener */, @@ -603,6 +602,7 @@ public class NotificationInfoTest extends SysuiTestCase { @Test public void testCloseControls_blockingHelperDismissedIfShown() throws Exception { + mNotificationChannel.setImportance(IMPORTANCE_DEFAULT); mNotificationInfo.bindNotification( mMockPackageManager, mMockINotificationManager, @@ -629,7 +629,7 @@ public class NotificationInfoTest extends SysuiTestCase { @Test public void testSilentlyChangedCallsUpdateNotificationChannel_blockingHelper() throws Exception { - mNotificationChannel.setImportance(IMPORTANCE_LOW); + mNotificationChannel.setImportance(IMPORTANCE_DEFAULT); mNotificationInfo.bindNotification( mMockPackageManager, mMockINotificationManager, @@ -644,7 +644,7 @@ public class NotificationInfoTest extends SysuiTestCase { false /* isNonblockable */, true /* isForBlockingHelper */, IMPORTANCE_DEFAULT, - false); + true); mNotificationInfo.findViewById(R.id.deliver_silently).performClick(); waitForUndoButton(); @@ -684,7 +684,7 @@ public class NotificationInfoTest extends SysuiTestCase { mNotificationChannel.setImportance(IMPORTANCE_DEFAULT); mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, true, - IMPORTANCE_DEFAULT, false); + IMPORTANCE_DEFAULT, true); mNotificationInfo.handleCloseControls(true, false); @@ -704,7 +704,7 @@ public class NotificationInfoTest extends SysuiTestCase { TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false, IMPORTANCE_DEFAULT, true); - mNotificationInfo.findViewById(R.id.silent_row).performClick(); + mNotificationInfo.findViewById(R.id.silence).performClick(); mNotificationInfo.findViewById(R.id.done).performClick(); mNotificationInfo.handleCloseControls(true, false); @@ -723,9 +723,9 @@ public class NotificationInfoTest extends SysuiTestCase { mNotificationChannel.setImportance(IMPORTANCE_LOW); mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false, - IMPORTANCE_DEFAULT, false); + IMPORTANCE_LOW, false); - mNotificationInfo.findViewById(R.id.alert_row).performClick(); + mNotificationInfo.findViewById(R.id.alert).performClick(); mNotificationInfo.findViewById(R.id.done).performClick(); mNotificationInfo.handleCloseControls(true, false); @@ -745,9 +745,9 @@ public class NotificationInfoTest extends SysuiTestCase { mNotificationChannel.setImportance(IMPORTANCE_UNSPECIFIED); mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false, - IMPORTANCE_DEFAULT, true); + IMPORTANCE_UNSPECIFIED, true); - mNotificationInfo.findViewById(R.id.silent_row).performClick(); + mNotificationInfo.findViewById(R.id.silence).performClick(); mNotificationInfo.findViewById(R.id.done).performClick(); mNotificationInfo.handleCloseControls(true, false); @@ -762,14 +762,82 @@ public class NotificationInfoTest extends SysuiTestCase { } @Test - public void testUnSilenceCallsUpdateNotificationChannel_channelImportanceUnspecified() + public void testSilenceCallsUpdateNotificationChannel_channelImportanceMin() throws Exception { - mNotificationChannel.setImportance(IMPORTANCE_UNSPECIFIED); + mNotificationChannel.setImportance(IMPORTANCE_MIN); + mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, + TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false, + IMPORTANCE_MIN, false); + + assertEquals(mContext.getString(R.string.inline_done_button), + ((TextView) mNotificationInfo.findViewById(R.id.done)).getText()); + mNotificationInfo.findViewById(R.id.silence).performClick(); + assertEquals(mContext.getString(R.string.inline_done_button), + ((TextView) mNotificationInfo.findViewById(R.id.done)).getText()); + mNotificationInfo.findViewById(R.id.done).performClick(); + mNotificationInfo.handleCloseControls(true, false); + + mTestableLooper.processAllMessages(); + ArgumentCaptor updated = + ArgumentCaptor.forClass(NotificationChannel.class); + verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage( + anyString(), eq(TEST_UID), updated.capture()); + assertTrue((updated.getValue().getUserLockedFields()& USER_LOCKED_IMPORTANCE) != 0); + assertEquals(IMPORTANCE_MIN, updated.getValue().getImportance()); + } + + @Test + public void testAlertCallsUpdateNotificationChannel_channelImportanceMin() + throws Exception { + mNotificationChannel.setImportance(IMPORTANCE_MIN); + mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, + TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false, + IMPORTANCE_MIN, false); + + assertEquals(mContext.getString(R.string.inline_done_button), + ((TextView) mNotificationInfo.findViewById(R.id.done)).getText()); + mNotificationInfo.findViewById(R.id.alert).performClick(); + assertEquals(mContext.getString(R.string.inline_ok_button), + ((TextView) mNotificationInfo.findViewById(R.id.done)).getText()); + mNotificationInfo.findViewById(R.id.done).performClick(); + mNotificationInfo.handleCloseControls(true, false); + + mTestableLooper.processAllMessages(); + ArgumentCaptor updated = + ArgumentCaptor.forClass(NotificationChannel.class); + verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage( + anyString(), eq(TEST_UID), updated.capture()); + assertTrue((updated.getValue().getUserLockedFields()& USER_LOCKED_IMPORTANCE) != 0); + assertEquals(IMPORTANCE_DEFAULT, updated.getValue().getImportance()); + } + + @Test + public void testDoneText() + throws Exception { + mNotificationChannel.setImportance(IMPORTANCE_LOW); mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false, IMPORTANCE_LOW, false); - mNotificationInfo.findViewById(R.id.alert_row).performClick(); + assertEquals(mContext.getString(R.string.inline_done_button), + ((TextView) mNotificationInfo.findViewById(R.id.done)).getText()); + mNotificationInfo.findViewById(R.id.alert).performClick(); + assertEquals(mContext.getString(R.string.inline_ok_button), + ((TextView) mNotificationInfo.findViewById(R.id.done)).getText()); + mNotificationInfo.findViewById(R.id.silence).performClick(); + assertEquals(mContext.getString(R.string.inline_done_button), + ((TextView) mNotificationInfo.findViewById(R.id.done)).getText()); + } + + @Test + public void testUnSilenceCallsUpdateNotificationChannel_channelImportanceUnspecified() + throws Exception { + mNotificationChannel.setImportance(IMPORTANCE_LOW); + mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, + TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false, + IMPORTANCE_LOW, false); + + mNotificationInfo.findViewById(R.id.alert).performClick(); mNotificationInfo.findViewById(R.id.done).performClick(); mNotificationInfo.handleCloseControls(true, false); @@ -790,7 +858,7 @@ public class NotificationInfoTest extends SysuiTestCase { TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false, IMPORTANCE_LOW, false); - mNotificationInfo.findViewById(R.id.alert_row).performClick(); + mNotificationInfo.findViewById(R.id.alert).performClick(); mNotificationInfo.findViewById(R.id.done).performClick(); mNotificationInfo.handleCloseControls(false, false); @@ -809,7 +877,7 @@ public class NotificationInfoTest extends SysuiTestCase { }, null, null, true, false, IMPORTANCE_LOW, false ); - mNotificationInfo.findViewById(R.id.alert_row).performClick(); + mNotificationInfo.findViewById(R.id.alert).performClick(); mNotificationInfo.findViewById(R.id.done).performClick(); mTestableLooper.processAllMessages(); verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(