From f287bdaef488f230118c8fc450b33c67b7f94f85 Mon Sep 17 00:00:00 2001 From: Shen Lin Date: Tue, 27 Sep 2022 21:25:08 +0800 Subject: [PATCH] Fix potential NPE when MessagingMessage's message is null message.getMessage() is nullable because it may be recycled, so we have to add null check before calling its reference. This can affect several messaging related layout classes. Bug: 249260110 Test: manual and atest Change-Id: I9ac68ab0edca5a5a1a46acfae9bcd52be51ea612 --- .../com/android/internal/widget/ConversationLayout.java | 6 ++++-- core/java/com/android/internal/widget/MessagingGroup.java | 4 +++- core/java/com/android/internal/widget/MessagingLayout.java | 3 ++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/core/java/com/android/internal/widget/ConversationLayout.java b/core/java/com/android/internal/widget/ConversationLayout.java index 4706affa3541a..8b1657b50139f 100644 --- a/core/java/com/android/internal/widget/ConversationLayout.java +++ b/core/java/com/android/internal/widget/ConversationLayout.java @@ -924,7 +924,8 @@ public class ConversationLayout extends FrameLayout message = messages.get(i - histSize); } boolean isNewGroup = currentGroup == null; - Person sender = message.getMessage().getSenderPerson(); + Person sender = + message.getMessage() == null ? null : message.getMessage().getSenderPerson(); CharSequence key = getKey(sender); isNewGroup |= !TextUtils.equals(key, currentSenderKey); if (isNewGroup) { @@ -1187,7 +1188,8 @@ public class ConversationLayout extends FrameLayout return null; } final MessagingMessage messagingMessage = mMessages.get(mMessages.size() - 1); - final CharSequence text = messagingMessage.getMessage().getText(); + final CharSequence text = messagingMessage.getMessage() == null ? null + : messagingMessage.getMessage().getText(); if (text == null && messagingMessage instanceof MessagingImageMessage) { final String unformatted = getResources().getString(R.string.conversation_single_line_image_placeholder); diff --git a/core/java/com/android/internal/widget/MessagingGroup.java b/core/java/com/android/internal/widget/MessagingGroup.java index 146cb3fadaacc..30e4099f9a6fd 100644 --- a/core/java/com/android/internal/widget/MessagingGroup.java +++ b/core/java/com/android/internal/widget/MessagingGroup.java @@ -492,7 +492,9 @@ public class MessagingGroup extends LinearLayout implements MessagingLinearLayou int color = mSendingSpinnerContainer.getVisibility() == View.VISIBLE ? mSendingTextColor : mTextColor; for (MessagingMessage message : mMessages) { - message.setColor(message.getMessage().isRemoteInputHistory() ? color : mTextColor); + final boolean isRemoteInputHistory = + message.getMessage() != null && message.getMessage().isRemoteInputHistory(); + message.setColor(isRemoteInputHistory ? color : mTextColor); } } } diff --git a/core/java/com/android/internal/widget/MessagingLayout.java b/core/java/com/android/internal/widget/MessagingLayout.java index 9ac6ef77bc076..a270b28e4e801 100644 --- a/core/java/com/android/internal/widget/MessagingLayout.java +++ b/core/java/com/android/internal/widget/MessagingLayout.java @@ -470,7 +470,8 @@ public class MessagingLayout extends FrameLayout message = messages.get(i - histSize); } boolean isNewGroup = currentGroup == null; - Person sender = message.getMessage().getSenderPerson(); + Person sender = + message.getMessage() == null ? null : message.getMessage().getSenderPerson(); CharSequence key = sender == null ? null : sender.getKey() == null ? sender.getName() : sender.getKey(); isNewGroup |= !TextUtils.equals(key, currentSenderKey);