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"> - + - + + + + + + + +