From 3f97278d577aa275883f45efec061a31e5813225 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Sat, 8 Nov 2025 22:18:24 +0100 Subject: [PATCH] Migrate settings to navigation3 --- app/ui/build.gradle.kts | 5 +- .../component/preferences/PreferenceScreen.kt | 8 +- .../ui/launcher/searchbar/SearchBarActions.kt | 2 +- .../ui/launcher/sheets/HiddenItemsSheetVM.kt | 3 +- .../launcher2/ui/locals/CompositionLocals.kt | 7 +- .../launcher2/ui/settings/SettingsActivity.kt | 473 +++++++++--------- .../ui/settings/about/AboutSettingsScreen.kt | 20 +- .../appearance/AppearanceSettingsScreen.kt | 24 +- .../appearance/ExportThemeSettingsScreen.kt | 5 + .../appearance/ImportThemeSettingsScreen.kt | 6 +- .../settings/backup/BackupSettingsScreen.kt | 5 + .../BreezyWeatherSettingsScreen.kt | 5 + .../buildinfo/BuildInfoSettingsScreen.kt | 5 + .../CalendarProviderSettingsScreen.kt | 5 + .../CalendarSearchSettingsScreen.kt | 15 +- .../colorscheme/ColorSchemeSettingsScreen.kt | 9 + .../colorscheme/ColorSchemesSettingsScreen.kt | 11 +- .../contacts/ContactsSettingsScreen.kt | 5 + .../crashreporter/CrashReportScreen.kt | 5 + .../crashreporter/CrashReporterScreen.kt | 12 +- .../ui/settings/debug/DebugSettingsScreen.kt | 15 +- .../easteregg/EasterEggSettingsScreen.kt | 5 + .../favorites/FavoritesSettingsScreen.kt | 5 + .../filesearch/FileSearchSettingsScreen.kt | 5 + .../filterbar/FilterBarSettingsScreen.kt | 13 +- .../gestures/GestureSettingsScreen.kt | 5 + .../hiddenitems/HiddenItemsSettingsScreen.kt | 5 + .../homescreen/HomescreenSettingsScreen.kt | 9 +- .../ui/settings/icons/IconsSettingsScreen.kt | 5 + .../IntegrationsSettingsScreen.kt | 30 +- .../ui/settings/license/LicenseScreen.kt | 26 +- .../locations/LocationsSettingsScreen.kt | 12 +- .../launcher2/ui/settings/log/LogScreen.kt | 5 + .../ui/settings/main/MainSettingsScreen.kt | 39 +- .../media/MediaIntegrationSettingsScreen.kt | 5 + .../nextcloud/NextcloudSettingsScreen.kt | 9 +- .../ui/settings/osm/OsmSettingsScreen.kt | 5 + .../owncloud/OwncloudSettingsScreen.kt | 9 +- .../settings/plugins/PluginSettingsScreen.kt | 27 +- .../settings/plugins/PluginsSettingsScreen.kt | 11 +- .../settings/search/SearchSettingsScreen.kt | 49 +- .../SearchActionsSettingsScreen.kt | 13 +- .../shapes/ShapeSchemeSettingsScreen.kt | 8 + .../shapes/ShapeSchemesSettingsScreen.kt | 11 +- .../ui/settings/tags/TagsSettingsScreen.kt | 5 + .../ui/settings/tasks/TasksSettingsScreen.kt | 12 +- .../TransparencySchemeSettingsScreen.kt | 6 +- .../TransparencySchemesSettingsScreen.kt | 11 +- .../typography/TypographiesSettingsScreen.kt | 11 +- .../typography/TypographySettingsScreen.kt | 6 +- .../UnitConverterHelpSettingsScreen.kt | 5 + .../UnitConverterSettingsScreen.kt | 11 +- .../WeatherIntegrationSettingsScreen.kt | 5 + .../wikipedia/WikipediaSettingsScreen.kt | 5 + gradle/libs.versions.toml | 7 +- 55 files changed, 678 insertions(+), 362 deletions(-) diff --git a/app/ui/build.gradle.kts b/app/ui/build.gradle.kts index 987421417..9f644de4d 100644 --- a/app/ui/build.gradle.kts +++ b/app/ui/build.gradle.kts @@ -82,7 +82,9 @@ dependencies { implementation(libs.androidx.compose.animationgraphics) implementation(libs.androidx.constraintlayout.compose) - implementation(libs.androidx.navigation.compose) + implementation(libs.androidx.navigation3.runtime) + implementation(libs.androidx.navigation3.ui) + implementation(libs.androidx.compose.material3adaptive.navigation3) implementation(libs.jsoup) implementation(libs.markdown) @@ -94,7 +96,6 @@ dependencies { implementation(libs.accompanist.pager) implementation(libs.accompanist.pagerindicators) implementation(libs.accompanist.flowlayout) - implementation(libs.accompanist.navigationanimation) implementation(libs.haze) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/component/preferences/PreferenceScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/component/preferences/PreferenceScreen.kt index cd6cf8a94..edc73d4cb 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/component/preferences/PreferenceScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/component/preferences/PreferenceScreen.kt @@ -41,7 +41,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.core.net.toUri import de.mm20.launcher2.ui.R -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack @Composable @@ -82,7 +82,7 @@ fun PreferenceScreen( verticalArrangement: Arrangement.Vertical = Arrangement.spacedBy(12.dp), content: LazyListScope.() -> Unit, ) { - val navController = LocalNavController.current + val backStack = LocalBackStack.current val context = LocalContext.current @@ -126,8 +126,10 @@ fun PreferenceScreen( ), navigationIcon = { IconButton(onClick = { - if (navController?.navigateUp() != true) { + if (backStack.size <= 1) { activity?.onBackPressed() + } else { + backStack.removeLastOrNull() } }) { Icon( diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/searchbar/SearchBarActions.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/searchbar/SearchBarActions.kt index 5fd2d7871..1308315c7 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/searchbar/SearchBarActions.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/searchbar/SearchBarActions.kt @@ -77,7 +77,7 @@ fun ColumnScope.SearchBarActions( onClick = { context.startActivity( Intent(context, SettingsActivity::class.java).apply { - putExtra(SettingsActivity.EXTRA_ROUTE, "settings/search/searchactions") + putExtra(SettingsActivity.EXTRA_ROUTE, SettingsActivity.ROUTE_SEARCH_ACTIONS) } ) } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/HiddenItemsSheetVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/HiddenItemsSheetVM.kt index 1252d371b..5d8787b17 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/HiddenItemsSheetVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/HiddenItemsSheetVM.kt @@ -2,6 +2,7 @@ package de.mm20.launcher2.ui.launcher.sheets import android.content.Context import android.content.Intent +import android.provider.Settings import androidx.lifecycle.ViewModel import de.mm20.launcher2.ui.settings.SettingsActivity @@ -10,7 +11,7 @@ class HiddenItemsSheetVM: ViewModel() { fun showHiddenItems(context: Context) { context.startActivity( Intent(context, SettingsActivity::class.java).apply { - putExtra(SettingsActivity.EXTRA_ROUTE, "settings/search/hiddenitems") + putExtra(SettingsActivity.EXTRA_ROUTE, SettingsActivity.ROUTE_HIDDEN_ITEMS) } ) } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/locals/CompositionLocals.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/locals/CompositionLocals.kt index d82780eb1..0a8d9bf5c 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/locals/CompositionLocals.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/locals/CompositionLocals.kt @@ -1,17 +1,18 @@ package de.mm20.launcher2.ui.locals -import android.appwidget.AppWidgetHost import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.compositionLocalOf +import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.ui.geometry.Size -import androidx.navigation.NavController +import androidx.navigation3.runtime.NavBackStack +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.preferences.ui.CardStyle import de.mm20.launcher2.preferences.ui.GridSettings import de.mm20.launcher2.ui.theme.WallpaperColors val LocalWindowSize = compositionLocalOf { Size(0f, 0f) } -val LocalNavController = compositionLocalOf { null } +val LocalBackStack = staticCompositionLocalOf< NavBackStack> { throw IllegalStateException("No backstack provided") } val LocalCardStyle = compositionLocalOf { CardStyle() } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt index 596299188..c3f1f3d55 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt @@ -11,6 +11,7 @@ import androidx.compose.animation.scaleIn import androidx.compose.animation.scaleOut import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideOutHorizontally +import androidx.compose.animation.togetherWith import androidx.compose.foundation.background import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.MaterialTheme @@ -18,65 +19,99 @@ import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect 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.graphics.toArgb -import androidx.core.net.toUri import androidx.core.view.WindowCompat -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable -import androidx.navigation.compose.rememberNavController -import androidx.navigation.navArgument -import androidx.navigation.toRoute -import de.mm20.launcher2.licenses.AppLicense -import de.mm20.launcher2.licenses.OpenSourceLicenses +import androidx.navigation3.runtime.NavKey +import androidx.navigation3.runtime.entryProvider +import androidx.navigation3.runtime.rememberNavBackStack +import androidx.navigation3.ui.NavDisplay import de.mm20.launcher2.ui.base.BaseActivity import de.mm20.launcher2.ui.base.ProvideCompositionLocals +import de.mm20.launcher2.ui.locals.LocalBackStack import de.mm20.launcher2.ui.locals.LocalDarkTheme -import de.mm20.launcher2.ui.locals.LocalNavController import de.mm20.launcher2.ui.locals.LocalWallpaperColors import de.mm20.launcher2.ui.overlays.OverlayHost +import de.mm20.launcher2.ui.settings.about.AboutSettingsRoute import de.mm20.launcher2.ui.settings.about.AboutSettingsScreen +import de.mm20.launcher2.ui.settings.appearance.AppearanceSettingsRoute import de.mm20.launcher2.ui.settings.appearance.AppearanceSettingsScreen +import de.mm20.launcher2.ui.settings.appearance.ExportThemeSettingsRoute import de.mm20.launcher2.ui.settings.appearance.ExportThemeSettingsScreen import de.mm20.launcher2.ui.settings.appearance.ImportThemeSettingsRoute import de.mm20.launcher2.ui.settings.appearance.ImportThemeSettingsScreen +import de.mm20.launcher2.ui.settings.backup.BackupSettingsRoute import de.mm20.launcher2.ui.settings.backup.BackupSettingsScreen +import de.mm20.launcher2.ui.settings.breezyweather.BreezyWeatherSettingsRoute import de.mm20.launcher2.ui.settings.breezyweather.BreezyWeatherSettingsScreen +import de.mm20.launcher2.ui.settings.buildinfo.BuildInfoSettingsRoute import de.mm20.launcher2.ui.settings.buildinfo.BuildInfoSettingsScreen +import de.mm20.launcher2.ui.settings.calendarsearch.CalendarProviderSettingsRoute import de.mm20.launcher2.ui.settings.calendarsearch.CalendarProviderSettingsScreen +import de.mm20.launcher2.ui.settings.calendarsearch.CalendarSearchSettingsRoute import de.mm20.launcher2.ui.settings.calendarsearch.CalendarSearchSettingsScreen +import de.mm20.launcher2.ui.settings.colorscheme.ColorSchemeSettingsRoute import de.mm20.launcher2.ui.settings.colorscheme.ColorSchemeSettingsScreen +import de.mm20.launcher2.ui.settings.colorscheme.ColorSchemesSettingsRoute import de.mm20.launcher2.ui.settings.colorscheme.ColorSchemesSettingsScreen +import de.mm20.launcher2.ui.settings.contacts.ContactsSettingsRoute import de.mm20.launcher2.ui.settings.contacts.ContactsSettingsScreen +import de.mm20.launcher2.ui.settings.crashreporter.CrashReportRoute import de.mm20.launcher2.ui.settings.crashreporter.CrashReportScreen +import de.mm20.launcher2.ui.settings.crashreporter.CrashReporterRoute import de.mm20.launcher2.ui.settings.crashreporter.CrashReporterScreen +import de.mm20.launcher2.ui.settings.debug.DebugSettingsRoute import de.mm20.launcher2.ui.settings.debug.DebugSettingsScreen +import de.mm20.launcher2.ui.settings.easteregg.EasterEggSettingsRoute import de.mm20.launcher2.ui.settings.easteregg.EasterEggSettingsScreen +import de.mm20.launcher2.ui.settings.favorites.FavoritesSettingsRoute import de.mm20.launcher2.ui.settings.favorites.FavoritesSettingsScreen +import de.mm20.launcher2.ui.settings.filesearch.FileSearchSettingsRoute import de.mm20.launcher2.ui.settings.filesearch.FileSearchSettingsScreen +import de.mm20.launcher2.ui.settings.filterbar.FilterBarSettingsRoute import de.mm20.launcher2.ui.settings.filterbar.FilterBarSettingsScreen import de.mm20.launcher2.ui.settings.gestures.GestureSettingsScreen +import de.mm20.launcher2.ui.settings.gestures.GesturesSettingsRoute +import de.mm20.launcher2.ui.settings.hiddenitems.HiddenItemsSettingsRoute import de.mm20.launcher2.ui.settings.hiddenitems.HiddenItemsSettingsScreen +import de.mm20.launcher2.ui.settings.homescreen.HomescreenSettingsRoute import de.mm20.launcher2.ui.settings.homescreen.HomescreenSettingsScreen +import de.mm20.launcher2.ui.settings.icons.IconsSettingsRoute import de.mm20.launcher2.ui.settings.icons.IconsSettingsScreen +import de.mm20.launcher2.ui.settings.integrations.IntegrationsSettingsRoute import de.mm20.launcher2.ui.settings.integrations.IntegrationsSettingsScreen +import de.mm20.launcher2.ui.settings.license.LicenseRoute import de.mm20.launcher2.ui.settings.license.LicenseScreen +import de.mm20.launcher2.ui.settings.locations.LocationsSettingsRoute import de.mm20.launcher2.ui.settings.locations.LocationsSettingsScreen +import de.mm20.launcher2.ui.settings.log.LogRoute import de.mm20.launcher2.ui.settings.log.LogScreen +import de.mm20.launcher2.ui.settings.main.MainRoute import de.mm20.launcher2.ui.settings.main.MainSettingsScreen +import de.mm20.launcher2.ui.settings.media.MediaIntegrationSettingsRoute import de.mm20.launcher2.ui.settings.media.MediaIntegrationSettingsScreen +import de.mm20.launcher2.ui.settings.nextcloud.NextcloudSettingsRoute import de.mm20.launcher2.ui.settings.nextcloud.NextcloudSettingsScreen +import de.mm20.launcher2.ui.settings.osm.OsmSettingsRoute import de.mm20.launcher2.ui.settings.osm.OsmSettingsScreen +import de.mm20.launcher2.ui.settings.owncloud.OwncloudSettingsRoute import de.mm20.launcher2.ui.settings.owncloud.OwncloudSettingsScreen +import de.mm20.launcher2.ui.settings.plugins.PluginSettingsRoute import de.mm20.launcher2.ui.settings.plugins.PluginSettingsScreen +import de.mm20.launcher2.ui.settings.plugins.PluginsSettingsRoute import de.mm20.launcher2.ui.settings.plugins.PluginsSettingsScreen +import de.mm20.launcher2.ui.settings.search.SearchSettingsRoute import de.mm20.launcher2.ui.settings.search.SearchSettingsScreen +import de.mm20.launcher2.ui.settings.searchactions.SearchActionsSettingsRoute import de.mm20.launcher2.ui.settings.searchactions.SearchActionsSettingsScreen +import de.mm20.launcher2.ui.settings.shapes.ShapeSchemeSettingsRoute import de.mm20.launcher2.ui.settings.shapes.ShapeSchemeSettingsScreen +import de.mm20.launcher2.ui.settings.shapes.ShapeSchemesSettingsRoute import de.mm20.launcher2.ui.settings.shapes.ShapeSchemesSettingsScreen +import de.mm20.launcher2.ui.settings.tags.TagsSettingsRoute import de.mm20.launcher2.ui.settings.tags.TagsSettingsScreen +import de.mm20.launcher2.ui.settings.tasks.TasksIntegrationSettingsRoute import de.mm20.launcher2.ui.settings.tasks.TasksIntegrationSettingsScreen import de.mm20.launcher2.ui.settings.transparencies.TransparencySchemeSettingsRoute import de.mm20.launcher2.ui.settings.transparencies.TransparencySchemeSettingsScreen @@ -86,32 +121,191 @@ import de.mm20.launcher2.ui.settings.typography.TypographiesSettingsRoute import de.mm20.launcher2.ui.settings.typography.TypographiesSettingsScreen import de.mm20.launcher2.ui.settings.typography.TypographySettingsRoute import de.mm20.launcher2.ui.settings.typography.TypographySettingsScreen +import de.mm20.launcher2.ui.settings.unitconverter.UnitConverterHelpSettingsRoute import de.mm20.launcher2.ui.settings.unitconverter.UnitConverterHelpSettingsScreen +import de.mm20.launcher2.ui.settings.unitconverter.UnitConverterSettingsRoute import de.mm20.launcher2.ui.settings.unitconverter.UnitConverterSettingsScreen +import de.mm20.launcher2.ui.settings.weather.WeatherIntegrationSettingsRoute import de.mm20.launcher2.ui.settings.weather.WeatherIntegrationSettingsScreen +import de.mm20.launcher2.ui.settings.wikipedia.WikipediaSettingsRoute import de.mm20.launcher2.ui.settings.wikipedia.WikipediaSettingsScreen import de.mm20.launcher2.ui.theme.LauncherTheme import de.mm20.launcher2.ui.theme.wallpaperColorsAsState -import java.net.URLDecoder -import java.util.UUID class SettingsActivity : BaseActivity() { - private var route by mutableStateOf(null) + private var initialRoute by mutableStateOf(null) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) WindowCompat.setDecorFitsSystemWindows(window, false) val newRoute = getStartRoute(intent) - route = newRoute + initialRoute = newRoute + + val entryProvider = entryProvider { + entry { + MainSettingsScreen() + } + entry { + AppearanceSettingsScreen() + } + entry { + ExportThemeSettingsScreen() + } + entry { + ImportThemeSettingsScreen(it.fromUri) + } + entry { + HomescreenSettingsScreen() + } + entry { + IconsSettingsScreen() + } + entry { + ColorSchemesSettingsScreen() + } + entry { + ColorSchemeSettingsScreen(it.id) + } + entry { + ShapeSchemesSettingsScreen() + } + entry { + ShapeSchemeSettingsScreen(it.id) + } + + entry { + TransparencySchemesSettingsScreen() + } + entry { + TransparencySchemeSettingsScreen(it.id) + } + entry { + TypographiesSettingsScreen() + } + entry { + TypographySettingsScreen(it.id) + } + entry { + SearchSettingsScreen() + } + entry { + GestureSettingsScreen() + } + entry { + UnitConverterSettingsScreen() + } + entry { + UnitConverterHelpSettingsScreen() + } + entry { + WikipediaSettingsScreen() + } + entry { + LocationsSettingsScreen() + } + entry { + OsmSettingsScreen() + } + entry { + FileSearchSettingsScreen() + } + entry { + CalendarSearchSettingsScreen() + } + entry { + CalendarProviderSettingsScreen(it.providerId) + } + entry { + SearchActionsSettingsScreen() + } + entry { + HiddenItemsSettingsScreen() + } + entry { + TagsSettingsScreen() + } + entry { + FilterBarSettingsScreen() + } + entry { + WeatherIntegrationSettingsScreen() + } + entry { + MediaIntegrationSettingsScreen() + } + entry { + FavoritesSettingsScreen() + } + entry { + ContactsSettingsScreen() + } + entry { + IntegrationsSettingsScreen() + } + entry { + NextcloudSettingsScreen() + } + entry { + OwncloudSettingsScreen() + } + entry { + TasksIntegrationSettingsScreen() + } + entry { + BreezyWeatherSettingsScreen() + } + entry { + PluginsSettingsScreen() + } + entry { + PluginSettingsScreen(it.pluginId) + } + entry { + AboutSettingsScreen() + } + entry { + BuildInfoSettingsScreen() + } + entry { + EasterEggSettingsScreen() + } + entry { + DebugSettingsScreen() + } + entry { + BackupSettingsScreen() + } + entry { + CrashReporterScreen() + } + entry { + LogScreen() + } + entry { + CrashReportScreen(it.fileName) + } + entry { + LicenseScreen(it.libraryName) + } + } + setContent { - val navController = rememberNavController() + val backStack = rememberNavBackStack(MainRoute) + + LaunchedEffect(initialRoute) { + if (initialRoute != null) { + backStack.clear() + backStack.add(initialRoute!!) + } + } + val wallpaperColors by wallpaperColorsAsState() CompositionLocalProvider( - LocalNavController provides navController, LocalWallpaperColors provides wallpaperColors, + LocalBackStack provides backStack, ) { ProvideCompositionLocals { LauncherTheme { @@ -130,215 +324,29 @@ class SettingsActivity : BaseActivity() { OverlayHost( modifier = Modifier.fillMaxSize().background(MaterialTheme.colorScheme.surfaceContainer) ) { - NavHost( - modifier = Modifier.fillMaxSize(), - navController = navController, - startDestination = route ?: "settings", - exitTransition = { - slideOutHorizontally { -it / 4 } + NavDisplay( + backStack = backStack, + onBack = { backStack.removeLastOrNull() }, + entryProvider = entryProvider, + transitionSpec = { + (slideInHorizontally { it / 2 } + scaleIn(initialScale = 0.9f) + fadeIn()) + .togetherWith( + slideOutHorizontally { -it / 4 } + ) }, - enterTransition = { - slideInHorizontally { it / 2 } + scaleIn(initialScale = 0.9f) + fadeIn() + popTransitionSpec = { + (slideInHorizontally { -it / 4 }) + .togetherWith( + slideOutHorizontally { it / 2 } + scaleOut(targetScale = 0.9f) + fadeOut() + ) }, - popEnterTransition = { - slideInHorizontally { -it / 4 } + predictivePopTransitionSpec = { + (slideInHorizontally { -it / 4 }) + .togetherWith( + slideOutHorizontally { it / 2 } + scaleOut(targetScale = 0.9f) + fadeOut() + ) }, - popExitTransition = { - slideOutHorizontally { it / 2 } + scaleOut(targetScale = 0.9f) + fadeOut() - }, - ) { - composable("settings") { - MainSettingsScreen() - } - composable("settings/appearance") { - AppearanceSettingsScreen() - } - composable("settings/appearance/export") { - ExportThemeSettingsScreen() - } - composable { - val route: ImportThemeSettingsRoute = it.toRoute() ?: return@composable - ImportThemeSettingsScreen(route.fromUri.toUri()) - } - composable("settings/homescreen") { - HomescreenSettingsScreen() - } - composable("settings/icons") { - IconsSettingsScreen() - } - composable("settings/appearance/colors") { - ColorSchemesSettingsScreen() - } - composable( - "settings/appearance/colors/{id}", - arguments = listOf(navArgument("id") { - nullable = false - }) - ) { - val id = it.arguments?.getString("id")?.let { - UUID.fromString(it) - } ?: return@composable - ColorSchemeSettingsScreen(id) - } - composable("settings/appearance/shapes") { - ShapeSchemesSettingsScreen() - } - composable( - "settings/appearance/shapes/{id}", - arguments = listOf(navArgument("id") { - nullable = false - }) - ) { - val id = it.arguments?.getString("id")?.let { - UUID.fromString(it) - } ?: return@composable - ShapeSchemeSettingsScreen(id) - } - composable { - TransparencySchemesSettingsScreen() - } - composable { - val route: TransparencySchemeSettingsRoute = it.toRoute() - ?: return@composable - TransparencySchemeSettingsScreen(UUID.fromString(route.id)) - } - composable { - TypographiesSettingsScreen() - } - composable { - val route: TypographySettingsRoute = it.toRoute() - ?: return@composable - TypographySettingsScreen(UUID.fromString(route.id)) - } - composable("settings/search") { - SearchSettingsScreen() - } - composable("settings/gestures") { - GestureSettingsScreen() - } - composable("settings/search/unitconverter") { - UnitConverterSettingsScreen() - } - composable("settings/search/unitconverter/help") { - UnitConverterHelpSettingsScreen() - } - composable("settings/search/wikipedia") { - WikipediaSettingsScreen() - } - composable("settings/search/locations") { - LocationsSettingsScreen() - } - composable("settings/search/locations/osm") { - OsmSettingsScreen() - } - composable("settings/search/files") { - FileSearchSettingsScreen() - } - composable("settings/search/calendar") { - CalendarSearchSettingsScreen() - } - composable("settings/search/calendar/{providerId}") { - CalendarProviderSettingsScreen( - it.arguments?.getString("providerId") ?: return@composable - ) - } - composable("settings/search/searchactions") { - SearchActionsSettingsScreen() - } - composable("settings/search/hiddenitems") { - HiddenItemsSettingsScreen() - } - composable("settings/search/tags") { - TagsSettingsScreen() - } - composable("settings/search/filterbar") { - FilterBarSettingsScreen() - } - composable(ROUTE_WEATHER_INTEGRATION) { - WeatherIntegrationSettingsScreen() - } - composable(ROUTE_MEDIA_INTEGRATION) { - MediaIntegrationSettingsScreen() - } - composable("settings/favorites") { - FavoritesSettingsScreen() - } - composable("settings/search/contacts") { - ContactsSettingsScreen() - } - composable("settings/integrations") { - IntegrationsSettingsScreen() - } - composable("settings/integrations/nextcloud") { - NextcloudSettingsScreen() - } - composable("settings/integrations/owncloud") { - OwncloudSettingsScreen() - } - composable("settings/integrations/tasks") { - TasksIntegrationSettingsScreen() - } - composable("settings/integrations/breezyweather") { - BreezyWeatherSettingsScreen() - } - composable("settings/plugins") { - PluginsSettingsScreen() - } - composable("settings/plugins/{id}") { - PluginSettingsScreen( - it.arguments?.getString("id") ?: return@composable - ) - } - composable("settings/about") { - AboutSettingsScreen() - } - composable("settings/about/buildinfo") { - BuildInfoSettingsScreen() - } - composable("settings/about/easteregg") { - EasterEggSettingsScreen() - } - composable("settings/debug") { - DebugSettingsScreen() - } - composable("settings/backup") { - BackupSettingsScreen() - } - composable("settings/debug/crashreporter") { - CrashReporterScreen() - } - composable("settings/debug/logs") { - LogScreen() - } - composable( - "settings/debug/crashreporter/report?fileName={fileName}", - arguments = listOf(navArgument("fileName") { - nullable = false - }) - ) { - val fileName = it.arguments?.getString("fileName") - ?.let { - URLDecoder.decode(it, "utf8") - } - CrashReportScreen(fileName!!) - } - composable( - "settings/license?library={libraryName}", - arguments = listOf(navArgument("libraryName") { - nullable = true - }) - ) { - val libraryName = it.arguments?.getString("libraryName") - val library = remember(libraryName) { - if (libraryName == null) { - AppLicense.get(this@SettingsActivity) - } else { - OpenSourceLicenses.first { it.name == libraryName } - } - } - LicenseScreen(library) - } - } + ) } } } @@ -349,14 +357,21 @@ class SettingsActivity : BaseActivity() { override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) val newRoute = getStartRoute(intent) - route = newRoute + initialRoute = newRoute } - private fun getStartRoute(intent: Intent): String? { - if (intent.data?.host == "kvaesitso.mm20.de") { - return intent.data?.getQueryParameter("route") + private fun getStartRoute(intent: Intent): NavKey? { + val routeName = if (intent.data?.host == "kvaesitso.mm20.de") { + intent.data?.getQueryParameter("route") ?: return null } else { - return intent.getStringExtra(EXTRA_ROUTE) + intent.getStringExtra(EXTRA_ROUTE) ?: return null + } + return when(routeName) { + ROUTE_WEATHER_INTEGRATION -> WeatherIntegrationSettingsRoute + ROUTE_MEDIA_INTEGRATION -> MediaIntegrationSettingsRoute + ROUTE_SEARCH_ACTIONS -> SearchActionsSettingsRoute + ROUTE_HIDDEN_ITEMS -> HiddenItemsSettingsRoute + else -> null } } @@ -364,5 +379,7 @@ class SettingsActivity : BaseActivity() { const val EXTRA_ROUTE = "de.mm20.launcher2.settings.ROUTE" const val ROUTE_WEATHER_INTEGRATION = "settings/integrations/weather" const val ROUTE_MEDIA_INTEGRATION = "settings/integrations/media" + const val ROUTE_SEARCH_ACTIONS = "settings/search/searchactions" + const val ROUTE_HIDDEN_ITEMS = "settings/search/hiddenitems" } -} \ No newline at end of file +} diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/about/AboutSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/about/AboutSettingsScreen.kt index 92e54a68f..861f98511 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/about/AboutSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/about/AboutSettingsScreen.kt @@ -11,19 +11,27 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.licenses.OpenSourceLicenses import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack +import de.mm20.launcher2.ui.settings.buildinfo.BuildInfoSettingsRoute +import de.mm20.launcher2.ui.settings.easteregg.EasterEggSettingsRoute +import de.mm20.launcher2.ui.settings.license.LicenseRoute import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import kotlinx.serialization.Serializable + +@Serializable +data object AboutSettingsRoute: NavKey @Composable fun AboutSettingsScreen() { val viewModel: AboutSettingsScreenVM = viewModel() - val navController = LocalNavController.current + val backStack = LocalBackStack.current val context = LocalContext.current PreferenceScreen(title = stringResource(R.string.preference_screen_about)) { item { @@ -44,7 +52,7 @@ fun AboutSettingsScreen() { onClick = { easterEggCounter++ if (easterEggCounter >= 9) { - navController?.navigate("settings/about/easteregg") + backStack.add(EasterEggSettingsRoute) easterEggCounter = 0 } } @@ -53,7 +61,7 @@ fun AboutSettingsScreen() { title = stringResource(R.string.preference_screen_buildinfo), summary = stringResource(R.string.preference_screen_buildinfo_summary), onClick = { - navController?.navigate("settings/about/buildinfo") + backStack.add(BuildInfoSettingsRoute) } ) } @@ -65,7 +73,7 @@ fun AboutSettingsScreen() { title = stringResource(id = R.string.preference_about_license), summary = stringResource(id = R.string.preference_about_license_summary), onClick = { - navController?.navigate("settings/license") + backStack.add(LicenseRoute()) } ) } @@ -112,7 +120,7 @@ fun AboutSettingsScreen() { title = library.name, summary = library.description, onClick = { - navController?.navigate("settings/license?library=${library.name}") + backStack.add(LicenseRoute(libraryName = library.name)) } ) } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt index d6664ec85..83c8c5610 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt @@ -8,6 +8,7 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.res.stringResource import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.ktx.isAtLeastApiLevel import de.mm20.launcher2.preferences.ColorScheme import de.mm20.launcher2.ui.R @@ -15,14 +16,21 @@ import de.mm20.launcher2.ui.component.preferences.ListPreference import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack +import de.mm20.launcher2.ui.locals.LocalBackStack +import de.mm20.launcher2.ui.settings.colorscheme.ColorSchemesSettingsRoute +import de.mm20.launcher2.ui.settings.shapes.ShapeSchemesSettingsRoute import de.mm20.launcher2.ui.settings.transparencies.TransparencySchemesSettingsRoute import de.mm20.launcher2.ui.settings.typography.TypographiesSettingsRoute +import kotlinx.serialization.Serializable + +@Serializable +data object AppearanceSettingsRoute: NavKey @Composable fun AppearanceSettingsScreen() { val viewModel: AppearanceSettingsScreenVM = viewModel() - val navController = LocalNavController.current + val backStack = LocalBackStack.current val colorThemeName by viewModel.colorThemeName.collectAsStateWithLifecycle(null) val typographyThemeName by viewModel.typographyThemeName.collectAsStateWithLifecycle(null) val shapeThemeName by viewModel.shapeThemeName.collectAsStateWithLifecycle(null) @@ -33,7 +41,7 @@ fun AppearanceSettingsScreen() { if (it == null) { return@rememberLauncherForActivityResult } - navController?.navigate(ImportThemeSettingsRoute(it.toString())) + backStack.add(ImportThemeSettingsRoute(it)) } PreferenceScreen(title = stringResource(id = R.string.preference_screen_appearance)) { @@ -61,7 +69,7 @@ fun AppearanceSettingsScreen() { title = stringResource(id = R.string.preference_screen_colors), summary = colorThemeName, onClick = { - navController?.navigate("settings/appearance/colors") + backStack.add(ColorSchemesSettingsRoute) }, icon = R.drawable.palette_24px, ) @@ -69,7 +77,7 @@ fun AppearanceSettingsScreen() { title = stringResource(id = R.string.preference_screen_typography), summary = typographyThemeName, onClick = { - navController?.navigate(TypographiesSettingsRoute) + backStack.add(TypographiesSettingsRoute) }, icon = R.drawable.text_fields_24px, ) @@ -77,7 +85,7 @@ fun AppearanceSettingsScreen() { title = stringResource(id = R.string.preference_screen_shapes), summary = shapeThemeName, onClick = { - navController?.navigate("settings/appearance/shapes") + backStack.add(ShapeSchemesSettingsRoute) }, icon = R.drawable.crop_square_24px, ) @@ -85,7 +93,7 @@ fun AppearanceSettingsScreen() { title = stringResource(id = R.string.preference_screen_transparencies), summary = transparencyThemeName, onClick = { - navController?.navigate(TransparencySchemesSettingsRoute) + backStack.add(TransparencySchemesSettingsRoute) }, icon = R.drawable.opacity_24px, ) @@ -105,7 +113,7 @@ fun AppearanceSettingsScreen() { title = stringResource(R.string.theme_export_title), icon = R.drawable.arrow_circle_up_24px, onClick = { - navController?.navigate("settings/appearance/export") + backStack.add(ExportThemeSettingsRoute) } ) } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/ExportThemeSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/ExportThemeSettingsScreen.kt index d41c0fac2..3f0c7fd56 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/ExportThemeSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/ExportThemeSettingsScreen.kt @@ -31,11 +31,16 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.ListPreference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.TextPreference +import kotlinx.serialization.Serializable + +@Serializable +data object ExportThemeSettingsRoute: NavKey @Composable fun ExportThemeSettingsScreen() { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/ImportThemeSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/ImportThemeSettingsScreen.kt index 4a4b4308a..9329acd23 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/ImportThemeSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/ImportThemeSettingsScreen.kt @@ -43,7 +43,9 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.preferences.SearchBarStyle +import de.mm20.launcher2.serialization.UriSerializer import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.Banner import de.mm20.launcher2.ui.component.SearchBar @@ -66,7 +68,9 @@ import kotlinx.coroutines.launch import kotlinx.serialization.Serializable @Serializable -data class ImportThemeSettingsRoute(val fromUri: String) +data class ImportThemeSettingsRoute( + @Serializable(with = UriSerializer::class) val fromUri: Uri +): NavKey @Composable fun ImportThemeSettingsScreen( diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/backup/BackupSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/backup/BackupSettingsScreen.kt index 6021051f5..cdad17bde 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/backup/BackupSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/backup/BackupSettingsScreen.kt @@ -6,14 +6,19 @@ import androidx.compose.runtime.* import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.common.RestoreBackupSheet import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen +import kotlinx.serialization.Serializable import java.time.ZonedDateTime import java.time.format.DateTimeFormatter +@Serializable +data object BackupSettingsRoute: NavKey + @Composable fun BackupSettingsScreen() { val viewModel: BackupSettingsScreenVM = viewModel() diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/breezyweather/BreezyWeatherSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/breezyweather/BreezyWeatherSettingsScreen.kt index 7799a9ee9..4c6e0d65b 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/breezyweather/BreezyWeatherSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/breezyweather/BreezyWeatherSettingsScreen.kt @@ -14,11 +14,16 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.Banner import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen +import kotlinx.serialization.Serializable + +@Serializable +data object BreezyWeatherSettingsRoute: NavKey @Composable fun BreezyWeatherSettingsScreen() { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/buildinfo/BuildInfoSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/buildinfo/BuildInfoSettingsScreen.kt index 6d8cbd295..6f0f5f737 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/buildinfo/BuildInfoSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/buildinfo/BuildInfoSettingsScreen.kt @@ -7,13 +7,18 @@ import androidx.compose.runtime.* import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.ui.BuildConfig import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen +import kotlinx.serialization.Serializable import java.security.MessageDigest +@Serializable +data object BuildInfoSettingsRoute: NavKey + @Composable fun BuildInfoSettingsScreen() { val viewModel: BuildInfoSettingsScreenVM = viewModel() diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/calendarsearch/CalendarProviderSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/calendarsearch/CalendarProviderSettingsScreen.kt index 5154cfc56..ae575265c 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/calendarsearch/CalendarProviderSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/calendarsearch/CalendarProviderSettingsScreen.kt @@ -10,6 +10,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.calendar.providers.CalendarList import de.mm20.launcher2.plugin.PluginState import de.mm20.launcher2.themes.colors.atTone @@ -19,6 +20,10 @@ import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.SwitchPreference import de.mm20.launcher2.ui.locals.LocalDarkTheme +import kotlinx.serialization.Serializable + +@Serializable +data class CalendarProviderSettingsRoute(val providerId: String): NavKey @Composable fun CalendarProviderSettingsScreen(providerId: String) { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/calendarsearch/CalendarSearchSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/calendarsearch/CalendarSearchSettingsScreen.kt index 40db8dfbb..14ff9b8e9 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/calendarsearch/CalendarSearchSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/calendarsearch/CalendarSearchSettingsScreen.kt @@ -10,6 +10,7 @@ import androidx.compose.ui.res.stringResource import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.crashreporter.CrashReporter import de.mm20.launcher2.ktx.sendWithBackgroundPermission import de.mm20.launcher2.plugin.PluginState @@ -18,13 +19,17 @@ import de.mm20.launcher2.ui.component.preferences.GuardedPreference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.PreferenceWithSwitch -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack +import kotlinx.serialization.Serializable + +@Serializable +data object CalendarSearchSettingsRoute: NavKey @Composable fun CalendarSearchSettingsScreen() { val viewModel: CalendarSearchSettingsScreenVM = viewModel() val context = LocalContext.current - val navController = LocalNavController.current + val backStack = LocalBackStack.current val hasCalendarPermission by viewModel.hasCalendarPermission.collectAsState(null) val hasTasksPermission by viewModel.hasTasksPermission.collectAsState(null) @@ -54,7 +59,7 @@ fun CalendarSearchSettingsScreen() { }, enabled = hasCalendarPermission == true, onClick = { - navController?.navigate("settings/search/calendar/local") + backStack.add(CalendarProviderSettingsRoute(providerId = "local")) } ) } @@ -75,7 +80,7 @@ fun CalendarSearchSettingsScreen() { }, enabled = hasTasksPermission == true, onClick = { - navController?.navigate("settings/search/calendar/tasks.org") + backStack.add(CalendarProviderSettingsRoute(providerId = "tasks.org")) } ) } @@ -109,7 +114,7 @@ fun CalendarSearchSettingsScreen() { viewModel.setProviderEnabled(plugin.plugin.authority, it) }, onClick = { - navController?.navigate("settings/search/calendar/${plugin.plugin.authority}") + backStack.add(CalendarProviderSettingsRoute(providerId = plugin.plugin.authority)) } ) } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemeSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemeSettingsScreen.kt index 1fdd112a8..2cc444519 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemeSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemeSettingsScreen.kt @@ -47,10 +47,12 @@ import androidx.compose.ui.unit.dp import androidx.core.content.ContextCompat import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.badges.Badge import de.mm20.launcher2.icons.ColorLayer import de.mm20.launcher2.icons.StaticLauncherIcon import de.mm20.launcher2.icons.TintedIconLayer +import de.mm20.launcher2.serialization.UUIDSerializer import de.mm20.launcher2.themes.colors.DefaultDarkColorScheme import de.mm20.launcher2.themes.colors.DefaultLightColorScheme import de.mm20.launcher2.themes.colors.merge @@ -63,8 +65,15 @@ import de.mm20.launcher2.ui.locals.LocalDarkTheme import de.mm20.launcher2.ui.theme.colorscheme.darkColorSchemeOf import de.mm20.launcher2.ui.theme.colorscheme.lightColorSchemeOf import de.mm20.launcher2.ui.theme.colorscheme.systemCorePalette +import kotlinx.serialization.Serializable import palettes.CorePalette import java.util.UUID +import kotlin.uuid.Uuid + +@Serializable +data class ColorSchemeSettingsRoute( + @Serializable(with = UUIDSerializer::class) val id: UUID +): NavKey @Composable fun ColorSchemeSettingsScreen(themeId: UUID) { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemesSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemesSettingsScreen.kt index 792495878..5a580c267 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemesSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/colorscheme/ColorSchemesSettingsScreen.kt @@ -32,20 +32,25 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.themes.colors.Colors import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen +import de.mm20.launcher2.ui.locals.LocalBackStack import de.mm20.launcher2.ui.locals.LocalDarkTheme -import de.mm20.launcher2.ui.locals.LocalNavController import de.mm20.launcher2.ui.theme.colorscheme.darkColorSchemeOf import de.mm20.launcher2.ui.theme.colorscheme.lightColorSchemeOf +import kotlinx.serialization.Serializable + +@Serializable +data object ColorSchemesSettingsRoute: NavKey @Composable fun ColorSchemesSettingsScreen() { val viewModel: ColorSchemesSettingsScreenVM = viewModel() - val navController = LocalNavController.current + val backStack = LocalBackStack.current val context = LocalContext.current val selectedTheme by viewModel.selectedColors.collectAsStateWithLifecycle(null) @@ -133,7 +138,7 @@ fun ColorSchemesSettingsScreen() { }, text = { Text(stringResource(R.string.edit)) }, onClick = { - navController?.navigate("settings/appearance/colors/${theme.id}") + backStack.add(ColorSchemeSettingsRoute(id = theme.id)) showMenu = false } ) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/contacts/ContactsSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/contacts/ContactsSettingsScreen.kt index 273f38be3..c0b8b84fb 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/contacts/ContactsSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/contacts/ContactsSettingsScreen.kt @@ -10,6 +10,7 @@ import androidx.compose.ui.res.stringResource import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.crashreporter.CrashReporter import de.mm20.launcher2.ktx.sendWithBackgroundPermission import de.mm20.launcher2.plugin.PluginState @@ -18,6 +19,10 @@ import de.mm20.launcher2.ui.component.preferences.GuardedPreference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.SwitchPreference +import kotlinx.serialization.Serializable + +@Serializable +data object ContactsSettingsRoute: NavKey @Composable fun ContactsSettingsScreen() { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/crashreporter/CrashReportScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/crashreporter/CrashReportScreen.kt index d36cc98b1..a76a1d82b 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/crashreporter/CrashReportScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/crashreporter/CrashReportScreen.kt @@ -21,9 +21,14 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.crashreporter.CrashReportType import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.PreferenceScreen +import kotlinx.serialization.Serializable + +@Serializable +data class CrashReportRoute(val fileName: String): NavKey @Composable fun CrashReportScreen(fileName: String) { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/crashreporter/CrashReporterScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/crashreporter/CrashReporterScreen.kt index 960251a8e..69cba650d 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/crashreporter/CrashReporterScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/crashreporter/CrashReporterScreen.kt @@ -17,16 +17,20 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.crashreporter.CrashReportType import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.PreferenceScreen -import de.mm20.launcher2.ui.locals.LocalNavController -import java.net.URLEncoder +import de.mm20.launcher2.ui.locals.LocalBackStack +import kotlinx.serialization.Serializable + +@Serializable +data object CrashReporterRoute: NavKey @Composable fun CrashReporterScreen() { val viewModel: CrashReporterScreenVM = viewModel() - val navController = LocalNavController.current + val backStack = LocalBackStack.current val reports by viewModel.reports val showExceptions by viewModel.showExceptions val showCrashes by viewModel.showCrashes @@ -69,7 +73,7 @@ fun CrashReporterScreen() { modifier = Modifier .fillMaxWidth() .clickable { - navController?.navigate("settings/debug/crashreporter/report?fileName=${it.filePath}") + backStack.add(CrashReportRoute(it.filePath)) } .padding(16.dp) ) { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/debug/DebugSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/debug/DebugSettingsScreen.kt index 50c32e032..4f149c21b 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/debug/DebugSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/debug/DebugSettingsScreen.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.core.content.FileProvider import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.ktx.tryStartActivity import de.mm20.launcher2.ui.BuildConfig import de.mm20.launcher2.ui.R @@ -24,22 +25,28 @@ import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.SwitchPreference -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack +import de.mm20.launcher2.ui.settings.crashreporter.CrashReporterRoute +import de.mm20.launcher2.ui.settings.log.LogRoute import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import kotlinx.serialization.Serializable import java.io.File import java.text.SimpleDateFormat import java.util.Date +@Serializable +data object DebugSettingsRoute: NavKey + @Composable fun DebugSettingsScreen() { val context = LocalContext.current val scope = rememberCoroutineScope() var dumpingHeap by remember { mutableStateOf(false) } val viewModel: DebugSettingsScreenVM = viewModel() - val navController = LocalNavController.current + val backStack = LocalBackStack.current PreferenceScreen( stringResource(R.string.preference_screen_debug) ) { @@ -56,14 +63,14 @@ fun DebugSettingsScreen() { title = stringResource(R.string.preference_crash_reporter), summary = stringResource(R.string.preference_crash_reporter_summary), onClick = { - navController?.navigate("settings/debug/crashreporter") + backStack.add(CrashReporterRoute) }) Preference( title = stringResource(R.string.preference_logs), summary = stringResource(R.string.preference_logs_summary), onClick = { - navController?.navigate("settings/debug/logs") + backStack.add(LogRoute) }) Preference( title = stringResource(R.string.preference_debug_dump_heap), diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/easteregg/EasterEggSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/easteregg/EasterEggSettingsScreen.kt index b83811b09..7b66fe874 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/easteregg/EasterEggSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/easteregg/EasterEggSettingsScreen.kt @@ -22,8 +22,13 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.PreferenceScreen +import kotlinx.serialization.Serializable + +@Serializable +data object EasterEggSettingsRoute: NavKey @Composable fun EasterEggSettingsScreen() { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreen.kt index 7163a224e..379253d5c 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreen.kt @@ -8,6 +8,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.res.stringResource import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.preferences.WeightFactor import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.ListPreference @@ -17,6 +18,10 @@ import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.SliderPreference import de.mm20.launcher2.ui.component.preferences.SwitchPreference import de.mm20.launcher2.ui.launcher.sheets.EditFavoritesSheet +import kotlinx.serialization.Serializable + +@Serializable +data object FavoritesSettingsRoute: NavKey @Composable fun FavoritesSettingsScreen() { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/filesearch/FileSearchSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/filesearch/FileSearchSettingsScreen.kt index 0ee63077a..f57082b2f 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/filesearch/FileSearchSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/filesearch/FileSearchSettingsScreen.kt @@ -16,6 +16,7 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.accounts.AccountType import de.mm20.launcher2.crashreporter.CrashReporter import de.mm20.launcher2.ktx.isAtLeastApiLevel @@ -26,6 +27,10 @@ import de.mm20.launcher2.ui.component.preferences.GuardedPreference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.SwitchPreference +import kotlinx.serialization.Serializable + +@Serializable +data object FileSearchSettingsRoute: NavKey @Composable fun FileSearchSettingsScreen() { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/filterbar/FilterBarSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/filterbar/FilterBarSettingsScreen.kt index 8e2a54d9b..23bc8c679 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/filterbar/FilterBarSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/filterbar/FilterBarSettingsScreen.kt @@ -31,6 +31,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import com.google.accompanist.systemuicontroller.rememberSystemUiController import de.mm20.launcher2.preferences.KeyboardFilterBarItem import de.mm20.launcher2.ui.R @@ -41,12 +42,16 @@ import de.mm20.launcher2.ui.component.preferences.SwitchPreference import de.mm20.launcher2.ui.launcher.search.filters.getLabel import de.mm20.launcher2.ui.launcher.search.filters.iconMedium import de.mm20.launcher2.ui.launcher.search.filters.isCategory -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack +import kotlinx.serialization.Serializable + +@Serializable +data object FilterBarSettingsRoute: NavKey @Composable fun FilterBarSettingsScreen() { val viewModel: FilterBarSettingsScreenVM = viewModel() - val navController = LocalNavController.current + val backStack = LocalBackStack.current val systemUiController = rememberSystemUiController() systemUiController.setStatusBarColor(MaterialTheme.colorScheme.surface) systemUiController.setNavigationBarColor(Color.Black) @@ -88,8 +93,10 @@ fun FilterBarSettingsScreen() { }, navigationIcon = { IconButton(onClick = { - if (navController?.navigateUp() != true) { + if (backStack.size <= 1) { activity?.onBackPressed() + } else { + backStack.removeLastOrNull() } }) { Icon( diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/gestures/GestureSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/gestures/GestureSettingsScreen.kt index acb1f6bfb..58467eae3 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/gestures/GestureSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/gestures/GestureSettingsScreen.kt @@ -24,6 +24,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.icons.LauncherIcon import de.mm20.launcher2.ktx.isAtLeastApiLevel import de.mm20.launcher2.preferences.GestureAction @@ -36,6 +37,10 @@ import de.mm20.launcher2.ui.component.preferences.ListPreference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.ktx.toPixels +import kotlinx.serialization.Serializable + +@Serializable +data object GesturesSettingsRoute: NavKey @Composable fun GestureSettingsScreen() { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/hiddenitems/HiddenItemsSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/hiddenitems/HiddenItemsSettingsScreen.kt index 332ea3205..cc6058182 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/hiddenitems/HiddenItemsSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/hiddenitems/HiddenItemsSettingsScreen.kt @@ -29,6 +29,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.icons.LauncherIcon import de.mm20.launcher2.search.Application import de.mm20.launcher2.search.CalendarEvent @@ -39,6 +40,10 @@ import de.mm20.launcher2.ui.component.ShapedLauncherIcon import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.SwitchPreference +import kotlinx.serialization.Serializable + +@Serializable +data object HiddenItemsSettingsRoute: NavKey @Composable fun HiddenItemsSettingsScreen() { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/homescreen/HomescreenSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/homescreen/HomescreenSettingsScreen.kt index 5739d6975..e5d0661e0 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/homescreen/HomescreenSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/homescreen/HomescreenSettingsScreen.kt @@ -39,6 +39,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.preferences.SearchBarColors import de.mm20.launcher2.preferences.SearchBarStyle import de.mm20.launcher2.preferences.SystemBarColors @@ -54,16 +55,18 @@ import de.mm20.launcher2.ui.component.preferences.SliderPreference import de.mm20.launcher2.ui.component.preferences.SwitchPreference import de.mm20.launcher2.ui.launcher.widgets.clock.ConfigureClockWidgetSheet import de.mm20.launcher2.ui.locals.LocalDarkTheme -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack import de.mm20.launcher2.ui.locals.LocalPreferDarkContentOverWallpaper +import kotlinx.serialization.Serializable + +@Serializable +data object HomescreenSettingsRoute: NavKey @Composable fun HomescreenSettingsScreen() { val viewModel: HomescreenSettingsScreenVM = viewModel(factory = HomescreenSettingsScreenVM.Factory) - val navController = LocalNavController.current - val context = LocalContext.current val dock by viewModel.dock.collectAsStateWithLifecycle(null) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/icons/IconsSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/icons/IconsSettingsScreen.kt index f39f16bce..06b3d4e95 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/icons/IconsSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/icons/IconsSettingsScreen.kt @@ -39,6 +39,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.icons.IconPack import de.mm20.launcher2.icons.LauncherIcon import de.mm20.launcher2.preferences.IconShape @@ -55,6 +56,10 @@ import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.SliderPreference import de.mm20.launcher2.ui.component.preferences.SwitchPreference import kotlinx.coroutines.flow.Flow +import kotlinx.serialization.Serializable + +@Serializable +data object IconsSettingsRoute: NavKey @Composable fun IconsSettingsScreen() { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/integrations/IntegrationsSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/integrations/IntegrationsSettingsScreen.kt index 27f0ffc23..10dc5028e 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/integrations/IntegrationsSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/integrations/IntegrationsSettingsScreen.kt @@ -3,16 +3,28 @@ package de.mm20.launcher2.ui.settings.integrations import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack +import de.mm20.launcher2.ui.settings.breezyweather.BreezyWeatherSettingsRoute +import de.mm20.launcher2.ui.settings.media.MediaIntegrationSettingsRoute +import de.mm20.launcher2.ui.settings.nextcloud.NextcloudSettingsRoute +import de.mm20.launcher2.ui.settings.owncloud.OwncloudSettingsRoute +import de.mm20.launcher2.ui.settings.tasks.TasksIntegrationSettingsRoute +import de.mm20.launcher2.ui.settings.weather.WeatherIntegrationSettingsRoute +import de.mm20.launcher2.ui.settings.wikipedia.WikipediaSettingsRoute +import kotlinx.serialization.Serializable + +@Serializable +data object IntegrationsSettingsRoute: NavKey @Composable fun IntegrationsSettingsScreen() { val viewModel: IntegrationsSettingsScreenVM = viewModel() - val navController = LocalNavController.current + val backStack = LocalBackStack.current PreferenceScreen(title = stringResource(R.string.preference_screen_integrations)) { item { @@ -21,14 +33,14 @@ fun IntegrationsSettingsScreen() { title = stringResource(R.string.preference_weather_integration), icon = R.drawable.light_mode_24px, onClick = { - navController?.navigate("settings/integrations/weather") + backStack.add(WeatherIntegrationSettingsRoute) } ) Preference( title = stringResource(R.string.preference_media_integration), icon = R.drawable.play_circle_24px, onClick = { - navController?.navigate("settings/integrations/media") + backStack.add(MediaIntegrationSettingsRoute) } ) } @@ -39,35 +51,35 @@ fun IntegrationsSettingsScreen() { title = stringResource(R.string.preference_nextcloud), icon = R.drawable.nextcloud, onClick = { - navController?.navigate("settings/integrations/nextcloud") + backStack.add(NextcloudSettingsRoute) } ) Preference( title = stringResource(R.string.preference_owncloud), icon = R.drawable.owncloud, onClick = { - navController?.navigate("settings/integrations/owncloud") + backStack.add(OwncloudSettingsRoute) } ) Preference( title = stringResource(R.string.preference_search_wikipedia), icon = R.drawable.wikipedia, onClick = { - navController?.navigate("settings/search/wikipedia") + backStack.add(WikipediaSettingsRoute) } ) Preference( title = stringResource(R.string.preference_tasks_integration), icon = R.drawable.check_24px_sharp, onClick = { - navController?.navigate("settings/integrations/tasks") + backStack.add(TasksIntegrationSettingsRoute) } ) Preference( title = stringResource(R.string.preference_breezyweather_integration), icon = R.drawable.breezy_weather, onClick = { - navController?.navigate("settings/integrations/breezyweather") + backStack.add(BreezyWeatherSettingsRoute) } ) } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/license/LicenseScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/license/LicenseScreen.kt index e1f6ee83e..28c3d0455 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/license/LicenseScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/license/LicenseScreen.kt @@ -10,6 +10,7 @@ import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.input.nestedscroll.nestedScroll @@ -18,16 +19,33 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey +import de.mm20.launcher2.licenses.AppLicense import de.mm20.launcher2.licenses.OpenSourceLibrary +import de.mm20.launcher2.licenses.OpenSourceLicenses import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.PreferenceCategory -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack +import kotlinx.serialization.Serializable + +@Serializable +data class LicenseRoute( + val libraryName: String? = null +): NavKey @Composable -fun LicenseScreen(library: OpenSourceLibrary) { +fun LicenseScreen(libraryName: String?) { val context = LocalContext.current + val library = remember(libraryName) { + if (libraryName == null) { + AppLicense.get(context) + } else { + OpenSourceLicenses.first { lib -> lib.name == libraryName } + } + } + val viewModel: LicenseScreenVM = viewModel() - val navController = LocalNavController.current + val backStack = LocalBackStack.current val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior( @@ -41,7 +59,7 @@ fun LicenseScreen(library: OpenSourceLibrary) { }, navigationIcon = { IconButton(onClick = { - navController?.navigateUp() + backStack.removeLastOrNull() }) { Icon(painterResource(R.drawable.arrow_back_24px), contentDescription = "Back") } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locations/LocationsSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locations/LocationsSettingsScreen.kt index 152d8a3c6..1d593b6cd 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locations/LocationsSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/locations/LocationsSettingsScreen.kt @@ -15,6 +15,7 @@ import androidx.compose.ui.unit.dp import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.crashreporter.CrashReporter import de.mm20.launcher2.ktx.sendWithBackgroundPermission import de.mm20.launcher2.plugin.PluginState @@ -29,13 +30,18 @@ import de.mm20.launcher2.ui.component.preferences.SliderPreference import de.mm20.launcher2.ui.component.preferences.SwitchPreference import de.mm20.launcher2.ui.component.preferences.TextPreference import de.mm20.launcher2.ui.ktx.metersToLocalizedString -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack +import de.mm20.launcher2.ui.settings.osm.OsmSettingsRoute +import kotlinx.serialization.Serializable + +@Serializable +data object LocationsSettingsRoute: NavKey @Composable fun LocationsSettingsScreen() { val viewModel: LocationsSettingsScreenVM = viewModel() - val navController = LocalNavController.current + val backStack = LocalBackStack.current val context = LocalContext.current val osmLocations by viewModel.osmLocations.collectAsState() @@ -65,7 +71,7 @@ fun LocationsSettingsScreen() { viewModel.setOsmLocations(it) }, onClick = { - navController?.navigate("settings/search/locations/osm") + backStack.add(OsmSettingsRoute) } ) for (plugin in plugins) { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/log/LogScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/log/LogScreen.kt index 41368946a..82e067504 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/log/LogScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/log/LogScreen.kt @@ -33,6 +33,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.core.content.FileProvider +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.debug.DebugInformationDumper import de.mm20.launcher2.ktx.tryStartActivity import de.mm20.launcher2.ui.R @@ -41,10 +42,14 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.isActive import kotlinx.coroutines.launch +import kotlinx.serialization.Serializable import java.io.File import java.io.IOException import java.util.regex.Pattern +@Serializable +data object LogRoute: NavKey + @Composable fun LogScreen() { var lines by remember { mutableStateOf(emptyList()) } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/main/MainSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/main/MainSettingsScreen.kt index dd6a24771..16e91c27d 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/main/MainSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/main/MainSettingsScreen.kt @@ -2,15 +2,30 @@ package de.mm20.launcher2.ui.settings.main import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack +import de.mm20.launcher2.ui.settings.about.AboutSettingsRoute +import de.mm20.launcher2.ui.settings.appearance.AppearanceSettingsRoute +import de.mm20.launcher2.ui.settings.backup.BackupSettingsRoute +import de.mm20.launcher2.ui.settings.debug.DebugSettingsRoute +import de.mm20.launcher2.ui.settings.gestures.GesturesSettingsRoute +import de.mm20.launcher2.ui.settings.homescreen.HomescreenSettingsRoute +import de.mm20.launcher2.ui.settings.icons.IconsSettingsRoute +import de.mm20.launcher2.ui.settings.integrations.IntegrationsSettingsRoute +import de.mm20.launcher2.ui.settings.plugins.PluginsSettingsRoute +import de.mm20.launcher2.ui.settings.search.SearchSettingsRoute +import kotlinx.serialization.Serializable + +@Serializable +data object MainRoute: NavKey @Composable fun MainSettingsScreen() { - val navController = LocalNavController.current + val backStack = LocalBackStack.current PreferenceScreen( title = stringResource(R.string.settings), ) { @@ -21,7 +36,7 @@ fun MainSettingsScreen() { title = stringResource(id = R.string.preference_screen_appearance), summary = stringResource(id = R.string.preference_screen_appearance_summary), onClick = { - navController?.navigate("settings/appearance") + backStack.add(AppearanceSettingsRoute) } ) Preference( @@ -29,7 +44,7 @@ fun MainSettingsScreen() { title = stringResource(id = R.string.preference_screen_homescreen), summary = stringResource(id = R.string.preference_screen_homescreen_summary), onClick = { - navController?.navigate("settings/homescreen") + backStack.add(HomescreenSettingsRoute) } ) Preference( @@ -37,7 +52,7 @@ fun MainSettingsScreen() { title = stringResource(id = R.string.preference_screen_icons), summary = stringResource(id = R.string.preference_screen_icons_summary), onClick = { - navController?.navigate("settings/icons") + backStack.add(IconsSettingsRoute) } ) Preference( @@ -45,7 +60,7 @@ fun MainSettingsScreen() { title = stringResource(id = R.string.preference_screen_search), summary = stringResource(id = R.string.preference_screen_search_summary), onClick = { - navController?.navigate("settings/search") + backStack.add(SearchSettingsRoute) } ) Preference( @@ -53,7 +68,7 @@ fun MainSettingsScreen() { title = stringResource(id = R.string.preference_screen_gestures), summary = stringResource(id = R.string.preference_screen_gestures_summary), onClick = { - navController?.navigate("settings/gestures") + backStack.add(GesturesSettingsRoute) } ) Preference( @@ -61,7 +76,7 @@ fun MainSettingsScreen() { title = stringResource(id = R.string.preference_screen_integrations), summary = stringResource(id = R.string.preference_screen_integrations_summary), onClick = { - navController?.navigate("settings/integrations") + backStack.add(IntegrationsSettingsRoute) } ) Preference( @@ -69,7 +84,7 @@ fun MainSettingsScreen() { title = stringResource(id = R.string.preference_screen_plugins), summary = stringResource(id = R.string.preference_screen_plugins_summary), onClick = { - navController?.navigate("settings/plugins") + backStack.add(PluginsSettingsRoute) } ) Preference( @@ -77,7 +92,7 @@ fun MainSettingsScreen() { title = stringResource(id = R.string.preference_screen_backup), summary = stringResource(id = R.string.preference_screen_backup_summary), onClick = { - navController?.navigate("settings/backup") + backStack.add(BackupSettingsRoute) } ) Preference( @@ -85,7 +100,7 @@ fun MainSettingsScreen() { title = stringResource(id = R.string.preference_screen_debug), summary = stringResource(id = R.string.preference_screen_debug_summary), onClick = { - navController?.navigate("settings/debug") + backStack.add(DebugSettingsRoute) } ) Preference( @@ -93,7 +108,7 @@ fun MainSettingsScreen() { title = stringResource(id = R.string.preference_screen_about), summary = stringResource(id = R.string.preference_screen_about_summary), onClick = { - navController?.navigate("settings/about") + backStack.add(AboutSettingsRoute) } ) } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/media/MediaIntegrationSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/media/MediaIntegrationSettingsScreen.kt index 91443767a..8461c996e 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/media/MediaIntegrationSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/media/MediaIntegrationSettingsScreen.kt @@ -20,6 +20,7 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.ui.BuildConfig import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.MissingPermissionBanner @@ -28,6 +29,10 @@ import de.mm20.launcher2.ui.component.preferences.CheckboxPreference import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen +import kotlinx.serialization.Serializable + +@Serializable +data object MediaIntegrationSettingsRoute: NavKey @Composable fun MediaIntegrationSettingsScreen() { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/nextcloud/NextcloudSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/nextcloud/NextcloudSettingsScreen.kt index 71e45aed4..4bb0eae33 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/nextcloud/NextcloudSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/nextcloud/NextcloudSettingsScreen.kt @@ -28,19 +28,24 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.SwitchPreference -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack +import kotlinx.serialization.Serializable + +@Serializable +data object NextcloudSettingsRoute: NavKey @Composable fun NextcloudSettingsScreen() { val viewModel: NextcloudSettingsScreenVM = viewModel() val lifecycleOwner = LocalLifecycleOwner.current - val navController = LocalNavController.current + val backStack = LocalBackStack.current val nextcloudUser by viewModel.nextcloudUser val loading by viewModel.loading diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/osm/OsmSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/osm/OsmSettingsScreen.kt index ab3047eb3..da2a8b53f 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/osm/OsmSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/osm/OsmSettingsScreen.kt @@ -5,12 +5,17 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.res.stringResource import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.preferences.search.LocationSearchSettings import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.SwitchPreference import de.mm20.launcher2.ui.component.preferences.TextPreference +import kotlinx.serialization.Serializable + +@Serializable +data object OsmSettingsRoute: NavKey @Composable fun OsmSettingsScreen() { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/owncloud/OwncloudSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/owncloud/OwncloudSettingsScreen.kt index 38c8ca1b1..95e9ffbdc 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/owncloud/OwncloudSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/owncloud/OwncloudSettingsScreen.kt @@ -29,19 +29,24 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.SwitchPreference -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack +import kotlinx.serialization.Serializable + +@Serializable +data object OwncloudSettingsRoute: NavKey @Composable fun OwncloudSettingsScreen() { val viewModel: OwncloudSettingsScreenVM = viewModel() val lifecycleOwner = LocalLifecycleOwner.current - val navController = LocalNavController.current + val backStack = LocalBackStack.current val owncloudUser by viewModel.owncloudUser val loading by viewModel.loading diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/plugins/PluginSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/plugins/PluginSettingsScreen.kt index f38ee74f5..2d65dcaf1 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/plugins/PluginSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/plugins/PluginSettingsScreen.kt @@ -39,6 +39,7 @@ import androidx.compose.ui.unit.dp import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import coil.compose.AsyncImage import de.mm20.launcher2.crashreporter.CrashReporter import de.mm20.launcher2.ktx.sendWithBackgroundPermission @@ -49,11 +50,17 @@ import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceWithSwitch import de.mm20.launcher2.ui.component.preferences.SwitchPreference -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack +import de.mm20.launcher2.ui.settings.calendarsearch.CalendarProviderSettingsRoute +import de.mm20.launcher2.ui.settings.weather.WeatherIntegrationSettingsRoute +import kotlinx.serialization.Serializable + +@Serializable +data class PluginSettingsRoute(val pluginId: String): NavKey @Composable fun PluginSettingsScreen(pluginId: String) { - val navController = LocalNavController.current + val backStack = LocalBackStack.current val activity = LocalActivity.current val context = LocalContext.current val viewModel: PluginSettingsScreenVM = viewModel() @@ -131,8 +138,10 @@ fun PluginSettingsScreen(pluginId: String) { ), navigationIcon = { IconButton(onClick = { - if (navController?.navigateUp() != true) { + if (backStack.size <= 1) { activity?.onBackPressed() + } else { + backStack.removeLastOrNull() } }) { Icon( @@ -164,7 +173,11 @@ fun PluginSettingsScreen(pluginId: String) { } IconButton(onClick = { viewModel.uninstall(context) - navController?.navigateUp() + if (backStack.size <= 1) { + activity?.onBackPressed() + } else { + backStack.removeLastOrNull() + } }) { Icon( painterResource(R.drawable.delete_24px), @@ -513,7 +526,9 @@ fun PluginSettingsScreen(pluginId: String) { }, iconPadding = false, onClick = { - navController?.navigate("settings/search/calendar/${plugin.plugin.authority}") + backStack.add(CalendarProviderSettingsRoute( + providerId = plugin.plugin.authority + )) } ) } @@ -574,7 +589,7 @@ fun PluginSettingsScreen(pluginId: String) { title = stringResource(R.string.widget_config_weather_integration_settings), icon = R.drawable.open_in_new_24px, onClick = { - navController?.navigate("settings/integrations/weather") + backStack.add(WeatherIntegrationSettingsRoute) } ) } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/plugins/PluginsSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/plugins/PluginsSettingsScreen.kt index d105c8345..9b424c776 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/plugins/PluginsSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/plugins/PluginsSettingsScreen.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import coil.compose.AsyncImage import de.mm20.launcher2.plugin.PluginPackage import de.mm20.launcher2.ui.R @@ -24,7 +25,11 @@ import de.mm20.launcher2.ui.component.LargeMessage import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack +import kotlinx.serialization.Serializable + +@Serializable +data object PluginsSettingsRoute: NavKey @Composable fun PluginsSettingsScreen() { @@ -82,7 +87,7 @@ fun PluginsSettingsScreen() { @Composable private fun PluginPreference(viewModel: PluginsSettingsScreenVM, plugin: PluginPackage) { - val navController = LocalNavController.current + val backStack = LocalBackStack.current val icon by remember(plugin.packageName) { viewModel.getIcon(plugin) }.collectAsState(null) @@ -103,7 +108,7 @@ private fun PluginPreference(viewModel: PluginsSettingsScreenVM, plugin: PluginP ) }, onClick = { - navController?.navigate("settings/plugins/${plugin.packageName}") + backStack.add(PluginSettingsRoute(pluginId = plugin.packageName)) } ) } \ No newline at end of file diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/search/SearchSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/search/SearchSettingsScreen.kt index f50963d33..36f945b5a 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/search/SearchSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/search/SearchSettingsScreen.kt @@ -16,6 +16,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.plugin.PluginType import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.BottomSheetDialog @@ -28,7 +29,23 @@ import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.PreferenceWithSwitch import de.mm20.launcher2.ui.component.preferences.SwitchPreference import de.mm20.launcher2.ui.launcher.search.filters.SearchFilters -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack +import de.mm20.launcher2.ui.settings.calendarsearch.CalendarProviderSettingsRoute +import de.mm20.launcher2.ui.settings.calendarsearch.CalendarSearchSettingsRoute +import de.mm20.launcher2.ui.settings.contacts.ContactsSettingsRoute +import de.mm20.launcher2.ui.settings.favorites.FavoritesSettingsRoute +import de.mm20.launcher2.ui.settings.filesearch.FileSearchSettingsRoute +import de.mm20.launcher2.ui.settings.filterbar.FilterBarSettingsRoute +import de.mm20.launcher2.ui.settings.hiddenitems.HiddenItemsSettingsRoute +import de.mm20.launcher2.ui.settings.locations.LocationsSettingsRoute +import de.mm20.launcher2.ui.settings.searchactions.SearchActionsSettingsRoute +import de.mm20.launcher2.ui.settings.tags.TagsSettingsRoute +import de.mm20.launcher2.ui.settings.unitconverter.UnitConverterSettingsRoute +import de.mm20.launcher2.ui.settings.wikipedia.WikipediaSettingsRoute +import kotlinx.serialization.Serializable + +@Serializable +data object SearchSettingsRoute: NavKey @Composable fun SearchSettingsScreen() { @@ -36,7 +53,7 @@ fun SearchSettingsScreen() { val viewModel: SearchSettingsScreenVM = viewModel() val context = LocalContext.current - val navController = LocalNavController.current + val backStack = LocalBackStack.current var showFilterEditor by remember { mutableStateOf(false) } @@ -81,7 +98,7 @@ fun SearchSettingsScreen() { viewModel.setFavorites(it) }, onClick = { - navController?.navigate("settings/favorites") + backStack.add(FavoritesSettingsRoute) } ) @@ -90,7 +107,7 @@ fun SearchSettingsScreen() { summary = stringResource(R.string.preference_search_files_summary), icon = R.drawable.description_24px, onClick = { - navController?.navigate("settings/search/files") + backStack.add(FileSearchSettingsRoute) } ) @@ -100,7 +117,7 @@ fun SearchSettingsScreen() { summary = stringResource(R.string.preference_search_contacts_summary), icon = R.drawable.person_24px, onClick = { - navController?.navigate("settings/search/contacts") + backStack.add(ContactsSettingsRoute) }, ) } else { @@ -120,7 +137,7 @@ fun SearchSettingsScreen() { viewModel.setContacts(it) }, onClick = { - navController?.navigate("settings/search/contacts") + backStack.add(ContactsSettingsRoute) }, enabled = hasContactsPermission == true ) @@ -133,7 +150,7 @@ fun SearchSettingsScreen() { summary = stringResource(R.string.preference_search_calendar_summary), icon = R.drawable.today_24px, onClick = { - navController?.navigate("settings/search/calendar") + backStack.add(CalendarSearchSettingsRoute) }, ) } else { @@ -155,7 +172,7 @@ fun SearchSettingsScreen() { icon = R.drawable.today_24px, enabled = hasCalendarPermission == true, onClick = { - navController?.navigate("settings/search/calendar/local") + backStack.add(CalendarProviderSettingsRoute(providerId = "local")) } ) } @@ -201,7 +218,7 @@ fun SearchSettingsScreen() { viewModel.setUnitConverter(it) }, onClick = { - navController?.navigate("settings/search/unitconverter") + backStack.add(UnitConverterSettingsRoute) } ) @@ -214,7 +231,7 @@ fun SearchSettingsScreen() { viewModel.setWikipedia(it) }, onClick = { - navController?.navigate("settings/search/wikipedia") + backStack.add(WikipediaSettingsRoute) } ) @@ -241,7 +258,7 @@ fun SearchSettingsScreen() { icon = R.drawable.location_on_24px, enabled = hasLocationPermission == true, onClick = { - navController?.navigate("settings/search/locations") + backStack.add(LocationsSettingsRoute) } ) } else { @@ -250,7 +267,7 @@ fun SearchSettingsScreen() { summary = stringResource(R.string.preference_search_locations_summary), icon = R.drawable.location_on_24px, onClick = { - navController?.navigate("settings/search/locations") + backStack.add(LocationsSettingsRoute) }, switchValue = places == true, onSwitchChanged = { @@ -266,7 +283,7 @@ fun SearchSettingsScreen() { summary = stringResource(R.string.preference_search_search_actions_summary), icon = R.drawable.arrow_outward_24px, onClick = { - navController?.navigate("settings/search/searchactions") + backStack.add(SearchActionsSettingsRoute) } ) } @@ -278,7 +295,7 @@ fun SearchSettingsScreen() { summary = stringResource(R.string.preference_hidden_items_summary), icon = R.drawable.visibility_off_24px, onClick = { - navController?.navigate("settings/search/hiddenitems") + backStack.add(HiddenItemsSettingsRoute) } ) Preference( @@ -286,7 +303,7 @@ fun SearchSettingsScreen() { summary = stringResource(R.string.preference_screen_tags_summary), icon = R.drawable.tag_24px, onClick = { - navController?.navigate("settings/search/tags") + backStack.add(TagsSettingsRoute) } ) } @@ -316,7 +333,7 @@ fun SearchSettingsScreen() { iconPadding = true, summary = stringResource(R.string.preference_customize_filter_bar_summary), onClick = { - navController?.navigate("settings/search/filterbar") + backStack.add(FilterBarSettingsRoute) } ) } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/searchactions/SearchActionsSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/searchactions/SearchActionsSettingsScreen.kt index 342011ad3..f574d621f 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/searchactions/SearchActionsSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/searchactions/SearchActionsSettingsScreen.kt @@ -42,6 +42,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import com.google.accompanist.systemuicontroller.rememberSystemUiController import de.mm20.launcher2.searchactions.builders.CustomizableSearchActionBuilder import de.mm20.launcher2.ui.R @@ -52,12 +53,16 @@ import de.mm20.launcher2.ui.component.dragndrop.rememberLazyDragAndDropListState import de.mm20.launcher2.ui.component.getSearchActionIconVector import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.SwitchPreference -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack +import kotlinx.serialization.Serializable + +@Serializable +data object SearchActionsSettingsRoute: NavKey @Composable fun SearchActionsSettingsScreen() { val viewModel: SearchActionsSettingsScreenVM = viewModel() - val navController = LocalNavController.current + val backStack = LocalBackStack.current val systemUiController = rememberSystemUiController() systemUiController.setStatusBarColor(MaterialTheme.colorScheme.surface) systemUiController.setNavigationBarColor(Color.Black) @@ -91,8 +96,10 @@ fun SearchActionsSettingsScreen() { }, navigationIcon = { IconButton(onClick = { - if (navController?.navigateUp() != true) { + if (backStack.size <= 1) { activity?.onBackPressed() + } else { + backStack.removeLastOrNull() } }) { Icon(painterResource(R.drawable.arrow_back_24px), contentDescription = "Back") diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/shapes/ShapeSchemeSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/shapes/ShapeSchemeSettingsScreen.kt index 9856a8fd9..2975c8c0e 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/shapes/ShapeSchemeSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/shapes/ShapeSchemeSettingsScreen.kt @@ -59,6 +59,8 @@ import androidx.compose.ui.unit.min import androidx.compose.ui.unit.times import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey +import de.mm20.launcher2.serialization.UUIDSerializer import de.mm20.launcher2.themes.shapes.CornerStyle import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.BottomSheetDialog @@ -66,11 +68,17 @@ import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.ktx.withCorners import de.mm20.launcher2.ui.theme.shapes.shapesOf +import kotlinx.serialization.Serializable import java.util.UUID import kotlin.math.max import kotlin.math.min import de.mm20.launcher2.themes.shapes.Shape as ThemeShape +@Serializable +data class ShapeSchemeSettingsRoute( + @Serializable(with = UUIDSerializer::class) val id: UUID +): NavKey + @Composable fun ShapeSchemeSettingsScreen(themeId: UUID) { val viewModel: ShapeSchemesSettingsScreenVM = viewModel() diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/shapes/ShapeSchemesSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/shapes/ShapeSchemesSettingsScreen.kt index e3c837eee..4582a6804 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/shapes/ShapeSchemesSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/shapes/ShapeSchemesSettingsScreen.kt @@ -28,18 +28,23 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.themes.shapes.CornerStyle import de.mm20.launcher2.themes.shapes.Shapes import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack +import kotlinx.serialization.Serializable + +@Serializable +data object ShapeSchemesSettingsRoute: NavKey @Composable fun ShapeSchemesSettingsScreen() { val viewModel: ShapeSchemesSettingsScreenVM = viewModel() - val navController = LocalNavController.current + val backStack = LocalBackStack.current val context = LocalContext.current val selectedTheme by viewModel.selectedShapesId.collectAsStateWithLifecycle(null) @@ -126,7 +131,7 @@ fun ShapeSchemesSettingsScreen() { }, text = { Text(stringResource(R.string.edit)) }, onClick = { - navController?.navigate("settings/appearance/shapes/${theme.id}") + backStack.add(ShapeSchemeSettingsRoute(id = theme.id)) showMenu = false } ) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/tags/TagsSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/tags/TagsSettingsScreen.kt index 0525183e6..b39f7d879 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/tags/TagsSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/tags/TagsSettingsScreen.kt @@ -16,12 +16,17 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.ShapedLauncherIcon import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.launcher.sheets.EditTagSheet +import kotlinx.serialization.Serializable + +@Serializable +data object TagsSettingsRoute: NavKey @Composable fun TagsSettingsScreen() { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/tasks/TasksSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/tasks/TasksSettingsScreen.kt index dc15eff2b..f1ac84370 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/tasks/TasksSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/tasks/TasksSettingsScreen.kt @@ -14,6 +14,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.Banner import de.mm20.launcher2.ui.component.preferences.GuardedPreference @@ -21,13 +22,18 @@ import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.PreferenceWithSwitch -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack +import de.mm20.launcher2.ui.settings.calendarsearch.CalendarProviderSettingsRoute +import kotlinx.serialization.Serializable + +@Serializable +data object TasksIntegrationSettingsRoute: NavKey @Composable fun TasksIntegrationSettingsScreen() { val viewModel: TasksSettingsScreenVM = viewModel() val activity = LocalActivity.current - val navController = LocalNavController.current + val backStack = LocalBackStack.current val isTasksInstalled by viewModel.isTasksAppInstalled.collectAsStateWithLifecycle(null) val hasTasksPermission by viewModel.hasTasksPermission.collectAsStateWithLifecycle(null) @@ -91,7 +97,7 @@ fun TasksIntegrationSettingsScreen() { }, enabled = hasTasksPermission == true, onClick = { - navController?.navigate("settings/search/calendar/tasks.org") + backStack.add(CalendarProviderSettingsRoute(providerId = "tasks.org")) } ) } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/transparencies/TransparencySchemeSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/transparencies/TransparencySchemeSettingsScreen.kt index b66a06ef7..0e9fe4385 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/transparencies/TransparencySchemeSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/transparencies/TransparencySchemeSettingsScreen.kt @@ -37,6 +37,8 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey +import de.mm20.launcher2.serialization.UUIDSerializer import de.mm20.launcher2.themes.transparencies.Transparencies import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.LocalIconShape @@ -53,8 +55,8 @@ import kotlin.math.round @Serializable data class TransparencySchemeSettingsRoute( - val id: String -) + @Serializable(with = UUIDSerializer::class) val id: UUID +): NavKey @Composable fun TransparencySchemeSettingsScreen(themeId: UUID) { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/transparencies/TransparencySchemesSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/transparencies/TransparencySchemesSettingsScreen.kt index 7806fdbb2..b97c19186 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/transparencies/TransparencySchemesSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/transparencies/TransparencySchemesSettingsScreen.kt @@ -30,24 +30,25 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.themes.transparencies.Transparencies import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack import de.mm20.launcher2.ui.theme.WallpaperColors import de.mm20.launcher2.ui.theme.transparency.transparencySchemeOf import de.mm20.launcher2.ui.theme.wallpaperColorsAsState import kotlinx.serialization.Serializable @Serializable -data object TransparencySchemesSettingsRoute +data object TransparencySchemesSettingsRoute: NavKey @Composable fun TransparencySchemesSettingsScreen() { val viewModel: TransparencySchemesSettingsScreenVM = viewModel() - val navController = LocalNavController.current + val backStack = LocalBackStack.current val context = LocalContext.current val selectedTheme by viewModel.selectedTransparencies.collectAsStateWithLifecycle(null) @@ -136,9 +137,7 @@ fun TransparencySchemesSettingsScreen() { }, text = { Text(stringResource(R.string.edit)) }, onClick = { - navController?.navigate( - TransparencySchemeSettingsRoute(theme.id.toString()) - ) + backStack.add(TransparencySchemeSettingsRoute(theme.id)) showMenu = false } ) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/typography/TypographiesSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/typography/TypographiesSettingsScreen.kt index 38d082a10..400607bf9 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/typography/TypographiesSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/typography/TypographiesSettingsScreen.kt @@ -25,22 +25,23 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.themes.typography.Typography import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack import de.mm20.launcher2.ui.theme.typography.typographyOf import kotlinx.serialization.Serializable @Serializable -data object TypographiesSettingsRoute +data object TypographiesSettingsRoute: NavKey @Composable fun TypographiesSettingsScreen() { val viewModel: TypographySettingsScreenVM = viewModel() - val navController = LocalNavController.current + val backStack = LocalBackStack.current val context = LocalContext.current val selectedTheme by viewModel.selectedTypography.collectAsStateWithLifecycle(null) @@ -158,9 +159,7 @@ fun TypographiesSettingsScreen() { }, text = { Text(stringResource(R.string.edit)) }, onClick = { - navController?.navigate( - TypographySettingsRoute(theme.id.toString()) - ) + backStack.add(TypographySettingsRoute(theme.id)) showMenu = false } ) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/typography/TypographySettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/typography/TypographySettingsScreen.kt index 019892a42..e57f50d09 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/typography/TypographySettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/typography/TypographySettingsScreen.kt @@ -63,6 +63,8 @@ import androidx.compose.ui.unit.em import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey +import de.mm20.launcher2.serialization.UUIDSerializer import de.mm20.launcher2.themes.typography.DefaultEmphasizedTextStyles import de.mm20.launcher2.themes.typography.DefaultTextStyles import de.mm20.launcher2.themes.typography.FontManager @@ -86,8 +88,8 @@ import de.mm20.launcher2.themes.typography.TextStyle as ThemeTextStyle @Serializable data class TypographySettingsRoute( - val id: String -) + @Serializable(with = UUIDSerializer::class) val id: UUID +): NavKey @Composable fun TypographySettingsScreen(themeId: UUID) { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/unitconverter/UnitConverterHelpSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/unitconverter/UnitConverterHelpSettingsScreen.kt index 6f84d66cd..10f99f721 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/unitconverter/UnitConverterHelpSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/unitconverter/UnitConverterHelpSettingsScreen.kt @@ -22,11 +22,16 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.launcher.search.unitconverter.getDimensionIcon import de.mm20.launcher2.unitconverter.Dimension +import kotlinx.serialization.Serializable + +@Serializable +data object UnitConverterHelpSettingsRoute: NavKey @Composable fun UnitConverterHelpSettingsScreen() { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/unitconverter/UnitConverterSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/unitconverter/UnitConverterSettingsScreen.kt index d82b1cfd9..b0e57a00d 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/unitconverter/UnitConverterSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/unitconverter/UnitConverterSettingsScreen.kt @@ -5,17 +5,22 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.res.stringResource import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.Preference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.SwitchPreference -import de.mm20.launcher2.ui.locals.LocalNavController +import de.mm20.launcher2.ui.locals.LocalBackStack +import kotlinx.serialization.Serializable + +@Serializable +data object UnitConverterSettingsRoute: NavKey @Composable fun UnitConverterSettingsScreen() { val viewModel: UnitConverterSettingsScreenVM = viewModel() - val navController = LocalNavController.current + val backStack = LocalBackStack.current PreferenceScreen( title = stringResource(R.string.preference_search_unitconverter), @@ -50,7 +55,7 @@ fun UnitConverterSettingsScreen() { title = stringResource(R.string.preference_search_supportedunits), icon = R.drawable.help_24px, onClick = { - navController?.navigate("settings/search/unitconverter/help") + backStack.add(UnitConverterHelpSettingsRoute) } ) } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/weather/WeatherIntegrationSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/weather/WeatherIntegrationSettingsScreen.kt index 97e7f13c0..90f6bca8c 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/weather/WeatherIntegrationSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/weather/WeatherIntegrationSettingsScreen.kt @@ -19,6 +19,7 @@ import androidx.compose.ui.unit.dp import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.crashreporter.CrashReporter import de.mm20.launcher2.ktx.sendWithBackgroundPermission import de.mm20.launcher2.ktx.tryStartActivity @@ -34,6 +35,10 @@ import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.SwitchPreference import de.mm20.launcher2.weather.breezy.BreezyWeatherProvider +import kotlinx.serialization.Serializable + +@Serializable +data object WeatherIntegrationSettingsRoute: NavKey @Composable fun WeatherIntegrationSettingsScreen() { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/wikipedia/WikipediaSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/wikipedia/WikipediaSettingsScreen.kt index c3986e950..909e18453 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/wikipedia/WikipediaSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/wikipedia/WikipediaSettingsScreen.kt @@ -5,11 +5,16 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.res.stringResource import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation3.runtime.NavKey import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.SwitchPreference import de.mm20.launcher2.ui.component.preferences.TextPreference +import kotlinx.serialization.Serializable + +@Serializable +data object WikipediaSettingsRoute: NavKey @Composable fun WikipediaSettingsScreen() { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dc45dcba8..dcdc08d8b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -21,10 +21,12 @@ jetbrains-markdown = "0.7.3" androidx-compose = "1.10.0-beta02" androidx-compose-material3 = "1.5.0-alpha08" +androidx-compose-material3adaptive = "1.3.0-alpha03" androidx-lifecycle = "2.9.4" androidx-core = "1.17.0" androidx-appcompat = "1.7.1" androidx-activity = "1.11.0" +androidx-navigation3 = "1.0.0-rc01" # Careful, 2.10.0 seems to require some fixes, or jobs aren't executed androidx-work = "2.9.0" @@ -67,6 +69,7 @@ androidx-compose-uitooling = { group = "androidx.compose.ui", name = "ui-tooling androidx-compose-animation = { group = "androidx.compose.animation", name = "animation", version.ref = "androidx-compose" } androidx-compose-animationgraphics = { group = "androidx.compose.animation", name = "animation-graphics", version.ref = "androidx-compose" } androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "androidx-compose-material3" } +androidx-compose-material3adaptive-navigation3 = { group = "androidx.compose.material3.adaptive", name = "adaptive-navigation3", version.ref = "androidx-compose-material3adaptive" } androidx-lifecycle-viewmodel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "androidx-lifecycle" } androidx-lifecycle-common = { group = "androidx.lifecycle", name = "lifecycle-common-java8", version.ref = "androidx-lifecycle" } @@ -74,6 +77,8 @@ androidx-lifecycle-runtime = { group = "androidx.lifecycle", name = "lifecycle-r androidx-lifecycle-viewmodelcompose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "androidx-lifecycle" } androidx-lifecycle-runtimecompose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "androidx-lifecycle" } +androidx-navigation3-runtime = { group = "androidx.navigation3", name = "navigation3-runtime", version.ref = "androidx-navigation3" } +androidx-navigation3-ui = { group = "androidx.navigation3", name = "navigation3-ui", version.ref = "androidx-navigation3" } androidx-activitycompose = { group = "androidx.activity", name = "activity-compose", version.ref = "androidx-activity" } @@ -92,7 +97,6 @@ accompanist-systemuicontroller = { group = "com.google.accompanist", name = "acc accompanist-pager = { group = "com.google.accompanist", name = "accompanist-pager", version.ref = "accompanist" } accompanist-pagerindicators = { group = "com.google.accompanist", name = "accompanist-pager-indicators", version.ref = "accompanist" } accompanist-flowlayout = { group = "com.google.accompanist", name = "accompanist-flowlayout", version.ref = "accompanist" } -accompanist-navigationanimation = { group = "com.google.accompanist", name = "accompanist-navigation-animation", version.ref = "accompanist" } haze = {group = "dev.chrisbanes.haze", name = "haze", version.ref = "haze" } androidx-constraintlayout-compose = { group = "androidx.constraintlayout", name = "constraintlayout-compose", version.ref = "androidx-constraint-layout" } @@ -107,7 +111,6 @@ ktor-client-okhttp = { group = "io.ktor", name = "ktor-client-okhttp", version.r ktor-client-content-negotiation = { group = "io.ktor", name = "ktor-client-content-negotiation", version.ref = "ktor" } ktor-serialization-kotlinx-json = { group = "io.ktor", name = "ktor-serialization-kotlinx-json", version.ref = "ktor" } -androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version = "2.9.5" } coil-core = { group = "io.coil-kt", name = "coil", version.ref = "coil" } coil-svg = { group = "io.coil-kt", name = "coil-svg", version.ref = "coil" }