diff --git a/app/src/main/kotlin/com/wire/android/di/AppModule.kt b/app/src/main/kotlin/com/wire/android/di/AppModule.kt index d2e0463b37d..a6ec5c7ad39 100644 --- a/app/src/main/kotlin/com/wire/android/di/AppModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/AppModule.kt @@ -39,7 +39,7 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent -import linc.com.amplituda.Amplituda +import com.linc.amplituda.Amplituda import javax.inject.Named import javax.inject.Qualifier import javax.inject.Singleton diff --git a/app/src/main/kotlin/com/wire/android/media/audiomessage/AudioState.kt b/app/src/main/kotlin/com/wire/android/media/audiomessage/AudioState.kt index dcf91acb172..13553ce6741 100644 --- a/app/src/main/kotlin/com/wire/android/media/audiomessage/AudioState.kt +++ b/app/src/main/kotlin/com/wire/android/media/audiomessage/AudioState.kt @@ -32,10 +32,10 @@ data class AudioState( val audioMediaPlayingState: AudioMediaPlayingState, val currentPositionInMs: Int, val totalTimeInMs: TotalTimeInMs, - val wavesMask: List + val wavesMask: List? ) { companion object { - val DEFAULT = AudioState(AudioMediaPlayingState.Stopped, 0, TotalTimeInMs.NotKnown, listOf()) + val DEFAULT = AudioState(AudioMediaPlayingState.Stopped, 0, TotalTimeInMs.NotKnown, null) } // if the back-end returned the total time, we use that, in case it didn't we use what we get from @@ -146,7 +146,7 @@ sealed class AudioMediaPlayerStateUpdate( data class WaveMaskUpdate( override val conversationId: ConversationId, override val messageId: String, - val waveMask: List + val waveMask: List? ) : AudioMediaPlayerStateUpdate(conversationId, messageId) } diff --git a/app/src/main/kotlin/com/wire/android/media/audiomessage/AudioWavesMaskHelper.kt b/app/src/main/kotlin/com/wire/android/media/audiomessage/AudioWavesMaskHelper.kt index b45ecc3d72e..a7fb9837b5f 100644 --- a/app/src/main/kotlin/com/wire/android/media/audiomessage/AudioWavesMaskHelper.kt +++ b/app/src/main/kotlin/com/wire/android/media/audiomessage/AudioWavesMaskHelper.kt @@ -17,30 +17,42 @@ */ package com.wire.android.media.audiomessage -import linc.com.amplituda.Amplituda -import linc.com.amplituda.Cache +import android.content.Context +import dagger.Lazy +import com.linc.amplituda.Amplituda +import com.linc.amplituda.Cache +import dagger.Reusable import okio.Path import java.io.File import javax.inject.Inject import kotlin.math.roundToInt +@Reusable class AudioWavesMaskHelper @Inject constructor( - private val amplituda: Amplituda + private val amplituda: Lazy ) { + lateinit var context: Context companion object { private const val WAVES_AMOUNT = 75 private const val WAVE_MAX = 32 } - fun getWaveMask(decodedAssetPath: Path): List = getWaveMask(File(decodedAssetPath.toString())) + @Suppress("TooGenericExceptionCaught") + private fun getAmplituda(): Amplituda? = try { + amplituda.get() + } catch (e: NullPointerException) { + null + } + + fun getWaveMask(decodedAssetPath: Path): List? = getWaveMask(File(decodedAssetPath.toString())) - fun getWaveMask(file: File): List = amplituda - .processAudio(file, Cache.withParams(Cache.REUSE)) - .get() - .amplitudesAsList() - .averageWavesMask() - .equalizeWavesMask() + fun getWaveMask(file: File): List? = getAmplituda() + ?.processAudio(file, Cache.withParams(Cache.REUSE)) + ?.get() + ?.amplitudesAsList() + ?.averageWavesMask() + ?.equalizeWavesMask() private fun List.equalizeWavesMask(): List { if (this.isEmpty()) return listOf() @@ -76,6 +88,6 @@ class AudioWavesMaskHelper @Inject constructor( } fun clear() { - amplituda.clearCache() + getAmplituda()?.clearCache() } } diff --git a/app/src/main/kotlin/com/wire/android/media/audiomessage/RecordAudioMessagePlayer.kt b/app/src/main/kotlin/com/wire/android/media/audiomessage/RecordAudioMessagePlayer.kt index 2caf2cb9209..2cde4ada44b 100644 --- a/app/src/main/kotlin/com/wire/android/media/audiomessage/RecordAudioMessagePlayer.kt +++ b/app/src/main/kotlin/com/wire/android/media/audiomessage/RecordAudioMessagePlayer.kt @@ -184,11 +184,13 @@ class RecordAudioMessagePlayer @Inject constructor( audioMediaPlayer.seekTo(position) audioMediaPlayer.start() - audioMessageStateUpdate.emit( - RecordAudioMediaPlayerStateUpdate.WaveMaskUpdate( - wavesMaskHelper.getWaveMask(audioFile) + wavesMaskHelper.getWaveMask(audioFile)?.let { waveMask -> + audioMessageStateUpdate.emit( + RecordAudioMediaPlayerStateUpdate.WaveMaskUpdate( + waveMask = waveMask + ) ) - ) + } audioMessageStateUpdate.emit( RecordAudioMediaPlayerStateUpdate.RecordAudioMediaPlayingStateUpdate( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/messagetypes/audio/AudioMessageType.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/messagetypes/audio/AudioMessageType.kt index a81e4a705ab..639b8fe7e96 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/messagetypes/audio/AudioMessageType.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/messagetypes/audio/AudioMessageType.kt @@ -335,12 +335,12 @@ fun SuccessfulAudioMessageContent( private fun AudioMessageSlider( audioDuration: AudioDuration, totalTimeInMs: AudioState.TotalTimeInMs, - waveMask: List, + waveMask: List?, onSliderPositionChange: (Float) -> Unit, ) { Box(modifier = Modifier.fillMaxWidth()) { val totalMs = if (totalTimeInMs is AudioState.TotalTimeInMs.Known) totalTimeInMs.value.toFloat() else 0f - val waves = waveMask.ifEmpty { getDefaultWaveMask() } + val waves = waveMask?.ifEmpty { getDefaultWaveMask() } ?: getDefaultWaveMask() val wavesAmount = waves.size Row( diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f95acbb5047..7984c7f0a16 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -44,7 +44,7 @@ androidx-biometric = "1.1.0" androidx-startup = "1.2.0" androidx-compose-runtime = "1.7.2" compose-qr = "1.0.1" -amplituda = "2.2.2" +amplituda = "2.3.0" # Compose composeBom = "2024.12.01"