kopia lustrzana https://github.com/ryukoposting/Signal-Android
Add expiry information to gift conversation items.
rodzic
ce2418ce9f
commit
a1025a8e9a
|
@ -13,6 +13,7 @@ import com.google.android.material.button.MaterialButton
|
||||||
import org.signal.core.util.DimensionUnit
|
import org.signal.core.util.DimensionUnit
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.badges.BadgeImageView
|
import org.thoughtcrime.securesms.badges.BadgeImageView
|
||||||
|
import org.thoughtcrime.securesms.badges.gifts.Gifts.formatExpiry
|
||||||
import org.thoughtcrime.securesms.database.model.databaseprotos.GiftBadge
|
import org.thoughtcrime.securesms.database.model.databaseprotos.GiftBadge
|
||||||
import org.thoughtcrime.securesms.mms.GlideRequests
|
import org.thoughtcrime.securesms.mms.GlideRequests
|
||||||
|
|
||||||
|
@ -50,7 +51,7 @@ class GiftMessageView @JvmOverloads constructor(
|
||||||
|
|
||||||
fun setGiftBadge(glideRequests: GlideRequests, giftBadge: GiftBadge, isOutgoing: Boolean, callback: Callback) {
|
fun setGiftBadge(glideRequests: GlideRequests, giftBadge: GiftBadge, isOutgoing: Boolean, callback: Callback) {
|
||||||
titleView.setText(R.string.GiftMessageView__gift_badge)
|
titleView.setText(R.string.GiftMessageView__gift_badge)
|
||||||
descriptionView.text = resources.getQuantityString(R.plurals.GiftMessageView__lasts_for_d_months, 1, 1)
|
descriptionView.text = giftBadge.formatExpiry(context)
|
||||||
actionView.icon = null
|
actionView.icon = null
|
||||||
actionView.setOnClickListener { callback.onViewGiftBadgeClicked() }
|
actionView.setOnClickListener { callback.onViewGiftBadgeClicked() }
|
||||||
actionView.isEnabled = true
|
actionView.isEnabled = true
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
package org.thoughtcrime.securesms.badges.gifts
|
package org.thoughtcrime.securesms.badges.gifts
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import org.signal.libsignal.zkgroup.InvalidInputException
|
||||||
|
import org.signal.libsignal.zkgroup.receipts.ReceiptCredentialPresentation
|
||||||
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.database.ThreadDatabase
|
import org.thoughtcrime.securesms.database.ThreadDatabase
|
||||||
import org.thoughtcrime.securesms.database.model.StoryType
|
import org.thoughtcrime.securesms.database.model.StoryType
|
||||||
import org.thoughtcrime.securesms.database.model.databaseprotos.GiftBadge
|
import org.thoughtcrime.securesms.database.model.databaseprotos.GiftBadge
|
||||||
|
@ -7,6 +11,8 @@ import org.thoughtcrime.securesms.mms.OutgoingMediaMessage
|
||||||
import org.thoughtcrime.securesms.mms.OutgoingSecureMediaMessage
|
import org.thoughtcrime.securesms.mms.OutgoingSecureMediaMessage
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient
|
import org.thoughtcrime.securesms.recipients.Recipient
|
||||||
import org.thoughtcrime.securesms.util.Base64
|
import org.thoughtcrime.securesms.util.Base64
|
||||||
|
import java.lang.Integer.min
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper object for Gift badges
|
* Helper object for Gift badges
|
||||||
|
@ -45,4 +51,36 @@ object Gifts {
|
||||||
giftBadge
|
giftBadge
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the expiration time from the redemption token, in UNIX epoch seconds.
|
||||||
|
*/
|
||||||
|
private fun GiftBadge.getExpiry(): Long {
|
||||||
|
return try {
|
||||||
|
ReceiptCredentialPresentation(redemptionToken.toByteArray()).receiptExpirationTime
|
||||||
|
} catch (e: InvalidInputException) {
|
||||||
|
return 0L
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun GiftBadge.formatExpiry(context: Context): String {
|
||||||
|
val expiry = getExpiry()
|
||||||
|
val timeRemaining = TimeUnit.SECONDS.toMillis(expiry) - System.currentTimeMillis()
|
||||||
|
if (timeRemaining <= 0) {
|
||||||
|
return context.getString(R.string.Gifts__expired)
|
||||||
|
}
|
||||||
|
|
||||||
|
val days = TimeUnit.MILLISECONDS.toDays(timeRemaining).toInt()
|
||||||
|
if (days > 0) {
|
||||||
|
return context.resources.getQuantityString(R.plurals.Gifts__d_days_remaining, days, days)
|
||||||
|
}
|
||||||
|
|
||||||
|
val hours = TimeUnit.MILLISECONDS.toHours(timeRemaining).toInt()
|
||||||
|
if (hours > 0) {
|
||||||
|
return context.resources.getQuantityString(R.plurals.Gifts__d_hours_remaining, hours, hours)
|
||||||
|
}
|
||||||
|
|
||||||
|
val minutes = min(1, TimeUnit.MILLISECONDS.toMinutes(timeRemaining).toInt())
|
||||||
|
return context.resources.getQuantityString(R.plurals.Gifts__d_minutes_remaining, minutes, minutes)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4824,6 +4824,23 @@
|
||||||
<item quantity="one">Group Story · %1$d viewer</item>
|
<item quantity="one">Group Story · %1$d viewer</item>
|
||||||
<item quantity="other">Group Story · %1$d viewers</item>
|
<item quantity="other">Group Story · %1$d viewers</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<!-- Gift expiry days remaining -->
|
||||||
|
<plurals name="Gifts__d_days_remaining">
|
||||||
|
<item quantity="one">%1$d days remaining</item>
|
||||||
|
<item quantity="other">%1$d days remaining</item>
|
||||||
|
</plurals>
|
||||||
|
<!-- Gift expiry hours remaining -->
|
||||||
|
<plurals name="Gifts__d_hours_remaining">
|
||||||
|
<item quantity="one">%1$d hours remaining</item>
|
||||||
|
<item quantity="other">%1$d hours remaining</item>
|
||||||
|
</plurals>
|
||||||
|
<!-- Gift expiry minutes remaining -->
|
||||||
|
<plurals name="Gifts__d_minutes_remaining">
|
||||||
|
<item quantity="one">%1$d minute remaining</item>
|
||||||
|
<item quantity="other">%1$d minutes remaining</item>
|
||||||
|
</plurals>
|
||||||
|
<!-- Gift expiry expired -->
|
||||||
|
<string name="Gifts__expired">Expired</string>
|
||||||
|
|
||||||
<!-- EOF -->
|
<!-- EOF -->
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue