Implement better detection of text only messages.

This commit is contained in:
Lucio Maciel
2021-08-12 15:17:51 -03:00
committed by Cody Henthorne
parent fe8fcb1394
commit 4702ab1aeb
6 changed files with 144 additions and 98 deletions

View File

@@ -1,40 +0,0 @@
package org.thoughtcrime.securesms.util;
import androidx.annotation.NonNull;
import com.annimon.stream.Stream;
import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord;
import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
import org.thoughtcrime.securesms.mms.Slide;
public final class MessageRecordUtil {
private MessageRecordUtil() {
}
public static boolean isMediaMessage(@NonNull MessageRecord messageRecord) {
return messageRecord.isMms() &&
!messageRecord.isMmsNotification() &&
((MediaMmsMessageRecord)messageRecord).containsMediaSlide() &&
((MediaMmsMessageRecord)messageRecord).getSlideDeck().getStickerSlide() == null;
}
public static boolean hasSticker(@NonNull MessageRecord messageRecord) {
return messageRecord.isMms() && ((MmsMessageRecord)messageRecord).getSlideDeck().getStickerSlide() != null;
}
public static boolean hasSharedContact(@NonNull MessageRecord messageRecord) {
return messageRecord.isMms() && !((MmsMessageRecord)messageRecord).getSharedContacts().isEmpty();
}
public static boolean hasLocation(@NonNull MessageRecord messageRecord) {
return messageRecord.isMms() && Stream.of(((MmsMessageRecord) messageRecord).getSlideDeck().getSlides())
.anyMatch(Slide::hasLocation);
}
public static boolean hasAudio(MessageRecord messageRecord) {
return messageRecord.isMms() && ((MmsMessageRecord)messageRecord).getSlideDeck().getAudioSlide() != null;
}
}

View File

@@ -0,0 +1,108 @@
@file:JvmName("MessageRecordUtil")
package org.thoughtcrime.securesms.util
import android.content.Context
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord
import org.thoughtcrime.securesms.database.model.MessageRecord
import org.thoughtcrime.securesms.database.model.MmsMessageRecord
import org.thoughtcrime.securesms.stickers.StickerUrl
const val MAX_BODY_DISPLAY_LENGTH = 1000
fun MessageRecord.isMediaMessage(): Boolean {
return isMms &&
!isMmsNotification &&
(this as MediaMmsMessageRecord).containsMediaSlide() &&
slideDeck.stickerSlide == null
}
fun MessageRecord.hasSticker(): Boolean =
isMms && (this as MmsMessageRecord).slideDeck.stickerSlide != null
fun MessageRecord.hasSharedContact(): Boolean =
isMms && (this as MmsMessageRecord).sharedContacts.isNotEmpty()
fun MessageRecord.hasLocation(): Boolean =
isMms && ((this as MmsMessageRecord).slideDeck.slides).any { slide -> slide.hasLocation() }
fun MessageRecord.hasAudio(): Boolean =
isMms && (this as MmsMessageRecord).slideDeck.audioSlide != null
fun MessageRecord.isCaptionlessMms(context: Context): Boolean =
getDisplayBody(context).isEmpty() && isMms && (this as MmsMessageRecord).slideDeck.textSlide == null
fun MessageRecord.hasThumbnail(): Boolean =
isMms && (this as MmsMessageRecord).slideDeck.thumbnailSlide != null
fun MessageRecord.isBorderless(context: Context): Boolean {
return isCaptionlessMms(context) &&
hasThumbnail() &&
(this as MmsMessageRecord).slideDeck.thumbnailSlide?.isBorderless == true
}
fun MessageRecord.hasNoBubble(context: Context): Boolean =
hasSticker() || isBorderless(context)
fun MessageRecord.hasOnlyThumbnail(context: Context): Boolean {
return hasThumbnail() &&
!hasAudio() &&
!hasDocument() &&
!hasSharedContact() &&
!hasSticker() &&
!isBorderless(context) &&
!isViewOnceMessage()
}
fun MessageRecord.hasDocument(): Boolean =
isMms && (this as MmsMessageRecord).slideDeck.documentSlide != null
fun MessageRecord.isViewOnceMessage(): Boolean =
isMms && (this as MmsMessageRecord).isViewOnce
fun MessageRecord.hasExtraText(): Boolean {
val hasTextSlide = isMms && (this as MmsMessageRecord).slideDeck.textSlide != null
val hasOverflowText: Boolean = body.length > MAX_BODY_DISPLAY_LENGTH
return hasTextSlide || hasOverflowText
}
fun MessageRecord.hasQuote(): Boolean =
isMms && (this as MmsMessageRecord).quote != null
fun MessageRecord.hasLinkPreview(): Boolean =
isMms && (this as MmsMessageRecord).linkPreviews.isNotEmpty()
fun MessageRecord.hasBigImageLinkPreview(context: Context): Boolean {
if (!hasLinkPreview()) {
return false
}
val linkPreview = (this as MmsMessageRecord).linkPreviews[0]
if (linkPreview.thumbnail.isPresent && !Util.isEmpty(linkPreview.description)) {
return true
}
val minWidth = context.resources.getDimensionPixelSize(R.dimen.media_bubble_min_width_solo)
return linkPreview.thumbnail.isPresent && linkPreview.thumbnail.get().width >= minWidth && !StickerUrl.isValidShareLink(linkPreview.url)
}
fun MessageRecord.isTextOnly(context: Context): Boolean {
return !(
!isMms ||
isViewOnceMessage() ||
hasLinkPreview() ||
hasQuote() ||
hasExtraText() ||
hasDocument() ||
hasThumbnail() ||
hasAudio() ||
hasLocation() ||
hasSharedContact() ||
hasSticker() ||
isCaptionlessMms(context)
)
}