diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/utilities/KThumbnailView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/utilities/KThumbnailView.kt index a8d20736ab..1710444c84 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/utilities/KThumbnailView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/utilities/KThumbnailView.kt @@ -42,7 +42,7 @@ open class KThumbnailView: FrameLayout { private val image by lazy { thumbnail_image } private val playOverlay by lazy { play_overlay } private val captionIcon by lazy { thumbnail_caption_icon } - val loadIndicator: ProgressBar by lazy { thumbnail_load_indicator } + val loadIndicator: View by lazy { thumbnail_load_indicator } private val transferControls by lazy { ViewUtil.inflateStub(this, R.id.transfer_controls_stub) } private val dimensDelegate = ThumbnailDimensDelegate() diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/utilities/ThumbnailProgressBar.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/utilities/ThumbnailProgressBar.kt new file mode 100644 index 0000000000..2a9b033732 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/utilities/ThumbnailProgressBar.kt @@ -0,0 +1,69 @@ +package org.thoughtcrime.securesms.conversation.v2.utilities + +import android.animation.ValueAnimator +import android.content.Context +import android.graphics.Canvas +import android.graphics.Interpolator +import android.graphics.Paint +import android.graphics.Rect +import android.os.SystemClock +import android.util.AttributeSet +import android.util.Log +import android.view.View +import android.view.animation.AccelerateDecelerateInterpolator +import android.view.animation.Animation +import android.view.animation.AnimationSet +import android.view.animation.AnimationUtils +import androidx.core.content.res.ResourcesCompat +import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView +import network.loki.messenger.R +import kotlin.math.sin + +class ThumbnailProgressBar: View, ValueAnimator.AnimatorUpdateListener { + + constructor(context: Context) : super(context) + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + + private val firstX: Double + get() = sin(SystemClock.elapsedRealtime() / 300.0) * 1.5 + + private val secondX: Double + get() = sin(SystemClock.elapsedRealtime() / 300.0 + (Math.PI/4)) * 1.5 + + private val paint = Paint(Paint.ANTI_ALIAS_FLAG).apply { + style = Paint.Style.FILL + color = ResourcesCompat.getColor(resources, R.color.accent, null) + } + + private val objectRect = Rect() + private val drawingRect = Rect() + + override fun onAnimationUpdate(animation: ValueAnimator?) { + if (animation == null || !isAttachedToWindow) return + invalidate() + } + + override fun dispatchDraw(canvas: Canvas?) { + if (canvas == null) return + + getDrawingRect(objectRect) + drawingRect.set(objectRect) + + val coercedFX = firstX + val coercedSX = secondX + + val firstMeasuredX = objectRect.left + (objectRect.width() * coercedFX) + val secondMeasuredX = objectRect.left + (objectRect.width() * coercedSX) + + drawingRect.set( + (if (firstMeasuredX < secondMeasuredX) firstMeasuredX else secondMeasuredX).toInt(), + objectRect.top, + (if (firstMeasuredX < secondMeasuredX) secondMeasuredX else firstMeasuredX).toInt(), + objectRect.bottom + ) + + canvas.drawRect(drawingRect, paint) + invalidate() + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/album_thumbnail_view.xml b/app/src/main/res/layout/album_thumbnail_view.xml index e9ca4e20e3..a7e80b31f6 100644 --- a/app/src/main/res/layout/album_thumbnail_view.xml +++ b/app/src/main/res/layout/album_thumbnail_view.xml @@ -35,7 +35,7 @@ /> -