diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewPlayerControlView.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewPlayerControlView.kt
index 8f8a913ad0..60ee576a31 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewPlayerControlView.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewPlayerControlView.kt
@@ -4,11 +4,14 @@ import android.animation.Animator
import android.animation.Animator.AnimatorListener
import android.annotation.SuppressLint
import android.content.Context
+import android.os.Build
import android.util.AttributeSet
import android.view.MotionEvent
+import android.view.animation.PathInterpolator
import android.widget.ImageButton
import android.widget.LinearLayout
import android.widget.TextView
+import androidx.appcompat.widget.AppCompatImageButton
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.airbnb.lottie.LottieAnimationView
@@ -122,3 +125,66 @@ class LottieAnimatedButton @JvmOverloads constructor(
playAnimation()
}
}
+
+class AnimatedInOutImageButton @JvmOverloads constructor(
+ context: Context,
+ attrs: AttributeSet? = null
+) : AppCompatImageButton(context, attrs) {
+ private val rotationWhenVisible: Float
+ private val rotationWhenHidden: Float
+
+ init {
+ val styledAttrs = getContext().obtainStyledAttributes(attrs, R.styleable.AnimatedInOutImageButton)
+ rotationWhenVisible = styledAttrs.getFloat(R.styleable.AnimatedInOutImageButton_rotationWhenVisible, 0f)
+ rotationWhenHidden = styledAttrs.getFloat(R.styleable.AnimatedInOutImageButton_rotationWhenHidden, 0f)
+ styledAttrs.recycle()
+ }
+
+ override fun setVisibility(visibility: Int) {
+ if (visibility == VISIBLE) {
+ super.setVisibility(visibility)
+ animateIn()
+ } else {
+ animateOut { super.setVisibility(visibility) }
+ }
+ }
+
+ private fun animateIn() {
+ this.rotation = rotationWhenHidden
+ this.scaleX = 0.5f
+ this.scaleY = 0.5f
+ this.alpha = 0f
+
+ val animator = this.animate()
+ .setDuration(animationDurationMs)
+ .alpha(1f)
+ .rotation(rotationWhenVisible)
+ .scaleX(1f)
+ .scaleY(1f)
+
+ if (Build.VERSION.SDK_INT >= 21) {
+ animator.interpolator = PathInterpolator(0.4f, 0.0f, 0.2f, 1f)
+ }
+
+ animator.start()
+ }
+
+ private fun animateOut(endAction: Runnable) {
+ val animator = this.animate()
+ .setDuration(animationDurationMs)
+ .alpha(0f)
+ .rotation(rotationWhenHidden)
+ .scaleX(0.5f)
+ .scaleY(0.5f)
+ .withEndAction(endAction)
+
+ if (Build.VERSION.SDK_INT >= 21) {
+ animator.interpolator = PathInterpolator(0.4f, 0.0f, 0.2f, 1f)
+ }
+ animator.start()
+ }
+
+ companion object {
+ const val animationDurationMs: Long = 150
+ }
+}
diff --git a/app/src/main/res/drawable/pause_solid_24.xml b/app/src/main/res/drawable/pause_solid_24.xml
new file mode 100644
index 0000000000..c6c8de6fd3
--- /dev/null
+++ b/app/src/main/res/drawable/pause_solid_24.xml
@@ -0,0 +1,12 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/play_button_solid_24.xml b/app/src/main/res/drawable/play_button_solid_24.xml
new file mode 100644
index 0000000000..d4c173d4d1
--- /dev/null
+++ b/app/src/main/res/drawable/play_button_solid_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/exo_player_control_view.xml b/app/src/main/res/layout/exo_player_control_view.xml
index 521ec5255f..10f4270119 100644
--- a/app/src/main/res/layout/exo_player_control_view.xml
+++ b/app/src/main/res/layout/exo_player_control_view.xml
@@ -14,11 +14,11 @@
android:id="@+id/exo_duration_viewgroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:visibility="gone"
android:layout_marginStart="@dimen/media_preview_video_timestamp_inset"
android:layout_marginEnd="@dimen/media_preview_video_timestamp_inset"
android:gravity="center_vertical"
- android:orientation="horizontal">
+ android:orientation="horizontal"
+ android:visibility="gone">
-
+
-
+
+
+
+
+
+
+
+