summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/Notification.java54
-rw-r--r--core/java/com/android/internal/widget/MessagingLayout.java12
2 files changed, 44 insertions, 22 deletions
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 526888d09772..d09a1355381a 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -6566,22 +6566,33 @@ public class Notification implements Parcelable
* Helper class for generating large-format notifications that include multiple back-and-forth
* messages of varying types between any number of people.
*
- * <br>
+ * <p>
* If the platform does not provide large-format notifications, this method has no effect. The
* user will always see the normal notification view.
- * <br>
- * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like
- * so:
+ *
+ * <p>
+ * If the app is targeting Android P and above, it is required to use the {@link Person}
+ * class in order to get an optimal rendering of the notification and its avatars. For
+ * conversations involving multiple people, the app should also make sure that it marks the
+ * conversation as a group with {@link #setGroupConversation(boolean)}.
+ *
+ * <p>
+ * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior.
+ * Here's an example of how this may be used:
* <pre class="prettyprint">
*
+ * Person user = new Person.Builder().setIcon(userIcon).setName(userName).build();
+ * MessagingStyle style = new MessagingStyle(user)
+ * .addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getPerson())
+ * .addMessage(messages[2].getText(), messages[2].getTime(), messages[2].getPerson())
+ * .setGroupConversation(hasMultiplePeople());
+ *
* Notification noti = new Notification.Builder()
- * .setContentTitle(&quot;2 new messages wtih &quot; + sender.toString())
+ * .setContentTitle(&quot;2 new messages with &quot; + sender.toString())
* .setContentText(subject)
* .setSmallIcon(R.drawable.new_message)
* .setLargeIcon(aBitmap)
- * .setStyle(new Notification.MessagingStyle(resources.getString(R.string.reply_name))
- * .addMessage(messages[0].getText(), messages[0].getTime(), messages[0].getSender())
- * .addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getSender()))
+ * .setStyle(style)
* .build();
* </pre>
*/
@@ -6791,7 +6802,9 @@ public class Notification implements Parcelable
}
/**
- * Sets whether this conversation notification represents a group.
+ * Sets whether this conversation notification represents a group. If the app is targeting
+ * Android P, this is required if the app wants to display the largeIcon set with
+ * {@link Notification.Builder#setLargeIcon(Bitmap)}, otherwise it will be hidden.
*
* @param isGroupConversation {@code true} if the conversation represents a group,
* {@code false} otherwise.
@@ -7013,12 +7026,21 @@ public class Notification implements Parcelable
CharSequence conversationTitle = !TextUtils.isEmpty(super.mBigContentTitle)
? super.mBigContentTitle
: mConversationTitle;
- boolean isOneToOne = TextUtils.isEmpty(conversationTitle);
+ boolean atLeastP = mBuilder.mContext.getApplicationInfo().targetSdkVersion
+ >= Build.VERSION_CODES.P;
+ boolean isOneToOne;
CharSequence nameReplacement = null;
- if (hasOnlyWhiteSpaceSenders()) {
- isOneToOne = true;
- nameReplacement = conversationTitle;
- conversationTitle = null;
+ Icon avatarReplacement = null;
+ if (!atLeastP) {
+ isOneToOne = TextUtils.isEmpty(conversationTitle);
+ avatarReplacement = mBuilder.mN.mLargeIcon;
+ if (hasOnlyWhiteSpaceSenders()) {
+ isOneToOne = true;
+ nameReplacement = conversationTitle;
+ conversationTitle = null;
+ }
+ } else {
+ isOneToOne = !isGroupConversation();
}
TemplateBindResult bindResult = new TemplateBindResult();
RemoteViews contentView = mBuilder.applyStandardTemplateWithActions(
@@ -7041,8 +7063,8 @@ public class Notification implements Parcelable
mBuilder.getSecondaryTextColor());
contentView.setBoolean(R.id.status_bar_latest_event_content, "setDisplayImagesAtEnd",
displayImagesAtEnd);
- contentView.setIcon(R.id.status_bar_latest_event_content, "setLargeIcon",
- mBuilder.mN.mLargeIcon);
+ contentView.setIcon(R.id.status_bar_latest_event_content, "setAvatarReplacement",
+ avatarReplacement);
contentView.setCharSequence(R.id.status_bar_latest_event_content, "setNameReplacement",
nameReplacement);
contentView.setBoolean(R.id.status_bar_latest_event_content, "setIsOneToOne",
diff --git a/core/java/com/android/internal/widget/MessagingLayout.java b/core/java/com/android/internal/widget/MessagingLayout.java
index d468ce38709f..03a734d8537e 100644
--- a/core/java/com/android/internal/widget/MessagingLayout.java
+++ b/core/java/com/android/internal/widget/MessagingLayout.java
@@ -82,7 +82,7 @@ public class MessagingLayout extends FrameLayout {
private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private Paint mTextPaint = new Paint();
private CharSequence mConversationTitle;
- private Icon mLargeIcon;
+ private Icon mAvatarReplacement;
private boolean mIsOneToOne;
private ArrayList<MessagingGroup> mAddedGroups = new ArrayList<>();
private Person mUser;
@@ -125,8 +125,8 @@ public class MessagingLayout extends FrameLayout {
}
@RemotableViewMethod
- public void setLargeIcon(Icon icon) {
- mLargeIcon = icon;
+ public void setAvatarReplacement(Icon icon) {
+ mAvatarReplacement = icon;
}
@RemotableViewMethod
@@ -228,7 +228,7 @@ public class MessagingLayout extends FrameLayout {
boolean isOwnMessage = group.getSender() == mUser;
CharSequence senderName = group.getSenderName();
if (!group.needsGeneratedAvatar() || TextUtils.isEmpty(senderName)
- || (mIsOneToOne && mLargeIcon != null && !isOwnMessage)) {
+ || (mIsOneToOne && mAvatarReplacement != null && !isOwnMessage)) {
continue;
}
String symbol = uniqueNames.get(senderName);
@@ -246,8 +246,8 @@ public class MessagingLayout extends FrameLayout {
if (!group.needsGeneratedAvatar() || TextUtils.isEmpty(senderName)) {
continue;
}
- if (mIsOneToOne && mLargeIcon != null && group.getSender() != mUser) {
- group.setAvatar(mLargeIcon);
+ if (mIsOneToOne && mAvatarReplacement != null && group.getSender() != mUser) {
+ group.setAvatar(mAvatarReplacement);
} else {
Icon cachedIcon = cachedAvatars.get(senderName);
if (cachedIcon == null) {