diff --git a/app/src/main/java/com/android/swingmusic/presentation/activity/MainActivity.kt b/app/src/main/java/com/android/swingmusic/presentation/activity/MainActivity.kt index e128bbfb..56afceb4 100644 --- a/app/src/main/java/com/android/swingmusic/presentation/activity/MainActivity.kt +++ b/app/src/main/java/com/android/swingmusic/presentation/activity/MainActivity.kt @@ -59,7 +59,9 @@ import com.android.swingmusic.auth.data.workmanager.scheduleTokenRefreshWork import com.android.swingmusic.auth.presentation.screen.destinations.LoginWithQrCodeDestination import com.android.swingmusic.auth.presentation.screen.destinations.LoginWithUsernameScreenDestination import com.android.swingmusic.auth.presentation.viewmodel.AuthViewModel +import com.android.swingmusic.folder.presentation.event.FolderUiEvent import com.android.swingmusic.folder.presentation.screen.destinations.FoldersAndTracksScreenDestination +import com.android.swingmusic.folder.presentation.viewmodel.FoldersViewModel import com.android.swingmusic.player.presentation.screen.MiniPlayer import com.android.swingmusic.player.presentation.screen.destinations.NowPlayingScreenDestination import com.android.swingmusic.player.presentation.screen.destinations.QueueScreenDestination @@ -81,13 +83,13 @@ import com.ramcosta.composedestinations.spec.NavGraphSpec import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch -import timber.log.Timber @AndroidEntryPoint class MainActivity : ComponentActivity() { private val mediaControllerViewModel: MediaControllerViewModel by viewModels() private val authViewModel: AuthViewModel by viewModels() private val artistInfoViewModel: ArtistInfoViewModel by viewModels() + private val foldersViewModel: FoldersViewModel by viewModels() private lateinit var controllerFuture: ListenableFuture @@ -155,7 +157,7 @@ class MainActivity : ComponentActivity() { label = "Spacer Height" ) - var folderClickCounter by remember{ mutableIntStateOf(0) } + var folderClickCounter by remember { mutableIntStateOf(0) } SwingMusicTheme { Scaffold( modifier = Modifier.fillMaxSize(), @@ -258,9 +260,12 @@ class MainActivity : ComponentActivity() { } ) - if (item.navGraph == NavGraphs.folder){ - folderClickCounter += 1 - Timber.e("TODO: Fire an action to reset to root folder on second click... $folderClickCounter") + if (item.navGraph == NavGraphs.folder) { + foldersViewModel.onFolderUiEvent( + FolderUiEvent.OnClickNavPath( + folder = foldersViewModel.homeDir + ) + ) } } ) @@ -276,6 +281,7 @@ class MainActivity : ComponentActivity() { isUserLoggedIn = isUserLoggedIn, navController = navController, authViewModel = authViewModel, + foldersViewModel = foldersViewModel, artistInfoViewModel = artistInfoViewModel, mediaControllerViewModel = mediaControllerViewModel ) @@ -331,6 +337,7 @@ internal fun SwingMusicAppNavigation( isUserLoggedIn: Boolean, navController: NavHostController, authViewModel: AuthViewModel, + foldersViewModel: FoldersViewModel, artistInfoViewModel: ArtistInfoViewModel, mediaControllerViewModel: MediaControllerViewModel ) { @@ -431,6 +438,7 @@ internal fun SwingMusicAppNavigation( navGraph = NavGraphs.root(isUserLoggedIn), dependenciesContainerBuilder = { dependency(authViewModel) + dependency(foldersViewModel) dependency(mediaControllerViewModel) dependency(artistInfoViewModel) dependency( diff --git a/feature/artist/src/main/java/com/android/swingmusic/artist/presentation/screen/ArtistInfoScreen.kt b/feature/artist/src/main/java/com/android/swingmusic/artist/presentation/screen/ArtistInfoScreen.kt index adb9bbc8..dce64e12 100644 --- a/feature/artist/src/main/java/com/android/swingmusic/artist/presentation/screen/ArtistInfoScreen.kt +++ b/feature/artist/src/main/java/com/android/swingmusic/artist/presentation/screen/ArtistInfoScreen.kt @@ -984,10 +984,6 @@ fun ArtistInfoScreen( }, onGetSheetAction = { track, sheetAction -> when (sheetAction) { - is BottomSheetAction.OpenArtistsDialog -> { - - } - is BottomSheetAction.GotoAlbum -> { commonNavigator.gotoAlbumWithInfo(track.albumHash) } 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 ef9e5353..996eee09 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 @@ -387,7 +387,7 @@ private fun FoldersAndTracks( @Destination @Composable fun FoldersAndTracksScreen( - foldersViewModel: FoldersViewModel = hiltViewModel(), + foldersViewModel: FoldersViewModel, albumWithInfoViewModel: AlbumWithInfoViewModel = hiltViewModel(), mediaControllerViewModel: MediaControllerViewModel, navigator: CommonNavigator, @@ -401,8 +401,13 @@ fun FoldersAndTracksScreen( val playerUiState by mediaControllerViewModel.playerUiState.collectAsState() val baseUrl by mediaControllerViewModel.baseUrl.collectAsState() + var routeByGotoFolder by remember{ mutableStateOf(false) } + LaunchedEffect(key1 = Unit) { if (gotoFolderName != null && gotoFolderPath != null) { + routeByGotoFolder = true + foldersViewModel.resetNavPaths() + val folder = Folder( name = gotoFolderName, path = gotoFolderPath, @@ -410,10 +415,12 @@ fun FoldersAndTracksScreen( folderCount = 0, isSym = false ) + foldersViewModel.onFolderUiEvent(FolderUiEvent.OnClickFolder(folder)) } else if (foldersAndTracksState.foldersAndTracks.folders.isEmpty() && foldersAndTracksState.foldersAndTracks.tracks.isEmpty() ) { + routeByGotoFolder = false foldersViewModel.onFolderUiEvent(FolderUiEvent.OnClickFolder(homeDir)) } } @@ -428,6 +435,7 @@ fun FoldersAndTracksScreen( navPaths = navPaths, baseUrl = baseUrl ?: "", onClickNavPath = { folder -> + routeByGotoFolder = false foldersViewModel.onFolderUiEvent(FolderUiEvent.OnClickNavPath(folder)) }, onRetry = { event -> @@ -439,6 +447,7 @@ fun FoldersAndTracksScreen( mediaControllerViewModel.onPlayerUiEvent(PlayerUiEvent.OnRetry) }, onClickFolder = { folder -> + routeByGotoFolder = false foldersViewModel.onFolderUiEvent(FolderUiEvent.OnClickFolder(folder)) }, onClickTrackItem = { index: Int, queue: List -> @@ -471,7 +480,7 @@ fun FoldersAndTracksScreen( ) val overrideSystemBackNav = currentFolder.path != "\$home" - BackHandler(enabled = overrideSystemBackNav) { + BackHandler(enabled = overrideSystemBackNav && routeByGotoFolder.not()) { foldersViewModel.onFolderUiEvent(FolderUiEvent.OnBackNav(currentFolder)) } } 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 894ff276..7de7d7aa 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 @@ -15,6 +15,7 @@ import com.android.swingmusic.folder.presentation.state.FoldersAndTracksState import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch +import timber.log.Timber import javax.inject.Inject @HiltViewModel @@ -36,6 +37,10 @@ class FoldersViewModel @Inject constructor( mutableStateOf(listOf(homeDir)) val navPaths: State> = _navPaths + fun resetNavPaths() { + _navPaths.value = listOf(homeDir) + } + private var _foldersAndTracks: MutableState = mutableStateOf( FoldersAndTracksState( @@ -127,14 +132,11 @@ class FoldersViewModel @Inject constructor( if (!_navPaths.value.contains(event.folder)) { _navPaths.value = listOf(homeDir) - // TODO: rebuild the entire path (use network result path) .plus( (_navPaths.value.filter { event.folder.path.contains(it.path) }.plus(event.folder)) - .toSet() - .toList() - ) + ).distinctBy { it.path } } } diff --git a/feature/player/src/main/java/com/android/swingmusic/player/presentation/screen/Queue.kt b/feature/player/src/main/java/com/android/swingmusic/player/presentation/screen/Queue.kt index 56bc0e2d..9d916ed2 100644 --- a/feature/player/src/main/java/com/android/swingmusic/player/presentation/screen/Queue.kt +++ b/feature/player/src/main/java/com/android/swingmusic/player/presentation/screen/Queue.kt @@ -436,6 +436,9 @@ fun QueueScreen( is BottomSheetAction.GotoAlbum -> { navigator.gotoAlbumWithInfo(track.albumHash) } + is BottomSheetAction.GotoFolder -> { + navigator.gotoSourceFolder(name = sheetAction.name, path = sheetAction.path) + } else -> {} } diff --git a/uicomponent/src/main/java/com/android/swingmusic/uicomponent/presentation/component/CustomTrackBottomSheet.kt b/uicomponent/src/main/java/com/android/swingmusic/uicomponent/presentation/component/CustomTrackBottomSheet.kt index 12734d77..48f8e045 100644 --- a/uicomponent/src/main/java/com/android/swingmusic/uicomponent/presentation/component/CustomTrackBottomSheet.kt +++ b/uicomponent/src/main/java/com/android/swingmusic/uicomponent/presentation/component/CustomTrackBottomSheet.kt @@ -1,5 +1,6 @@ package com.android.swingmusic.uicomponent.presentation.component +import android.util.Log import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource