Merge "Introduce PrecomputedText version of MessagingTextMessage" into udc-qpr-dev

This commit is contained in:
Ibrahim Yilmaz
2023-08-16 14:47:47 +00:00
committed by Android (Google) Code Review
5 changed files with 87 additions and 33 deletions

View File

@@ -410,9 +410,11 @@ public class ConversationLayout extends FrameLayout
// convert MessagingStyle.Message to MessagingMessage, re-using ones from a previous binding
// if they exist
final List<MessagingMessage> newMessagingMessages =
createMessages(newMessages, false /* isHistoric */);
createMessages(newMessages, /* isHistoric= */false,
/* usePrecomputedText= */false);
final List<MessagingMessage> newHistoricMessagingMessages =
createMessages(newHistoricMessages, true /* isHistoric */);
createMessages(newHistoricMessages, /* isHistoric= */true,
/* usePrecomputedText= */false);
// bind it, baby
bindViews(user, showSpinner, unreadCount,
newMessagingMessages,
@@ -981,15 +983,17 @@ public class ConversationLayout extends FrameLayout
* @param newMessages the messages to parse.
*/
private List<MessagingMessage> createMessages(
List<Notification.MessagingStyle.Message> newMessages, boolean historic) {
List<Notification.MessagingStyle.Message> newMessages, boolean isHistoric,
boolean usePrecomputedText) {
List<MessagingMessage> result = new ArrayList<>();
for (int i = 0; i < newMessages.size(); i++) {
Notification.MessagingStyle.Message m = newMessages.get(i);
MessagingMessage message = findAndRemoveMatchingMessage(m);
if (message == null) {
message = MessagingMessage.createMessage(this, m, mImageResolver);
message = MessagingMessage.createMessage(this, m,
mImageResolver, usePrecomputedText);
}
message.setIsHistoric(historic);
message.setIsHistoric(isHistoric);
result.add(message);
}
return result;

View File

@@ -93,8 +93,9 @@ public class MessagingImageMessage extends ImageView implements MessagingMessage
}
@Override
public boolean setMessage(Notification.MessagingStyle.Message message) {
MessagingMessage.super.setMessage(message);
public boolean setMessage(Notification.MessagingStyle.Message message,
boolean usePrecomputedText) {
MessagingMessage.super.setMessage(message, usePrecomputedText);
Drawable drawable;
try {
Uri uri = message.getDataUri();
@@ -114,32 +115,42 @@ public class MessagingImageMessage extends ImageView implements MessagingMessage
}
mDrawable = drawable;
mAspectRatio = ((float) mDrawable.getIntrinsicWidth()) / intrinsicHeight;
setImageDrawable(drawable);
setContentDescription(message.getText());
if (!usePrecomputedText) {
finalizeInflate();
}
return true;
}
static MessagingMessage createMessage(IMessagingLayout layout,
Notification.MessagingStyle.Message m, ImageResolver resolver) {
Notification.MessagingStyle.Message m, ImageResolver resolver,
boolean usePrecomputedText) {
MessagingLinearLayout messagingLinearLayout = layout.getMessagingLinearLayout();
MessagingImageMessage createdMessage = sInstancePool.acquire();
if (createdMessage == null) {
createdMessage = (MessagingImageMessage) LayoutInflater.from(
layout.getContext()).inflate(
R.layout.notification_template_messaging_image_message,
messagingLinearLayout,
false);
R.layout.notification_template_messaging_image_message,
messagingLinearLayout,
false);
createdMessage.addOnLayoutChangeListener(MessagingLayout.MESSAGING_PROPERTY_ANIMATOR);
}
createdMessage.setImageResolver(resolver);
boolean created = createdMessage.setMessage(m);
if (!created) {
// MessagingImageMessage does not use usePrecomputedText.
boolean populated = createdMessage.setMessage(m, /* usePrecomputedText= */false);
if (!populated) {
createdMessage.recycle();
return MessagingTextMessage.createMessage(layout, m);
return MessagingTextMessage.createMessage(layout, m, usePrecomputedText);
}
return createdMessage;
}
@Override
public void finalizeInflate() {
setImageDrawable(mDrawable);
setContentDescription(getMessage().getText());
}
private void setImageResolver(ImageResolver resolver) {
mImageResolver = resolver;
}

View File

@@ -178,9 +178,9 @@ public class MessagingLayout extends FrameLayout
extras.getBoolean(Notification.EXTRA_SHOW_REMOTE_INPUT_SPINNER, false);
final List<MessagingMessage> historicMessagingMessages = createMessages(newHistoricMessages,
true /* isHistoric */);
/* isHistoric= */true, /* usePrecomputedText= */ false);
final List<MessagingMessage> newMessagingMessages =
createMessages(newMessages, false /* isHistoric */);
createMessages(newMessages, /* isHistoric= */false, /* usePrecomputedText= */false);
bindViews(user, showSpinner, historicMessagingMessages, newMessagingMessages);
}
@@ -518,15 +518,17 @@ public class MessagingLayout extends FrameLayout
* @param newMessages the messages to parse.
*/
private List<MessagingMessage> createMessages(
List<Notification.MessagingStyle.Message> newMessages, boolean historic) {
List<Notification.MessagingStyle.Message> newMessages, boolean isHistoric,
boolean usePrecomputedText) {
List<MessagingMessage> result = new ArrayList<>();
for (int i = 0; i < newMessages.size(); i++) {
Notification.MessagingStyle.Message m = newMessages.get(i);
MessagingMessage message = findAndRemoveMatchingMessage(m);
if (message == null) {
message = MessagingMessage.createMessage(this, m, mImageResolver);
message = MessagingMessage.createMessage(this, m,
mImageResolver, usePrecomputedText);
}
message.setIsHistoric(historic);
message.setIsHistoric(isHistoric);
result.add(message);
}
return result;

View File

@@ -34,11 +34,12 @@ public interface MessagingMessage extends MessagingLinearLayout.MessagingChild {
String IMAGE_MIME_TYPE_PREFIX = "image/";
static MessagingMessage createMessage(IMessagingLayout layout,
Notification.MessagingStyle.Message m, ImageResolver resolver) {
Notification.MessagingStyle.Message m, ImageResolver resolver,
boolean usePrecomputedText) {
if (hasImage(m) && !ActivityManager.isLowRamDeviceStatic()) {
return MessagingImageMessage.createMessage(layout, m, resolver);
return MessagingImageMessage.createMessage(layout, m, resolver, usePrecomputedText);
} else {
return MessagingTextMessage.createMessage(layout, m);
return MessagingTextMessage.createMessage(layout, m, usePrecomputedText);
}
}
@@ -55,9 +56,11 @@ public interface MessagingMessage extends MessagingLinearLayout.MessagingChild {
/**
* Set a message for this view.
*
* @return true if setting the message worked
*/
default boolean setMessage(Notification.MessagingStyle.Message message) {
default boolean setMessage(Notification.MessagingStyle.Message message,
boolean usePrecomputedText) {
getState().setMessage(message);
return true;
}
@@ -151,4 +154,10 @@ public interface MessagingMessage extends MessagingLinearLayout.MessagingChild {
void setVisibility(int visibility);
int getVisibility();
/**
* Finalize inflation of the MessagingMessages, which should be called on Main Thread.
* @hide
*/
void finalizeInflate();
}

View File

@@ -23,7 +23,9 @@ import android.annotation.StyleRes;
import android.app.Notification;
import android.content.Context;
import android.text.Layout;
import android.text.PrecomputedText;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.widget.RemoteViews;
@@ -35,10 +37,13 @@ import com.android.internal.R;
@RemoteViews.RemoteView
public class MessagingTextMessage extends ImageFloatingTextView implements MessagingMessage {
private static final String TAG = "MessagingTextMessage";
private static final MessagingPool<MessagingTextMessage> sInstancePool =
new MessagingPool<>(20);
private final MessagingMessageState mState = new MessagingMessageState(this);
private PrecomputedText mPrecomputedText = null;
public MessagingTextMessage(@NonNull Context context) {
super(context);
}
@@ -63,25 +68,32 @@ public class MessagingTextMessage extends ImageFloatingTextView implements Messa
}
@Override
public boolean setMessage(Notification.MessagingStyle.Message message) {
MessagingMessage.super.setMessage(message);
setText(message.getText());
public boolean setMessage(Notification.MessagingStyle.Message message,
boolean usePrecomputedText) {
MessagingMessage.super.setMessage(message, usePrecomputedText);
if (usePrecomputedText) {
mPrecomputedText = PrecomputedText.create(message.getText(), getTextMetricsParams());
} else {
setText(message.getText());
mPrecomputedText = null;
}
return true;
}
static MessagingMessage createMessage(IMessagingLayout layout,
Notification.MessagingStyle.Message m) {
Notification.MessagingStyle.Message m, boolean usePrecomputedText) {
MessagingLinearLayout messagingLinearLayout = layout.getMessagingLinearLayout();
MessagingTextMessage createdMessage = sInstancePool.acquire();
if (createdMessage == null) {
createdMessage = (MessagingTextMessage) LayoutInflater.from(
layout.getContext()).inflate(
R.layout.notification_template_messaging_text_message,
messagingLinearLayout,
false);
R.layout.notification_template_messaging_text_message,
messagingLinearLayout,
false);
createdMessage.addOnLayoutChangeListener(MessagingLayout.MESSAGING_PROPERTY_ANIMATOR);
}
createdMessage.setMessage(m);
createdMessage.setMessage(m, usePrecomputedText);
return createdMessage;
}
@@ -135,4 +147,20 @@ public class MessagingTextMessage extends ImageFloatingTextView implements Messa
public void setColor(int color) {
setTextColor(color);
}
@Override
public void finalizeInflate() {
try {
setText(mPrecomputedText != null ? mPrecomputedText
: getState().getMessage().getText());
} catch (IllegalArgumentException exception) {
Log.wtf(
/* tag = */ TAG,
/* msg = */ "PrecomputedText setText failed for TextView:" + this,
/* tr = */ exception
);
mPrecomputedText = null;
setText(getState().getMessage().getText());
}
}
}