From 6660e8b774303d2464f06b7c09f0768ecb19c014 Mon Sep 17 00:00:00 2001 From: Zion Huang Date: Sun, 21 Jan 2024 15:21:48 +0800 Subject: [PATCH] Long click on back arrow to go to home --- .../java/com/zionhuang/music/MainActivity.kt | 31 +++++++---- .../music/ui/component/IconButton.kt | 54 ++++++++++++++++++- .../music/ui/screens/AccountScreen.kt | 8 ++- .../zionhuang/music/ui/screens/AlbumScreen.kt | 7 ++- .../music/ui/screens/HistoryScreen.kt | 7 ++- .../zionhuang/music/ui/screens/LoginScreen.kt | 8 ++- .../music/ui/screens/MoodAndGenresScreen.kt | 8 ++- .../music/ui/screens/NewReleaseScreen.kt | 8 ++- .../com/zionhuang/music/ui/screens/Screens.kt | 4 ++ .../zionhuang/music/ui/screens/StatsScreen.kt | 7 ++- .../music/ui/screens/YouTubeBrowseScreen.kt | 7 ++- .../ui/screens/artist/ArtistItemsScreen.kt | 7 ++- .../music/ui/screens/artist/ArtistScreen.kt | 7 ++- .../ui/screens/artist/ArtistSongsScreen.kt | 7 ++- .../screens/playlist/LocalPlaylistScreen.kt | 7 ++- .../screens/playlist/OnlinePlaylistScreen.kt | 7 ++- .../music/ui/screens/settings/AboutScreen.kt | 7 ++- .../ui/screens/settings/AppearanceSettings.kt | 13 ++++- .../ui/screens/settings/BackupAndRestore.kt | 13 ++++- .../ui/screens/settings/ContentSettings.kt | 26 +++++++-- .../ui/screens/settings/PlayerSettings.kt | 13 ++++- .../ui/screens/settings/PrivacySettings.kt | 21 ++++++-- .../ui/screens/settings/SettingsScreen.kt | 15 +++++- .../ui/screens/settings/StorageSettings.kt | 8 ++- .../music/ui/utils/NavControllerUtils.kt | 10 +++- 25 files changed, 264 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/com/zionhuang/music/MainActivity.kt b/app/src/main/java/com/zionhuang/music/MainActivity.kt index 44dbfa8e6..8ddb177d9 100644 --- a/app/src/main/java/com/zionhuang/music/MainActivity.kt +++ b/app/src/main/java/com/zionhuang/music/MainActivity.kt @@ -92,6 +92,7 @@ import com.zionhuang.music.ui.screens.search.OnlineSearchScreen import com.zionhuang.music.ui.screens.settings.* import com.zionhuang.music.ui.theme.* import com.zionhuang.music.ui.utils.appBarScrollBehavior +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.ui.utils.canNavigateUp import com.zionhuang.music.ui.utils.resetHeightOffset import com.zionhuang.music.utils.dataStore @@ -205,9 +206,7 @@ class MainActivity : ComponentActivity() { val navController = rememberNavController() val navBackStackEntry by navController.currentBackStackEntryAsState() - val navigationItems = remember { - listOf(Screens.Home, Screens.Songs, Screens.Artists, Screens.Albums, Screens.Playlists) - } + val navigationItems = remember { Screens.MainScreens } val defaultOpenTab = remember { dataStore[DefaultOpenTabKey].toEnum(defaultValue = NavigationTab.HOME) } @@ -586,16 +585,28 @@ class MainActivity : ComponentActivity() { ) }, leadingIcon = { - IconButton(onClick = { - when { - active -> onActiveChange(false) - navController.canNavigateUp && !navigationItems.fastAny { it.route == navBackStackEntry?.destination?.route } -> { - navController.navigateUp() + IconButton( + onClick = { + when { + active -> onActiveChange(false) + navController.canNavigateUp && !navigationItems.fastAny { it.route == navBackStackEntry?.destination?.route } -> { + navController.navigateUp() + } + + else -> onActiveChange(true) } + }, + onLongClick = { + when { + active -> {} + navController.canNavigateUp && !navigationItems.fastAny { it.route == navBackStackEntry?.destination?.route } -> { + navController.backToMain() + } - else -> onActiveChange(true) + else -> {} + } } - }) { + ) { Icon( painterResource( if (active || (navController.canNavigateUp && !navigationItems.fastAny { it.route == navBackStackEntry?.destination?.route })) { diff --git a/app/src/main/java/com/zionhuang/music/ui/component/IconButton.kt b/app/src/main/java/com/zionhuang/music/ui/component/IconButton.kt index 87e657bbc..4d6eced61 100644 --- a/app/src/main/java/com/zionhuang/music/ui/component/IconButton.kt +++ b/app/src/main/java/com/zionhuang/music/ui/component/IconButton.kt @@ -1,19 +1,36 @@ +@file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") + package com.zionhuang.music.ui.component import androidx.annotation.DrawableRes +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.Indication +import androidx.compose.foundation.background import androidx.compose.foundation.clickable +import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.size import androidx.compose.material.ripple.rememberRipple +import androidx.compose.material3.IconButtonColors +import androidx.compose.material3.IconButtonDefaults +import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.minimumInteractiveComponentSize +import androidx.compose.material3.toShape +import androidx.compose.material3.tokens.IconButtonTokens import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.res.painterResource +import androidx.compose.ui.semantics.Role @Composable fun ResizableIconButton( @@ -38,4 +55,39 @@ fun ResizableIconButton( .alpha(if (enabled) 1f else 0.5f) .then(modifier) ) -} \ No newline at end of file +} + +@OptIn(ExperimentalFoundationApi::class) +@Composable +fun IconButton( + onClick: () -> Unit, + onLongClick: () -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + colors: IconButtonColors = IconButtonDefaults.iconButtonColors(), + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, + content: @Composable () -> Unit, +) { + Box( + modifier = modifier + .minimumInteractiveComponentSize() + .size(IconButtonTokens.StateLayerSize) + .clip(IconButtonTokens.StateLayerShape.toShape()) + .background(color = colors.containerColor(enabled).value) + .combinedClickable( + onClick = onClick, + onLongClick = onLongClick, + enabled = enabled, + role = Role.Button, + interactionSource = interactionSource, + indication = rememberRipple( + bounded = false, + radius = IconButtonTokens.StateLayerSize / 2 + ) + ), + contentAlignment = Alignment.Center + ) { + val contentColor = colors.contentColor(enabled).value + CompositionLocalProvider(LocalContentColor provides contentColor, content = content) + } +} diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/AccountScreen.kt b/app/src/main/java/com/zionhuang/music/ui/screens/AccountScreen.kt index 80d7ff3a7..3661ea730 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/AccountScreen.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/AccountScreen.kt @@ -8,7 +8,6 @@ import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarScrollBehavior @@ -25,11 +24,13 @@ import androidx.navigation.NavController import com.zionhuang.music.LocalPlayerAwareWindowInsets import com.zionhuang.music.R import com.zionhuang.music.constants.GridThumbnailHeight +import com.zionhuang.music.ui.component.IconButton import com.zionhuang.music.ui.component.LocalMenuState import com.zionhuang.music.ui.component.YouTubeGridItem import com.zionhuang.music.ui.component.shimmer.GridItemPlaceHolder import com.zionhuang.music.ui.component.shimmer.ShimmerHost import com.zionhuang.music.ui.menu.YouTubePlaylistMenu +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.viewmodels.AccountViewModel @OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) @@ -86,7 +87,10 @@ fun AccountScreen( TopAppBar( title = { Text(stringResource(R.string.account)) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/AlbumScreen.kt b/app/src/main/java/com/zionhuang/music/ui/screens/AlbumScreen.kt index 6a5fd6061..d190806fd 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/AlbumScreen.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/AlbumScreen.kt @@ -71,6 +71,7 @@ import com.zionhuang.music.playback.ExoDownloadService import com.zionhuang.music.playback.queues.ListQueue import com.zionhuang.music.ui.component.AutoResizeText import com.zionhuang.music.ui.component.FontSizeRange +import com.zionhuang.music.ui.component.IconButton import com.zionhuang.music.ui.component.LocalMenuState import com.zionhuang.music.ui.component.SongListItem import com.zionhuang.music.ui.component.shimmer.ButtonPlaceholder @@ -79,6 +80,7 @@ import com.zionhuang.music.ui.component.shimmer.ShimmerHost import com.zionhuang.music.ui.component.shimmer.TextPlaceholder import com.zionhuang.music.ui.menu.AlbumMenu import com.zionhuang.music.ui.menu.SongMenu +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.viewmodels.AlbumViewModel @OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class) @@ -425,7 +427,10 @@ fun AlbumScreen( TopAppBar( title = { }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/HistoryScreen.kt b/app/src/main/java/com/zionhuang/music/ui/screens/HistoryScreen.kt index 3f3719a32..5d92e2385 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/HistoryScreen.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/HistoryScreen.kt @@ -31,10 +31,12 @@ import com.zionhuang.music.R import com.zionhuang.music.extensions.togglePlayPause import com.zionhuang.music.models.toMediaMetadata import com.zionhuang.music.playback.queues.YouTubeQueue +import com.zionhuang.music.ui.component.IconButton import com.zionhuang.music.ui.component.LocalMenuState import com.zionhuang.music.ui.component.NavigationTitle import com.zionhuang.music.ui.component.SongListItem import com.zionhuang.music.ui.menu.SongMenu +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.viewmodels.DateAgo import com.zionhuang.music.viewmodels.HistoryViewModel import java.time.format.DateTimeFormatter @@ -123,7 +125,10 @@ fun HistoryScreen( TopAppBar( title = { Text(stringResource(R.string.history)) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/LoginScreen.kt b/app/src/main/java/com/zionhuang/music/ui/screens/LoginScreen.kt index d141019bb..86b203d1d 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/LoginScreen.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/LoginScreen.kt @@ -10,7 +10,6 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable @@ -29,6 +28,8 @@ import com.zionhuang.music.constants.AccountEmailKey import com.zionhuang.music.constants.AccountNameKey import com.zionhuang.music.constants.InnerTubeCookieKey import com.zionhuang.music.constants.VisitorDataKey +import com.zionhuang.music.ui.component.IconButton +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.utils.rememberPreference import com.zionhuang.music.utils.reportException import kotlinx.coroutines.DelicateCoroutinesApi @@ -97,7 +98,10 @@ fun LoginScreen( TopAppBar( title = { Text(stringResource(R.string.login)) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/MoodAndGenresScreen.kt b/app/src/main/java/com/zionhuang/music/ui/screens/MoodAndGenresScreen.kt index c2d5536a6..c331cd17f 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/MoodAndGenresScreen.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/MoodAndGenresScreen.kt @@ -14,7 +14,6 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar @@ -35,9 +34,11 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavController import com.zionhuang.music.LocalPlayerAwareWindowInsets import com.zionhuang.music.R +import com.zionhuang.music.ui.component.IconButton import com.zionhuang.music.ui.component.NavigationTitle import com.zionhuang.music.ui.component.shimmer.ListItemPlaceHolder import com.zionhuang.music.ui.component.shimmer.ShimmerHost +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.viewmodels.MoodAndGenresViewModel @OptIn(ExperimentalMaterial3Api::class) @@ -101,7 +102,10 @@ fun MoodAndGenresScreen( TopAppBar( title = { Text(stringResource(R.string.mood_and_genres)) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/NewReleaseScreen.kt b/app/src/main/java/com/zionhuang/music/ui/screens/NewReleaseScreen.kt index 4e9fc45c7..2df1e987a 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/NewReleaseScreen.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/NewReleaseScreen.kt @@ -8,7 +8,6 @@ import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarScrollBehavior @@ -26,11 +25,13 @@ import com.zionhuang.music.LocalPlayerAwareWindowInsets import com.zionhuang.music.LocalPlayerConnection import com.zionhuang.music.R import com.zionhuang.music.constants.GridThumbnailHeight +import com.zionhuang.music.ui.component.IconButton import com.zionhuang.music.ui.component.LocalMenuState import com.zionhuang.music.ui.component.YouTubeGridItem import com.zionhuang.music.ui.component.shimmer.GridItemPlaceHolder import com.zionhuang.music.ui.component.shimmer.ShimmerHost import com.zionhuang.music.ui.menu.YouTubeAlbumMenu +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.viewmodels.NewReleaseViewModel @OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class) @@ -93,7 +94,10 @@ fun NewReleaseScreen( TopAppBar( title = { Text(stringResource(R.string.new_release_albums)) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/Screens.kt b/app/src/main/java/com/zionhuang/music/ui/screens/Screens.kt index 3d2aea354..20b8b365c 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/Screens.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/Screens.kt @@ -16,4 +16,8 @@ sealed class Screens( object Artists : Screens(R.string.artists, R.drawable.artist, "artists") object Albums : Screens(R.string.albums, R.drawable.album, "albums") object Playlists : Screens(R.string.playlists, R.drawable.queue_music, "playlists") + + companion object { + val MainScreens = listOf(Home, Songs, Artists, Albums, Playlists) + } } diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/StatsScreen.kt b/app/src/main/java/com/zionhuang/music/ui/screens/StatsScreen.kt index 97e01cb32..8e5b1b6e5 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/StatsScreen.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/StatsScreen.kt @@ -36,12 +36,14 @@ import com.zionhuang.music.playback.queues.YouTubeQueue import com.zionhuang.music.ui.component.AlbumGridItem import com.zionhuang.music.ui.component.ArtistGridItem import com.zionhuang.music.ui.component.ChipsRow +import com.zionhuang.music.ui.component.IconButton import com.zionhuang.music.ui.component.LocalMenuState import com.zionhuang.music.ui.component.NavigationTitle import com.zionhuang.music.ui.component.SongListItem import com.zionhuang.music.ui.menu.AlbumMenu import com.zionhuang.music.ui.menu.ArtistMenu import com.zionhuang.music.ui.menu.SongMenu +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.viewmodels.StatsViewModel @OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) @@ -215,7 +217,10 @@ fun StatsScreen( TopAppBar( title = { Text(stringResource(R.string.stats)) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/YouTubeBrowseScreen.kt b/app/src/main/java/com/zionhuang/music/ui/screens/YouTubeBrowseScreen.kt index aea4e7099..5a1e8e30d 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/YouTubeBrowseScreen.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/YouTubeBrowseScreen.kt @@ -30,6 +30,7 @@ import com.zionhuang.music.R import com.zionhuang.music.extensions.togglePlayPause import com.zionhuang.music.models.toMediaMetadata import com.zionhuang.music.playback.queues.YouTubeQueue +import com.zionhuang.music.ui.component.IconButton import com.zionhuang.music.ui.component.LocalMenuState import com.zionhuang.music.ui.component.NavigationTitle import com.zionhuang.music.ui.component.YouTubeListItem @@ -39,6 +40,7 @@ import com.zionhuang.music.ui.menu.YouTubeAlbumMenu import com.zionhuang.music.ui.menu.YouTubeArtistMenu import com.zionhuang.music.ui.menu.YouTubePlaylistMenu import com.zionhuang.music.ui.menu.YouTubeSongMenu +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.viewmodels.YouTubeBrowseViewModel @OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) @@ -148,7 +150,10 @@ fun YouTubeBrowseScreen( TopAppBar( title = { Text(browseResult?.title.orEmpty()) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/artist/ArtistItemsScreen.kt b/app/src/main/java/com/zionhuang/music/ui/screens/artist/ArtistItemsScreen.kt index 66cf5ea45..010614237 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/artist/ArtistItemsScreen.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/artist/ArtistItemsScreen.kt @@ -40,6 +40,7 @@ import com.zionhuang.music.constants.GridThumbnailHeight import com.zionhuang.music.extensions.togglePlayPause import com.zionhuang.music.models.toMediaMetadata import com.zionhuang.music.playback.queues.YouTubeQueue +import com.zionhuang.music.ui.component.IconButton import com.zionhuang.music.ui.component.LocalMenuState import com.zionhuang.music.ui.component.YouTubeGridItem import com.zionhuang.music.ui.component.YouTubeListItem @@ -49,6 +50,7 @@ import com.zionhuang.music.ui.menu.YouTubeAlbumMenu import com.zionhuang.music.ui.menu.YouTubeArtistMenu import com.zionhuang.music.ui.menu.YouTubePlaylistMenu import com.zionhuang.music.ui.menu.YouTubeSongMenu +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.viewmodels.ArtistItemsViewModel @OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class) @@ -237,7 +239,10 @@ fun ArtistItemsScreen( TopAppBar( title = { Text(title) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/artist/ArtistScreen.kt b/app/src/main/java/com/zionhuang/music/ui/screens/artist/ArtistScreen.kt index cc8438aa8..058f4095e 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/artist/ArtistScreen.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/artist/ArtistScreen.kt @@ -73,6 +73,7 @@ import com.zionhuang.music.models.toMediaMetadata import com.zionhuang.music.playback.queues.YouTubeQueue import com.zionhuang.music.ui.component.AutoResizeText import com.zionhuang.music.ui.component.FontSizeRange +import com.zionhuang.music.ui.component.IconButton import com.zionhuang.music.ui.component.LocalMenuState import com.zionhuang.music.ui.component.NavigationTitle import com.zionhuang.music.ui.component.SongListItem @@ -87,6 +88,7 @@ import com.zionhuang.music.ui.menu.YouTubeAlbumMenu import com.zionhuang.music.ui.menu.YouTubeArtistMenu import com.zionhuang.music.ui.menu.YouTubePlaylistMenu import com.zionhuang.music.ui.menu.YouTubeSongMenu +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.ui.utils.fadingEdge import com.zionhuang.music.ui.utils.resize import com.zionhuang.music.viewmodels.ArtistViewModel @@ -416,7 +418,10 @@ fun ArtistScreen( TopAppBar( title = { if (!transparentAppBar) Text(artistPage?.artist?.title.orEmpty()) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/artist/ArtistSongsScreen.kt b/app/src/main/java/com/zionhuang/music/ui/screens/artist/ArtistSongsScreen.kt index 32e142e25..047e6fca1 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/artist/ArtistSongsScreen.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/artist/ArtistSongsScreen.kt @@ -41,10 +41,12 @@ import com.zionhuang.music.extensions.toMediaItem import com.zionhuang.music.extensions.togglePlayPause import com.zionhuang.music.playback.queues.ListQueue import com.zionhuang.music.ui.component.HideOnScrollFAB +import com.zionhuang.music.ui.component.IconButton import com.zionhuang.music.ui.component.LocalMenuState import com.zionhuang.music.ui.component.SongListItem import com.zionhuang.music.ui.component.SortHeader import com.zionhuang.music.ui.menu.SongMenu +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.utils.rememberEnumPreference import com.zionhuang.music.utils.rememberPreference import com.zionhuang.music.viewmodels.ArtistSongsViewModel @@ -158,7 +160,10 @@ fun ArtistSongsScreen( TopAppBar( title = { Text(artist?.artist?.name.orEmpty()) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/playlist/LocalPlaylistScreen.kt b/app/src/main/java/com/zionhuang/music/ui/screens/playlist/LocalPlaylistScreen.kt index 4ed7b6e7e..adee517e1 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/playlist/LocalPlaylistScreen.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/playlist/LocalPlaylistScreen.kt @@ -95,11 +95,13 @@ import com.zionhuang.music.ui.component.AutoResizeText import com.zionhuang.music.ui.component.DefaultDialog import com.zionhuang.music.ui.component.EmptyPlaceholder import com.zionhuang.music.ui.component.FontSizeRange +import com.zionhuang.music.ui.component.IconButton import com.zionhuang.music.ui.component.LocalMenuState import com.zionhuang.music.ui.component.SongListItem import com.zionhuang.music.ui.component.SortHeader import com.zionhuang.music.ui.component.TextFieldDialog import com.zionhuang.music.ui.menu.SongMenu +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.utils.makeTimeString import com.zionhuang.music.utils.rememberEnumPreference import com.zionhuang.music.utils.rememberPreference @@ -636,7 +638,10 @@ fun LocalPlaylistScreen( TopAppBar( title = { if (showTopBarTitle) Text(playlist?.playlist?.name.orEmpty()) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/playlist/OnlinePlaylistScreen.kt b/app/src/main/java/com/zionhuang/music/ui/screens/playlist/OnlinePlaylistScreen.kt index ffa0808e7..27c2d0432 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/playlist/OnlinePlaylistScreen.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/playlist/OnlinePlaylistScreen.kt @@ -68,6 +68,7 @@ import com.zionhuang.music.models.toMediaMetadata import com.zionhuang.music.playback.queues.YouTubeQueue import com.zionhuang.music.ui.component.AutoResizeText import com.zionhuang.music.ui.component.FontSizeRange +import com.zionhuang.music.ui.component.IconButton import com.zionhuang.music.ui.component.LocalMenuState import com.zionhuang.music.ui.component.YouTubeListItem import com.zionhuang.music.ui.component.shimmer.ButtonPlaceholder @@ -76,6 +77,7 @@ import com.zionhuang.music.ui.component.shimmer.ShimmerHost import com.zionhuang.music.ui.component.shimmer.TextPlaceholder import com.zionhuang.music.ui.menu.YouTubePlaylistMenu import com.zionhuang.music.ui.menu.YouTubeSongMenu +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.viewmodels.OnlinePlaylistViewModel import kotlinx.coroutines.launch @@ -349,7 +351,10 @@ fun OnlinePlaylistScreen( TopAppBar( title = { if (showTopBarTitle) Text(playlist?.title.orEmpty()) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/settings/AboutScreen.kt b/app/src/main/java/com/zionhuang/music/ui/screens/settings/AboutScreen.kt index 8e14ca1e7..ebed44c27 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/settings/AboutScreen.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/settings/AboutScreen.kt @@ -39,6 +39,8 @@ import androidx.navigation.NavController import com.zionhuang.music.BuildConfig import com.zionhuang.music.LocalPlayerAwareWindowInsets import com.zionhuang.music.R +import com.zionhuang.music.ui.component.IconButton +import com.zionhuang.music.ui.utils.backToMain @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -168,7 +170,10 @@ fun AboutScreen( TopAppBar( title = { Text(stringResource(R.string.about)) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/settings/AppearanceSettings.kt b/app/src/main/java/com/zionhuang/music/ui/screens/settings/AppearanceSettings.kt index 460e2a05b..6541e413c 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/settings/AppearanceSettings.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/settings/AppearanceSettings.kt @@ -4,7 +4,11 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.* +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource @@ -18,7 +22,9 @@ import com.zionhuang.music.constants.DynamicThemeKey import com.zionhuang.music.constants.LyricsTextPositionKey import com.zionhuang.music.constants.PureBlackKey import com.zionhuang.music.ui.component.EnumListPreference +import com.zionhuang.music.ui.component.IconButton import com.zionhuang.music.ui.component.SwitchPreference +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.utils.rememberEnumPreference import com.zionhuang.music.utils.rememberPreference @@ -97,7 +103,10 @@ fun AppearanceSettings( TopAppBar( title = { Text(stringResource(R.string.appearance)) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/settings/BackupAndRestore.kt b/app/src/main/java/com/zionhuang/music/ui/screens/settings/BackupAndRestore.kt index 8480cfe85..ff2c1f437 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/settings/BackupAndRestore.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/settings/BackupAndRestore.kt @@ -6,7 +6,11 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.* +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext @@ -16,7 +20,9 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavController import com.zionhuang.music.LocalPlayerAwareWindowInsets import com.zionhuang.music.R +import com.zionhuang.music.ui.component.IconButton import com.zionhuang.music.ui.component.PreferenceEntry +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.viewmodels.BackupRestoreViewModel import java.time.LocalDateTime import java.time.format.DateTimeFormatter @@ -65,7 +71,10 @@ fun BackupAndRestore( TopAppBar( title = { Text(stringResource(R.string.backup_restore)) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/settings/ContentSettings.kt b/app/src/main/java/com/zionhuang/music/ui/screens/settings/ContentSettings.kt index 0d4c0d0a8..4afe72f4e 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/settings/ContentSettings.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/settings/ContentSettings.kt @@ -4,7 +4,11 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.* +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember @@ -15,12 +19,25 @@ import androidx.navigation.NavController import com.zionhuang.innertube.utils.parseCookieString import com.zionhuang.music.LocalPlayerAwareWindowInsets import com.zionhuang.music.R -import com.zionhuang.music.constants.* +import com.zionhuang.music.constants.AccountChannelHandleKey +import com.zionhuang.music.constants.AccountEmailKey +import com.zionhuang.music.constants.AccountNameKey +import com.zionhuang.music.constants.ContentCountryKey +import com.zionhuang.music.constants.ContentLanguageKey +import com.zionhuang.music.constants.CountryCodeToName +import com.zionhuang.music.constants.InnerTubeCookieKey +import com.zionhuang.music.constants.LanguageCodeToName +import com.zionhuang.music.constants.ProxyEnabledKey +import com.zionhuang.music.constants.ProxyTypeKey +import com.zionhuang.music.constants.ProxyUrlKey +import com.zionhuang.music.constants.SYSTEM_DEFAULT import com.zionhuang.music.ui.component.EditTextPreference +import com.zionhuang.music.ui.component.IconButton import com.zionhuang.music.ui.component.ListPreference import com.zionhuang.music.ui.component.PreferenceEntry import com.zionhuang.music.ui.component.PreferenceGroupTitle import com.zionhuang.music.ui.component.SwitchPreference +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.utils.rememberEnumPreference import com.zionhuang.music.utils.rememberPreference import java.net.Proxy @@ -113,7 +130,10 @@ fun ContentSettings( TopAppBar( title = { Text(stringResource(R.string.content)) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/settings/PlayerSettings.kt b/app/src/main/java/com/zionhuang/music/ui/screens/settings/PlayerSettings.kt index 49a988efb..75dfedb23 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/settings/PlayerSettings.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/settings/PlayerSettings.kt @@ -4,7 +4,11 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.* +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource @@ -18,7 +22,9 @@ import com.zionhuang.music.constants.AudioQualityKey import com.zionhuang.music.constants.PersistentQueueKey import com.zionhuang.music.constants.SkipSilenceKey import com.zionhuang.music.ui.component.EnumListPreference +import com.zionhuang.music.ui.component.IconButton import com.zionhuang.music.ui.component.SwitchPreference +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.utils.rememberEnumPreference import com.zionhuang.music.utils.rememberPreference @@ -74,7 +80,10 @@ fun PlayerSettings( TopAppBar( title = { Text(stringResource(R.string.player_and_audio)) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/settings/PrivacySettings.kt b/app/src/main/java/com/zionhuang/music/ui/screens/settings/PrivacySettings.kt index e43a25b1d..c60e6aa1c 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/settings/PrivacySettings.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/settings/PrivacySettings.kt @@ -5,8 +5,18 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.* -import androidx.compose.runtime.* +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarScrollBehavior +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -19,8 +29,10 @@ import com.zionhuang.music.constants.EnableKugouKey import com.zionhuang.music.constants.PauseListenHistoryKey import com.zionhuang.music.constants.PauseSearchHistoryKey import com.zionhuang.music.ui.component.DefaultDialog +import com.zionhuang.music.ui.component.IconButton import com.zionhuang.music.ui.component.PreferenceEntry import com.zionhuang.music.ui.component.SwitchPreference +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.utils.rememberPreference @OptIn(ExperimentalMaterial3Api::class) @@ -142,7 +154,10 @@ fun PrivacySettings( TopAppBar( title = { Text(stringResource(R.string.privacy)) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/settings/SettingsScreen.kt b/app/src/main/java/com/zionhuang/music/ui/screens/settings/SettingsScreen.kt index 698323091..899822b62 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/settings/SettingsScreen.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/settings/SettingsScreen.kt @@ -4,7 +4,13 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.* +import androidx.compose.material3.Badge +import androidx.compose.material3.BadgedBox +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalUriHandler @@ -14,7 +20,9 @@ import androidx.navigation.NavController import com.zionhuang.music.BuildConfig import com.zionhuang.music.LocalPlayerAwareWindowInsets import com.zionhuang.music.R +import com.zionhuang.music.ui.component.IconButton import com.zionhuang.music.ui.component.PreferenceEntry +import com.zionhuang.music.ui.utils.backToMain @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -89,7 +97,10 @@ fun SettingsScreen( TopAppBar( title = { Text(stringResource(R.string.settings)) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/screens/settings/StorageSettings.kt b/app/src/main/java/com/zionhuang/music/ui/screens/settings/StorageSettings.kt index 1aea64f90..8753f0a5a 100644 --- a/app/src/main/java/com/zionhuang/music/ui/screens/settings/StorageSettings.kt +++ b/app/src/main/java/com/zionhuang/music/ui/screens/settings/StorageSettings.kt @@ -8,7 +8,6 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -36,9 +35,11 @@ import com.zionhuang.music.R import com.zionhuang.music.constants.MaxImageCacheSizeKey import com.zionhuang.music.constants.MaxSongCacheSizeKey import com.zionhuang.music.extensions.tryOrNull +import com.zionhuang.music.ui.component.IconButton import com.zionhuang.music.ui.component.ListPreference import com.zionhuang.music.ui.component.PreferenceEntry import com.zionhuang.music.ui.component.PreferenceGroupTitle +import com.zionhuang.music.ui.utils.backToMain import com.zionhuang.music.ui.utils.formatFileSize import com.zionhuang.music.utils.TranslationHelper import com.zionhuang.music.utils.rememberPreference @@ -217,7 +218,10 @@ fun StorageSettings( TopAppBar( title = { Text(stringResource(R.string.storage)) }, navigationIcon = { - IconButton(onClick = navController::navigateUp) { + IconButton( + onClick = navController::navigateUp, + onLongClick = navController::backToMain + ) { Icon( painterResource(R.drawable.arrow_back), contentDescription = null diff --git a/app/src/main/java/com/zionhuang/music/ui/utils/NavControllerUtils.kt b/app/src/main/java/com/zionhuang/music/ui/utils/NavControllerUtils.kt index a1973199a..40a14aa63 100644 --- a/app/src/main/java/com/zionhuang/music/ui/utils/NavControllerUtils.kt +++ b/app/src/main/java/com/zionhuang/music/ui/utils/NavControllerUtils.kt @@ -1,7 +1,15 @@ package com.zionhuang.music.ui.utils +import androidx.compose.ui.util.fastAny import androidx.navigation.NavController import androidx.navigation.NavGraph +import com.zionhuang.music.ui.screens.Screens val NavController.canNavigateUp: Boolean - get() = backQueue.count { entry -> entry.destination !is NavGraph } > 1 \ No newline at end of file + get() = backQueue.count { entry -> entry.destination !is NavGraph } > 1 + +fun NavController.backToMain() { + while (canNavigateUp && !Screens.MainScreens.fastAny { it.route == currentBackStackEntry?.destination?.route }) { + navigateUp() + } +} \ No newline at end of file