Merge "Display smart replies in notifications"
This commit is contained in:
committed by
Android (Google) Code Review
commit
c8d6489c65
@@ -22,6 +22,7 @@ import android.app.RemoteInput;
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
import android.os.Build;
|
||||
import android.provider.Settings;
|
||||
import android.service.notification.StatusBarNotification;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
@@ -31,6 +32,7 @@ import android.view.ViewGroup;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.internal.util.NotificationColorUtil;
|
||||
@@ -42,6 +44,7 @@ import com.android.systemui.statusbar.notification.NotificationUtils;
|
||||
import com.android.systemui.statusbar.notification.NotificationViewWrapper;
|
||||
import com.android.systemui.statusbar.phone.NotificationGroupManager;
|
||||
import com.android.systemui.statusbar.policy.RemoteInputView;
|
||||
import com.android.systemui.statusbar.policy.SmartReplyView;
|
||||
|
||||
/**
|
||||
* A frame layout containing the actual payload of the notification, including the contracted,
|
||||
@@ -72,6 +75,7 @@ public class NotificationContentView extends FrameLayout {
|
||||
|
||||
private RemoteInputView mExpandedRemoteInput;
|
||||
private RemoteInputView mHeadsUpRemoteInput;
|
||||
private SmartReplyView mExpandedSmartReplyView;
|
||||
|
||||
private NotificationViewWrapper mContractedWrapper;
|
||||
private NotificationViewWrapper mExpandedWrapper;
|
||||
@@ -1125,7 +1129,7 @@ public class NotificationContentView extends FrameLayout {
|
||||
if (mAmbientChild != null) {
|
||||
mAmbientWrapper.onContentUpdated(entry.row);
|
||||
}
|
||||
applyRemoteInput(entry);
|
||||
applyRemoteInputAndSmartReply(entry);
|
||||
updateLegacy();
|
||||
mForceSelectNextLayout = true;
|
||||
setDark(mDark, false /* animate */, 0 /* delay */);
|
||||
@@ -1157,20 +1161,34 @@ public class NotificationContentView extends FrameLayout {
|
||||
}
|
||||
}
|
||||
|
||||
private void applyRemoteInput(final NotificationData.Entry entry) {
|
||||
private void applyRemoteInputAndSmartReply(final NotificationData.Entry entry) {
|
||||
if (mRemoteInputController == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
boolean enableSmartReplies = Settings.Global.getInt(mContext.getContentResolver(),
|
||||
Settings.Global.ENABLE_SMART_REPLIES_IN_NOTIFICATIONS, 0) != 0;
|
||||
|
||||
boolean hasRemoteInput = false;
|
||||
RemoteInput remoteInputWithChoices = null;
|
||||
PendingIntent pendingIntentWithChoices = null;
|
||||
|
||||
Notification.Action[] actions = entry.notification.getNotification().actions;
|
||||
if (actions != null) {
|
||||
for (Notification.Action a : actions) {
|
||||
if (a.getRemoteInputs() != null) {
|
||||
for (RemoteInput ri : a.getRemoteInputs()) {
|
||||
if (ri.getAllowFreeFormInput()) {
|
||||
boolean showRemoteInputView = ri.getAllowFreeFormInput();
|
||||
boolean showSmartReplyView = enableSmartReplies && ri.getChoices() != null
|
||||
&& ri.getChoices().length > 0;
|
||||
if (showRemoteInputView) {
|
||||
hasRemoteInput = true;
|
||||
}
|
||||
if (showSmartReplyView) {
|
||||
remoteInputWithChoices = ri;
|
||||
pendingIntentWithChoices = a.actionIntent;
|
||||
}
|
||||
if (showRemoteInputView || showSmartReplyView) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1178,6 +1196,11 @@ public class NotificationContentView extends FrameLayout {
|
||||
}
|
||||
}
|
||||
|
||||
applyRemoteInput(entry, hasRemoteInput);
|
||||
applySmartReplyView(remoteInputWithChoices, pendingIntentWithChoices);
|
||||
}
|
||||
|
||||
private void applyRemoteInput(NotificationData.Entry entry, boolean hasRemoteInput) {
|
||||
View bigContentView = mExpandedChild;
|
||||
if (bigContentView != null) {
|
||||
mExpandedRemoteInput = applyRemoteInput(bigContentView, entry, hasRemoteInput,
|
||||
@@ -1274,6 +1297,40 @@ public class NotificationContentView extends FrameLayout {
|
||||
return null;
|
||||
}
|
||||
|
||||
private void applySmartReplyView(RemoteInput remoteInput, PendingIntent pendingIntent) {
|
||||
mExpandedSmartReplyView = mExpandedChild == null ?
|
||||
null : applySmartReplyView(mExpandedChild, remoteInput, pendingIntent);
|
||||
}
|
||||
|
||||
private SmartReplyView applySmartReplyView(
|
||||
View view, RemoteInput remoteInput, PendingIntent pendingIntent) {
|
||||
View smartReplyContainerCandidate = view.findViewById(
|
||||
com.android.internal.R.id.smart_reply_container);
|
||||
if (!(smartReplyContainerCandidate instanceof LinearLayout)) {
|
||||
return null;
|
||||
}
|
||||
LinearLayout smartReplyContainer = (LinearLayout) smartReplyContainerCandidate;
|
||||
if (remoteInput == null || pendingIntent == null) {
|
||||
smartReplyContainer.setVisibility(View.GONE);
|
||||
return null;
|
||||
}
|
||||
SmartReplyView smartReplyView = null;
|
||||
if (smartReplyContainer.getChildCount() == 0) {
|
||||
smartReplyView = SmartReplyView.inflate(mContext, smartReplyContainer);
|
||||
smartReplyContainer.addView(smartReplyView);
|
||||
} else if (smartReplyContainer.getChildCount() == 1) {
|
||||
View child = smartReplyContainer.getChildAt(0);
|
||||
if (child instanceof SmartReplyView) {
|
||||
smartReplyView = (SmartReplyView) child;
|
||||
}
|
||||
}
|
||||
if (smartReplyView != null) {
|
||||
smartReplyView.setRepliesFromRemoteInput(remoteInput, pendingIntent);
|
||||
smartReplyContainer.setVisibility(View.VISIBLE);
|
||||
}
|
||||
return smartReplyView;
|
||||
}
|
||||
|
||||
public void closeRemoteInput() {
|
||||
if (mHeadsUpRemoteInput != null) {
|
||||
mHeadsUpRemoteInput.close();
|
||||
|
||||
Reference in New Issue
Block a user