From e4eddf7c897907e32e376c850069d65c79ca9121 Mon Sep 17 00:00:00 2001 From: rushiiMachine <33725716+rushiiMachine@users.noreply.github.com> Date: Wed, 31 Jul 2024 14:49:42 -0700 Subject: [PATCH] feat(installer): Store install metadata in APK --- .../com/aliucord/manager/MainActivity.kt | 8 +--- .../manager/installer/InstallMetadata.kt | 35 ++++++++++++++ .../{steps => }/KotlinInstallRunner.kt | 3 +- .../installer/{steps => }/StepRunner.kt | 3 +- .../installer/steps/base/DownloadStep.kt | 2 +- .../manager/installer/steps/base/Step.kt | 2 +- .../steps/download/CopyDependenciesStep.kt | 2 +- .../steps/download/DownloadAliuhookStep.kt | 6 +-- .../steps/download/DownloadInjectorStep.kt | 5 +- .../installer/steps/install/AlignmentStep.kt | 4 +- .../installer/steps/install/CleanupStep.kt | 2 +- .../installer/steps/install/InstallStep.kt | 2 +- .../installer/steps/install/SigningStep.kt | 2 +- .../installer/steps/patch/AddAliuhookStep.kt | 2 +- .../installer/steps/patch/AddInjectorStep.kt | 2 +- .../steps/patch/PatchManifestStep.kt | 2 +- .../installer/steps/patch/ReplaceIconStep.kt | 2 +- .../installer/steps/patch/SaveMetadataStep.kt | 46 +++++++++++++++++++ .../steps/prepare/DowngradeCheckStep.kt | 2 +- .../installer/steps/prepare/FetchInfoStep.kt | 2 +- .../ui/screens/install/InstallModel.kt | 2 + .../ui/screens/installopts/InstallOptions.kt | 12 +++++ .../aliucord/manager/util/ColorSerializer.kt | 28 +++++++++++ .../kotlin/com/aliucord/manager/util/Utils.kt | 11 +++++ app/src/main/res/values/strings.xml | 1 + 25 files changed, 160 insertions(+), 28 deletions(-) create mode 100644 app/src/main/kotlin/com/aliucord/manager/installer/InstallMetadata.kt rename app/src/main/kotlin/com/aliucord/manager/installer/{steps => }/KotlinInstallRunner.kt (93%) rename app/src/main/kotlin/com/aliucord/manager/installer/{steps => }/StepRunner.kt (97%) create mode 100644 app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/SaveMetadataStep.kt create mode 100644 app/src/main/kotlin/com/aliucord/manager/util/ColorSerializer.kt diff --git a/app/src/main/kotlin/com/aliucord/manager/MainActivity.kt b/app/src/main/kotlin/com/aliucord/manager/MainActivity.kt index 990b501..e3a4660 100644 --- a/app/src/main/kotlin/com/aliucord/manager/MainActivity.kt +++ b/app/src/main/kotlin/com/aliucord/manager/MainActivity.kt @@ -24,6 +24,7 @@ import com.aliucord.manager.ui.screens.home.HomeScreen import com.aliucord.manager.ui.screens.install.InstallScreen import com.aliucord.manager.ui.screens.installopts.InstallOptionsScreen import com.aliucord.manager.ui.widgets.updater.UpdaterDialog +import com.aliucord.manager.util.IS_CUSTOM_BUILD import org.koin.android.ext.android.inject // TODO: move to a path provider in DI @@ -46,12 +47,7 @@ class MainActivity : ComponentActivity() { ) { StoragePermissionsDialog() - @Suppress("KotlinConstantConditions") - if ( - BuildConfig.GIT_BRANCH == "release" && - !BuildConfig.GIT_LOCAL_CHANGES && - !BuildConfig.GIT_LOCAL_COMMITS - ) { + if (!IS_CUSTOM_BUILD) { UpdaterDialog() } diff --git a/app/src/main/kotlin/com/aliucord/manager/installer/InstallMetadata.kt b/app/src/main/kotlin/com/aliucord/manager/installer/InstallMetadata.kt new file mode 100644 index 0000000..084fded --- /dev/null +++ b/app/src/main/kotlin/com/aliucord/manager/installer/InstallMetadata.kt @@ -0,0 +1,35 @@ +package com.aliucord.manager.installer + +import com.aliucord.manager.ui.screens.installopts.InstallOptions +import kotlinx.serialization.Serializable + +/** + * Data stored inside patched APKs as "aliucord.json" in order to preserve install-time information about Aliucord and the Manager. + */ +@Serializable +data class InstallMetadata( + /** + * The user-selected options for this installation. + */ + val options: InstallOptions, + + /** + * The semver version of this manager that performed the installation. + */ + val managerVersionName: String, + + /** + * Whether the manager is a real release or built from source. + */ + val customManager: Boolean, + + /** + * Aliuhook release version injected into the APK. + */ + val aliuhookVersion: String, + + /** + * Short commit hash of the commit the injector was built from. + */ + val injectorCommitHash: String, +) diff --git a/app/src/main/kotlin/com/aliucord/manager/installer/steps/KotlinInstallRunner.kt b/app/src/main/kotlin/com/aliucord/manager/installer/KotlinInstallRunner.kt similarity index 93% rename from app/src/main/kotlin/com/aliucord/manager/installer/steps/KotlinInstallRunner.kt rename to app/src/main/kotlin/com/aliucord/manager/installer/KotlinInstallRunner.kt index 083e7c5..b4172e0 100644 --- a/app/src/main/kotlin/com/aliucord/manager/installer/steps/KotlinInstallRunner.kt +++ b/app/src/main/kotlin/com/aliucord/manager/installer/KotlinInstallRunner.kt @@ -1,4 +1,4 @@ -package com.aliucord.manager.installer.steps +package com.aliucord.manager.installer import com.aliucord.manager.installer.steps.download.* import com.aliucord.manager.installer.steps.install.* @@ -29,6 +29,7 @@ class KotlinInstallRunner(options: InstallOptions) : StepRunner() { PatchManifestStep(options), AddInjectorStep(), AddAliuhookStep(), + SaveMetadataStep(options), // Install AlignmentStep(), diff --git a/app/src/main/kotlin/com/aliucord/manager/installer/steps/StepRunner.kt b/app/src/main/kotlin/com/aliucord/manager/installer/StepRunner.kt similarity index 97% rename from app/src/main/kotlin/com/aliucord/manager/installer/steps/StepRunner.kt rename to app/src/main/kotlin/com/aliucord/manager/installer/StepRunner.kt index 8168108..dbd794b 100644 --- a/app/src/main/kotlin/com/aliucord/manager/installer/steps/StepRunner.kt +++ b/app/src/main/kotlin/com/aliucord/manager/installer/StepRunner.kt @@ -1,9 +1,10 @@ -package com.aliucord.manager.installer.steps +package com.aliucord.manager.installer import android.content.Context import androidx.lifecycle.Lifecycle import androidx.lifecycle.ProcessLifecycleOwner import com.aliucord.manager.R +import com.aliucord.manager.installer.steps.StepGroup import com.aliucord.manager.installer.steps.base.DownloadStep import com.aliucord.manager.installer.steps.base.Step import com.aliucord.manager.manager.PreferencesManager diff --git a/app/src/main/kotlin/com/aliucord/manager/installer/steps/base/DownloadStep.kt b/app/src/main/kotlin/com/aliucord/manager/installer/steps/base/DownloadStep.kt index c35e625..c8b6429 100644 --- a/app/src/main/kotlin/com/aliucord/manager/installer/steps/base/DownloadStep.kt +++ b/app/src/main/kotlin/com/aliucord/manager/installer/steps/base/DownloadStep.kt @@ -4,7 +4,7 @@ import android.content.Context import androidx.compose.runtime.Stable import com.aliucord.manager.R import com.aliucord.manager.installer.steps.StepGroup -import com.aliucord.manager.installer.steps.StepRunner +import com.aliucord.manager.installer.StepRunner import com.aliucord.manager.manager.DownloadManager import com.aliucord.manager.util.showToast import kotlinx.coroutines.Dispatchers diff --git a/app/src/main/kotlin/com/aliucord/manager/installer/steps/base/Step.kt b/app/src/main/kotlin/com/aliucord/manager/installer/steps/base/Step.kt index f533504..00ff861 100644 --- a/app/src/main/kotlin/com/aliucord/manager/installer/steps/base/Step.kt +++ b/app/src/main/kotlin/com/aliucord/manager/installer/steps/base/Step.kt @@ -3,7 +3,7 @@ package com.aliucord.manager.installer.steps.base import androidx.annotation.StringRes import androidx.compose.runtime.* import com.aliucord.manager.installer.steps.StepGroup -import com.aliucord.manager.installer.steps.StepRunner +import com.aliucord.manager.installer.StepRunner import com.aliucord.manager.util.toPrecision import kotlinx.coroutines.* import org.koin.core.time.measureTimedValue diff --git a/app/src/main/kotlin/com/aliucord/manager/installer/steps/download/CopyDependenciesStep.kt b/app/src/main/kotlin/com/aliucord/manager/installer/steps/download/CopyDependenciesStep.kt index 7402410..46c28c4 100644 --- a/app/src/main/kotlin/com/aliucord/manager/installer/steps/download/CopyDependenciesStep.kt +++ b/app/src/main/kotlin/com/aliucord/manager/installer/steps/download/CopyDependenciesStep.kt @@ -2,7 +2,7 @@ package com.aliucord.manager.installer.steps.download import com.aliucord.manager.R import com.aliucord.manager.installer.steps.StepGroup -import com.aliucord.manager.installer.steps.StepRunner +import com.aliucord.manager.installer.StepRunner import com.aliucord.manager.installer.steps.base.Step import com.aliucord.manager.manager.PathManager import org.koin.core.component.KoinComponent diff --git a/app/src/main/kotlin/com/aliucord/manager/installer/steps/download/DownloadAliuhookStep.kt b/app/src/main/kotlin/com/aliucord/manager/installer/steps/download/DownloadAliuhookStep.kt index 87e5fb0..8ace16a 100644 --- a/app/src/main/kotlin/com/aliucord/manager/installer/steps/download/DownloadAliuhookStep.kt +++ b/app/src/main/kotlin/com/aliucord/manager/installer/steps/download/DownloadAliuhookStep.kt @@ -3,7 +3,7 @@ package com.aliucord.manager.installer.steps.download import androidx.compose.runtime.Stable import com.aliucord.manager.R import com.aliucord.manager.domain.repository.AliucordMavenRepository -import com.aliucord.manager.installer.steps.StepRunner +import com.aliucord.manager.installer.StepRunner import com.aliucord.manager.installer.steps.base.DownloadStep import com.aliucord.manager.manager.PathManager import com.aliucord.manager.network.utils.getOrThrow @@ -21,7 +21,8 @@ class DownloadAliuhookStep : DownloadStep(), KoinComponent { /** * This is populated right before the download starts (ref: [execute]) */ - private lateinit var targetVersion: String + lateinit var targetVersion: String + private set override val localizedName = R.string.install_step_dl_aliuhook override val targetUrl get() = AliucordMavenRepository.getAliuhookUrl(targetVersion) @@ -33,4 +34,3 @@ class DownloadAliuhookStep : DownloadStep(), KoinComponent { super.execute(container) } } - diff --git a/app/src/main/kotlin/com/aliucord/manager/installer/steps/download/DownloadInjectorStep.kt b/app/src/main/kotlin/com/aliucord/manager/installer/steps/download/DownloadInjectorStep.kt index 0433dea..7495ed3 100644 --- a/app/src/main/kotlin/com/aliucord/manager/installer/steps/download/DownloadInjectorStep.kt +++ b/app/src/main/kotlin/com/aliucord/manager/installer/steps/download/DownloadInjectorStep.kt @@ -2,7 +2,7 @@ package com.aliucord.manager.installer.steps.download import androidx.compose.runtime.Stable import com.aliucord.manager.R -import com.aliucord.manager.installer.steps.StepRunner +import com.aliucord.manager.installer.StepRunner import com.aliucord.manager.installer.steps.base.DownloadStep import com.aliucord.manager.installer.steps.prepare.FetchInfoStep import com.aliucord.manager.manager.PathManager @@ -21,7 +21,8 @@ class DownloadInjectorStep : DownloadStep(), KoinComponent { * Populated from a dependency step ([FetchInfoStep]). * This is used as cache invalidation (ref: [Version.aliucordHash]) */ - private lateinit var aliucordHash: String + lateinit var aliucordHash: String + private set override val localizedName = R.string.install_step_dl_injector override val targetUrl = URL diff --git a/app/src/main/kotlin/com/aliucord/manager/installer/steps/install/AlignmentStep.kt b/app/src/main/kotlin/com/aliucord/manager/installer/steps/install/AlignmentStep.kt index 22cc46d..b5c9b9c 100644 --- a/app/src/main/kotlin/com/aliucord/manager/installer/steps/install/AlignmentStep.kt +++ b/app/src/main/kotlin/com/aliucord/manager/installer/steps/install/AlignmentStep.kt @@ -3,7 +3,7 @@ package com.aliucord.manager.installer.steps.install import android.os.Build import com.aliucord.manager.R import com.aliucord.manager.installer.steps.StepGroup -import com.aliucord.manager.installer.steps.StepRunner +import com.aliucord.manager.installer.StepRunner import com.aliucord.manager.installer.steps.base.Step import com.aliucord.manager.installer.steps.base.StepState import com.aliucord.manager.installer.steps.download.CopyDependenciesStep @@ -14,8 +14,6 @@ import org.koin.core.component.KoinComponent * Align certain files in the APK to a 4KiB boundary. */ class AlignmentStep : Step(), KoinComponent { - private val currentDeviceArch = Build.SUPPORTED_ABIS.first() - override val group = StepGroup.Install override val localizedName = R.string.install_step_alignment diff --git a/app/src/main/kotlin/com/aliucord/manager/installer/steps/install/CleanupStep.kt b/app/src/main/kotlin/com/aliucord/manager/installer/steps/install/CleanupStep.kt index d57635f..4ee3a98 100644 --- a/app/src/main/kotlin/com/aliucord/manager/installer/steps/install/CleanupStep.kt +++ b/app/src/main/kotlin/com/aliucord/manager/installer/steps/install/CleanupStep.kt @@ -2,7 +2,7 @@ package com.aliucord.manager.installer.steps.install import com.aliucord.manager.R import com.aliucord.manager.installer.steps.StepGroup -import com.aliucord.manager.installer.steps.StepRunner +import com.aliucord.manager.installer.StepRunner import com.aliucord.manager.installer.steps.base.Step import com.aliucord.manager.installer.steps.base.StepState import com.aliucord.manager.manager.PathManager diff --git a/app/src/main/kotlin/com/aliucord/manager/installer/steps/install/InstallStep.kt b/app/src/main/kotlin/com/aliucord/manager/installer/steps/install/InstallStep.kt index 8721f90..d096274 100644 --- a/app/src/main/kotlin/com/aliucord/manager/installer/steps/install/InstallStep.kt +++ b/app/src/main/kotlin/com/aliucord/manager/installer/steps/install/InstallStep.kt @@ -4,7 +4,7 @@ import android.content.Context import androidx.lifecycle.* import com.aliucord.manager.R import com.aliucord.manager.installer.steps.StepGroup -import com.aliucord.manager.installer.steps.StepRunner +import com.aliucord.manager.installer.StepRunner import com.aliucord.manager.installer.steps.base.Step import com.aliucord.manager.installer.steps.base.StepState import com.aliucord.manager.installer.steps.download.CopyDependenciesStep diff --git a/app/src/main/kotlin/com/aliucord/manager/installer/steps/install/SigningStep.kt b/app/src/main/kotlin/com/aliucord/manager/installer/steps/install/SigningStep.kt index 261df70..7de2604 100644 --- a/app/src/main/kotlin/com/aliucord/manager/installer/steps/install/SigningStep.kt +++ b/app/src/main/kotlin/com/aliucord/manager/installer/steps/install/SigningStep.kt @@ -2,7 +2,7 @@ package com.aliucord.manager.installer.steps.install import com.aliucord.manager.R import com.aliucord.manager.installer.steps.StepGroup -import com.aliucord.manager.installer.steps.StepRunner +import com.aliucord.manager.installer.StepRunner import com.aliucord.manager.installer.steps.base.Step import com.aliucord.manager.installer.steps.download.CopyDependenciesStep import com.aliucord.manager.installer.util.Signer diff --git a/app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/AddAliuhookStep.kt b/app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/AddAliuhookStep.kt index 169ca47..4a0adaa 100644 --- a/app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/AddAliuhookStep.kt +++ b/app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/AddAliuhookStep.kt @@ -3,7 +3,7 @@ package com.aliucord.manager.installer.steps.patch import android.os.Build import com.aliucord.manager.R import com.aliucord.manager.installer.steps.StepGroup -import com.aliucord.manager.installer.steps.StepRunner +import com.aliucord.manager.installer.StepRunner import com.aliucord.manager.installer.steps.base.Step import com.aliucord.manager.installer.steps.download.CopyDependenciesStep import com.aliucord.manager.installer.steps.download.DownloadAliuhookStep diff --git a/app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/AddInjectorStep.kt b/app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/AddInjectorStep.kt index 3318d45..513fef8 100644 --- a/app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/AddInjectorStep.kt +++ b/app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/AddInjectorStep.kt @@ -2,7 +2,7 @@ package com.aliucord.manager.installer.steps.patch import com.aliucord.manager.R import com.aliucord.manager.installer.steps.StepGroup -import com.aliucord.manager.installer.steps.StepRunner +import com.aliucord.manager.installer.StepRunner import com.aliucord.manager.installer.steps.base.Step import com.aliucord.manager.installer.steps.download.* import com.github.diamondminer88.zip.ZipReader diff --git a/app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/PatchManifestStep.kt b/app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/PatchManifestStep.kt index 8a6ab36..f050280 100644 --- a/app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/PatchManifestStep.kt +++ b/app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/PatchManifestStep.kt @@ -2,7 +2,7 @@ package com.aliucord.manager.installer.steps.patch import com.aliucord.manager.R import com.aliucord.manager.installer.steps.StepGroup -import com.aliucord.manager.installer.steps.StepRunner +import com.aliucord.manager.installer.StepRunner import com.aliucord.manager.installer.steps.base.Step import com.aliucord.manager.installer.steps.download.CopyDependenciesStep import com.aliucord.manager.installer.util.ManifestPatcher diff --git a/app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/ReplaceIconStep.kt b/app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/ReplaceIconStep.kt index 1b961a8..fee47f9 100644 --- a/app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/ReplaceIconStep.kt +++ b/app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/ReplaceIconStep.kt @@ -5,7 +5,7 @@ import android.os.Build import androidx.compose.runtime.Stable import com.aliucord.manager.R import com.aliucord.manager.installer.steps.StepGroup -import com.aliucord.manager.installer.steps.StepRunner +import com.aliucord.manager.installer.StepRunner import com.aliucord.manager.installer.steps.base.Step import com.aliucord.manager.installer.steps.base.StepState import com.aliucord.manager.installer.steps.download.CopyDependenciesStep diff --git a/app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/SaveMetadataStep.kt b/app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/SaveMetadataStep.kt new file mode 100644 index 0000000..aa6cf1a --- /dev/null +++ b/app/src/main/kotlin/com/aliucord/manager/installer/steps/patch/SaveMetadataStep.kt @@ -0,0 +1,46 @@ +package com.aliucord.manager.installer.steps.patch + +import com.aliucord.manager.BuildConfig +import com.aliucord.manager.R +import com.aliucord.manager.installer.InstallMetadata +import com.aliucord.manager.installer.StepRunner +import com.aliucord.manager.installer.steps.StepGroup +import com.aliucord.manager.installer.steps.base.Step +import com.aliucord.manager.installer.steps.download.* +import com.aliucord.manager.ui.screens.installopts.InstallOptions +import com.aliucord.manager.util.IS_CUSTOM_BUILD +import com.github.diamondminer88.zip.ZipWriter +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json + +/** + * Store the install options and additional data inside the APK for future use, + * for example checking what library versions were used, or performing "updates" while + * maintaining the same install options as what was used upon first install. + */ +class SaveMetadataStep(private val options: InstallOptions) : Step() { + override val group = StepGroup.Patch + override val localizedName = R.string.install_step_save_metadata + + private val json = Json { + prettyPrint = true + } + + override suspend fun execute(container: StepRunner) { + val apk = container.getStep().patchedApk + val aliuhook = container.getStep() + val injector = container.getStep() + + val metadata = InstallMetadata( + options = options, + managerVersionName = BuildConfig.VERSION_NAME, + customManager = IS_CUSTOM_BUILD, + aliuhookVersion = aliuhook.targetVersion, + injectorCommitHash = injector.aliucordHash, + ) + + ZipWriter(apk, /* append = */ true).use { + it.writeEntry("aliucord.json", json.encodeToString(metadata)) + } + } +} diff --git a/app/src/main/kotlin/com/aliucord/manager/installer/steps/prepare/DowngradeCheckStep.kt b/app/src/main/kotlin/com/aliucord/manager/installer/steps/prepare/DowngradeCheckStep.kt index fe74307..d522697 100644 --- a/app/src/main/kotlin/com/aliucord/manager/installer/steps/prepare/DowngradeCheckStep.kt +++ b/app/src/main/kotlin/com/aliucord/manager/installer/steps/prepare/DowngradeCheckStep.kt @@ -3,7 +3,7 @@ package com.aliucord.manager.installer.steps.prepare import android.content.Context import com.aliucord.manager.R import com.aliucord.manager.installer.steps.StepGroup -import com.aliucord.manager.installer.steps.StepRunner +import com.aliucord.manager.installer.StepRunner import com.aliucord.manager.installer.steps.base.Step import com.aliucord.manager.installer.steps.base.StepState import com.aliucord.manager.installer.util.uninstallApk diff --git a/app/src/main/kotlin/com/aliucord/manager/installer/steps/prepare/FetchInfoStep.kt b/app/src/main/kotlin/com/aliucord/manager/installer/steps/prepare/FetchInfoStep.kt index 19dff13..116b79b 100644 --- a/app/src/main/kotlin/com/aliucord/manager/installer/steps/prepare/FetchInfoStep.kt +++ b/app/src/main/kotlin/com/aliucord/manager/installer/steps/prepare/FetchInfoStep.kt @@ -3,7 +3,7 @@ package com.aliucord.manager.installer.steps.prepare import androidx.compose.runtime.Stable import com.aliucord.manager.R import com.aliucord.manager.installer.steps.StepGroup -import com.aliucord.manager.installer.steps.StepRunner +import com.aliucord.manager.installer.StepRunner import com.aliucord.manager.installer.steps.base.Step import com.aliucord.manager.network.dto.Version import com.aliucord.manager.network.service.AliucordGithubService 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 1a2c779..172f4ee 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 @@ -13,6 +13,8 @@ import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import com.aliucord.manager.BuildConfig import com.aliucord.manager.R +import com.aliucord.manager.installer.KotlinInstallRunner +import com.aliucord.manager.installer.StepRunner import com.aliucord.manager.installer.steps.* import com.aliucord.manager.installer.steps.base.Step import com.aliucord.manager.installer.steps.base.StepState diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/installopts/InstallOptions.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/installopts/InstallOptions.kt index 646d6b3..2b11b38 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/screens/installopts/InstallOptions.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/installopts/InstallOptions.kt @@ -4,11 +4,15 @@ import android.os.Parcelable import androidx.compose.runtime.Immutable import androidx.compose.ui.graphics.Color import com.aliucord.manager.util.ColorParceler +import com.aliucord.manager.util.ColorSerializer import kotlinx.parcelize.Parcelize import kotlinx.parcelize.TypeParceler +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable @Immutable @Parcelize +@Serializable data class InstallOptions( /** * The app name that's user-facing in launchers. @@ -38,12 +42,15 @@ data class InstallOptions( ) : Parcelable { @Immutable @Parcelize + @Serializable sealed interface IconReplacement : Parcelable { /** * Keeps the original icons that are present in the APK. */ @Immutable @Parcelize + @Serializable + @SerialName("original") data object Original : IconReplacement /** @@ -52,8 +59,11 @@ data class InstallOptions( */ @Immutable @Parcelize + @Serializable + @SerialName("color") data class CustomColor( @TypeParceler + @Serializable(ColorSerializer::class) val color: Color, ) : IconReplacement @@ -63,6 +73,8 @@ data class InstallOptions( */ @Immutable @Parcelize + @Serializable + @SerialName("image") data class CustomImage(val imageBytes: ByteArray) : IconReplacement { override fun hashCode() = imageBytes.contentHashCode() override fun equals(other: Any?) = this === other diff --git a/app/src/main/kotlin/com/aliucord/manager/util/ColorSerializer.kt b/app/src/main/kotlin/com/aliucord/manager/util/ColorSerializer.kt new file mode 100644 index 0000000..8ce5fcb --- /dev/null +++ b/app/src/main/kotlin/com/aliucord/manager/util/ColorSerializer.kt @@ -0,0 +1,28 @@ +package com.aliucord.manager.util + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.* +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder + +/** + * (De)serialize compose's [Color] into/from an ARGB hex string. + */ +object ColorSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("Color", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: Color) { + val string = value + .toArgb().toUInt() + .toString(16) + .padStart(8, '0') + encoder.encodeString(string) + } + + override fun deserialize(decoder: Decoder): Color { + val string = decoder.decodeString() + return Color(string.toInt(16)) + } +} diff --git a/app/src/main/kotlin/com/aliucord/manager/util/Utils.kt b/app/src/main/kotlin/com/aliucord/manager/util/Utils.kt index 9acd3e0..a48379f 100644 --- a/app/src/main/kotlin/com/aliucord/manager/util/Utils.kt +++ b/app/src/main/kotlin/com/aliucord/manager/util/Utils.kt @@ -1,6 +1,7 @@ package com.aliucord.manager.util import androidx.collection.ObjectList +import com.aliucord.manager.BuildConfig import kotlin.math.pow import kotlin.math.truncate @@ -20,3 +21,13 @@ inline fun ObjectList.find(block: (E) -> Boolean): E? { return null } + +/** + * Whether this manager build is not an official release. + */ +@Suppress("KotlinConstantConditions") +val IS_CUSTOM_BUILD by lazy { + BuildConfig.GIT_BRANCH != "release" + || BuildConfig.GIT_LOCAL_CHANGES + || BuildConfig.GIT_LOCAL_COMMITS +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8c4f99e..c375b3d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -110,6 +110,7 @@ Patching app icon Adding Aliucord injector Adding Aliuhook library + Store metadata Aligning APKs Signing APKs Installing APKs