From e121b23c169fc4911ecd5118b29ea81370f7d85e Mon Sep 17 00:00:00 2001 From: Uchenna Okoye Date: Thu, 30 Sep 2021 14:05:55 -0700 Subject: Fix UI changes Messages content lost after tap Mute, and messages no longer displayed in Notification center Update conversation "mute" behavior RCS message content with text+image disappears All Messages Database read in First Received Message - If MSG DB has unread Messages Add "tap to read aloud" to Car Messenger Old messages read out along with the new message Bug: 182834412, 197153672, 197532449, 199747755, 200687249, 200689447 PiperOrigin-RevId: 400019901 Change-Id: I2a893b45ee45208fe8bb9469ae0a72016da1ed68 --- AndroidManifest.xml | 4 +-- res/drawable/ic_reply.xml | 27 +++++++++++++++ res/drawable/ic_subtitle_play.xml | 25 ++++++++++++++ res/layout/conversation_list_item.xml | 23 ++++--------- res/values/config.xml | 2 +- res/values/strings.xml | 10 ++++-- res/values/styles.xml | 8 +++-- .../car/messenger/core/interfaces/DataModel.java | 2 ++ .../messenger/core/shared/NotificationHandler.java | 9 ++--- .../ConversationItemViewHolder.java | 20 ++++++++++-- .../conversationlist/ConversationListFragment.java | 14 +++++++- .../ConversationListViewModel.java | 38 +++++++++++++--------- .../UIConversationItemConverter.java | 22 +++++-------- .../core/ui/launcher/MessageLauncherActivity.java | 2 +- .../core/ui/launcher/MessageLauncherViewModel.java | 7 ++-- .../android/car/messenger/core/util/VoiceUtil.java | 15 --------- .../impl/datamodels/ContentProviderLiveData.java | 2 ++ .../ConversationsPerDeviceFetchManager.java | 3 ++ .../impl/datamodels/NewMessageLiveData.java | 7 ++++ .../impl/datamodels/TelephonyDataModel.java | 5 ++- .../impl/datamodels/UserAccountLiveData.java | 3 ++ .../impl/datamodels/util/MessageUtils.java | 29 ++++++----------- .../messenger/impl/datamodels/util/MmsUtils.java | 1 + 23 files changed, 178 insertions(+), 100 deletions(-) create mode 100644 res/drawable/ic_reply.xml create mode 100644 res/drawable/ic_subtitle_play.xml diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 8787f44..d48bd17 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -28,9 +28,9 @@ + android:screenOrientation="landscape" + android:launchMode="singleTask"> diff --git a/res/drawable/ic_reply.xml b/res/drawable/ic_reply.xml new file mode 100644 index 0000000..33dcc9c --- /dev/null +++ b/res/drawable/ic_reply.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/res/drawable/ic_subtitle_play.xml b/res/drawable/ic_subtitle_play.xml new file mode 100644 index 0000000..9eccfaf --- /dev/null +++ b/res/drawable/ic_subtitle_play.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/res/layout/conversation_list_item.xml b/res/layout/conversation_list_item.xml index 1240337..3739d9d 100644 --- a/res/layout/conversation_list_item.xml +++ b/res/layout/conversation_list_item.xml @@ -52,16 +52,15 @@ limitations under the License. android:background="?android:attr/selectableItemBackground" android:contentDescription="@string/cd_reply_action_button" android:scaleType="center" - android:src="@drawable/car_ui_icon_reply" + android:src="@drawable/ic_reply" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@id/mute_action_button" - app:layout_constraintStart_toEndOf="@id/guideline_end" + app:layout_constraintEnd_toEndOf="parent" android:visibility="visible" app:layout_constraintTop_toTopOf="parent" /> @@ -78,13 +76,14 @@ limitations under the License. android:id="@+id/mute_action_button" android:layout_width="0dp" android:layout_height="match_parent" + android:visibility="gone" android:background="?android:attr/selectableItemBackground" android:contentDescription="@string/cd_mute_button" android:scaleType="center" android:src="@drawable/car_ui_icon_toggle_mute" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@id/guideline_mid" + app:layout_constraintStart_toEndOf="@id/guideline_end" app:layout_constraintTop_toTopOf="parent" /> - - diff --git a/res/values/config.xml b/res/values/config.xml index 849ef92..c44885f 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -18,7 +18,7 @@ false true true - false + true - Car Messenger + SMS Bluetooth disconnected + No messages + Connect to Bluetooth - No messages + Replied + + + Tap to read aloud - Replied ยท Reply Mute diff --git a/res/values/styles.xml b/res/values/styles.xml index 0e8c798..8845c0a 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -17,7 +17,11 @@ + + @@ -103,4 +107,4 @@ center @dimen/hero_button_corner_radius - + \ No newline at end of file diff --git a/src/com/android/car/messenger/core/interfaces/DataModel.java b/src/com/android/car/messenger/core/interfaces/DataModel.java index 93a728f..2822ecf 100644 --- a/src/com/android/car/messenger/core/interfaces/DataModel.java +++ b/src/com/android/car/messenger/core/interfaces/DataModel.java @@ -18,8 +18,10 @@ package com.android.car.messenger.core.interfaces; import androidx.annotation.NonNull; import androidx.lifecycle.LiveData; + import com.android.car.messenger.common.Conversation; import com.android.car.messenger.core.models.UserAccount; + import java.util.Collection; /** diff --git a/src/com/android/car/messenger/core/shared/NotificationHandler.java b/src/com/android/car/messenger/core/shared/NotificationHandler.java index f9836ec..ddee570 100644 --- a/src/com/android/car/messenger/core/shared/NotificationHandler.java +++ b/src/com/android/car/messenger/core/shared/NotificationHandler.java @@ -73,21 +73,18 @@ public class NotificationHandler { Notification notification = ConversationPayloadHandler.createNotificationFromConversation( context, channelId, tapToReadConversation, R.drawable.ic_message, null); - notification.contentIntent = createServiceIntent(); - + notification.contentIntent = createContentIntent(); notificationManager.notify(tapToReadConversation.getId().hashCode(), notification); } - private static PendingIntent createServiceIntent() { + private static PendingIntent createContentIntent() { Context context = AppFactory.get().getContext(); - Intent intent = new Intent(context, MessageLauncherActivity.class) .addFlags( Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP - | Intent.FLAG_ACTIVITY_SINGLE_TOP) - .setClass(context, MessengerService.class); + | Intent.FLAG_ACTIVITY_SINGLE_TOP); return PendingIntent.getActivity( context, diff --git a/src/com/android/car/messenger/core/ui/conversationlist/ConversationItemViewHolder.java b/src/com/android/car/messenger/core/ui/conversationlist/ConversationItemViewHolder.java index cb7f324..4f4de71 100644 --- a/src/com/android/car/messenger/core/ui/conversationlist/ConversationItemViewHolder.java +++ b/src/com/android/car/messenger/core/ui/conversationlist/ConversationItemViewHolder.java @@ -16,12 +16,16 @@ package com.android.car.messenger.core.ui.conversationlist; +import android.content.Context; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import androidx.recyclerview.widget.RecyclerView; import android.view.View; import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import com.android.car.messenger.R; @@ -106,15 +110,19 @@ public class ConversationItemViewHolder extends RecyclerView.ViewHolder { } private void setUpTextAppearance(@NonNull UIConversationItem uiData) { + Context context = AppFactory.get().getContext(); if (uiData.shouldUseUnreadTheme()) { mTitleView.setTextAppearance(R.style.TextAppearance_MessageHistoryUnreadTitle); - mPreviewTextView.setTextAppearance(R.style.TextAppearance_MessageHistoryTextPreview); + mPreviewTextView.setTextAppearance( + R.style.TextAppearance_MessageHistoryTextPreviewUnread); mTextMetadataView.setTextAppearance( R.style.TextAppearance_MessageHistoryUnreadMetadata); mTextMetadataDotView.setTextAppearance( R.style.TextAppearance_MessageHistoryUnreadMetadata); mDateTimeView.setTextAppearance(R.style.TextAppearance_MessageHistoryUnreadMetadata); - mDotSeparatorView.setTextAppearance(R.style.TextAppearance_MessageHistoryTextPreview); + mDotSeparatorView.setTextAppearance( + R.style.TextAppearance_MessageHistoryTextPreviewUnread); + updateSubtitleIcon(context.getColor(R.color.unread_color)); ViewUtils.setVisible(mUnreadIconIndicator, /* visible= */ true); } else { mTitleView.setTextAppearance(R.style.TextAppearance_MessageHistoryTitle); @@ -124,14 +132,20 @@ public class ConversationItemViewHolder extends RecyclerView.ViewHolder { R.style.TextAppearance_MessageHistoryTextPreview); mDateTimeView.setTextAppearance(R.style.TextAppearance_MessageHistoryTextPreview); mDotSeparatorView.setTextAppearance(R.style.TextAppearance_MessageHistoryTextPreview); + updateSubtitleIcon(context.getColor(R.color.secondary_text_color)); ViewUtils.setVisible(mUnreadIconIndicator, /* visible= */ false); } } + private void updateSubtitleIcon(@ColorInt int color) { + PorterDuffColorFilter porterDuffColorFilter = + new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP); + mSubtitleIconView.getDrawable().setColorFilter(porterDuffColorFilter); + } + private void updateMuteButton(boolean isMuted) { int drawableRes = isMuted ? R.drawable.ic_unmute : R.drawable.ic_mute; Drawable drawable = AppFactory.get().getContext().getDrawable(drawableRes); - mMuteActionButton.setImageDrawable(drawable); } diff --git a/src/com/android/car/messenger/core/ui/conversationlist/ConversationListFragment.java b/src/com/android/car/messenger/core/ui/conversationlist/ConversationListFragment.java index b00fb5f..bc27889 100644 --- a/src/com/android/car/messenger/core/ui/conversationlist/ConversationListFragment.java +++ b/src/com/android/car/messenger/core/ui/conversationlist/ConversationListFragment.java @@ -16,13 +16,13 @@ package com.android.car.messenger.core.ui.conversationlist; import android.app.Activity; -import androidx.lifecycle.ViewModelProvider; import android.content.Intent; import android.os.Bundle; import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; import com.android.car.messenger.R; import com.android.car.messenger.common.Conversation; @@ -110,6 +110,15 @@ public class ConversationListFragment extends MessageListBaseFragment R.string.connect_bluetooth_button_text, v -> startActivity(launchIntent), true); + removeMenuItems(); + } + + private void removeMenuItems() { + Activity activity = getActivity(); + if (activity == null || mToolbar == null) { + return; + } + mToolbar.setMenuItems(new ArrayList<>()); } private void setMenuItems() { @@ -117,6 +126,9 @@ public class ConversationListFragment extends MessageListBaseFragment if (activity == null || mUserAccount == null || mToolbar == null) { return; } + if (!mToolbar.getMenuItems().isEmpty()) { + return; + } if (!getResources().getBoolean(R.bool.direct_send_supported)) { return; } diff --git a/src/com/android/car/messenger/core/ui/conversationlist/ConversationListViewModel.java b/src/com/android/car/messenger/core/ui/conversationlist/ConversationListViewModel.java index 6b5d199..e16bff5 100644 --- a/src/com/android/car/messenger/core/ui/conversationlist/ConversationListViewModel.java +++ b/src/com/android/car/messenger/core/ui/conversationlist/ConversationListViewModel.java @@ -18,19 +18,23 @@ package com.android.car.messenger.core.ui.conversationlist; import android.annotation.SuppressLint; import android.app.Application; -import androidx.lifecycle.AndroidViewModel; import android.car.drivingstate.CarUxRestrictions; +import android.util.Pair; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import androidx.lifecycle.MediatorLiveData; +import androidx.lifecycle.Transformations; +import com.android.car.messenger.common.Conversation; import com.android.car.messenger.core.interfaces.AppFactory; import com.android.car.messenger.core.interfaces.DataModel; import com.android.car.messenger.core.models.UserAccount; import com.android.car.messenger.core.util.L; +import java.util.Collection; import java.util.List; import java.util.stream.Collectors; @@ -77,20 +81,10 @@ public class ConversationListViewModel extends AndroidViewModel { MediatorLiveData mutableLiveData = new MediatorLiveData<>(); mutableLiveData.postValue(UIConversationLog.getLoadingState()); mutableLiveData.addSource( - AppFactory.get().getCarStateListener().getUxrRestrictions(), - uxrRestrictions -> - subscribeToConversations(userAccount, mutableLiveData, uxrRestrictions)); - return mutableLiveData; - } - - private void subscribeToConversations( - @NonNull UserAccount userAccount, - MediatorLiveData mutableLiveData, - CarUxRestrictions uxRestrictions) { - L.w("Got new ux restrictions: " + uxRestrictions); - mutableLiveData.addSource( - mDataModel.getConversations(userAccount), - list -> { + subscribeToConversations(userAccount), + pair -> { + CarUxRestrictions uxRestrictions = pair.first; + Collection list = pair.second; List data = list.stream() .map( @@ -102,5 +96,19 @@ public class ConversationListViewModel extends AndroidViewModel { UIConversationLog log = UIConversationLog.getLoadedState(data); mutableLiveData.postValue(log); }); + return mutableLiveData; + } + + private LiveData>> subscribeToConversations( + @NonNull UserAccount userAccount) { + final LiveData> liveData = + mDataModel.getConversations(userAccount); + return Transformations.switchMap( + AppFactory.get().getCarStateListener().getUxrRestrictions(), + uxRestrictions -> { + L.d("Got new ux restrictions: " + uxRestrictions); + return Transformations.map( + liveData, conversations -> new Pair<>(uxRestrictions, conversations)); + }); } } diff --git a/src/com/android/car/messenger/core/ui/conversationlist/UIConversationItemConverter.java b/src/com/android/car/messenger/core/ui/conversationlist/UIConversationItemConverter.java index 00f2a71..baa7056 100644 --- a/src/com/android/car/messenger/core/ui/conversationlist/UIConversationItemConverter.java +++ b/src/com/android/car/messenger/core/ui/conversationlist/UIConversationItemConverter.java @@ -42,12 +42,10 @@ public class UIConversationItemConverter { long timestamp = ConversationUtil.getConversationTimestamp(conversation); boolean isReplied = ConversationUtil.isReplied(conversation); - Drawable subtitleIcon = null; - - // show reply icon to the side when replied - if (isReplied) { - subtitleIcon = context.getDrawable(R.drawable.car_ui_icon_reply); - } + Drawable subtitleIcon = + isReplied + ? context.getDrawable(R.drawable.car_ui_icon_reply) + : context.getDrawable(R.drawable.ic_subtitle_play); boolean showTextPreview = (carUxRestrictions.getActiveRestrictions() @@ -64,6 +62,8 @@ public class UIConversationItemConverter { } } else { if (isUnread) { + // in place of text preview, we show "tap to read aloud" when unread + textPreview = context.getString(R.string.tap_to_read_aloud); textMetadata = getNumberOfUnreadMessages(context, conversation.getUnreadCount()); } else if (isReplied) { textMetadata = context.getString(R.string.replied); @@ -72,10 +72,6 @@ public class UIConversationItemConverter { } } - boolean showPlayIcon = isUnread; - boolean showReplyIcon = - !showPlayIcon && context.getResources().getBoolean(R.bool.direct_reply_supported); - return new UIConversationItem( conversation.getId(), Objects.requireNonNull(conversation.getConversationTitle()), @@ -84,9 +80,9 @@ public class UIConversationItemConverter { textMetadata, timestamp, getConversationAvatar(context, conversation), - /* showMuteIcon= */ true, - /* showReplyIcon= */ showReplyIcon, - /* showPlayIcon= */ showPlayIcon, + /* showMuteIcon= */ false, + /* showReplyIcon= */ true, + /* showPlayIcon= */ false, isUnread, conversation.isMuted(), conversation); diff --git a/src/com/android/car/messenger/core/ui/launcher/MessageLauncherActivity.java b/src/com/android/car/messenger/core/ui/launcher/MessageLauncherActivity.java index 14c1951..0c114cc 100644 --- a/src/com/android/car/messenger/core/ui/launcher/MessageLauncherActivity.java +++ b/src/com/android/car/messenger/core/ui/launcher/MessageLauncherActivity.java @@ -16,12 +16,12 @@ package com.android.car.messenger.core.ui.launcher; -import androidx.lifecycle.ViewModelProvider; import android.os.Bundle; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.annotation.NonNull; +import androidx.lifecycle.ViewModelProvider; import com.android.car.messenger.core.interfaces.AppFactory; import com.android.car.messenger.core.models.UserAccount; diff --git a/src/com/android/car/messenger/core/ui/launcher/MessageLauncherViewModel.java b/src/com/android/car/messenger/core/ui/launcher/MessageLauncherViewModel.java index 2df42c1..47503e6 100644 --- a/src/com/android/car/messenger/core/ui/launcher/MessageLauncherViewModel.java +++ b/src/com/android/car/messenger/core/ui/launcher/MessageLauncherViewModel.java @@ -17,14 +17,17 @@ package com.android.car.messenger.core.ui.launcher; import android.app.Application; -import androidx.lifecycle.AndroidViewModel; -import androidx.lifecycle.Transformations; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; +import androidx.lifecycle.Transformations; + import com.android.car.messenger.core.interfaces.AppFactory; import com.android.car.messenger.core.interfaces.DataModel; import com.android.car.messenger.core.models.UserAccount; + import java.util.List; import java.util.stream.Collectors; diff --git a/src/com/android/car/messenger/core/util/VoiceUtil.java b/src/com/android/car/messenger/core/util/VoiceUtil.java index bd7997b..7791b1b 100644 --- a/src/com/android/car/messenger/core/util/VoiceUtil.java +++ b/src/com/android/car/messenger/core/util/VoiceUtil.java @@ -29,7 +29,6 @@ import static com.android.car.assist.CarVoiceInteractionSession.VOICE_ACTION_REP import static com.android.car.assist.CarVoiceInteractionSession.VOICE_ACTION_SEND_SMS; import static com.android.car.messenger.core.shared.MessageConstants.ACTION_DIRECT_SEND; import static com.android.car.messenger.core.shared.MessageConstants.ACTION_MARK_AS_READ; -import static com.android.car.messenger.core.shared.MessageConstants.ACTION_MUTE; import static com.android.car.messenger.core.shared.MessageConstants.ACTION_REPLY; import static com.android.car.messenger.core.shared.MessageConstants.EXTRA_ACCOUNT_ID; import static com.android.car.messenger.core.shared.MessageConstants.EXTRA_CONVERSATION_KEY; @@ -189,23 +188,9 @@ public class VoiceUtil { markAsReadIntent), null); - final int muteIcon = R.drawable.car_ui_icon_toggle_mute; - final String muteString = context.getString(R.string.action_mute); - PendingIntent muteIntent = createServiceIntent(ACTION_MUTE, conversationKey, userAccountId); - ConversationAction muteAction = - new ConversationAction( - ActionType.ACTION_TYPE_MUTE, - new RemoteAction( - Icon.createWithResource(context, muteIcon), - muteString, - muteString, - muteIntent), - null); - List actions = new ArrayList<>(); actions.add(replyAction); actions.add(markAsReadAction); - actions.add(muteAction); builder.setActions(actions); return builder.build(); } diff --git a/src/com/android/car/messenger/impl/datamodels/ContentProviderLiveData.java b/src/com/android/car/messenger/impl/datamodels/ContentProviderLiveData.java index fbd6d14..bf3ebae 100644 --- a/src/com/android/car/messenger/impl/datamodels/ContentProviderLiveData.java +++ b/src/com/android/car/messenger/impl/datamodels/ContentProviderLiveData.java @@ -19,8 +19,10 @@ package com.android.car.messenger.impl.datamodels; import android.content.Context; import android.database.ContentObserver; import android.net.Uri; + import androidx.annotation.NonNull; import androidx.lifecycle.MediatorLiveData; + import com.android.car.messenger.core.interfaces.AppFactory; /** diff --git a/src/com/android/car/messenger/impl/datamodels/ConversationsPerDeviceFetchManager.java b/src/com/android/car/messenger/impl/datamodels/ConversationsPerDeviceFetchManager.java index 379e922..19689de 100644 --- a/src/com/android/car/messenger/impl/datamodels/ConversationsPerDeviceFetchManager.java +++ b/src/com/android/car/messenger/impl/datamodels/ConversationsPerDeviceFetchManager.java @@ -25,13 +25,16 @@ import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.telephony.SubscriptionInfo; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.LiveData; import androidx.lifecycle.MediatorLiveData; import androidx.lifecycle.Observer; + import com.android.car.messenger.core.interfaces.AppFactory; import com.android.car.messenger.core.models.UserAccount; + import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; diff --git a/src/com/android/car/messenger/impl/datamodels/NewMessageLiveData.java b/src/com/android/car/messenger/impl/datamodels/NewMessageLiveData.java index 05e5c57..2195bc5 100644 --- a/src/com/android/car/messenger/impl/datamodels/NewMessageLiveData.java +++ b/src/com/android/car/messenger/impl/datamodels/NewMessageLiveData.java @@ -125,6 +125,13 @@ public class NewMessageLiveData extends ContentProviderLiveData { Conversation conversation; try { conversation = fetchConversation(conversationId); + Instant offset = + Objects.requireNonNull( + mOffsetMap.getOrDefault( + userAccount.getId(), userAccount.getConnectionTime())); + conversation + .getMessages() + .removeIf(message -> message.getTimestamp() < offset.toEpochMilli()); conversation.getExtras().putInt(MessageConstants.EXTRA_ACCOUNT_ID, userAccount.getId()); } catch (CursorIndexOutOfBoundsException e) { L.w("Error occurred fetching conversation Id " + conversationId); diff --git a/src/com/android/car/messenger/impl/datamodels/TelephonyDataModel.java b/src/com/android/car/messenger/impl/datamodels/TelephonyDataModel.java index 40568cc..82a3d0a 100644 --- a/src/com/android/car/messenger/impl/datamodels/TelephonyDataModel.java +++ b/src/com/android/car/messenger/impl/datamodels/TelephonyDataModel.java @@ -18,15 +18,17 @@ package com.android.car.messenger.impl.datamodels; import static com.android.car.messenger.core.shared.MessageConstants.KEY_MUTED_CONVERSATIONS; -import androidx.lifecycle.Transformations; import android.content.ContentValues; import android.content.Context; import android.content.SharedPreferences; import android.net.Uri; import android.provider.Telephony; import android.telephony.SmsManager; + import androidx.annotation.NonNull; import androidx.lifecycle.LiveData; +import androidx.lifecycle.Transformations; + import com.android.car.messenger.common.Conversation; import com.android.car.messenger.core.interfaces.AppFactory; import com.android.car.messenger.core.interfaces.DataModel; @@ -34,6 +36,7 @@ import com.android.car.messenger.core.models.UserAccount; import com.android.car.messenger.core.util.L; import com.android.car.messenger.impl.datamodels.UserAccountLiveData.UserAccountChangeList; import com.android.car.messenger.impl.datamodels.util.CursorUtils; + import java.util.Collection; import java.util.HashSet; import java.util.Set; diff --git a/src/com/android/car/messenger/impl/datamodels/UserAccountLiveData.java b/src/com/android/car/messenger/impl/datamodels/UserAccountLiveData.java index feaecea..b5314dd 100644 --- a/src/com/android/car/messenger/impl/datamodels/UserAccountLiveData.java +++ b/src/com/android/car/messenger/impl/datamodels/UserAccountLiveData.java @@ -20,12 +20,15 @@ import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; import android.telephony.TelephonyManager; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.LiveData; + import com.android.car.messenger.core.interfaces.AppFactory; import com.android.car.messenger.core.models.UserAccount; import com.android.car.messenger.impl.datamodels.UserAccountLiveData.UserAccountChangeList; + import java.time.Instant; import java.util.ArrayList; import java.util.Collection; diff --git a/src/com/android/car/messenger/impl/datamodels/util/MessageUtils.java b/src/com/android/car/messenger/impl/datamodels/util/MessageUtils.java index 8da6318..555d91c 100644 --- a/src/com/android/car/messenger/impl/datamodels/util/MessageUtils.java +++ b/src/com/android/car/messenger/impl/datamodels/util/MessageUtils.java @@ -130,6 +130,16 @@ public final class MessageUtils { L.d("Message was not able to be parsed. Skipping."); continue; } + if (message.getText().trim().isEmpty()) { + // There are occasions where a user may send + // a text message plus an image or audio and + // bluetooth will post two messages to the database (b/182834412), + // one with a text and one blank + // This leads to boomerang notifications, one with text and one that is empty. + // Validating or removing messages when blank is a mitigation on our end. + L.d("Message is blank. Skipped. "); + continue; + } if (message.getMessageType() == MessageType.MESSAGE_TYPE_SENT) { hasBeenRepliedTo = true; } @@ -137,25 +147,6 @@ public final class MessageUtils { } while (messageCursor.moveToNext() && moveToNext); } - /** - * Parses each message in the cursor and returns the item for further processing - * - * @param messageCursor The message cursor to be parsed for SMS and MMS messages and returns - * true for the method to continue parsing the cursor or false to return. - */ - @Nullable - public static Message parseCurrentMessage(@NonNull Cursor messageCursor) { - Message message = null; - Context context = AppFactory.get().getContext(); - try { - message = parseMessageAtPoint(context, messageCursor, false); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - L.d("Message was not able to be parsed. Skipping."); - } - return message; - } - /** * Parses message at the point in cursor. * diff --git a/src/com/android/car/messenger/impl/datamodels/util/MmsUtils.java b/src/com/android/car/messenger/impl/datamodels/util/MmsUtils.java index 808ce86..7f87e69 100644 --- a/src/com/android/car/messenger/impl/datamodels/util/MmsUtils.java +++ b/src/com/android/car/messenger/impl/datamodels/util/MmsUtils.java @@ -82,6 +82,7 @@ class MmsUtils { stringBuilder.append(cursor.getString(cursor.getColumnIndex(Part.TEXT))); stringBuilder.append(" "); } + return stringBuilder.toString().replace(REPLACE_CHARS, ""); } -- cgit v1.2.3