Skip to content

Commit a8a06b4

Browse files
authored
Merge pull request #1096 from DimensionDev/bugfix/video_playback
Bugfix video playback
2 parents f5757b4 + a2ed410 commit a8a06b4

File tree

2 files changed

+37
-33
lines changed
  • desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/home
  • shared/ui/component/src/androidMain/kotlin/dev/dimension/flare/ui/component

2 files changed

+37
-33
lines changed

desktopApp/src/main/kotlin/dev/dimension/flare/ui/screen/home/ProfileScreen.kt

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import androidx.compose.foundation.lazy.staggeredgrid.rememberLazyStaggeredGridS
1414
import androidx.compose.foundation.rememberScrollState
1515
import androidx.compose.foundation.verticalScroll
1616
import androidx.compose.runtime.Composable
17+
import androidx.compose.runtime.CompositionLocalProvider
1718
import androidx.compose.runtime.getValue
1819
import androidx.compose.runtime.mutableStateOf
1920
import androidx.compose.runtime.remember
@@ -39,6 +40,8 @@ import dev.dimension.flare.profile_tab_media
3940
import dev.dimension.flare.profile_tab_timeline
4041
import dev.dimension.flare.profile_tab_timeline_with_reply
4142
import dev.dimension.flare.ui.common.items
43+
import dev.dimension.flare.ui.component.ComponentAppearance
44+
import dev.dimension.flare.ui.component.LocalComponentAppearance
4245
import dev.dimension.flare.ui.component.ProfileHeader
4346
import dev.dimension.flare.ui.component.ProfileMenu
4447
import dev.dimension.flare.ui.component.platform.isBigScreen
@@ -198,19 +201,25 @@ internal fun ProfileScreen(
198201
}
199202
},
200203
) { item ->
201-
val media = item.media
202-
MediaItem(
203-
media = media,
204-
showCountdown = false,
205-
modifier =
206-
Modifier
207-
.clip(FluentTheme.shapes.control)
208-
.padding(
209-
vertical = 4.dp,
210-
).clipToBounds()
211-
.clickable {
212-
val content = item.status.content
213-
if (content is UiTimeline.ItemContent.Status) {
204+
CompositionLocalProvider(
205+
LocalComponentAppearance provides
206+
LocalComponentAppearance.current.copy(
207+
videoAutoplay = ComponentAppearance.VideoAutoplay.NEVER,
208+
),
209+
) {
210+
val media = item.media
211+
MediaItem(
212+
media = media,
213+
showCountdown = false,
214+
modifier =
215+
Modifier
216+
.clip(FluentTheme.shapes.control)
217+
.padding(
218+
vertical = 4.dp,
219+
).clipToBounds()
220+
.clickable {
221+
val content = item.status.content
222+
if (content is UiTimeline.ItemContent.Status) {
214223
// onItemClicked(
215224
// content.statusKey,
216225
// item.index,
@@ -221,9 +230,10 @@ internal fun ProfileScreen(
221230
// else -> null
222231
// },
223232
// )
224-
}
225-
},
226-
)
233+
}
234+
},
235+
)
236+
}
227237
}
228238
}
229239
is ProfileState.Tab.Timeline -> {

shared/ui/component/src/androidMain/kotlin/dev/dimension/flare/ui/component/VideoPlayer.kt

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import androidx.media3.common.Player
3232
import androidx.media3.common.util.UnstableApi
3333
import androidx.media3.exoplayer.ExoPlayer
3434
import androidx.media3.ui.compose.PlayerSurface
35-
import androidx.media3.ui.compose.SURFACE_TYPE_TEXTURE_VIEW
3635
import androidx.media3.ui.compose.modifiers.resizeWithContentScale
3736
import androidx.media3.ui.compose.state.rememberPresentationState
3837
import kotlinx.coroutines.CoroutineScope
@@ -112,9 +111,12 @@ public fun VideoPlayer(
112111
remember(uri) {
113112
playerPool
114113
.get(uri)
114+
.apply {
115+
volume = if (muted) 0f else 1f
116+
}
115117
}
116118
val state = rememberPresentationState(player)
117-
LaunchedEffect(muted) {
119+
LaunchedEffect(muted, player) {
118120
player.volume = if (muted) 0f else 1f
119121
if (muted) {
120122
player.setAudioAttributes(audioAttributes, false)
@@ -136,12 +138,6 @@ public fun VideoPlayer(
136138
delay(500)
137139
}
138140
}
139-
DisposableEffect(uri) {
140-
onDispose {
141-
player.setAudioAttributes(audioAttributes, false)
142-
playerPool.release(uri)
143-
}
144-
}
145141
val isActive = rememberSurfaceBinding(uri)
146142
val playerModifier =
147143
Modifier
@@ -150,14 +146,6 @@ public fun VideoPlayer(
150146
contentScale = contentScale,
151147
sourceSizeDp = state.videoSizeDp,
152148
).let {
153-
if (aspectRatio != null) {
154-
it.aspectRatio(
155-
aspectRatio,
156-
)
157-
} else {
158-
it
159-
}
160-
}.let {
161149
if (onClick != null) {
162150
it.combinedClickable(
163151
onClick = onClick,
@@ -171,7 +159,6 @@ public fun VideoPlayer(
171159
PlayerSurface(
172160
player = player,
173161
modifier = playerModifier,
174-
surfaceType = SURFACE_TYPE_TEXTURE_VIEW,
175162
)
176163
} else {
177164
loadingPlaceholder.invoke(this)
@@ -181,6 +168,13 @@ public fun VideoPlayer(
181168
} else {
182169
remainingTimeContent?.invoke(this, remainingTime)
183170
}
171+
DisposableEffect(uri) {
172+
onDispose {
173+
player.volume = 0f
174+
player.setAudioAttributes(audioAttributes, false)
175+
playerPool.release(uri)
176+
}
177+
}
184178
}
185179
}
186180

0 commit comments

Comments
 (0)