diff --git a/library/ui-styles/build.gradle b/library/ui-styles/build.gradle
index 47c4664636..3a8851784e 100644
--- a/library/ui-styles/build.gradle
+++ b/library/ui-styles/build.gradle
@@ -60,4 +60,6 @@ dependencies {
implementation 'com.github.vector-im:PFLockScreen-Android:1.0.0-beta12'
// dialpad dimen
implementation 'im.dlg:android-dialer:1.2.5'
+ // AudioRecordView attr
+ implementation 'com.github.Armen101:AudioRecordView:1.0.5'
}
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/drawable/bg_round_corner_8dp.xml b/library/ui-styles/src/main/res/drawable/bg_round_corner_8dp.xml
new file mode 100644
index 0000000000..f44b146021
--- /dev/null
+++ b/library/ui-styles/src/main/res/drawable/bg_round_corner_8dp.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/colors.xml b/library/ui-styles/src/main/res/values/colors.xml
index bfe9a9a59c..927977431b 100644
--- a/library/ui-styles/src/main/res/values/colors.xml
+++ b/library/ui-styles/src/main/res/values/colors.xml
@@ -144,4 +144,8 @@
#FFE3E8F0
#FF394049
+
+ @color/palette_black_900
+ @color/palette_gray_450
+
diff --git a/library/ui-styles/src/main/res/values/styles_voice_message.xml b/library/ui-styles/src/main/res/values/styles_voice_message.xml
index 29ba6e31d9..dff1d08d28 100644
--- a/library/ui-styles/src/main/res/values/styles_voice_message.xml
+++ b/library/ui-styles/src/main/res/values/styles_voice_message.xml
@@ -12,4 +12,15 @@
- leftToRight
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/theme_dark.xml b/library/ui-styles/src/main/res/values/theme_dark.xml
index 6dcf02139a..43693031a3 100644
--- a/library/ui-styles/src/main/res/values/theme_dark.xml
+++ b/library/ui-styles/src/main/res/values/theme_dark.xml
@@ -140,6 +140,7 @@
- @color/vctr_voice_message_playback_background_dark
- @color/vctr_voice_message_play_pause_button_background_dark
- @color/vctr_voice_message_recording_playback_background_dark
+ - @color/vctr_voice_message_toast_background_dark
diff --git a/library/ui-styles/src/main/res/values/theme_light.xml b/library/ui-styles/src/main/res/values/theme_light.xml
index a669c2cb79..2eaba62550 100644
--- a/library/ui-styles/src/main/res/values/theme_light.xml
+++ b/library/ui-styles/src/main/res/values/theme_light.xml
@@ -142,6 +142,7 @@
- @color/vctr_voice_message_playback_background_light
- @color/vctr_voice_message_play_pause_button_background_light
- @color/vctr_voice_message_recording_playback_background_light
+ - @color/vctr_voice_message_toast_background_light
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt
index 2feeb8da65..49fbae4ecf 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt
@@ -595,12 +595,14 @@ class RoomDetailFragment @Inject constructor(
views.voiceMessageRecorderView.voiceMessagePlaybackTracker = voiceMessagePlaybackTracker
views.voiceMessageRecorderView.callback = object : VoiceMessageRecorderView.Callback {
- override fun onVoiceRecordingStarted() {
- if (checkPermissions(PERMISSIONS_FOR_AUDIO_IP_CALL, requireActivity(), 0)) {
+ override fun onVoiceRecordingStarted(): Boolean {
+ return if (checkPermissions(PERMISSIONS_FOR_AUDIO_IP_CALL, requireActivity(), 0)) {
views.composerLayout.isInvisible = true
roomDetailViewModel.handle(RoomDetailAction.StartRecordingVoiceMessage)
- context?.toast(R.string.voice_message_release_to_send_toast)
vibrate(requireContext())
+ true
+ } else {
+ false
}
}
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt
index 25bc41e497..cfc922272a 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt
@@ -21,19 +21,15 @@ import android.text.format.DateUtils
import android.util.AttributeSet
import android.util.TypedValue
import android.view.MotionEvent
-import android.widget.ImageButton
-import android.widget.ImageView
-import android.widget.TextView
import androidx.annotation.Px
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.isVisible
-import com.visualizer.amplitude.AudioRecordView
import im.vector.app.BuildConfig
import im.vector.app.R
import im.vector.app.core.hardware.vibrate
-import im.vector.app.core.utils.toast
import im.vector.app.databinding.ViewVoiceMessageRecorderBinding
import im.vector.app.features.home.room.detail.timeline.helper.VoiceMessagePlaybackTracker
+import org.matrix.android.sdk.api.extensions.orFalse
import timber.log.Timber
import java.util.Timer
import java.util.TimerTask
@@ -50,7 +46,8 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
) : ConstraintLayout(context, attrs, defStyleAttr), VoiceMessagePlaybackTracker.Listener {
interface Callback {
- fun onVoiceRecordingStarted()
+ // Return true if the recording is started
+ fun onVoiceRecordingStarted(): Boolean
fun onVoiceRecordingEnded(isCancelled: Boolean)
fun onVoiceRecordingPlaybackModeOn()
fun onVoicePlaybackButtonClicked()
@@ -122,7 +119,10 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
return@setOnTouchListener when (event.action) {
MotionEvent.ACTION_DOWN -> {
startRecordingTimer()
- callback?.onVoiceRecordingStarted()
+ val recordingStarted = callback?.onVoiceRecordingStarted().orFalse()
+ if (recordingStarted) {
+ renderToast(context.getString(R.string.voice_message_release_to_send_toast))
+ }
recordingState = RecordingState.STARTED
showRecordingViews()
@@ -245,7 +245,7 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
}
} else if (timeDiffToRecordingLimit in 10000..10999) {
views.voiceMessageRecordingLayout.post {
- context.toast(context.getString(R.string.voice_message_n_seconds_warning_toast, floor(timeDiffToRecordingLimit / 1000f).toInt()))
+ renderToast(context.getString(R.string.voice_message_n_seconds_warning_toast, floor(timeDiffToRecordingLimit / 1000f).toInt()))
vibrate(context)
}
}
@@ -254,6 +254,17 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
recordingTimer.scheduleAtFixedRate(recordingTimerTask, 0, 1000)
}
+ private fun renderToast(message: String) {
+ views.voiceMessageToast.removeCallbacks(hideToastRunnable)
+ views.voiceMessageToast.text = message
+ views.voiceMessageToast.isVisible = true
+ views.voiceMessageToast.postDelayed(hideToastRunnable, 2_000)
+ }
+
+ private val hideToastRunnable = Runnable {
+ views.voiceMessageToast.isVisible = false
+ }
+
private fun showRecordingTimer() {
val formattedTimerText = DateUtils.formatElapsedTime((recordingTime).toLong())
if (recordingState == RecordingState.LOCKED) {
@@ -325,7 +336,7 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
views.voiceMessagePlaybackTimerIndicator.isVisible = true
views.voicePlaybackControlButton.isVisible = false
views.voiceMessageSendButton.isVisible = true
- context.toast(R.string.voice_message_tap_to_stop_toast)
+ renderToast(context.getString(R.string.voice_message_tap_to_stop_toast))
}
private fun showPlaybackViews() {
@@ -355,15 +366,15 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
override fun onUpdate(state: VoiceMessagePlaybackTracker.Listener.State) {
when (state) {
- is VoiceMessagePlaybackTracker.Listener.State.Recording -> {
+ is VoiceMessagePlaybackTracker.Listener.State.Recording -> {
this.amplitudeList = state.amplitudeList
}
- is VoiceMessagePlaybackTracker.Listener.State.Playing -> {
+ is VoiceMessagePlaybackTracker.Listener.State.Playing -> {
views.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_pause)
val formattedTimerText = DateUtils.formatElapsedTime((state.playbackTime / 1000).toLong())
views.voicePlaybackTime.setText(formattedTimerText)
}
- is VoiceMessagePlaybackTracker.Listener.State.Idle -> {
+ is VoiceMessagePlaybackTracker.Listener.State.Idle -> {
views.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_play)
}
}
diff --git a/vector/src/main/res/layout/view_voice_message_recorder.xml b/vector/src/main/res/layout/view_voice_message_recorder.xml
index ee8dd677ac..0c975aa9cb 100644
--- a/vector/src/main/res/layout/view_voice_message_recorder.xml
+++ b/vector/src/main/res/layout/view_voice_message_recorder.xml
@@ -42,7 +42,7 @@
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
- tools:layout_marginBottom="320dp"
+ tools:layout_marginBottom="180dp"
tools:visibility="visible" />
+
+
\ No newline at end of file