feat: make Aliucord installation update button work

Launch a patch opts screen with prefilled options based on the previous install.
This commit is contained in:
rushiiMachine 2025-01-25 10:55:48 -08:00
parent bd70cf0eeb
commit b7f2e7abe5
No known key found for this signature in database
GPG key ID: DCBE5952BB3B6420
6 changed files with 55 additions and 13 deletions

View file

@ -16,12 +16,15 @@ import androidx.core.graphics.drawable.toBitmap
import androidx.core.net.toUri
import cafe.adriel.voyager.core.model.ScreenModel
import cafe.adriel.voyager.core.model.screenModelScope
import cafe.adriel.voyager.navigator.Navigator
import com.aliucord.manager.BuildConfig
import com.aliucord.manager.R
import com.aliucord.manager.domain.repository.GithubRepository
import com.aliucord.manager.network.dto.BuildInfo
import com.aliucord.manager.network.utils.fold
import com.aliucord.manager.patcher.InstallMetadata
import com.aliucord.manager.ui.screens.patchopts.PatchOptions
import com.aliucord.manager.ui.screens.patchopts.PatchOptionsScreen
import com.aliucord.manager.ui.util.DiscordVersion
import com.aliucord.manager.util.launchBlock
import com.aliucord.manager.util.showToast
@ -153,6 +156,31 @@ class HomeModel(
}
}
// Launches the patching screen with prefilled options according to the existing APK
fun updateAliucord(data: InstallData, navigator: Navigator) = screenModelScope.launchBlock {
val metadata = try {
val applicationInfo = application.packageManager.getApplicationInfo(data.packageName, 0)
val metadataFile = ZipReader(applicationInfo.publicSourceDir)
.use { it.openEntry("aliucord.json")?.read() }
@OptIn(ExperimentalSerializationApi::class)
metadataFile?.let { json.decodeFromStream<InstallMetadata>(it.inputStream()) }
} catch (t: Throwable) {
Log.w(BuildConfig.TAG, "Failed to parse Aliucord install metadata from package ${data.packageName}", t)
null
}
val patchOptions = metadata?.options
?: PatchOptions.Default.copy(packageName = data.packageName)
navigator.push(
PatchOptionsScreen(
prefilledOptions = patchOptions,
supportedVersion = supportedVersion,
)
)
}
private fun fetchSupportedVersion() = screenModelScope.launchBlock {
github.getDataJson().fold(
success = {

View file

@ -57,16 +57,17 @@ class HomeScreen : Screen {
if (model.isNetworkDangerous()) {
showNetworkWarningDialog = true
} else {
navigator.push(PatchOptionsScreen(model.supportedVersion))
navigator.push(PatchOptionsScreen(supportedVersion = model.supportedVersion))
}
}
}
// TODO: trigger this for updates too?
if (showNetworkWarningDialog) {
NetworkWarningDialog(
onConfirm = {
showNetworkWarningDialog = false
navigator.push(PatchOptionsScreen(model.supportedVersion))
navigator.push(PatchOptionsScreen(supportedVersion = model.supportedVersion))
},
onDismiss = {
showNetworkWarningDialog = false
@ -171,7 +172,7 @@ fun PresentInstallsContent(
InstalledItemCard(
data = it,
onUpdate = ::TODO, // TODO: prefilled install options screen
onUpdate = { model.updateAliucord(it, navigator) },
onOpenApp = { model.launchApp(it.packageName) },
onOpenInfo = { model.openAppInfo(it.packageName) },
onOpenPlugins = { navigator.push(PluginsScreen()) }, // TODO: install-specific plugins

View file

@ -88,4 +88,14 @@ data class PatchOptions(
val Aliucord = CustomColor(Color(0xFF00C853))
}
}
companion object {
val Default = PatchOptions(
appName = "Aliucord",
packageName = "com.aliucord",
debuggable = false,
iconReplacement = IconReplacement.Aliucord,
monochromeIcon = true,
)
}
}

View file

@ -10,18 +10,19 @@ import com.aliucord.manager.util.debounce
import kotlinx.coroutines.launch
class PatchOptionsModel(
prefilledOptions: PatchOptions,
private val context: Context,
private val prefs: PreferencesManager,
) : ScreenModel {
// ---------- Package name state ----------
var packageName by mutableStateOf("com.aliucord")
var packageName by mutableStateOf(prefilledOptions.packageName)
private set
var packageNameState by mutableStateOf(PackageNameState.Ok)
private set
val packageNameIsDefault by derivedStateOf {
packageName == "com.aliucord"
packageName == PatchOptions.Default.packageName
}
fun changePackageName(newPackageName: String) {
@ -30,18 +31,18 @@ class PatchOptionsModel(
}
fun resetPackageName() {
changePackageName("com.aliucord")
changePackageName(PatchOptions.Default.packageName)
}
// ---------- App name state ----------
var appName by mutableStateOf("Aliucord")
var appName by mutableStateOf(prefilledOptions.appName)
private set
var appNameIsError by mutableStateOf(false)
private set
val appNameIsDefault by derivedStateOf {
appName == "Aliucord"
appName == PatchOptions.Default.appName
}
fun changeAppName(newAppName: String) {
@ -50,11 +51,11 @@ class PatchOptionsModel(
}
fun resetAppName() {
appName = "Aliucord"
appName = PatchOptions.Default.appName
}
// ---------- Icon patching state ----------
var replaceIcon by mutableStateOf(true)
var replaceIcon by mutableStateOf(prefilledOptions.iconReplacement == PatchOptions.IconReplacement.Aliucord)
private set
fun changeReplaceIcon(value: Boolean) {
@ -62,7 +63,7 @@ class PatchOptionsModel(
}
// ---------- Debuggable state ----------
var debuggable by mutableStateOf(false)
var debuggable by mutableStateOf(prefilledOptions.debuggable)
private set
fun changeDebuggable(value: Boolean) {

View file

@ -29,8 +29,10 @@ import com.aliucord.manager.ui.util.*
import com.aliucord.manager.util.isIgnoringBatteryOptimizations
import com.aliucord.manager.util.requestNoBatteryOptimizations
import kotlinx.coroutines.delay
import org.koin.core.parameter.parametersOf
class PatchOptionsScreen(
private val prefilledOptions: PatchOptions = PatchOptions.Default,
private val supportedVersion: DiscordVersion = DiscordVersion.None,
) : Screen {
override val key = "PatchOptions"
@ -39,7 +41,7 @@ class PatchOptionsScreen(
override fun Content() {
val context = LocalContext.current
val navigator = LocalNavigator.currentOrThrow
val model = getScreenModel<PatchOptionsModel>()
val model = getScreenModel<PatchOptionsModel>() { parametersOf(prefilledOptions) }
LaunchedEffect(Unit) {
// Ensure that when popping this screen off the stack that permission requests don't get triggered

View file

@ -23,6 +23,6 @@ object ColorSerializer : KSerializer<Color> {
override fun deserialize(decoder: Decoder): Color {
val string = decoder.decodeString()
return Color(string.toInt(16))
return Color(string.toLong(16))
}
}