Skip to content

Commit 1c1cc01

Browse files
committed
Replace unmaintained reorderable library
1 parent 1d9b860 commit 1c1cc01

3 files changed

Lines changed: 48 additions & 56 deletions

File tree

‎buildSrc/src/main/java/tm/alashow/buildSrc/App.kt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ object App {
66
const val compileSdkVersion = 37
77
const val targetSdkVersion = 37
88
const val minSdkVersion = 24
9-
const val versionCode = 250
9+
const val versionCode = 251
1010
const val versionName = "2.5.0-beta.1"
1111
}

‎gradle/libs.versions.toml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ compose-bom-alpha = "2026.06.01"
3030
constraintlayout-compose = "1.1.0-alpha03"
3131
paging-compose = "1.0.0-alpha16"
3232
lottie = "5.2.0"
33-
reorderable = "0.9.2"
33+
reorderable = "3.1.0"
3434
swipe = "1.0.0"
3535
# Accompanist
3636
accompanist = "0.26.3-beta"
@@ -140,7 +140,7 @@ accompanist-systemuicontroller = { module = "com.google.accompanist:accompanist-
140140
accompanist-flowlayout = { module = "com.google.accompanist:accompanist-flowlayout", version.ref = "accompanist" }
141141
lottie-compose = { module = "com.airbnb.android:lottie-compose", version.ref = "lottie" }
142142
coil-compose = { module = "io.coil-kt:coil-compose", version.ref = "coil" }
143-
compose-reorderable = { module = "org.burnoutcrew.composereorderable:reorderable", version.ref = "reorderable" }
143+
compose-reorderable = { module = "sh.calvin.reorderable:reorderable", version.ref = "reorderable" }
144144
swipe = { module = "me.saket.swipe:swipe", version.ref = "swipe" }
145145

146146
# Lifecycle

‎modules/ui-library/src/main/java/tm/alashow/datmusic/ui/library/playlists/edit/EditPlaylist.kt‎

Lines changed: 45 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ import android.net.Uri
88
import androidx.activity.compose.rememberLauncherForActivityResult
99
import androidx.activity.result.contract.ActivityResultContracts
1010
import androidx.compose.animation.AnimatedVisibility
11+
import androidx.compose.animation.core.animateDpAsState
1112
import androidx.compose.animation.fadeIn
1213
import androidx.compose.animation.fadeOut
1314
import androidx.compose.foundation.ExperimentalFoundationApi
14-
import androidx.compose.foundation.gestures.detectTapGestures
1515
import androidx.compose.foundation.horizontalScroll
1616
import androidx.compose.foundation.layout.Arrangement
1717
import androidx.compose.foundation.layout.Box
@@ -25,9 +25,9 @@ import androidx.compose.foundation.layout.padding
2525
import androidx.compose.foundation.layout.statusBarsPadding
2626
import androidx.compose.foundation.layout.systemBarsPadding
2727
import androidx.compose.foundation.lazy.LazyColumn
28-
import androidx.compose.foundation.lazy.LazyListItemInfo
2928
import androidx.compose.foundation.lazy.LazyListScope
3029
import androidx.compose.foundation.lazy.items
30+
import androidx.compose.foundation.lazy.rememberLazyListState
3131
import androidx.compose.foundation.rememberScrollState
3232
import androidx.compose.material.icons.Icons
3333
import androidx.compose.material.icons.filled.Clear
@@ -40,6 +40,7 @@ import androidx.compose.material3.ExperimentalMaterial3Api
4040
import androidx.compose.material3.Icon
4141
import androidx.compose.material3.MaterialTheme
4242
import androidx.compose.material3.Scaffold
43+
import androidx.compose.material3.Surface
4344
import androidx.compose.material3.Text
4445
import androidx.compose.material3.TextButton
4546
import androidx.compose.runtime.Composable
@@ -51,19 +52,16 @@ import androidx.compose.runtime.toMutableStateList
5152
import androidx.compose.ui.Alignment
5253
import androidx.compose.ui.Modifier
5354
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
54-
import androidx.compose.ui.input.pointer.pointerInput
5555
import androidx.compose.ui.platform.LocalContext
5656
import androidx.compose.ui.platform.LocalHapticFeedback
5757
import androidx.compose.ui.res.stringResource
5858
import androidx.compose.ui.text.style.TextAlign
5959
import androidx.compose.ui.unit.Dp
6060
import androidx.compose.ui.unit.dp
6161
import androidx.hilt.navigation.compose.hiltViewModel
62-
import org.burnoutcrew.reorderable.ReorderableItem
63-
import org.burnoutcrew.reorderable.ReorderableState
64-
import org.burnoutcrew.reorderable.detectReorder
65-
import org.burnoutcrew.reorderable.rememberReorderableLazyListState
66-
import org.burnoutcrew.reorderable.reorderable
62+
import sh.calvin.reorderable.ReorderableItem
63+
import sh.calvin.reorderable.ReorderableLazyListState
64+
import sh.calvin.reorderable.rememberReorderableLazyListState
6765
import tm.alashow.base.util.extensions.swap
6866
import tm.alashow.common.compose.LocalIsPreviewMode
6967
import tm.alashow.common.compose.previews.CombinedPreview
@@ -148,17 +146,16 @@ private fun EditPlaylist(
148146
) { paddings ->
149147
ProvideScaffoldPadding(paddings) {
150148
val itemsBeforeContent = 3
151-
val reorderableState = rememberReorderableLazyListState(
152-
onMove = { from, to -> onMovePlaylistItem(from.index - itemsBeforeContent, to.index - itemsBeforeContent) },
153-
canDragOver = { it.key is DraggableItemKey },
154-
)
149+
val listState = rememberLazyListState()
150+
val reorderableState = rememberReorderableLazyListState(listState) { from, to ->
151+
onMovePlaylistItem(from.index - itemsBeforeContent, to.index - itemsBeforeContent)
152+
}
155153

156154
Box(modifier) {
157155
LazyColumn(
158-
state = reorderableState.listState,
156+
state = listState,
159157
modifier = Modifier
160158
.fillMaxSize()
161-
.reorderable(reorderableState)
162159
) {
163160
item {
164161
Spacer(Modifier.statusBarsPadding())
@@ -334,55 +331,50 @@ private fun LazyListScope.editPlaylistExtraActions(
334331

335332
@OptIn(ExperimentalFoundationApi::class)
336333
private fun LazyListScope.editablePlaylistAudioList(
337-
reorderableState: ReorderableState<LazyListItemInfo>,
334+
reorderableState: ReorderableLazyListState,
338335
onRemove: (PlaylistAudioId) -> Unit,
339336
audios: PlaylistItems,
340337
) {
341338
items(audios, key = { DraggableItemKey(it.playlistAudio.id) }) { playlistItem ->
342339
val haptic = LocalHapticFeedback.current
343340
val itemKey = DraggableItemKey(playlistItem.playlistAudio.id)
344-
val isDragging = reorderableState.draggingItemKey == itemKey
345-
ReorderableItem(
346-
reorderableState, key = itemKey,
347-
if (isDragging) Modifier else Modifier.animateItem()
348-
) {
349-
Row(
350-
verticalAlignment = Alignment.CenterVertically,
351-
horizontalArrangement = Arrangement.spacedBy(AppTheme.specs.paddingSmall),
352-
modifier = Modifier
353-
.padding(vertical = Theme.specs.paddingSmall)
354-
.padding(start = Theme.specs.paddingSmall)
355-
.padding(end = Theme.specs.padding),
356-
) {
357-
IconButton(onClick = { onRemove(playlistItem.playlistAudio.id) }) {
341+
ReorderableItem(reorderableState, itemKey) { isDragging ->
342+
val elevation by animateDpAsState(if (isDragging) 2.dp else 0.dp)
343+
Surface(shadowElevation = elevation) {
344+
Row(
345+
verticalAlignment = Alignment.CenterVertically,
346+
horizontalArrangement = Arrangement.spacedBy(AppTheme.specs.paddingSmall),
347+
modifier = Modifier
348+
.padding(vertical = Theme.specs.paddingSmall)
349+
.padding(start = Theme.specs.paddingSmall)
350+
.padding(end = Theme.specs.padding)
351+
.apply { if (isDragging) animateItem() else this }
352+
) {
353+
IconButton(onClick = { onRemove(playlistItem.playlistAudio.id) }) {
354+
Icon(
355+
Icons.Default.RemoveCircleOutline,
356+
contentDescription = null,
357+
modifier = Modifier.weight(2f)
358+
)
359+
}
360+
361+
AudioRowItem(
362+
audio = playlistItem.audio,
363+
modifier = Modifier.weight(19f),
364+
includeCover = false,
365+
observeNowPlayingAudio = false,
366+
maxLines = 1,
367+
)
368+
358369
Icon(
359-
Icons.Default.RemoveCircleOutline,
370+
Icons.Default.DragHandle,
360371
contentDescription = null,
361-
modifier = Modifier.weight(2f)
372+
modifier = Modifier.draggableHandle(
373+
onDragStarted = { haptic.performHapticFeedback(HapticFeedbackType.GestureThresholdActivate) },
374+
onDragStopped = { haptic.performHapticFeedback(HapticFeedbackType.GestureEnd) },
375+
)
362376
)
363377
}
364-
365-
AudioRowItem(
366-
audio = playlistItem.audio,
367-
modifier = Modifier.weight(19f),
368-
includeCover = false,
369-
observeNowPlayingAudio = false,
370-
maxLines = 1,
371-
)
372-
373-
Icon(
374-
Icons.Default.DragHandle,
375-
contentDescription = null,
376-
modifier = Modifier
377-
.pointerInput(Unit) {
378-
detectTapGestures(
379-
onPress = {
380-
haptic.performHapticFeedback(HapticFeedbackType.LongPress)
381-
}
382-
)
383-
}
384-
.detectReorder(reorderableState)
385-
)
386378
}
387379
}
388380
}

0 commit comments

Comments
 (0)