diff --git a/feature/folder/src/main/java/com/android/swingmusic/folder/presentation/screen/FoldersAndTracks.kt b/feature/folder/src/main/java/com/android/swingmusic/folder/presentation/screen/FoldersAndTracks.kt index 2fac5c7d..3277ef4b 100644 --- a/feature/folder/src/main/java/com/android/swingmusic/folder/presentation/screen/FoldersAndTracks.kt +++ b/feature/folder/src/main/java/com/android/swingmusic/folder/presentation/screen/FoldersAndTracks.kt @@ -39,6 +39,10 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue +import androidx.compose.runtime.snapshotFlow +import kotlinx.coroutines.flow.drop +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.first import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.StrokeCap @@ -90,7 +94,9 @@ private fun FoldersAndTracks( onGotoArtist: (hash: String) -> Unit, baseUrl: String, isManualRefreshing: Boolean, - onManualRefreshingChange: (Boolean) -> Unit + onManualRefreshingChange: (Boolean) -> Unit, + getSavedScroll: (path: String) -> Pair?, + onSaveScroll: (path: String, index: Int, offset: Int) -> Unit ) { val sheetState = rememberModalBottomSheetState() val scope = rememberCoroutineScope() @@ -134,6 +140,25 @@ private fun FoldersAndTracks( val lazyColumnState = rememberLazyListState() val pathsLazyRowState = rememberLazyListState() + + LaunchedEffect(currentFolder.path) { + val saved = getSavedScroll(currentFolder.path) + if (saved != null) { + snapshotFlow { lazyColumnState.layoutInfo.totalItemsCount } + .filter { it > 0 } + .first() + lazyColumnState.scrollToItem(saved.first, saved.second) + } + + snapshotFlow { + lazyColumnState.firstVisibleItemIndex to lazyColumnState.firstVisibleItemScrollOffset + } + .drop(1) + .collect { (index, offset) -> + onSaveScroll(currentFolder.path, index, offset) + } + } + Scaffold { it -> PullToRefreshBox( modifier = Modifier.fillMaxSize(), @@ -654,7 +679,11 @@ fun FoldersAndTracksScreen( onGotoArtist = { hash -> navigator.gotoArtistInfo(hash) }, - baseUrl = baseUrl ?: "" + baseUrl = baseUrl ?: "", + getSavedScroll = { path -> foldersViewModel.getScrollPosition(path) }, + onSaveScroll = { path, index, offset -> + foldersViewModel.saveScrollPosition(path, index, offset) + } ) } } diff --git a/feature/folder/src/main/java/com/android/swingmusic/folder/presentation/viewmodel/FoldersViewModel.kt b/feature/folder/src/main/java/com/android/swingmusic/folder/presentation/viewmodel/FoldersViewModel.kt index 17b0203f..bb37daf2 100644 --- a/feature/folder/src/main/java/com/android/swingmusic/folder/presentation/viewmodel/FoldersViewModel.kt +++ b/feature/folder/src/main/java/com/android/swingmusic/folder/presentation/viewmodel/FoldersViewModel.kt @@ -68,6 +68,17 @@ class FoldersViewModel @Inject constructor( mutableStateOf(FoldersContentPagingState()) val foldersContentPaging: State = _foldersContentPaging + private val folderScrollPositions = mutableMapOf>() + + private fun normalizeFolderPath(path: String): String = path.trimEnd('/') + + fun saveScrollPosition(path: String, index: Int, offset: Int) { + folderScrollPositions[normalizeFolderPath(path)] = index to offset + } + + fun getScrollPosition(path: String): Pair? = + folderScrollPositions[normalizeFolderPath(path)] + init { getFoldersContentPaging(homeDir.path) }