Skip to content

Commit 5b3bf92

Browse files
committed
WIP - fixed the interactivity issue
Signed-off-by: rapterjet2004 <juliuslinus1@gmail.com>
1 parent dbbe1b9 commit 5b3bf92

2 files changed

Lines changed: 20 additions & 44 deletions

File tree

app/src/main/java/com/nextcloud/talk/ui/ComposeWaveformSeekbar.kt

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
package com.nextcloud.talk.ui
99

1010
import androidx.compose.foundation.background
11-
import androidx.compose.foundation.interaction.MutableInteractionSource
1211
import androidx.compose.foundation.layout.Box
1312
import androidx.compose.foundation.layout.height
1413
import androidx.compose.foundation.layout.size
@@ -17,7 +16,6 @@ import androidx.compose.foundation.shape.CircleShape
1716
import androidx.compose.material3.ExperimentalMaterial3Api
1817
import androidx.compose.material3.MaterialTheme
1918
import androidx.compose.material3.Slider
20-
import androidx.compose.material3.SliderState
2119
import androidx.compose.runtime.Composable
2220
import androidx.compose.runtime.remember
2321
import androidx.compose.ui.Modifier
@@ -32,16 +30,16 @@ const val WAVEFORM_THUMB_SIZE = 20
3230
const val WAVEFORM_SIZE = 30
3331
@OptIn(ExperimentalMaterial3Api::class)
3432
@Composable
35-
fun WaveformSeekBar1(sliderState: SliderState, modifier: Modifier, interaction: MutableInteractionSource, waveData: FloatArray) {
33+
fun ComposeWaveformSeekBar(value: Float, onValueChange: (Float) -> Unit, modifier: Modifier, waveData: FloatArray) {
3634
val barWidth = Stroke.DefaultMiter
3735
val thumbSize = WAVEFORM_THUMB_SIZE.dp
3836
val inversePrimary = MaterialTheme.colorScheme.inversePrimary
3937
val onPrimaryContainer = MaterialTheme.colorScheme.onPrimaryContainer
4038

4139
Slider(
42-
state = sliderState,
43-
interactionSource = interaction,
44-
track = { state ->
40+
value = value,
41+
onValueChange = onValueChange,
42+
track = {
4543
Box(modifier = modifier
4644
.drawWithCache {
4745
onDrawBehind {
@@ -51,7 +49,7 @@ fun WaveformSeekBar1(sliderState: SliderState, modifier: Modifier, interaction:
5149
for (i in waveData.indices) {
5250
val x: Float = i * (barWidth + barGap)
5351
val y: Float = waveData[i] * height
54-
val isXBeforeThumb = (x / this.size.width) <= state.value + 0.025
52+
val isXBeforeThumb = (x / this.size.width) <= value + 0.025
5553

5654
drawLine(
5755
if (isXBeforeThumb) inversePrimary else onPrimaryContainer,
@@ -79,27 +77,13 @@ fun WaveformSeekBar1(sliderState: SliderState, modifier: Modifier, interaction:
7977
@Preview
8078
fun Preview() {
8179
val waveData = remember { FloatArray(50) { (Math.random() % 1).toFloat() } }
82-
val sliderState = SliderState()
83-
val interaction = remember { MutableInteractionSource() }
84-
sliderState.onValueChange = { progress ->
85-
if (sliderState.isDragging) {
86-
// onSeek(message.id, progress)
87-
}
88-
}
89-
90-
// to update the slider, it should have
91-
sliderState.value
92-
// be updated in some kind of async programming callback
93-
// but in practice, that is abstracted away due to the magic of
94-
// recomposition, leading to just this derived state
95-
// sliderState.value = typeContent.seekbarProgress
9680

97-
WaveformSeekBar1(
98-
sliderState,
81+
ComposeWaveformSeekBar(
82+
0f,
83+
{},
9984
modifier = Modifier
10085
.height(56.dp)
10186
.width(200.dp),
102-
interaction,
10387
waveData
10488
)
10589
}

app/src/main/java/com/nextcloud/talk/ui/chat/VoiceMessage.kt

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
package com.nextcloud.talk.ui.chat
99

1010
import android.text.format.DateUtils
11-
import androidx.compose.foundation.interaction.MutableInteractionSource
12-
import androidx.compose.foundation.interaction.collectIsDraggedAsState
1311
import androidx.compose.foundation.layout.Column
1412
import androidx.compose.foundation.layout.Row
1513
import androidx.compose.foundation.layout.fillMaxWidth
@@ -24,12 +22,13 @@ import androidx.compose.material3.ExperimentalMaterial3Api
2422
import androidx.compose.material3.Icon
2523
import androidx.compose.material3.IconButton
2624
import androidx.compose.material3.MaterialTheme.colorScheme
27-
import androidx.compose.material3.SliderState
2825
import androidx.compose.material3.Text
2926
import androidx.compose.material3.TextButton
3027
import androidx.compose.runtime.Composable
3128
import androidx.compose.runtime.getValue
29+
import androidx.compose.runtime.mutableFloatStateOf
3230
import androidx.compose.runtime.remember
31+
import androidx.compose.runtime.setValue
3332
import androidx.compose.ui.Alignment
3433
import androidx.compose.ui.Modifier
3534
import androidx.compose.ui.graphics.toArgb
@@ -38,8 +37,8 @@ import androidx.compose.ui.unit.dp
3837
import com.nextcloud.talk.R
3938
import com.nextcloud.talk.chat.ui.model.ChatMessageUi
4039
import com.nextcloud.talk.chat.ui.model.MessageTypeContent
40+
import com.nextcloud.talk.ui.ComposeWaveformSeekBar
4141
import com.nextcloud.talk.ui.WAVEFORM_SIZE
42-
import com.nextcloud.talk.ui.WaveformSeekBar1
4342
import com.nextcloud.talk.utils.AudioUtils
4443

4544
private const val SEEKBAR_MAX = 100
@@ -92,27 +91,20 @@ fun VoiceMessage(
9291
}
9392
}
9493

95-
// TODO - figure out why this won't be interactive on user drag events
94+
var sliderValue by remember { mutableFloatStateOf(0f) }
95+
sliderValue = typeContent.seekbarProgress * 1f / SEEKBAR_MAX
9696

97-
val interaction = remember { MutableInteractionSource() }
98-
val sliderState = SliderState()
99-
typeContent.seekbarProgress * 1f / SEEKBAR_MAX // should be in range 0 to 1
100-
101-
// FIXME - this might be problematic
102-
// sliderState.onValueChange = { progress ->
103-
// if (isDragging) {
104-
// val progressI = (progress * SEEKBAR_MAX).toInt()
105-
// onSeek(message.id, progressI)
106-
// }
107-
// }
108-
109-
WaveformSeekBar1(
110-
sliderState,
97+
ComposeWaveformSeekBar(
98+
sliderValue,
99+
{
100+
val progressI = (it * SEEKBAR_MAX).toInt()
101+
onSeek(message.id, progressI)
102+
sliderValue = it
103+
},
111104
modifier = Modifier
112105
.height(56.dp)
113106
.fillMaxWidth()
114107
.padding(8.dp), // or weight(1f),
115-
interaction,
116108
waveformData
117109
)
118110

0 commit comments

Comments
 (0)