From f314283b8ece7d2cf80f3ded6f2aec1e3a5df37f Mon Sep 17 00:00:00 2001 From: rushiiMachine <33725716+rushiiMachine@users.noreply.github.com> Date: Wed, 24 Jan 2024 12:29:50 -0800 Subject: [PATCH] fix: display plugins + settings screens properly --- .../manager/ui/screens/home/HomeScreen.kt | 18 +- .../ui/screens/install/InstallModel.kt | 1 + .../ui/screens/plugins/PluginsScreen.kt | 139 +++++----- .../ui/screens/settings/SettingsScreen.kt | 243 +++++++++--------- .../ui/widgets/updater/UpdaterDialog.kt | 4 +- 5 files changed, 221 insertions(+), 184 deletions(-) diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/home/HomeScreen.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/home/HomeScreen.kt index b0413ed..5e9d338 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/screens/home/HomeScreen.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/home/HomeScreen.kt @@ -26,6 +26,8 @@ import com.aliucord.manager.ui.components.dialogs.InstallerDialog import com.aliucord.manager.ui.components.home.InfoCard import com.aliucord.manager.ui.screens.about.AboutScreen import com.aliucord.manager.ui.screens.install.InstallScreen +import com.aliucord.manager.ui.screens.plugins.PluginsScreen +import com.aliucord.manager.ui.screens.settings.SettingsScreen class HomeScreen : Screen { override val key = "Home" @@ -51,8 +53,6 @@ class HomeScreen : Screen { ) } - // TODO: add a way to open plugins and settings - Scaffold( topBar = { HomeAppBar() }, ) { paddingValues -> @@ -102,6 +102,20 @@ private fun HomeAppBar() { contentDescription = stringResource(R.string.navigation_about) ) } + + IconButton(onClick = { navigator.push(PluginsScreen()) }) { + Icon( + painter = painterResource(R.drawable.ic_extension), + contentDescription = stringResource(R.string.navigation_about) + ) + } + + IconButton(onClick = { navigator.push(SettingsScreen()) }) { + Icon( + painter = painterResource(R.drawable.ic_settings), + contentDescription = stringResource(R.string.navigation_settings) + ) + } } ) } diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/install/InstallModel.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/install/InstallModel.kt index 1416a5a..19c0998 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/screens/install/InstallModel.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/install/InstallModel.kt @@ -60,6 +60,7 @@ class InstallModel( fun copyDebugToClipboard() { val text = "$debugInfo\n\n$stacktrace" + // TODO: remove this useless replace .replace("(\\\\*~_)".toRegex(), "\\$1") application.copyToClipboard(text) diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/plugins/PluginsScreen.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/plugins/PluginsScreen.kt index 191b810..fa0f003 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/screens/plugins/PluginsScreen.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/plugins/PluginsScreen.kt @@ -25,6 +25,7 @@ import androidx.compose.ui.unit.dp import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.koin.getScreenModel import com.aliucord.manager.R +import com.aliucord.manager.ui.components.BackButton import com.aliucord.manager.ui.components.plugins.Changelog import com.aliucord.manager.ui.components.plugins.PluginCard @@ -52,75 +53,85 @@ class PluginsScreen : Screen { ) } - Column( - modifier = Modifier - .fillMaxSize() - .padding(horizontal = 16.dp), - verticalArrangement = Arrangement.spacedBy(14.dp) - ) { - PluginSearch( - currentFilter = model.search, - onFilterChange = model::search, - modifier = Modifier.fillMaxWidth(), - ) + Scaffold( + topBar = { + TopAppBar( + title = { Text(stringResource(R.string.plugins_title)) }, + navigationIcon = { BackButton() }, + ) + } + ) { paddingValues -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues) + .padding(horizontal = 16.dp), + verticalArrangement = Arrangement.spacedBy(14.dp) + ) { + PluginSearch( + currentFilter = model.search, + onFilterChange = model::search, + modifier = Modifier.fillMaxWidth(), + ) - if (model.error) { - Box( - modifier = Modifier.fillMaxSize() - ) { - Column( - modifier = Modifier.align(Alignment.Center), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(8.dp), + if (model.error) { + Box( + modifier = Modifier.fillMaxSize() ) { - Icon( - imageVector = Icons.Default.Warning, - contentDescription = null, - tint = MaterialTheme.colorScheme.error, - ) - Text( - text = stringResource(R.string.plugins_error), - color = MaterialTheme.colorScheme.error, - ) - } - } - } else if (model.plugins.isNotEmpty()) { - LazyColumn( - contentPadding = PaddingValues(bottom = 15.dp, top = 6.dp), - verticalArrangement = Arrangement.spacedBy(14.dp) - ) { - items( - // TODO: remember {} this - model.plugins.filter { plugin -> - plugin.manifest.run { - name.contains(model.search, true) - || description.contains(model.search, true) - || authors.any { (name) -> name.contains(model.search, true) } - } + Column( + modifier = Modifier.align(Alignment.Center), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + Icon( + imageVector = Icons.Default.Warning, + contentDescription = null, + tint = MaterialTheme.colorScheme.error, + ) + Text( + text = stringResource(R.string.plugins_error), + color = MaterialTheme.colorScheme.error, + ) } - ) { plugin -> - PluginCard( - plugin = plugin, - enabled = model.enabled[plugin.manifest.name] ?: true, - onClickDelete = { model.showUninstallDialog(plugin) }, - onClickShowChangelog = { model.showChangelogDialog(plugin) }, - onSetEnabled = { model.setPluginEnabled(plugin.manifest.name, it) } - ) } - } - } else { - Box( - modifier = Modifier.fillMaxSize() - ) { - Column( - modifier = Modifier.align(Alignment.Center), - horizontalAlignment = Alignment.CenterHorizontally + } else if (model.plugins.isNotEmpty()) { + LazyColumn( + contentPadding = PaddingValues(bottom = 15.dp, top = 6.dp), + verticalArrangement = Arrangement.spacedBy(14.dp) ) { - Icon( - painter = painterResource(R.drawable.ic_extension_off), - contentDescription = null - ) - Text(stringResource(R.string.plugins_none_installed)) + items( + // TODO: remember {} this + model.plugins.filter { plugin -> + plugin.manifest.run { + name.contains(model.search, true) + || description.contains(model.search, true) + || authors.any { (name) -> name.contains(model.search, true) } + } + } + ) { plugin -> + PluginCard( + plugin = plugin, + enabled = model.enabled[plugin.manifest.name] ?: true, + onClickDelete = { model.showUninstallDialog(plugin) }, + onClickShowChangelog = { model.showChangelogDialog(plugin) }, + onSetEnabled = { model.setPluginEnabled(plugin.manifest.name, it) } + ) + } + } + } else { + Box( + modifier = Modifier.fillMaxSize() + ) { + Column( + modifier = Modifier.align(Alignment.Center), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Icon( + painter = painterResource(R.drawable.ic_extension_off), + contentDescription = null + ) + Text(stringResource(R.string.plugins_none_installed)) + } } } } diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/settings/SettingsScreen.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/settings/SettingsScreen.kt index e72a34d..051c775 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/screens/settings/SettingsScreen.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/settings/SettingsScreen.kt @@ -20,6 +20,7 @@ import androidx.compose.ui.unit.dp import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.koin.getScreenModel import com.aliucord.manager.R +import com.aliucord.manager.ui.components.BackButton import com.aliucord.manager.ui.components.Theme import com.aliucord.manager.ui.components.settings.* @@ -30,126 +31,136 @@ class SettingsScreen : Screen { override fun Content() { val model = getScreenModel() - Column( - modifier = Modifier - .verticalScroll(state = rememberScrollState()) - ) { - val preferences = model.preferences - - if (model.showThemeDialog) { - ThemeDialog( - currentTheme = preferences.theme, - onDismissRequest = model::hideThemeDialog, - onConfirm = model::setTheme + Scaffold( + topBar = { + TopAppBar( + title = { Text(stringResource(R.string.navigation_settings)) }, + navigationIcon = { BackButton() }, ) - } - - SettingsHeader(stringResource(R.string.settings_appearance)) - - SettingsItem( - modifier = Modifier.clickable(onClick = model::showThemeDialog), - icon = { Icon(painterResource(R.drawable.ic_brush), null) }, - text = { Text(stringResource(R.string.settings_theme)) } - ) { - FilledTonalButton(onClick = model::showThemeDialog) { - Text(preferences.theme.toDisplayName()) - } - } - - SettingsSwitch( - label = stringResource(R.string.setting_dynamic_color), - pref = preferences.dynamicColor, - icon = { Icon(painterResource(R.drawable.ic_palette), null) } - ) { - preferences.dynamicColor = it - } - - SettingsHeader(stringResource(R.string.settings_advanced)) - - SettingsTextField( - label = stringResource(R.string.setting_app_name), - pref = preferences.appName, - onPrefChange = model::setAppName - ) - Spacer(modifier = Modifier.height(4.dp)) - - SettingsSwitch( - label = stringResource(R.string.setting_replace_icon), - secondaryLabel = stringResource(R.string.setting_replace_icon_desc), - pref = preferences.replaceIcon, - icon = { Icon(painterResource(R.drawable.ic_app_shortcut), null) } - ) { - preferences.replaceIcon = it - } - - SettingsSwitch( - label = stringResource(R.string.setting_keep_patched_apks), - secondaryLabel = stringResource(R.string.setting_keep_patched_apks_desc), - icon = { Icon(painterResource(R.drawable.ic_delete_forever), null) }, - pref = preferences.keepPatchedApks, - onPrefChange = { preferences.keepPatchedApks = it }, - ) - - Spacer(modifier = Modifier.height(14.dp)) - - SettingsSwitch( - label = stringResource(R.string.settings_developer_options), - pref = preferences.devMode, - icon = { Icon(painterResource(R.drawable.ic_code), null) } - ) { - preferences.devMode = it - } - - AnimatedVisibility( - visible = preferences.devMode, - enter = expandVertically(), - exit = shrinkVertically() - ) { - Column( - verticalArrangement = Arrangement.spacedBy(6.dp) - ) { - SettingsTextField( - label = stringResource(R.string.setting_package_name), - pref = preferences.packageName, - onPrefChange = model::setPackageName, - error = model.packageNameError - ) - - SettingsTextField( - label = stringResource(R.string.setting_target_version), - pref = preferences.version, - onPrefChange = model::setVersion - ) - - SettingsSwitch( - label = stringResource(R.string.setting_debuggable), - secondaryLabel = stringResource(R.string.setting_debuggable_desc), - pref = preferences.debuggable, - icon = { Icon(painterResource(R.drawable.ic_bug), null) }, - onPrefChange = { preferences.debuggable = it }, - ) - - SettingsSwitch( - label = stringResource(R.string.setting_hermes_replace_libcpp), - secondaryLabel = stringResource(R.string.setting_hermes_replace_libcpp_desc), - icon = { Icon(painterResource(R.drawable.ic_copy_file), null) }, - pref = preferences.hermesReplaceLibCpp, - onPrefChange = { preferences.hermesReplaceLibCpp = it }, - ) - } - } - - Button( + }, + ) { paddingValues -> + Column( modifier = Modifier - .fillMaxWidth() - .padding(18.dp), - shape = ShapeDefaults.Large, - onClick = model::clearCacheDir + .padding(paddingValues) + .verticalScroll(state = rememberScrollState()) ) { - Text( - text = stringResource(R.string.setting_clear_cache), - textAlign = TextAlign.Center + val preferences = model.preferences + + if (model.showThemeDialog) { + ThemeDialog( + currentTheme = preferences.theme, + onDismissRequest = model::hideThemeDialog, + onConfirm = model::setTheme + ) + } + + SettingsHeader(stringResource(R.string.settings_appearance)) + + SettingsItem( + modifier = Modifier.clickable(onClick = model::showThemeDialog), + icon = { Icon(painterResource(R.drawable.ic_brush), null) }, + text = { Text(stringResource(R.string.settings_theme)) } + ) { + FilledTonalButton(onClick = model::showThemeDialog) { + Text(preferences.theme.toDisplayName()) + } + } + + SettingsSwitch( + label = stringResource(R.string.setting_dynamic_color), + pref = preferences.dynamicColor, + icon = { Icon(painterResource(R.drawable.ic_palette), null) } + ) { + preferences.dynamicColor = it + } + + SettingsHeader(stringResource(R.string.settings_advanced)) + + SettingsTextField( + label = stringResource(R.string.setting_app_name), + pref = preferences.appName, + onPrefChange = model::setAppName ) + Spacer(modifier = Modifier.height(4.dp)) + + SettingsSwitch( + label = stringResource(R.string.setting_replace_icon), + secondaryLabel = stringResource(R.string.setting_replace_icon_desc), + pref = preferences.replaceIcon, + icon = { Icon(painterResource(R.drawable.ic_app_shortcut), null) } + ) { + preferences.replaceIcon = it + } + + SettingsSwitch( + label = stringResource(R.string.setting_keep_patched_apks), + secondaryLabel = stringResource(R.string.setting_keep_patched_apks_desc), + icon = { Icon(painterResource(R.drawable.ic_delete_forever), null) }, + pref = preferences.keepPatchedApks, + onPrefChange = { preferences.keepPatchedApks = it }, + ) + + Spacer(modifier = Modifier.height(14.dp)) + + SettingsSwitch( + label = stringResource(R.string.settings_developer_options), + pref = preferences.devMode, + icon = { Icon(painterResource(R.drawable.ic_code), null) } + ) { + preferences.devMode = it + } + + AnimatedVisibility( + visible = preferences.devMode, + enter = expandVertically(), + exit = shrinkVertically() + ) { + Column( + verticalArrangement = Arrangement.spacedBy(6.dp) + ) { + SettingsTextField( + label = stringResource(R.string.setting_package_name), + pref = preferences.packageName, + onPrefChange = model::setPackageName, + error = model.packageNameError + ) + + SettingsTextField( + label = stringResource(R.string.setting_target_version), + pref = preferences.version, + onPrefChange = model::setVersion + ) + + SettingsSwitch( + label = stringResource(R.string.setting_debuggable), + secondaryLabel = stringResource(R.string.setting_debuggable_desc), + pref = preferences.debuggable, + icon = { Icon(painterResource(R.drawable.ic_bug), null) }, + onPrefChange = { preferences.debuggable = it }, + ) + + SettingsSwitch( + label = stringResource(R.string.setting_hermes_replace_libcpp), + secondaryLabel = stringResource(R.string.setting_hermes_replace_libcpp_desc), + icon = { Icon(painterResource(R.drawable.ic_copy_file), null) }, + pref = preferences.hermesReplaceLibCpp, + onPrefChange = { preferences.hermesReplaceLibCpp = it }, + ) + } + } + + Button( + modifier = Modifier + .fillMaxWidth() + .padding(18.dp), + shape = ShapeDefaults.Large, + onClick = model::clearCacheDir + ) { + Text( + text = stringResource(R.string.setting_clear_cache), + textAlign = TextAlign.Center + ) + } } } } diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/widgets/updater/UpdaterDialog.kt b/app/src/main/kotlin/com/aliucord/manager/ui/widgets/updater/UpdaterDialog.kt index 61f38e1..ffd015f 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/widgets/updater/UpdaterDialog.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/widgets/updater/UpdaterDialog.kt @@ -8,11 +8,11 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.window.DialogProperties import com.aliucord.manager.R -import org.koin.androidx.compose.getViewModel +import org.koin.androidx.compose.koinViewModel @Composable fun UpdaterDialog( - viewModel: UpdaterViewModel = getViewModel(), + viewModel: UpdaterViewModel = koinViewModel(), ) { if (!viewModel.showDialog) return