diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostAnimation.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostAnimation.kt new file mode 100644 index 000000000..169ac352c --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostAnimation.kt @@ -0,0 +1,44 @@ +package org.thoughtcrime.securesms.components.settings.app.subscription.boost + +import android.animation.Animator +import android.view.View +import com.airbnb.lottie.LottieAnimationView +import com.airbnb.lottie.LottieDrawable +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.animation.AnimationCompleteListener +import org.thoughtcrime.securesms.components.settings.PreferenceModel +import org.thoughtcrime.securesms.util.MappingAdapter +import org.thoughtcrime.securesms.util.MappingViewHolder + +/** + * A simple mapping model to show a boost animation. + */ +object BoostAnimation { + + class Model : PreferenceModel(isEnabled = true) { + override fun areItemsTheSame(newItem: Model): Boolean = true + } + + class ViewHolder(itemView: View) : MappingViewHolder(itemView) { + + private val lottie: LottieAnimationView = findViewById(R.id.boost_animation_view) + + override fun bind(model: Model) { + lottie.playAnimation() + lottie.addAnimatorListener(object : AnimationCompleteListener() { + override fun onAnimationEnd(animation: Animator?) { + lottie.removeAnimatorListener(this) + lottie.setMinAndMaxFrame(30, 91) + lottie.repeatMode = LottieDrawable.RESTART + lottie.repeatCount = LottieDrawable.INFINITE + lottie.frame = 30 + lottie.playAnimation() + } + }) + } + } + + fun register(adapter: MappingAdapter) { + adapter.registerFactory(Model::class.java, MappingAdapter.LayoutFactory({ ViewHolder(it) }, R.layout.boost_animation_pref)) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostFragment.kt index 5f374f9c7..2a15e1fe2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostFragment.kt @@ -82,6 +82,7 @@ class BoostFragment : DSLSettingsBottomSheetFragment( GooglePayButton.register(adapter) Progress.register(adapter) NetworkFailure.register(adapter) + BoostAnimation.register(adapter) processingDonationPaymentDialog = MaterialAlertDialogBuilder(requireContext()) .setView(R.layout.processing_payment_dialog) @@ -143,7 +144,7 @@ class BoostFragment : DSLSettingsBottomSheetFragment( } return configure { - customPref(BadgePreview.SubscriptionModel(state.boostBadge)) + customPref(BoostAnimation.Model()) sectionHeaderPref( title = DSLSettingsText.from( diff --git a/app/src/main/res/layout/boost_animation_pref.xml b/app/src/main/res/layout/boost_animation_pref.xml new file mode 100644 index 000000000..d01c1e2ff --- /dev/null +++ b/app/src/main/res/layout/boost_animation_pref.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9b57034c7..7162a8a15 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3974,7 +3974,7 @@ Error getting subscription. Give Signal a Boost - Say "Thanks!" and earn the Boost badge for %1$d days. + Say \"Thanks!\" and earn the Boost badge for %1$d days. Enter Custom Amount One-time contribution