diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/thanks/GiftThanksSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/thanks/GiftThanksSheet.kt index d139f36052..3ac6105173 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/thanks/GiftThanksSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/thanks/GiftThanksSheet.kt @@ -48,6 +48,7 @@ class GiftThanksSheet : DSLSettingsBottomSheetFragment() { override fun bindAdapter(adapter: DSLSettingsAdapter) { BadgePreview.register(adapter) + lifecycleDisposable.bindTo(viewLifecycleOwner) lifecycleDisposable += Recipient.observable(recipientId).subscribe { adapter.submitList(getConfiguration(it).toMappingModelList()) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/viewgift/received/ViewReceivedGiftBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/viewgift/received/ViewReceivedGiftBottomSheet.kt index d8a7a639e7..48650b1445 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/viewgift/received/ViewReceivedGiftBottomSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/viewgift/received/ViewReceivedGiftBottomSheet.kt @@ -6,7 +6,6 @@ import androidx.appcompat.app.AlertDialog import androidx.fragment.app.FragmentManager import androidx.fragment.app.setFragmentResult import androidx.fragment.app.viewModels -import androidx.lifecycle.LiveDataReactiveStreams import androidx.navigation.fragment.findNavController import com.google.android.material.dialog.MaterialAlertDialogBuilder import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers @@ -105,7 +104,7 @@ class ViewReceivedGiftBottomSheet : DSLSettingsBottomSheetFragment() { onRedemptionError(donationError) } - LiveDataReactiveStreams.fromPublisher(viewModel.state).observe(viewLifecycleOwner) { state -> + lifecycleDisposable += viewModel.state.subscribe { state -> adapter.submitList(getConfiguration(state).toMappingModelList()) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/viewgift/sent/ViewSentGiftBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/viewgift/sent/ViewSentGiftBottomSheet.kt index 95d333d32c..7d0a57eef8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/viewgift/sent/ViewSentGiftBottomSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/viewgift/sent/ViewSentGiftBottomSheet.kt @@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.badges.gifts.viewgift.sent import android.os.Bundle import androidx.fragment.app.FragmentManager import androidx.fragment.app.viewModels -import androidx.lifecycle.LiveDataReactiveStreams import org.signal.core.util.DimensionUnit import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.badges.gifts.viewgift.ViewGiftRepository @@ -17,6 +16,7 @@ import org.thoughtcrime.securesms.database.model.MmsMessageRecord import org.thoughtcrime.securesms.database.model.databaseprotos.GiftBadge import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.util.BottomSheetUtil +import org.thoughtcrime.securesms.util.LifecycleDisposable /** * Handles all interactions for received gift badges. @@ -45,6 +45,8 @@ class ViewSentGiftBottomSheet : DSLSettingsBottomSheetFragment() { private val giftBadge: GiftBadge get() = GiftBadge.parseFrom(requireArguments().getByteArray(ARG_GIFT_BADGE)) + private val lifecycleDisposable = LifecycleDisposable() + private val viewModel: ViewSentGiftViewModel by viewModels( factoryProducer = { ViewSentGiftViewModel.Factory(sentTo, giftBadge, ViewGiftRepository()) } ) @@ -52,7 +54,8 @@ class ViewSentGiftBottomSheet : DSLSettingsBottomSheetFragment() { override fun bindAdapter(adapter: DSLSettingsAdapter) { BadgeDisplay112.register(adapter) - LiveDataReactiveStreams.fromPublisher(viewModel.state).observe(viewLifecycleOwner) { state -> + lifecycleDisposable.bindTo(viewLifecycleOwner) + lifecycleDisposable += viewModel.state.subscribe { state -> adapter.submitList(getConfiguration(state).toMappingModelList()) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiStrings.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiStrings.java index 0e09e621c6..d6db1e4f5a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiStrings.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiStrings.java @@ -8,4 +8,5 @@ public final class EmojiStrings { public static final String AUDIO = "\uD83C\uDFA4"; public static final String FILE = "\uD83D\uDCCE"; public static final String STICKER = "\u2B50"; + public static final String GIFT = "\uD83C\uDF81"; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadBodyUtil.java b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadBodyUtil.java index 1a2d8d09b3..4d25c22090 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadBodyUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadBodyUtil.java @@ -48,6 +48,8 @@ public final class ThreadBodyUtil { } else if (MessageRecordUtil.hasSticker(record)) { String emoji = getStickerEmoji(record); return format(context, record, emoji, R.string.ThreadRecord_sticker); + } else if (MessageRecordUtil.hasGiftBadge(record)) { + return String.format("%s %s", EmojiStrings.GIFT, getGiftSummary(context, record)); } boolean hasImage = false; @@ -72,6 +74,16 @@ public final class ThreadBodyUtil { return getBody(context, record); } } + + private static @NonNull String getGiftSummary(@NonNull Context context, @NonNull MessageRecord messageRecord) { + if (messageRecord.isOutgoing()) { + return context.getString(R.string.ThreadRecord__you_sent_a_gift); + } else if (messageRecord.getViewedReceiptCount() > 0) { + return context.getString(R.string.ThreadRecord__you_redeemed_a_gift_badge); + } else { + return context.getString(R.string.ThreadRecord__you_received_a_gift); + } + } private static @NonNull String format(@NonNull Context context, @NonNull MessageRecord record, @NonNull String emoji, @StringRes int defaultStringRes) { return String.format("%s %s", emoji, getBodyOrDefault(context, record, defaultStringRes)); diff --git a/app/src/main/java/org/thoughtcrime/securesms/glide/GiftBadgeModel.kt b/app/src/main/java/org/thoughtcrime/securesms/glide/GiftBadgeModel.kt index ba314a6bfb..e0d70cd033 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/glide/GiftBadgeModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/glide/GiftBadgeModel.kt @@ -44,6 +44,7 @@ data class GiftBadgeModel(val giftBadge: GiftBadge) : Key { } override fun updateDiskCacheKey(messageDigest: MessageDigest) { + messageDigest.update(giftBadge.toByteArray()) } class Fetcher( diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationItemV2.kt b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationItemV2.kt index dfd88b6543..a58dd66be2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationItemV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationItemV2.kt @@ -25,6 +25,7 @@ import org.thoughtcrime.securesms.service.KeyCachingService import org.thoughtcrime.securesms.util.MediaUtil import org.thoughtcrime.securesms.util.SpanUtil import org.thoughtcrime.securesms.util.Util +import org.thoughtcrime.securesms.util.hasGiftBadge import org.thoughtcrime.securesms.util.hasSharedContact import org.thoughtcrime.securesms.util.hasSticker import org.thoughtcrime.securesms.util.isMediaMessage @@ -186,6 +187,8 @@ class MessageNotification(threadRecipient: Recipient, record: MessageRecord) : N ThreadBodyUtil.getFormattedBodyFor(context, record) } else if (record.isGroupCall) { MessageRecord.getGroupCallUpdateDescription(context, record.body, false).spannable + } else if (record.hasGiftBadge()) { + ThreadBodyUtil.getFormattedBodyFor(context, record) } else { MentionUtil.updateBodyWithDisplayNames(context, record) } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 542beff2f2..af410ea5a8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1769,6 +1769,12 @@ File Video Chat session refreshed + + You received a gift + + You sent a gift + + You redeemed a gift badge Signal update