Centralize WaveForm samples.

This commit is contained in:
Benoit Marty
2025-10-13 16:21:17 +02:00
committed by Benoit Marty
parent a5198b4f6a
commit 194b97ee10
7 changed files with 38 additions and 56 deletions
@@ -8,15 +8,15 @@
package io.element.android.features.messages.api.timeline.voicemessages.composer package io.element.android.features.messages.api.timeline.voicemessages.composer
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.designsystem.components.media.WaveFormSamples
import io.element.android.libraries.designsystem.components.media.createFakeWaveform import io.element.android.libraries.designsystem.components.media.createFakeWaveform
import io.element.android.libraries.textcomposer.model.VoiceMessageState import io.element.android.libraries.textcomposer.model.VoiceMessageState
import kotlinx.collections.immutable.toImmutableList
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds
open class VoiceMessageComposerStateProvider : PreviewParameterProvider<VoiceMessageComposerState> { open class VoiceMessageComposerStateProvider : PreviewParameterProvider<VoiceMessageComposerState> {
override val values: Sequence<VoiceMessageComposerState> override val values: Sequence<VoiceMessageComposerState>
get() = sequenceOf( get() = sequenceOf(
aVoiceMessageComposerState(voiceMessageState = VoiceMessageState.Recording(duration = 61.seconds, levels = aWaveformLevels)), aVoiceMessageComposerState(voiceMessageState = VoiceMessageState.Recording(duration = 61.seconds, levels = WaveFormSamples.allRangeWaveForm)),
) )
} }
@@ -41,5 +41,3 @@ fun aVoiceMessagePreviewState() = VoiceMessageState.Preview(
time = 10.seconds, time = 10.seconds,
waveform = createFakeWaveform(), waveform = createFakeWaveform(),
) )
internal var aWaveformLevels = List(100) { it.toFloat() / 100 }.toImmutableList()
@@ -0,0 +1,26 @@
/*
* Copyright 2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.libraries.designsystem.components.media
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
object WaveFormSamples {
val allRangeWaveForm = List(100) { it.toFloat() / 100 }.toImmutableList()
val realisticWaveForm = persistentListOf(
0.000f, 0.000f, 0.000f, 0.003f, 0.354f,
0.353f, 0.365f, 0.790f, 0.787f, 0.167f,
0.333f, 0.975f, 0.000f, 0.102f, 0.003f,
0.531f, 0.584f, 0.317f, 0.140f, 0.475f,
0.496f, 0.561f, 0.042f, 0.263f, 0.169f,
0.829f, 0.349f, 0.010f, 0.000f, 0.000f,
1.000f, 0.334f, 0.321f, 0.011f, 0.000f,
0.000f, 0.003f,
)
}
@@ -187,14 +187,14 @@ internal fun WaveformPlaybackViewPreview() = ElementPreview {
showCursor = false, showCursor = false,
playbackProgress = 0.5f, playbackProgress = 0.5f,
onSeek = {}, onSeek = {},
waveform = aWaveForm().toImmutableList(), waveform = WaveFormSamples.realisticWaveForm,
) )
WaveformPlaybackView( WaveformPlaybackView(
modifier = Modifier.height(34.dp), modifier = Modifier.height(34.dp),
showCursor = true, showCursor = true,
playbackProgress = 0.5f, playbackProgress = 0.5f,
onSeek = {}, onSeek = {},
waveform = List(1024) { it / 1024f }.toImmutableList(), waveform = WaveFormSamples.allRangeWaveForm,
) )
} }
} }
@@ -217,45 +217,3 @@ private fun ImmutableList<Float>.normalisedData(maxSamplesCount: Int): Immutable
return result.toImmutableList() return result.toImmutableList()
} }
fun aWaveForm(): List<Float> {
return listOf(
0.000f,
0.000f,
0.000f,
0.003f,
0.354f,
0.353f,
0.365f,
0.790f,
0.787f,
0.167f,
0.333f,
0.975f,
0.000f,
0.102f,
0.003f,
0.531f,
0.584f,
0.317f,
0.140f,
0.475f,
0.496f,
0.561f,
0.042f,
0.263f,
0.169f,
0.829f,
0.349f,
0.010f,
0.000f,
0.000f,
1.000f,
0.334f,
0.321f,
0.011f,
0.000f,
0.000f,
0.003f,
)
}
@@ -9,7 +9,7 @@ package io.element.android.libraries.mediaviewer.impl.gallery
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.designsystem.components.media.aWaveForm import io.element.android.libraries.designsystem.components.media.WaveFormSamples
import io.element.android.libraries.matrix.api.core.UniqueId import io.element.android.libraries.matrix.api.core.UniqueId
import io.element.android.libraries.mediaviewer.impl.details.MediaBottomSheetState import io.element.android.libraries.mediaviewer.impl.details.MediaBottomSheetState
import io.element.android.libraries.mediaviewer.impl.details.aMediaDetailsBottomSheetState import io.element.android.libraries.mediaviewer.impl.details.aMediaDetailsBottomSheetState
@@ -71,7 +71,7 @@ open class MediaGalleryStateProvider : PreviewParameterProvider<MediaGalleryStat
aMediaItemAudio(id = UniqueId("4")), aMediaItemAudio(id = UniqueId("4")),
aMediaItemVoice( aMediaItemVoice(
id = UniqueId("5"), id = UniqueId("5"),
waveform = aWaveForm(), waveform = WaveFormSamples.realisticWaveForm,
), ),
aMediaItemLoadingIndicator(), aMediaItemLoadingIndicator(),
).toImmutableList() ).toImmutableList()
@@ -8,7 +8,7 @@
package io.element.android.libraries.mediaviewer.impl.local.audio package io.element.android.libraries.mediaviewer.impl.local.audio
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.designsystem.components.media.aWaveForm import io.element.android.libraries.designsystem.components.media.WaveFormSamples
import io.element.android.libraries.mediaviewer.api.MediaInfo import io.element.android.libraries.mediaviewer.api.MediaInfo
import io.element.android.libraries.mediaviewer.api.anAudioMediaInfo import io.element.android.libraries.mediaviewer.api.anAudioMediaInfo
@@ -17,7 +17,7 @@ open class MediaInfoAudioProvider : PreviewParameterProvider<MediaInfo> {
get() = sequenceOf( get() = sequenceOf(
anAudioMediaInfo(), anAudioMediaInfo(),
anAudioMediaInfo( anAudioMediaInfo(
waveForm = aWaveForm(), waveForm = WaveFormSamples.realisticWaveForm,
), ),
) )
} }
@@ -7,7 +7,7 @@
package io.element.android.libraries.mediaviewer.impl.model package io.element.android.libraries.mediaviewer.impl.model
import io.element.android.libraries.designsystem.components.media.aWaveForm import io.element.android.libraries.designsystem.components.media.WaveFormSamples
import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.UniqueId import io.element.android.libraries.matrix.api.core.UniqueId
import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.UserId
@@ -91,7 +91,7 @@ fun aMediaItemVoice(
filename: String = "filename.ogg", filename: String = "filename.ogg",
caption: String? = null, caption: String? = null,
duration: String? = "1:23", duration: String? = "1:23",
waveform: List<Float> = aWaveForm(), waveform: List<Float> = WaveFormSamples.realisticWaveForm,
): MediaItem.Voice { ): MediaItem.Voice {
return MediaItem.Voice( return MediaItem.Voice(
id = id, id = id,
@@ -11,7 +11,7 @@ import android.net.Uri
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.designsystem.components.media.aWaveForm import io.element.android.libraries.designsystem.components.media.WaveFormSamples
import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.media.MediaSource import io.element.android.libraries.matrix.api.media.MediaSource
import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.Timeline
@@ -138,7 +138,7 @@ open class MediaViewerStateProvider : PreviewParameterProvider<MediaViewerState>
mediaBottomSheetState = aMediaDeleteConfirmationState(), mediaBottomSheetState = aMediaDeleteConfirmationState(),
), ),
anAudioMediaInfo( anAudioMediaInfo(
waveForm = aWaveForm(), waveForm = WaveFormSamples.realisticWaveForm,
).let { ).let {
aMediaViewerState( aMediaViewerState(
listOf( listOf(