Skip to content

Commit 3fa9913

Browse files
authored
Merge pull request #1149 from tunjid/bugfix/2.1.6
Bugfix/2.1.6
2 parents 314de5f + fa8b894 commit 3fa9913

File tree

14 files changed

+418
-447
lines changed

14 files changed

+418
-447
lines changed

composeApp/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ compose.desktop {
196196
proguard {
197197
version.set("7.8.0")
198198
configurationFiles.from(project.file("compose-desktop.pro"))
199+
isEnabled = false
199200
}
200201
}
201202

feature/gallery/src/commonMain/kotlin/com/tunjid/heron/gallery/GalleryScreen.kt

Lines changed: 58 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ import androidx.compose.animation.fadeOut
2222
import androidx.compose.foundation.clickable
2323
import androidx.compose.foundation.combinedClickable
2424
import androidx.compose.foundation.gestures.ScrollableState
25+
import androidx.compose.foundation.layout.Arrangement
2526
import androidx.compose.foundation.layout.Box
27+
import androidx.compose.foundation.layout.Column
28+
import androidx.compose.foundation.layout.Row
2629
import androidx.compose.foundation.layout.WindowInsets
2730
import androidx.compose.foundation.layout.aspectRatio
2831
import androidx.compose.foundation.layout.fillMaxHeight
@@ -68,49 +71,47 @@ import com.tunjid.heron.data.core.types.ProfileId
6871
import com.tunjid.heron.data.utilities.asGenericUri
6972
import com.tunjid.heron.gallery.ui.Comments
7073
import com.tunjid.heron.gallery.ui.CommentsState
71-
import com.tunjid.heron.gallery.ui.GalleryFooter
7274
import com.tunjid.heron.gallery.ui.GalleryImage
7375
import com.tunjid.heron.gallery.ui.GalleryVideo
7476
import com.tunjid.heron.gallery.ui.ImageDownloadState
77+
import com.tunjid.heron.gallery.ui.MediaCreatorAndDescription
7578
import com.tunjid.heron.gallery.ui.MediaInteractions
76-
import com.tunjid.heron.gallery.ui.MediaOverlay
77-
import com.tunjid.heron.gallery.ui.MediaPoster
79+
import com.tunjid.heron.gallery.ui.MediaOverlayBox
7880
import com.tunjid.heron.gallery.ui.PagerStates
7981
import com.tunjid.heron.gallery.ui.galleryHeightFraction
8082
import com.tunjid.heron.gallery.ui.isNotCollapsed
8183
import com.tunjid.heron.gallery.ui.rememberCommentsState
8284
import com.tunjid.heron.interpolatedVisibleIndexEffect
8385
import com.tunjid.heron.media.video.ControlsVisibilityEffect
8486
import com.tunjid.heron.media.video.LocalVideoPlayerController
87+
import com.tunjid.heron.media.video.PlaybackStatus
8588
import com.tunjid.heron.media.video.PlayerControlsUiState
8689
import com.tunjid.heron.media.video.VideoPlayerController
8790
import com.tunjid.heron.scaffold.navigation.NavigationAction
8891
import com.tunjid.heron.scaffold.navigation.composePostDestination
8992
import com.tunjid.heron.scaffold.navigation.conversationDestination
90-
import com.tunjid.heron.scaffold.navigation.profileDestination
9193
import com.tunjid.heron.scaffold.navigation.signInDestination
9294
import com.tunjid.heron.scaffold.scaffold.DragToPopState.Companion.dragToPop
9395
import com.tunjid.heron.scaffold.scaffold.DragToPopState.Companion.rememberDragToPopState
9496
import com.tunjid.heron.scaffold.scaffold.PaneScaffoldState
9597
import com.tunjid.heron.tiling.TilingState
9698
import com.tunjid.heron.tiling.tiledItems
9799
import com.tunjid.heron.timeline.state.TimelineState
98-
import com.tunjid.heron.timeline.ui.PostAction
99100
import com.tunjid.heron.timeline.ui.post.PostInteractionsSheetState
100101
import com.tunjid.heron.timeline.ui.post.PostInteractionsSheetState.Companion.rememberUpdatedPostInteractionsSheetState
101102
import com.tunjid.heron.timeline.ui.post.PostOption
102103
import com.tunjid.heron.timeline.ui.post.PostOptionsSheetState
103104
import com.tunjid.heron.timeline.ui.post.PostOptionsSheetState.Companion.rememberUpdatedPostOptionsSheetState
104105
import com.tunjid.heron.timeline.ui.profile.ProfileRestrictionDialogState.Companion.rememberProfileRestrictionDialogState
105106
import com.tunjid.heron.timeline.ui.sheets.MutedWordsSheetState.Companion.rememberUpdatedMutedWordsSheetState
106-
import com.tunjid.heron.timeline.utilities.avatarSharedElementKey
107107
import com.tunjid.heron.ui.Indicator
108108
import com.tunjid.heron.ui.UiTokens
109109
import com.tunjid.heron.ui.platformStatusBars
110110
import com.tunjid.heron.ui.text.links
111111
import com.tunjid.tiler.compose.PivotedTilingEffect
112112
import kotlin.math.absoluteValue
113113
import kotlin.math.roundToInt
114+
import kotlinx.coroutines.flow.collectLatest
114115
import kotlinx.coroutines.launch
115116

116117
@Composable
@@ -482,94 +483,68 @@ private fun HorizontalItems(
482483
)
483484
}
484485

485-
MediaOverlay(
486+
MediaOverlayBox(
486487
modifier = Modifier
487488
.fillMaxSize(),
488489
media = item.media.getOrNull(pagerState.currentPage),
489490
isVisible = playerControlsUiState.playerControlsVisible,
490491
) { media ->
491-
val viewedProfileId = item.post.author.did
492-
MediaPoster(
492+
Column(
493493
modifier = Modifier
494-
.windowInsetsPadding(WindowInsets.platformStatusBars)
494+
.align(Alignment.BottomStart)
495495
.padding(
496-
horizontal = 16.dp,
497-
vertical = 20.dp,
498-
),
499-
post = item.post,
500-
signedInProfileId = signedInProfileId,
501-
viewerState = item.viewerState,
502-
sharedElementPrefix = item.posterSharedElementPrefix,
503-
paneScaffoldState = paneScaffoldState,
504-
onProfileClicked = { post ->
505-
actions(
506-
Action.Navigate.To(
507-
profileDestination(
508-
profile = post.author,
509-
avatarSharedElementKey = post.avatarSharedElementKey(
510-
prefix = item.posterSharedElementPrefix,
511-
),
512-
referringRouteOption = NavigationAction.ReferringRouteOption.Current,
513-
),
514-
),
496+
horizontal = 8.dp,
497+
vertical = 16.dp,
515498
)
516-
},
517-
onViewerStateToggled = remember(signedInProfileId, viewedProfileId) {
518-
{ viewerState ->
519-
signedInProfileId?.let {
520-
actions(
521-
Action.ToggleViewerState(
522-
signedInProfileId = it,
523-
viewedProfileId = viewedProfileId,
524-
following = viewerState?.following,
525-
followedBy = viewerState?.followedBy,
526-
),
527-
)
528-
}
529-
}
530-
},
531-
)
532-
533-
MediaInteractions(
534-
post = item.post,
535-
paneScaffoldState = paneScaffoldState,
536-
modifier = Modifier
537-
.padding(horizontal = 16.dp),
538-
showEngagementMetrics = showEngagementMetrics,
539-
onPostInteraction = { interaction ->
540-
when (interaction) {
541-
is PostAction.OfInteraction -> postInteractionSheetState.onInteraction(
542-
interaction,
543-
)
544-
is PostAction.OfMetadata -> Unit
545-
is PostAction.OfMore -> postOptionsSheetState.showOptions(
546-
interaction.post,
499+
.windowInsetsPadding(insets = WindowInsets.navigationBars),
500+
verticalArrangement = Arrangement.spacedBy(8.dp),
501+
) {
502+
Row(
503+
modifier = Modifier
504+
.weight(1f)
505+
.fillMaxWidth(),
506+
verticalAlignment = Alignment.Bottom,
507+
horizontalArrangement = Arrangement.spacedBy(8.dp),
508+
) {
509+
MediaCreatorAndDescription(
510+
modifier = Modifier
511+
.weight(1f),
512+
signedInProfileId = signedInProfileId,
513+
item = item,
514+
paneScaffoldState = paneScaffoldState,
515+
actions = actions,
516+
)
517+
MediaInteractions(
518+
modifier = Modifier
519+
.fillMaxHeight()
520+
.windowInsetsPadding(WindowInsets.platformStatusBars),
521+
media = media,
522+
imageDownloadState = imageDownloadState,
523+
videoPlayerController = videoPlayerController,
524+
actions = actions,
525+
item = item,
526+
paneScaffoldState = paneScaffoldState,
527+
showEngagementMetrics = showEngagementMetrics,
528+
postInteractionSheetState = postInteractionSheetState,
529+
postOptionsSheetState = postOptionsSheetState,
530+
commentsState = commentsState,
531+
)
532+
}
533+
(item.media.firstOrNull() as? GalleryItem.Media.Video)
534+
?.let { videoPlayerController.getVideoStateById(it.video.playlist.uri) }
535+
?.let { videoPlayerState ->
536+
PlaybackStatus(
537+
modifier = Modifier
538+
.fillMaxWidth(),
539+
videoPlayerState = videoPlayerState,
540+
controlsState = playerControlsUiState,
547541
)
548-
is PostAction.OfReply -> {
549-
commentsState.expand()
550-
actions(
551-
Action.LoadComments(
552-
post = item.post,
553-
order = null,
554-
),
555-
)
542+
LaunchedEffect(Unit) {
543+
snapshotFlow { videoPlayerState.status }
544+
.collectLatest(playerControlsUiState::update)
556545
}
557546
}
558-
},
559-
)
560-
GalleryFooter(
561-
modifier = Modifier
562-
.fillMaxWidth()
563-
.padding(vertical = 24.dp)
564-
.windowInsetsPadding(insets = WindowInsets.navigationBars),
565-
item = media,
566-
videoPlayerController = videoPlayerController,
567-
imageDownloadState = imageDownloadState,
568-
post = item.post,
569-
paneScaffoldState = paneScaffoldState,
570-
actions = actions,
571-
playerControlsUiState = playerControlsUiState,
572-
)
547+
}
573548
}
574549

575550
pagerState.interpolatedVisibleIndexEffect(

feature/gallery/src/commonMain/kotlin/com/tunjid/heron/gallery/State.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,9 @@ sealed class Action(val key: String) {
238238
sealed class Navigate :
239239
Action(key = "Navigate"),
240240
NavigationAction {
241+
242+
data object Pop : Navigate(), NavigationAction by NavigationAction.Pop
243+
241244
data class To(
242245
val delegate: NavigationAction.Destination,
243246
) : Navigate(),

feature/gallery/src/commonMain/kotlin/com/tunjid/heron/gallery/ui/Downloads.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ import androidx.compose.animation.core.animateFloatAsState
2121
import androidx.compose.foundation.layout.Box
2222
import androidx.compose.foundation.layout.size
2323
import androidx.compose.material.icons.Icons
24-
import androidx.compose.material.icons.rounded.Check
2524
import androidx.compose.material.icons.rounded.Download
25+
import androidx.compose.material.icons.rounded.DownloadDone
2626
import androidx.compose.material.icons.rounded.Error
2727
import androidx.compose.material3.CircularProgressIndicator
2828
import androidx.compose.material3.Icon
@@ -34,7 +34,6 @@ import androidx.compose.runtime.remember
3434
import androidx.compose.runtime.rememberCoroutineScope
3535
import androidx.compose.ui.Alignment
3636
import androidx.compose.ui.Modifier
37-
import androidx.compose.ui.unit.dp
3837
import com.tunjid.heron.gallery.GalleryItem
3938
import com.tunjid.heron.images.DownloadStatus
4039
import com.tunjid.heron.images.ImageRequest
@@ -61,7 +60,7 @@ internal fun ImageDownloadState.DownloadButton(
6160
) {
6261
val contentModifier = Modifier
6362
.align(Alignment.Center)
64-
.size(40.dp)
63+
.size(OverlayIconSize)
6564

6665
val onDownloadClicked: () -> Unit = remember(item.image.fullsize) {
6766
{
@@ -78,7 +77,7 @@ internal fun ImageDownloadState.DownloadButton(
7877
) { status ->
7978
when (status) {
8079
DownloadStatus.Complete -> Icon(
81-
imageVector = Icons.Rounded.Check,
80+
imageVector = Icons.Rounded.DownloadDone,
8281
contentDescription = stringResource(Res.string.download_complete),
8382
tint = MaterialTheme.colorScheme.primary,
8483
modifier = contentModifier,

0 commit comments

Comments
 (0)