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