diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index 13cad79ae6..d7e845d858 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -1,5 +1,7 @@ package org.thoughtcrime.securesms.conversation.v2 +import android.animation.FloatEvaluator +import android.animation.ValueAnimator import android.database.Cursor import android.os.Bundle import android.view.ActionMode @@ -20,6 +22,7 @@ import org.thoughtcrime.securesms.conversation.v2.menus.ConversationActionModeCa import org.thoughtcrime.securesms.conversation.v2.menus.ConversationMenuHelper import org.thoughtcrime.securesms.database.DatabaseFactory import org.thoughtcrime.securesms.database.model.MessageRecord +import org.thoughtcrime.securesms.loki.views.NewConversationButtonSetView import org.thoughtcrime.securesms.mms.GlideApp class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDelegate { @@ -115,7 +118,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe } override fun showVoiceMessageUI() { - inputBarRecordingView.isVisible = true + inputBarRecordingView.show() } // endregion diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/input_bar/InputBarRecordingView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/input_bar/InputBarRecordingView.kt index ffcb403ab7..b1da2ec48a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/input_bar/InputBarRecordingView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/input_bar/InputBarRecordingView.kt @@ -1,10 +1,19 @@ package org.thoughtcrime.securesms.conversation.v2.input_bar +import android.animation.Animator +import android.animation.FloatEvaluator +import android.animation.ValueAnimator import android.content.Context import android.util.AttributeSet +import android.util.Log import android.view.LayoutInflater import android.widget.RelativeLayout +import androidx.core.view.isVisible +import kotlinx.android.synthetic.main.view_input_bar_recording.view.* import network.loki.messenger.R +import org.thoughtcrime.securesms.loki.utilities.animateSizeChange +import org.thoughtcrime.securesms.loki.utilities.toPx +import kotlin.math.roundToInt class InputBarRecordingView : RelativeLayout { @@ -15,4 +24,29 @@ class InputBarRecordingView : RelativeLayout { private fun initialize() { LayoutInflater.from(context).inflate(R.layout.view_input_bar_recording, this) } + + fun show() { + isVisible = true + alpha = 0.0f + val animation = ValueAnimator.ofObject(FloatEvaluator(), 0.0f, 1.0f) + animation.duration = 250L + animation.addUpdateListener { animator -> + alpha = animator.animatedValue as Float + } + animation.start() + pulse() + } + + private fun pulse() { + val collapsedSize = toPx(80.0f, resources) + val expandedSize = toPx(104.0f, resources) + pulseView.animateSizeChange(collapsedSize, expandedSize, 1000) + val animation = ValueAnimator.ofObject(FloatEvaluator(), 0.5, 0.0f) + animation.duration = 1000L + animation.addUpdateListener { animator -> + pulseView.alpha = animator.animatedValue as Float + if (animator.animatedFraction == 1.0f) { pulse() } + } + animation.start() + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/ViewUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/ViewUtilities.kt index c9d135ba24..67a137bc48 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/ViewUtilities.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/ViewUtilities.kt @@ -21,9 +21,13 @@ val View.hitRect: Rect } fun View.animateSizeChange(@DimenRes startSizeID: Int, @DimenRes endSizeID: Int, animationDuration: Long = 250) { - val layoutParams = this.layoutParams val startSize = resources.getDimension(startSizeID) val endSize = resources.getDimension(endSizeID) + animateSizeChange(startSize, endSize) +} + +fun View.animateSizeChange(startSize: Float, endSize: Float, animationDuration: Long = 250) { + val layoutParams = this.layoutParams val animation = ValueAnimator.ofObject(FloatEvaluator(), startSize, endSize) animation.duration = animationDuration animation.addUpdateListener { animator -> diff --git a/app/src/main/res/layout/view_input_bar_recording.xml b/app/src/main/res/layout/view_input_bar_recording.xml index f0e10cf7c2..1ea62d3371 100644 --- a/app/src/main/res/layout/view_input_bar_recording.xml +++ b/app/src/main/res/layout/view_input_bar_recording.xml @@ -3,93 +3,123 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" - android:layout_height="80dp"> + android:layout_height="92dp"> - + - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - +