From b8cf2176c6bc2101bf3ce6c8622f47ab3dcf250c Mon Sep 17 00:00:00 2001 From: rushiiMachine <33725716+rushiiMachine@users.noreply.github.com> Date: Sat, 29 Mar 2025 16:18:35 -0700 Subject: [PATCH] wip: icon options screen model sharing --- .../aliucord/manager/ManagerApplication.kt | 2 ++ .../ui/screens/iconopts/IconOptionsModel.kt | 28 +++++++++++++++++++ .../ui/screens/iconopts/IconOptionsScreen.kt | 27 +++++++++++++----- .../ui/screens/patchopts/PatchOptions.kt | 5 ++++ .../ui/screens/patchopts/PatchOptionsModel.kt | 5 ++-- .../screens/patchopts/PatchOptionsScreen.kt | 19 +++++++++---- 6 files changed, 71 insertions(+), 15 deletions(-) create mode 100644 app/src/main/kotlin/com/aliucord/manager/ui/screens/iconopts/IconOptionsModel.kt diff --git a/app/src/main/kotlin/com/aliucord/manager/ManagerApplication.kt b/app/src/main/kotlin/com/aliucord/manager/ManagerApplication.kt index 1dceb2b..7ac2f95 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ManagerApplication.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ManagerApplication.kt @@ -9,6 +9,7 @@ import com.aliucord.manager.manager.download.KtorDownloadManager import com.aliucord.manager.network.services.* import com.aliucord.manager.ui.screens.about.AboutModel import com.aliucord.manager.ui.screens.home.HomeModel +import com.aliucord.manager.ui.screens.iconopts.IconOptionsModel import com.aliucord.manager.ui.screens.patching.PatchingScreenModel import com.aliucord.manager.ui.screens.patchopts.PatchOptionsModel import com.aliucord.manager.ui.screens.plugins.PluginsModel @@ -52,6 +53,7 @@ class ManagerApplication : Application() { factoryOf(::PatchingScreenModel) factoryOf(::SettingsModel) factoryOf(::PatchOptionsModel) + factoryOf(::IconOptionsModel) viewModelOf(::UpdaterViewModel) }) diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/iconopts/IconOptionsModel.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/iconopts/IconOptionsModel.kt new file mode 100644 index 0000000..d62590f --- /dev/null +++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/iconopts/IconOptionsModel.kt @@ -0,0 +1,28 @@ +package com.aliucord.manager.ui.screens.iconopts + +import androidx.compose.runtime.* +import androidx.compose.ui.graphics.Color +import cafe.adriel.voyager.core.model.ScreenModel +import com.aliucord.manager.ui.screens.patchopts.PatchOptions.IconReplacement + +class IconOptionsModel( + prefilledOptions: IconReplacement, +) : ScreenModel { + var selectedColor by mutableStateOf(((prefilledOptions as? IconReplacement.CustomColor) ?: IconReplacement.Discord).color) + private set + + fun changeSelectedColor(color: Color) { + this.selectedColor = color + } + + fun generateConfig(): IconReplacement { + // TODO: other branches + return IconReplacement.CustomColor(color = selectedColor) + } + + enum class Mode { + Original, + ReplaceColor, + ReplaceForeground, + } +} diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/iconopts/IconOptionsScreen.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/iconopts/IconOptionsScreen.kt index a2cc723..0152bb7 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/screens/iconopts/IconOptionsScreen.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/iconopts/IconOptionsScreen.kt @@ -1,31 +1,44 @@ package com.aliucord.manager.ui.screens.iconopts +import android.os.Parcelable import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Scaffold -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import cafe.adriel.voyager.core.screen.Screen import com.aliucord.manager.ui.screens.iconopts.components.IconOptionsAppBar -import com.aliucord.manager.ui.screens.patchopts.PatchOptions.IconReplacement import dev.zt64.compose.pipette.CircularColorPicker +import kotlinx.parcelize.IgnoredOnParcel +import kotlinx.parcelize.Parcelize +interface IconOptionsScreenParent : Parcelable { + /** + * The screen model is elevated outside of this screen + * in order to share the state with the parent screen. + */ + @Composable + fun getIconModel(): IconOptionsModel +} + +@Parcelize class IconOptionsScreen( - private val prefilledOptions: IconReplacement, -) : Screen { + private val parent: IconOptionsScreenParent, +) : Screen, Parcelable { + @IgnoredOnParcel override val key = "IconOptions" @Composable override fun Content() { - var (color, setColor) = remember { mutableStateOf(IconReplacement.Aliucord.color) } + val model = parent.getIconModel() IconOptionsScreenContent( - selectedColor = color, - setSelectedColor = setColor, + selectedColor = model.selectedColor, + setSelectedColor = model::changeSelectedColor, ) } } diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/patchopts/PatchOptions.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/patchopts/PatchOptions.kt index 4f98fc0..46f7ffd 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/screens/patchopts/PatchOptions.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/patchopts/PatchOptions.kt @@ -80,6 +80,11 @@ data class PatchOptions( * The default icon replacement option. */ val Aliucord = CustomColor(Color(0xFF00C853)) + + /** + * The Discord icon color. + */ + val Discord = CustomColor(Color(0xFF7289DA)) } } diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/patchopts/PatchOptionsModel.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/patchopts/PatchOptionsModel.kt index 3558f40..b193bb8 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/screens/patchopts/PatchOptionsModel.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/patchopts/PatchOptionsModel.kt @@ -59,15 +59,14 @@ class PatchOptionsModel( invalidChecks.none { it } } - fun generateConfig(): PatchOptions { + fun generateConfig(icon: PatchOptions.IconReplacement): PatchOptions { if (!isConfigValid) error("invalid config state") return PatchOptions( appName = appName, packageName = packageName, debuggable = debuggable, - // TODO: advanced icon options - iconReplacement = PatchOptions.IconReplacement.Aliucord, + iconReplacement = icon, ) } diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/patchopts/PatchOptionsScreen.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/patchopts/PatchOptionsScreen.kt index 0e0c336..6ab8ff5 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/screens/patchopts/PatchOptionsScreen.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/patchopts/PatchOptionsScreen.kt @@ -23,7 +23,7 @@ import com.aliucord.manager.R import com.aliucord.manager.ui.components.TextDivider import com.aliucord.manager.ui.components.dialogs.NetworkWarningDialog import com.aliucord.manager.ui.components.dialogs.UnknownSourcesPermissionDialog -import com.aliucord.manager.ui.screens.iconopts.IconOptionsScreen +import com.aliucord.manager.ui.screens.iconopts.* import com.aliucord.manager.ui.screens.patching.PatchingScreen import com.aliucord.manager.ui.screens.patchopts.components.PackageNameStateLabel import com.aliucord.manager.ui.screens.patchopts.components.PatchOptionsAppBar @@ -40,15 +40,21 @@ import org.koin.core.parameter.parametersOf @Parcelize class PatchOptionsScreen( private val prefilledOptions: PatchOptions? = null, -) : Screen, Parcelable { +) : Screen, Parcelable, IconOptionsScreenParent { @IgnoredOnParcel override val key = "PatchOptions" + @Composable + override fun getIconModel(): IconOptionsModel { + return getScreenModel() + } + @Composable override fun Content() { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val model = getScreenModel { parametersOf(prefilledOptions ?: PatchOptions.Default) } + val iconModel = getScreenModel { parametersOf((prefilledOptions ?: PatchOptions.Default).iconReplacement) } LaunchedEffect(Unit) { // Ensure that when popping this screen off the stack that permission requests don't get triggered @@ -81,8 +87,7 @@ class PatchOptionsScreen( debuggable = model.debuggable, setDebuggable = model::changeDebuggable, - // TODO: actual filled in options - onOpenIconOptions = { navigator.push(IconOptionsScreen(PatchOptions.Default.iconReplacement)) }, + onOpenIconOptions = { navigator.push(IconOptionsScreen(this@PatchOptionsScreen)) }, appName = model.appName, appNameIsError = model.appNameIsError, @@ -93,7 +98,11 @@ class PatchOptionsScreen( setPackageName = model::changePackageName, isConfigValid = model.isConfigValid, - onInstall = { navigator.push(PatchingScreen(model.generateConfig())) }, + onInstall = { + val iconConfig = iconModel.generateConfig() + val patchConfig = model.generateConfig(iconConfig) + navigator.push(PatchingScreen(patchConfig)) + }, ) } }