Skip to content

Commit 183f8a4

Browse files
committed
feat(player-ux): make source links copyable by long clicking server items
1 parent cf4f7e8 commit 183f8a4

File tree

3 files changed

+36
-9
lines changed

3 files changed

+36
-9
lines changed

feature/mobile/player/src/main/java/com/flixclusive/feature/mobile/player/controls/common/ListContentHolder.kt

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.flixclusive.feature.mobile.player.controls.common
22

3-
import androidx.compose.foundation.ExperimentalFoundationApi
43
import androidx.compose.foundation.layout.Arrangement
54
import androidx.compose.foundation.layout.Box
65
import androidx.compose.foundation.layout.PaddingValues
@@ -20,17 +19,19 @@ import androidx.compose.ui.Modifier
2019
import androidx.compose.ui.graphics.Brush
2120
import androidx.compose.ui.graphics.Color
2221
import androidx.compose.ui.graphics.painter.Painter
22+
import androidx.compose.ui.platform.LocalClipboardManager
23+
import androidx.compose.ui.text.AnnotatedString
2324
import androidx.compose.ui.text.font.FontWeight
2425
import androidx.compose.ui.unit.dp
2526
import androidx.compose.ui.unit.sp
2627
import com.flixclusive.core.ui.common.util.fadingEdge
28+
import com.flixclusive.core.ui.mobile.util.getFeedbackOnLongPress
2729
import com.flixclusive.core.ui.player.PlayerProviderState
2830
import com.flixclusive.core.util.exception.safeCall
2931
import com.flixclusive.model.provider.SourceLink
3032
import com.flixclusive.model.provider.Subtitle
3133
import com.flixclusive.provider.ProviderApi
3234

33-
@OptIn(ExperimentalFoundationApi::class)
3435
@Composable
3536
internal fun <Type> ListContentHolder(
3637
modifier: Modifier = Modifier,
@@ -42,6 +43,9 @@ internal fun <Type> ListContentHolder(
4243
itemState: PlayerProviderState = PlayerProviderState.SELECTED,
4344
onItemClick: (Int) -> Unit,
4445
) {
46+
val clipboardManager = LocalClipboardManager.current
47+
val hapticFeedback = getFeedbackOnLongPress()
48+
4549
val listState = rememberLazyListState()
4650
val listBottomFade = Brush.verticalGradient(
4751
0.15F to Color.Transparent,
@@ -79,7 +83,23 @@ internal fun <Type> ListContentHolder(
7983
selectedIndex = selectedIndex,
8084
itemState = itemState,
8185
onClick = {
82-
onItemClick(i)
86+
if (i != selectedIndex) {
87+
onItemClick(i)
88+
}
89+
},
90+
onLongClick = {
91+
if (item is SourceLink) {
92+
hapticFeedback()
93+
clipboardManager.setText(
94+
AnnotatedString(
95+
"""
96+
Source name: ${item.name}
97+
Source link: ${item.url}
98+
Source headers: ${item.customHeaders}
99+
""".trimIndent()
100+
)
101+
)
102+
}
83103
}
84104
)
85105
}

feature/mobile/player/src/main/java/com/flixclusive/feature/mobile/player/controls/common/ListItem.kt

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.flixclusive.feature.mobile.player.controls.common
22

3-
import androidx.compose.foundation.clickable
3+
import androidx.compose.foundation.ExperimentalFoundationApi
4+
import androidx.compose.foundation.combinedClickable
45
import androidx.compose.foundation.layout.Arrangement
56
import androidx.compose.foundation.layout.Box
67
import androidx.compose.foundation.layout.Column
@@ -37,6 +38,7 @@ import com.flixclusive.core.ui.common.util.placeholderEffect
3738
import com.flixclusive.core.ui.player.PlayerProviderState
3839
import com.flixclusive.core.util.R as UtilR
3940

41+
@OptIn(ExperimentalFoundationApi::class)
4042
@Composable
4143
internal fun ListItem(
4244
modifier: Modifier = Modifier,
@@ -45,6 +47,7 @@ internal fun ListItem(
4547
selectedIndex: Int,
4648
itemState: PlayerProviderState = PlayerProviderState.SELECTED,
4749
onClick: () -> Unit,
50+
onLongClick: () -> Unit = {}
4851
) {
4952
val baseStyle = MaterialTheme.typography.labelLarge
5053
val unselectedColor = LocalContentColor.current.onMediumEmphasis()
@@ -63,9 +66,10 @@ internal fun ListItem(
6366

6467
Box(
6568
modifier = modifier
66-
.clickable(enabled = index != selectedIndex) {
67-
onClick()
68-
}
69+
.combinedClickable(
70+
onClick = onClick,
71+
onLongClick = onLongClick
72+
)
6973
) {
7074
Row(
7175
horizontalArrangement = Arrangement.spacedBy(15.dp),
@@ -149,7 +153,8 @@ private fun SheetItemLoadingPreview() {
149153
index = 0,
150154
selectedIndex = if (it < 2) 0 else 1,
151155
itemState = PlayerProviderState.entries[it % PlayerProviderState.entries.size],
152-
onClick = {}
156+
onClick = {},
157+
onLongClick = {}
153158
)
154159
}
155160
}

feature/mobile/player/src/main/java/com/flixclusive/feature/mobile/player/controls/dialogs/settings/PlayerSettingsPanel.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ internal fun PlayerSettingsPanel(
3636
index = i,
3737
selectedIndex = selected,
3838
onClick = {
39-
onClick?.invoke(i, item)
39+
if (i != selected) {
40+
onClick?.invoke(i, item)
41+
}
4042
}
4143
)
4244
}

0 commit comments

Comments
 (0)