Merge "Add functionality for new smart action"

This commit is contained in:
Beverly Tai
2021-01-19 14:54:50 +00:00
committed by Android (Google) Code Review
5 changed files with 134 additions and 5 deletions

View File

@@ -16,6 +16,7 @@
package com.android.systemui.statusbar.notification.row;
import static android.app.Notification.Action.SEMANTIC_ACTION_MARK_CONVERSATION_AS_PRIORITY;
import static android.service.notification.NotificationListenerService.REASON_CANCEL;
import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator.ExpandAnimationParameters;
@@ -1785,6 +1786,27 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
doLongClickCallback(x, y, menuItem);
}
/**
* Perform a smart action which triggers a longpress (expose guts).
* Based on the semanticAction passed, may update the state of the guts view.
* @param semanticAction associated with this smart action click
*/
public void doSmartActionClick(int x, int y, int semanticAction) {
createMenu();
NotificationMenuRowPlugin provider = getProvider();
MenuItem menuItem = null;
if (provider != null) {
menuItem = provider.getLongpressMenuItem(mContext);
}
if (SEMANTIC_ACTION_MARK_CONVERSATION_AS_PRIORITY == semanticAction
&& menuItem.getGutsView() instanceof NotificationConversationInfo) {
NotificationConversationInfo info =
(NotificationConversationInfo) menuItem.getGutsView();
info.setSelectedAction(NotificationConversationInfo.ACTION_FAVORITE);
}
doLongClickCallback(x, y, menuItem);
}
private void doLongClickCallback(int x, int y, MenuItem menuItem) {
if (mLongPressListener != null && menuItem != null) {
mLongPressListener.onLongPress(this, x, y, menuItem);

View File

@@ -206,6 +206,7 @@ public class NotificationConversationInfo extends LinearLayout implements
}
public void bindNotification(
@Action int selectedAction,
ShortcutManager shortcutManager,
PackageManager pm,
INotificationManager iNotificationManager,
@@ -224,7 +225,8 @@ public class NotificationConversationInfo extends LinearLayout implements
@Background Handler bgHandler,
OnConversationSettingsClickListener onConversationSettingsClickListener,
Optional<BubblesManager> bubblesManagerOptional) {
mSelectedAction = -1;
mPressedApply = false;
mSelectedAction = selectedAction;
mINotificationManager = iNotificationManager;
mOnUserInteractionCallback = onUserInteractionCallback;
mPackageName = pkg;
@@ -297,7 +299,8 @@ public class NotificationConversationInfo extends LinearLayout implements
settingsButton.setOnClickListener(getSettingsOnClickListener());
settingsButton.setVisibility(settingsButton.hasOnClickListeners() ? VISIBLE : GONE);
updateToggleActions(getSelectedAction(), false);
updateToggleActions(mSelectedAction == -1 ? getPriority() : mSelectedAction,
false);
}
private void bindHeader() {
@@ -406,7 +409,7 @@ public class NotificationConversationInfo extends LinearLayout implements
@Override
public void onFinishedClosing() {
// TODO: do we need to do anything here?
mSelectedAction = -1;
}
@Override
@@ -487,7 +490,7 @@ public class NotificationConversationInfo extends LinearLayout implements
throw new IllegalArgumentException("Unrecognized behavior: " + mSelectedAction);
}
boolean isAChange = getSelectedAction() != selectedAction;
boolean isAChange = getPriority() != selectedAction;
TextView done = findViewById(R.id.done);
done.setText(isAChange
? R.string.inline_ok_button
@@ -498,6 +501,10 @@ public class NotificationConversationInfo extends LinearLayout implements
}
int getSelectedAction() {
return mSelectedAction;
}
private int getPriority() {
if (mNotificationChannel.getImportance() <= IMPORTANCE_LOW
&& mNotificationChannel.getImportance() > IMPORTANCE_UNSPECIFIED) {
return ACTION_MUTE;

View File

@@ -474,6 +474,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx
R.dimen.notification_guts_conversation_icon_size));
notificationInfoView.bindNotification(
notificationInfoView.getSelectedAction(),
mShortcutManager,
pmUser,
mNotificationManager,

View File

@@ -17,6 +17,7 @@
package com.android.systemui.statusbar.policy
import android.app.Notification
import android.app.Notification.Action.SEMANTIC_ACTION_MARK_CONVERSATION_AS_PRIORITY
import android.app.PendingIntent
import android.app.RemoteInput
import android.content.Context
@@ -310,11 +311,19 @@ interface SmartActionInflater {
actionIndex: Int,
action: Notification.Action
) =
if (smartActions.fromAssistant
&& SEMANTIC_ACTION_MARK_CONVERSATION_AS_PRIORITY == action.semanticAction) {
entry.row.doSmartActionClick(entry.row.x.toInt() / 2,
entry.row.y.toInt() / 2, SEMANTIC_ACTION_MARK_CONVERSATION_AS_PRIORITY)
smartReplyController
.smartActionClicked(entry, actionIndex, action, smartActions.fromAssistant)
} else {
activityStarter.startPendingIntentDismissingKeyguard(action.actionIntent, entry.row) {
smartReplyController
.smartActionClicked(entry, actionIndex, action, smartActions.fromAssistant)
.smartActionClicked(entry, actionIndex, action, smartActions.fromAssistant)
headsUpManager.removeNotification(entry.key, true /* releaseImmediately */)
}
}
}
interface SmartReplyInflater {

View File

@@ -241,6 +241,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
@Test
public void testBindNotification_SetsShortcutIcon() {
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -265,6 +266,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
public void testBindNotification_SetsTextApplicationName() {
when(mMockPackageManager.getApplicationLabel(any())).thenReturn("App Name");
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -289,6 +291,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
@Test
public void testBindNotification_SetsTextChannelName() {
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mLauncherApps,
mMockPackageManager,
@@ -316,6 +319,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
mConversationChannel.setGroup(group.getId());
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -341,6 +345,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
@Test
public void testBindNotification_GroupNameHiddenIfNoGroup() {
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -365,6 +370,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
@Test
public void testBindNotification_noDelegate() {
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -400,6 +406,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
.setShortcutInfo(mShortcutInfo)
.build();
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -425,6 +432,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
public void testBindNotification_SetsOnClickListenerForSettings() {
final CountDownLatch latch = new CountDownLatch(1);
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -454,6 +462,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
@Test
public void testBindNotification_SettingsButtonInvisibleWhenNoClickListener() {
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -478,6 +487,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
public void testBindNotification_SettingsButtonInvisibleWhenDeviceUnprovisioned() {
final CountDownLatch latch = new CountDownLatch(1);
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -506,6 +516,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
mConversationChannel.setImportance(IMPORTANCE_LOW);
mConversationChannel.setImportantConversation(true);
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -534,6 +545,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
mConversationChannel.setImportantConversation(false);
mConversationChannel.setAllowBubbles(true);
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -565,6 +577,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
mConversationChannel.setImportantConversation(false);
mConversationChannel.setAllowBubbles(true);
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -595,6 +608,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
mConversationChannel.setImportantConversation(false);
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -639,6 +653,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
mConversationChannel.setImportance(IMPORTANCE_LOW);
mConversationChannel.setImportantConversation(false);
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -682,6 +697,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
mConversationChannel.setImportantConversation(false);
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -726,6 +742,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
mConversationChannel.setImportantConversation(false);
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -763,6 +780,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
mConversationChannel.setImportance(9);
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -799,6 +817,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
mConversationChannel.setImportantConversation(true);
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -831,12 +850,76 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
assertTrue(captor.getValue().isImportantConversation());
}
@Test
public void testDefaultSelectedWhenChannelIsDefault() throws Exception {
// GIVEN channel importance indicates "Default" priority
mConversationChannel.setImportance(IMPORTANCE_HIGH);
mConversationChannel.setImportantConversation(false);
// WHEN we indicate no selected action
mNotificationInfo.bindNotification(
-1, // no action selected by default
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
mOnUserInteractionCallback,
TEST_PACKAGE_NAME,
mNotificationChannel,
mEntry,
mBubbleMetadata,
null,
null,
mIconFactory,
mContext,
mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager));
// THEN the selected action is -1, so the selected option is "Default" priority
assertEquals(mNotificationInfo.getSelectedAction(), -1);
assertTrue(mNotificationInfo.findViewById(R.id.default_behavior).isSelected());
}
@Test
public void testFavoriteSelectedWhenChannelIsDefault() throws Exception {
// GIVEN channel importance indicates "Default" priority
mConversationChannel.setImportance(IMPORTANCE_HIGH);
mConversationChannel.setImportantConversation(false);
// WHEN we indicate the selected action should be "Favorite"
mNotificationInfo.bindNotification(
NotificationConversationInfo.ACTION_FAVORITE, // "Favorite" selected by default
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
mOnUserInteractionCallback,
TEST_PACKAGE_NAME,
mNotificationChannel,
mEntry,
mBubbleMetadata,
null,
null,
mIconFactory,
mContext,
mBuilderProvider,
true,
mTestHandler,
mTestHandler, null, Optional.of(mBubblesManager));
// THEN the selected action is "Favorite", so the selected option is "priority" priority
assertEquals(mNotificationInfo.getSelectedAction(),
NotificationConversationInfo.ACTION_FAVORITE);
assertTrue(mNotificationInfo.findViewById(R.id.priority).isSelected());
}
@Test
public void testDefault_andSave() throws Exception {
mConversationChannel.setAllowBubbles(true);
mConversationChannel.setOriginalImportance(IMPORTANCE_HIGH);
mConversationChannel.setImportantConversation(true);
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -873,6 +956,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
mConversationChannel.setOriginalImportance(IMPORTANCE_HIGH);
mConversationChannel.setImportantConversation(false);
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -909,6 +993,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
mConversationChannel.setOriginalImportance(IMPORTANCE_HIGH);
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -944,6 +1029,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
mConversationChannel.setAllowBubbles(true);
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -978,6 +1064,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
@Test
public void testBindNotification_createsNewChannel() throws Exception {
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -1003,6 +1090,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
public void testBindNotification_doesNotCreateNewChannelIfExists() throws Exception {
mNotificationChannel.setConversationId("", CONVERSATION_ID);
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -1038,6 +1126,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
// GIVEN the user is changing conversation settings
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,
@@ -1078,6 +1167,7 @@ public class NotificationConversationInfoTest extends SysuiTestCase {
when(b.build()).thenReturn(controller);
mNotificationInfo.bindNotification(
-1,
mShortcutManager,
mMockPackageManager,
mMockINotificationManager,