52 lines
1.7 KiB
Kotlin
52 lines
1.7 KiB
Kotlin
package org.thoughtcrime.securesms.conversation.v2.components
|
|
|
|
import android.content.Context
|
|
import android.graphics.drawable.AnimationDrawable
|
|
import android.util.AttributeSet
|
|
import android.widget.ImageView
|
|
import androidx.core.content.ContextCompat
|
|
import network.loki.messenger.R
|
|
import org.session.libsession.snode.SnodeAPI.nowWithOffset
|
|
import kotlin.math.round
|
|
|
|
class ExpirationTimerView @JvmOverloads constructor(
|
|
context: Context?,
|
|
attrs: AttributeSet? = null,
|
|
defStyleAttr: Int = 0
|
|
) : ImageView(context, attrs, defStyleAttr) {
|
|
private val frames = intArrayOf(
|
|
R.drawable.timer00,
|
|
R.drawable.timer05,
|
|
R.drawable.timer10,
|
|
R.drawable.timer15,
|
|
R.drawable.timer20,
|
|
R.drawable.timer25,
|
|
R.drawable.timer30,
|
|
R.drawable.timer35,
|
|
R.drawable.timer40,
|
|
R.drawable.timer45,
|
|
R.drawable.timer50,
|
|
R.drawable.timer55,
|
|
R.drawable.timer60
|
|
)
|
|
|
|
fun setExpirationTime(startedAt: Long, expiresIn: Long) {
|
|
if (expiresIn == 0L) {
|
|
setImageResource(R.drawable.timer55)
|
|
return
|
|
}
|
|
|
|
val elapsedTime = nowWithOffset - startedAt
|
|
val remainingTime = expiresIn - elapsedTime
|
|
val remainingPercent = (remainingTime / expiresIn.toFloat()).coerceIn(0f, 1f)
|
|
|
|
val frameCount = round(frames.size * remainingPercent).toInt().coerceIn(1, frames.size)
|
|
val frameTime = round(remainingTime / frameCount.toFloat()).toInt()
|
|
|
|
AnimationDrawable().apply {
|
|
frames.take(frameCount).reversed().forEach { addFrame(ContextCompat.getDrawable(context, it)!!, frameTime) }
|
|
isOneShot = true
|
|
}.also(::setImageDrawable).apply(AnimationDrawable::start)
|
|
}
|
|
}
|