diff --git a/core/res/res/layout/notification_top_line_views.xml b/core/res/res/layout/notification_top_line_views.xml index 361b7a393448a..7cda03f8fc4f1 100644 --- a/core/res/res/layout/notification_top_line_views.xml +++ b/core/res/res/layout/notification_top_line_views.xml @@ -112,11 +112,12 @@ android:id="@+id/feedback" android:layout_width="@dimen/notification_feedback_size" android:layout_height="@dimen/notification_feedback_size" - android:layout_marginStart="4dp" - android:layout_marginEnd="4dp" + android:layout_marginStart="@dimen/notification_header_separating_margin" + android:layout_gravity="center" android:scaleType="fitCenter" android:src="@drawable/ic_feedback_indicator" android:background="?android:selectableItemBackgroundBorderless" + android:paddingTop="2dp" android:visibility="gone" android:contentDescription="@string/notification_feedback_indicator" /> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 4fd8ef6bfa24e..5b19a486881af 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -480,7 +480,7 @@ 5dp - 16dp + 20dp 12dp diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 31aee4a2e8b49..3a593b93346da 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -5366,6 +5366,14 @@ Provide Feedback + + This notification was promoted to Default. Tap to provide feedback. + + This notification was demoted to Silent. Tap to provide feedback. + + This notification was ranked higher. Tap to provide feedback. + + This notification was ranked lower. Tap to provide feedback. diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 88a78a8e6ac3c..cd9319a9f9928 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2252,6 +2252,10 @@ + + + + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java index 4b6d66eef56d2..3c549f94ad0f5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java @@ -485,7 +485,7 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle } } row.showFeedbackIcon(mAssistantFeedbackController.showFeedbackIndicator(entry), - mAssistantFeedbackController.getFeedbackImageResource(entry)); + mAssistantFeedbackController.getFeedbackResources(entry)); row.setLastAudiblyAlertedMs(entry.getLastAudiblyAlertedMs()); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/AssistantFeedbackController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/AssistantFeedbackController.java index a350c5d8cd771..0465ebff9aebb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/AssistantFeedbackController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/AssistantFeedbackController.java @@ -27,6 +27,7 @@ import android.os.Handler; import android.os.Looper; import android.os.UserHandle; import android.provider.Settings; +import android.util.Pair; import androidx.annotation.Nullable; @@ -129,24 +130,28 @@ public class AssistantFeedbackController extends ContentObserver { } /** - * Get the feedback indicator image resource according to assistant's changes on this - * notification's rank or importance. + * Get the feedback indicator image and content description resources according to assistant's + * changes on this notification's rank or importance. * * @param entry Notification Entry to show feedback for */ - public int getFeedbackImageResource(NotificationEntry entry) { + public Pair getFeedbackResources(NotificationEntry entry) { int feedbackStatus = getFeedbackStatus(entry); switch (feedbackStatus) { case STATUS_ALERTED: - return R.drawable.ic_feedback_alerted; + return new Pair(R.drawable.ic_feedback_alerted, + R.string.notification_feedback_indicator_alerted); case STATUS_SILENCED: - return R.drawable.ic_feedback_silenced; + return new Pair(R.drawable.ic_feedback_silenced, + R.string.notification_feedback_indicator_silenced); case STATUS_PROMOTED: - return R.drawable.ic_feedback_uprank; + return new Pair(R.drawable.ic_feedback_uprank, + R.string.notification_feedback_indicator_promoted); case STATUS_DEMOTED: - return R.drawable.ic_feedback_downrank; + return new Pair(R.drawable.ic_feedback_downrank, + R.string.notification_feedback_indicator_demoted); default: - return 0; + return new Pair(0, 0); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index 11b829c4b4e88..3c437d1e7e6be 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -49,6 +49,7 @@ import android.util.AttributeSet; import android.util.FloatProperty; import android.util.Log; import android.util.MathUtils; +import android.util.Pair; import android.util.Property; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -1672,12 +1673,12 @@ public class ExpandableNotificationRow extends ActivatableNotificationView requestLayout(); } - public void showFeedbackIcon(boolean show, int resId) { + public void showFeedbackIcon(boolean show, Pair resIds) { if (mIsSummaryWithChildren) { - mChildrenContainer.showFeedbackIcon(show, resId); + mChildrenContainer.showFeedbackIcon(show, resIds); } - mPrivateLayout.showFeedbackIcon(show, resId); - mPublicLayout.showFeedbackIcon(show, resId); + mPrivateLayout.showFeedbackIcon(show, resIds); + mPublicLayout.showFeedbackIcon(show, resIds); } /** Sets the last time the notification being displayed audibly alerted the user. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java index 475f627d86492..d2774df330da4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java @@ -33,6 +33,7 @@ import android.provider.Settings; import android.util.ArrayMap; import android.util.AttributeSet; import android.util.Log; +import android.util.Pair; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.NotificationHeaderView; @@ -1586,15 +1587,15 @@ public class NotificationContentView extends FrameLayout { return null; } - public void showFeedbackIcon(boolean show, int resId) { + public void showFeedbackIcon(boolean show, Pair resIds) { if (mContractedChild != null) { - mContractedWrapper.showFeedbackIcon(show, resId); + mContractedWrapper.showFeedbackIcon(show, resIds); } if (mExpandedChild != null) { - mExpandedWrapper.showFeedbackIcon(show, resId); + mExpandedWrapper.showFeedbackIcon(show, resIds); } if (mHeadsUpChild != null) { - mHeadsUpWrapper.showFeedbackIcon(show, resId); + mHeadsUpWrapper.showFeedbackIcon(show, resIds); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java index 152527f3d76a6..28ee9358737e3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java @@ -22,6 +22,7 @@ import android.app.Notification; import android.content.Context; import android.content.res.ColorStateList; import android.util.ArraySet; +import android.util.Pair; import android.view.NotificationHeaderView; import android.view.NotificationTopLineView; import android.view.View; @@ -132,10 +133,13 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper { /** Shows or hides feedback indicator */ @Override - public void showFeedbackIcon(boolean show, int resId) { + public void showFeedbackIcon(boolean show, Pair resIds) { mFeedbackIcon.setVisibility(show ? View.VISIBLE : View.GONE); - if (show && mFeedbackIcon instanceof ImageButton) { - ((ImageButton) mFeedbackIcon).setImageResource(resId); + if (show) { + if (mFeedbackIcon instanceof ImageButton) { + ((ImageButton) mFeedbackIcon).setImageResource(resIds.first); + } + mFeedbackIcon.setContentDescription(mView.getContext().getString(resIds.second)); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java index 04cbe87c1e822..7b5c5f6dcf8f9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java @@ -29,6 +29,7 @@ import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Build; +import android.util.Pair; import android.view.ContextThemeWrapper; import android.view.NotificationHeaderView; import android.view.View; @@ -103,7 +104,7 @@ public abstract class NotificationViewWrapper implements TransformableView { /** * Shows or hides feedback icon. */ - public void showFeedbackIcon(boolean show, int resId) { + public void showFeedbackIcon(boolean show, Pair resIds) { } public void onReinflated() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java index a56ae7d219524..3833637e85421 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java @@ -23,6 +23,7 @@ import android.content.res.Resources; import android.graphics.drawable.ColorDrawable; import android.service.notification.StatusBarNotification; import android.util.AttributeSet; +import android.util.Pair; import android.view.LayoutInflater; import android.view.NotificationHeaderView; import android.view.View; @@ -1300,12 +1301,12 @@ public class NotificationChildrenContainer extends ViewGroup { /** * Shows or hides feedback icon. */ - public void showFeedbackIcon(boolean show, int resId) { + public void showFeedbackIcon(boolean show, Pair resIds) { if (mNotificationHeaderWrapper != null) { - mNotificationHeaderWrapper.showFeedbackIcon(show, resId); + mNotificationHeaderWrapper.showFeedbackIcon(show, resIds); } if (mNotificationHeaderWrapperLowPriority != null) { - mNotificationHeaderWrapperLowPriority.showFeedbackIcon(show, resId); + mNotificationHeaderWrapperLowPriority.showFeedbackIcon(show, resIds); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/AssistantFeedbackControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/AssistantFeedbackControllerTest.java index 3f1cf83d7b5c1..d131dceb70db0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/AssistantFeedbackControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/AssistantFeedbackControllerTest.java @@ -41,6 +41,7 @@ import android.provider.Settings; import android.service.notification.StatusBarNotification; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; +import android.util.Pair; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -120,9 +121,9 @@ public class AssistantFeedbackControllerTest extends SysuiTestCase { } @Test - public void testGetFeedbackImageResource_settingDisabled() { + public void testGetFeedbackResources_settingDisabled() { switchSetting(OFF); - Assert.assertEquals(0, mAssistantFeedbackController.getFeedbackImageResource( + Assert.assertEquals(new Pair(0, 0), mAssistantFeedbackController.getFeedbackResources( getEntry(IMPORTANCE_DEFAULT, IMPORTANCE_DEFAULT, RANKING_UNCHANGED))); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java index ca982a64d3825..2e0827f24bf84 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java @@ -39,10 +39,12 @@ import android.app.NotificationChannel; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; +import android.util.Pair; import android.view.View; import androidx.test.filters.SmallTest; +import com.android.internal.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -210,7 +212,7 @@ public class ExpandableNotificationRowTest extends SysuiTestCase { // public notification is custom layout - no header mGroupRow.setSensitive(true, true); mGroupRow.setOnFeedbackClickListener(null); - mGroupRow.showFeedbackIcon(false, 0); + mGroupRow.showFeedbackIcon(false, null); } @Test @@ -224,12 +226,13 @@ public class ExpandableNotificationRowTest extends SysuiTestCase { mGroupRow.setChildrenContainer(mockContainer); final boolean show = true; - final int resId = 1; - mGroupRow.showFeedbackIcon(show, resId); + final Pair resIds = new Pair(R.drawable.ic_feedback_alerted, + R.string.notification_feedback_indicator_alerted); + mGroupRow.showFeedbackIcon(show, resIds); - verify(mockContainer, times(1)).showFeedbackIcon(show, resId); - verify(privateLayout, times(1)).showFeedbackIcon(show, resId); - verify(publicLayout, times(1)).showFeedbackIcon(show, resId); + verify(mockContainer, times(1)).showFeedbackIcon(show, resIds); + verify(privateLayout, times(1)).showFeedbackIcon(show, resIds); + verify(publicLayout, times(1)).showFeedbackIcon(show, resIds); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java index 377a69dab91b5..41835082d7068 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java @@ -25,6 +25,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.util.Pair; import android.view.NotificationHeaderView; import android.view.View; import android.view.ViewPropertyAnimator; @@ -33,6 +34,7 @@ import androidx.test.annotation.UiThreadTest; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; +import com.android.internal.R; import com.android.internal.widget.NotificationExpandButton; import com.android.systemui.SysuiTestCase; import com.android.systemui.media.dialog.MediaOutputDialogFactory; @@ -95,7 +97,8 @@ public class NotificationContentViewTest extends SysuiTestCase { mView.setExpandedChild(mockExpanded); mView.setHeadsUpChild(mockHeadsUp); - mView.showFeedbackIcon(true, 1); + mView.showFeedbackIcon(true, new Pair(R.drawable.ic_feedback_alerted, + R.string.notification_feedback_indicator_alerted)); verify(mockContracted, times(1)).setVisibility(View.VISIBLE); verify(mockExpanded, times(1)).setVisibility(View.VISIBLE);