Migrate settings to navigation3

This commit is contained in:
MM20
2025-11-08 22:18:24 +01:00
parent 20775361a0
commit 3f97278d57
55 changed files with 678 additions and 362 deletions

View File

@@ -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)

View File

@@ -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(

View File

@@ -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)
}
)
}

View File

@@ -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)
}
)
}

View File

@@ -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<NavController?> { null }
val LocalBackStack = staticCompositionLocalOf< NavBackStack<NavKey>> { throw IllegalStateException("No backstack provided") }
val LocalCardStyle = compositionLocalOf { CardStyle() }

View File

@@ -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<String?>(null)
private var initialRoute by mutableStateOf<NavKey?>(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<MainRoute> {
MainSettingsScreen()
}
entry<AppearanceSettingsRoute> {
AppearanceSettingsScreen()
}
entry<ExportThemeSettingsRoute> {
ExportThemeSettingsScreen()
}
entry<ImportThemeSettingsRoute> {
ImportThemeSettingsScreen(it.fromUri)
}
entry<HomescreenSettingsRoute> {
HomescreenSettingsScreen()
}
entry<IconsSettingsRoute> {
IconsSettingsScreen()
}
entry<ColorSchemesSettingsRoute> {
ColorSchemesSettingsScreen()
}
entry<ColorSchemeSettingsRoute> {
ColorSchemeSettingsScreen(it.id)
}
entry<ShapeSchemesSettingsRoute> {
ShapeSchemesSettingsScreen()
}
entry<ShapeSchemeSettingsRoute> {
ShapeSchemeSettingsScreen(it.id)
}
entry<TransparencySchemesSettingsRoute> {
TransparencySchemesSettingsScreen()
}
entry<TransparencySchemeSettingsRoute> {
TransparencySchemeSettingsScreen(it.id)
}
entry<TypographiesSettingsRoute> {
TypographiesSettingsScreen()
}
entry<TypographySettingsRoute> {
TypographySettingsScreen(it.id)
}
entry<SearchSettingsRoute> {
SearchSettingsScreen()
}
entry<GesturesSettingsRoute> {
GestureSettingsScreen()
}
entry<UnitConverterSettingsRoute> {
UnitConverterSettingsScreen()
}
entry<UnitConverterHelpSettingsRoute> {
UnitConverterHelpSettingsScreen()
}
entry<WikipediaSettingsRoute> {
WikipediaSettingsScreen()
}
entry<LocationsSettingsRoute> {
LocationsSettingsScreen()
}
entry<OsmSettingsRoute> {
OsmSettingsScreen()
}
entry<FileSearchSettingsRoute> {
FileSearchSettingsScreen()
}
entry<CalendarSearchSettingsRoute> {
CalendarSearchSettingsScreen()
}
entry<CalendarProviderSettingsRoute> {
CalendarProviderSettingsScreen(it.providerId)
}
entry<SearchActionsSettingsRoute> {
SearchActionsSettingsScreen()
}
entry<HiddenItemsSettingsRoute> {
HiddenItemsSettingsScreen()
}
entry<TagsSettingsRoute> {
TagsSettingsScreen()
}
entry<FilterBarSettingsRoute> {
FilterBarSettingsScreen()
}
entry<WeatherIntegrationSettingsRoute> {
WeatherIntegrationSettingsScreen()
}
entry<MediaIntegrationSettingsRoute> {
MediaIntegrationSettingsScreen()
}
entry<FavoritesSettingsRoute> {
FavoritesSettingsScreen()
}
entry<ContactsSettingsRoute> {
ContactsSettingsScreen()
}
entry<IntegrationsSettingsRoute> {
IntegrationsSettingsScreen()
}
entry<NextcloudSettingsRoute> {
NextcloudSettingsScreen()
}
entry<OwncloudSettingsRoute> {
OwncloudSettingsScreen()
}
entry<TasksIntegrationSettingsRoute> {
TasksIntegrationSettingsScreen()
}
entry<BreezyWeatherSettingsRoute> {
BreezyWeatherSettingsScreen()
}
entry<PluginsSettingsRoute> {
PluginsSettingsScreen()
}
entry<PluginSettingsRoute> {
PluginSettingsScreen(it.pluginId)
}
entry<AboutSettingsRoute> {
AboutSettingsScreen()
}
entry<BuildInfoSettingsRoute> {
BuildInfoSettingsScreen()
}
entry<EasterEggSettingsRoute> {
EasterEggSettingsScreen()
}
entry<DebugSettingsRoute> {
DebugSettingsScreen()
}
entry<BackupSettingsRoute> {
BackupSettingsScreen()
}
entry<CrashReporterRoute> {
CrashReporterScreen()
}
entry<LogRoute> {
LogScreen()
}
entry<CrashReportRoute> {
CrashReportScreen(it.fileName)
}
entry<LicenseRoute> {
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<ImportThemeSettingsRoute> {
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<TransparencySchemesSettingsRoute> {
TransparencySchemesSettingsScreen()
}
composable<TransparencySchemeSettingsRoute> {
val route: TransparencySchemeSettingsRoute = it.toRoute()
?: return@composable
TransparencySchemeSettingsScreen(UUID.fromString(route.id))
}
composable<TypographiesSettingsRoute> {
TypographiesSettingsScreen()
}
composable<TypographySettingsRoute> {
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"
}
}
}

View File

@@ -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))
}
)
}

View File

@@ -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)
}
)
}

View File

@@ -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() {

View File

@@ -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(

View File

@@ -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()

View File

@@ -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() {

View File

@@ -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()

View File

@@ -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) {

View File

@@ -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))
}
)
}

View File

@@ -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) {

View File

@@ -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
}
)

View File

@@ -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() {

View File

@@ -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) {

View File

@@ -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)
) {

View File

@@ -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),

View File

@@ -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() {

View File

@@ -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() {

View File

@@ -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() {

View File

@@ -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(

View File

@@ -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() {

View File

@@ -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() {

View File

@@ -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)

View File

@@ -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() {

View File

@@ -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)
}
)
}

View File

@@ -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")
}

View File

@@ -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) {

View File

@@ -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<LogcatLine>()) }

View File

@@ -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)
}
)
}

View File

@@ -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() {

View File

@@ -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

View File

@@ -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() {

View File

@@ -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

View File

@@ -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)
}
)
}

View File

@@ -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))
}
)
}

View File

@@ -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)
}
)
}

View File

@@ -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")

View File

@@ -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()

View File

@@ -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
}
)

View File

@@ -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() {

View File

@@ -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"))
}
)
}

View File

@@ -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) {

View File

@@ -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
}
)

View File

@@ -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
}
)

View File

@@ -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) {

View File

@@ -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() {

View File

@@ -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)
}
)
}

View File

@@ -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() {

View File

@@ -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() {

View File

@@ -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" }