Merge "Fixed the behavior of group conversations when targeting P" into pi-dev

am: c4e19963f4

Change-Id: I7e5feadc253816852528e06719e136a7cba51c49
This commit is contained in:
Selim Cinek
2018-05-25 13:21:38 -07:00
committed by android-build-merger
2 changed files with 44 additions and 22 deletions

View File

@@ -6601,22 +6601,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>
*/
@@ -6826,7 +6837,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.
@@ -7048,12 +7061,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(
@@ -7076,8 +7098,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",

View File

@@ -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) {