Migrate settings to navigation3
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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() }
|
||||
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
)
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
) {
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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>()) }
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
)
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
}
|
||||
)
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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"))
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
)
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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" }
|
||||
|
||||
Reference in New Issue
Block a user