From 5c48860ef90fbe2806e2cc09c3c0fa57e9735892 Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Sun, 7 Dec 2025 20:23:46 +0700 Subject: [PATCH] refactor: Move getApkVersion to LawnchairUtils.kt --- .../about/NightlyBuildsRepository.kt | 59 +------------ .../ui/preferences/about/UpdateSection.kt | 4 +- .../src/app/lawnchair/util/LawnchairUtils.kt | 85 +++++++++++++++++++ 3 files changed, 87 insertions(+), 61 deletions(-) diff --git a/lawnchair/src/app/lawnchair/ui/preferences/about/NightlyBuildsRepository.kt b/lawnchair/src/app/lawnchair/ui/preferences/about/NightlyBuildsRepository.kt index 27965871f2..e7982ca2d2 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/about/NightlyBuildsRepository.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/about/NightlyBuildsRepository.kt @@ -6,6 +6,7 @@ import android.provider.Settings import android.util.Log import androidx.core.content.FileProvider import androidx.core.net.toUri +import app.lawnchair.util.getApkVersionComparison import com.android.launcher3.BuildConfig import com.android.launcher3.Utilities import java.io.File @@ -216,64 +217,6 @@ private fun Context.requestInstallPermission() { } } -/** - * Parses a version code into [Major, Minor, Stage, Release, Patch]. - * Handles both 8-digit (AA_BB_CC_DD) and 10-digit (AA_BB_CC_DD_EE) formats. - * - * Lawnchair format has: [Major, Minor, Stage, Release] - * - * pE format has: [Major, Minor, Stage, Release, Patch] - */ -fun versionParser(version: Long): List { - var ver = version - - // If version is less than 1 Billion (1,000,000,000), it is likely the 8-digit format - // (AA_BB_CC_DD). Multiply by 100 to shift it to 10-digit format equivalent - // (AA_BB_CC_DD_00), so the math below works for both. - if (ver < 1_000_000_000L) { - ver *= 100 - } - - val patch = (ver % 100).toInt() // EE - val release = ((ver / 100) % 100).toInt() // DD - val stage = ((ver / 10000) % 100).toInt() // CC - val minor = ((ver / 1000000) % 100).toInt() // BB - val major = ((ver / 100000000)).toInt() // AA - - return listOf(major, minor, stage, release, patch) -} - -/** - * Get both current and APK version for the purpose of comparing them. - * Returns a [Pair] of (current build version, apk build version) or null if parsing fails. - */ -fun Context.getApkVersionComparison(apkFile: File): Pair, List>? { - val pm = packageManager - - val info = pm.getPackageArchiveInfo(apkFile.absolutePath, 0) - ?: return null - - val apkVersionCode = if (Utilities.ATLEAST_P) { - info.longVersionCode - } else { - @Suppress("DEPRECATION") - info.versionCode.toLong() - } - - val currentVersionCode = if (Utilities.ATLEAST_P) { - pm.getPackageInfo(packageName, 0).longVersionCode - } else { - BuildConfig.VERSION_CODE.toLong() - } - - val apkParsed = versionParser(apkVersionCode) - val currentParsed = versionParser(currentVersionCode) - - Log.d("UpdateCheck", "Current: $currentParsed, APK: $apkParsed") - - return Pair(currentParsed, apkParsed) -} - /** * Checks if the downloaded APK file has a higher Major (AA) version than the currently * installed build. diff --git a/lawnchair/src/app/lawnchair/ui/preferences/about/UpdateSection.kt b/lawnchair/src/app/lawnchair/ui/preferences/about/UpdateSection.kt index b6deecda44..2f8191466f 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/about/UpdateSection.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/about/UpdateSection.kt @@ -24,9 +24,8 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import app.lawnchair.ui.util.preview.PreviewLawnchair +import app.lawnchair.util.getApkVersionComparison import com.android.launcher3.R import java.io.File @@ -132,7 +131,6 @@ fun UpdateSection( }, ) } - } } } diff --git a/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt b/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt index 8ebc3e99ca..fb1deae797 100644 --- a/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt +++ b/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt @@ -38,6 +38,7 @@ import android.net.Uri import android.os.Build import android.os.Looper import android.provider.OpenableColumns +import android.util.Log import android.util.Size import android.view.View import android.widget.TextView @@ -48,6 +49,8 @@ import app.lawnchair.preferences.PreferenceManager import app.lawnchair.preferences2.PreferenceManager2 import app.lawnchair.theme.color.ColorOption import app.lawnchair.theme.color.tokens.ColorTokens +import app.lawnchair.ui.preferences.about.versionParser +import com.android.launcher3.BuildConfig import com.android.launcher3.R import com.android.launcher3.Utilities import com.android.launcher3.util.Executors.MAIN_EXECUTOR @@ -55,6 +58,7 @@ import com.android.launcher3.util.Themes import com.android.systemui.shared.system.QuickStepContract import com.patrykmichalik.opto.core.firstBlocking import java.io.ByteArrayOutputStream +import java.io.File import java.util.Locale import java.util.concurrent.Callable import java.util.concurrent.ExecutionException @@ -272,6 +276,87 @@ fun Context.getDefaultResolveInfo(): ResolveInfo? { return packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) } +/** + * Parses a version code into [Major, Minor, Stage, Release, Patch]. + * Handles both 8-digit (AA_BB_CC_DD) and 10-digit (AA_BB_CC_DD_EE) formats. + * + * Lawnchair format has: [Major, Minor, Stage, Release] + * + * pE format has: [Major, Minor, Stage, Release, Patch] + */ +private fun versionParser(version: Long): List { + var ver = version + + // If version is less than 1 Billion (1,000,000,000), it is likely the 8-digit format + // (AA_BB_CC_DD). Multiply by 100 to shift it to 10-digit format equivalent + // (AA_BB_CC_DD_00), so the math below works for both. + if (ver < 1_000_000_000L) { + ver *= 100 + } + + val patch = (ver % 100).toInt() // EE + val release = ((ver / 100) % 100).toInt() // DD + val stage = ((ver / 10000) % 100).toInt() // CC + val minor = ((ver / 1000000) % 100).toInt() // BB + val major = ((ver / 100000000)).toInt() // AA + + return listOf(major, minor, stage, release, patch) +} + +// pE-TODO: Make this actually sensible because the writing is really non-sense after re-reading for fourth time +/** + * Get both current and APK version for the purpose of comparing them. + * Returns a [Pair] of (current build version, apk build version) or null if parsing fails. + */ +fun Context.getApkVersionComparison(apkFile: File): Pair, List>? { + val pm = packageManager + + val info = pm.getPackageArchiveInfo(apkFile.absolutePath, 0) + ?: return null + + val apkVersionCode = if (Utilities.ATLEAST_P) { + info.longVersionCode + } else { + @Suppress("DEPRECATION") + info.versionCode.toLong() + } + + val currentVersionCode = if (Utilities.ATLEAST_P) { + pm.getPackageInfo(packageName, 0).longVersionCode + } else { + BuildConfig.VERSION_CODE.toLong() + } + + val apkParsed = versionParser(apkVersionCode) + val currentParsed = versionParser(currentVersionCode) + + Log.d("UpdateCheck", "Current: $currentParsed, APK: $apkParsed") + + return Pair(currentParsed, apkParsed) +} + + +// pE-TODO: Make this actually sensible because the writing is really non-sense after re-reading for fourth time +/** + * Get current version for the purpose of comparing them. + * Returns a [Pair] of (current build version, apk build version else null) + */ +fun Context.getApkVersionComparison(): Pair, Nothing?> { + val pm = packageManager + + val currentVersionCode = if (Utilities.ATLEAST_P) { + pm.getPackageInfo(packageName, 0).longVersionCode + } else { + BuildConfig.VERSION_CODE.toLong() + } + + val currentParsed = versionParser(currentVersionCode) + + Log.d("UpdateCheck", "Current: $currentParsed") + + return Pair(currentParsed, null) +} + fun Drawable.toBitmap(): Bitmap { if (this is BitmapDrawable) { return bitmap