From 45d75ca0f97d482af6885abac8b8d5aa1ecb0d34 Mon Sep 17 00:00:00 2001 From: rushii <33725716+DiamondMiner88@users.noreply.github.com> Date: Thu, 3 Nov 2022 21:29:26 -0700 Subject: [PATCH] feat: handle InfoCard versions state properly (#39) --- .../manager/ui/component/home/InfoCard.kt | 38 ++++--- .../aliucord/manager/ui/screen/HomeScreen.kt | 1 + .../manager/ui/viewmodel/HomeViewModel.kt | 102 +++++++++++++----- .../kotlin/com/aliucord/manager/util/Util.kt | 13 ++- 4 files changed, 110 insertions(+), 44 deletions(-) diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/component/home/InfoCard.kt b/app/src/main/kotlin/com/aliucord/manager/ui/component/home/InfoCard.kt index 48a103b..9ab9796 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/component/home/InfoCard.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/component/home/InfoCard.kt @@ -1,8 +1,6 @@ package com.aliucord.manager.ui.component.home -import androidx.annotation.StringRes import androidx.compose.foundation.layout.* -import androidx.compose.foundation.text.appendInlineContent import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.* import androidx.compose.material3.* @@ -15,13 +13,15 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.aliucord.manager.R +import com.aliucord.manager.ui.viewmodel.HomeViewModel.VersionType @Composable fun InfoCard( packageName: String, supportedVersion: String, - @StringRes supportedVersionType: Int, + supportedVersionType: VersionType, currentVersion: String, + currentVersionType: VersionType, onDownloadClick: () -> Unit, onUninstallClick: () -> Unit, onLaunchClick: () -> Unit @@ -44,16 +44,22 @@ fun InfoCard( append(stringResource(R.string.version_supported)) withStyle(SpanStyle(fontWeight = FontWeight.Bold)) { append(" ") - append(supportedVersion) - append(" - ") - append(stringResource(supportedVersionType)) + if (supportedVersion.isNotEmpty()) { + append(supportedVersion) + append(" - ") + } + append(supportedVersionType.toDisplayName()) } append('\n') append(stringResource(R.string.version_installed)) withStyle(SpanStyle(fontWeight = FontWeight.Bold)) { append(" ") - append(currentVersion) + if (currentVersion.isNotEmpty()) { + append(currentVersion) + append(" - ") + } + append(currentVersionType.toDisplayName()) } }, style = MaterialTheme.typography.bodyMedium @@ -65,9 +71,8 @@ fun InfoCard( .padding(top = 10.dp), horizontalArrangement = Arrangement.spacedBy(16.dp) ) { - val (icon, description) = when (currentVersion) { - "-" -> Icons.Default.Download to R.string.action_install + "" -> Icons.Default.Download to R.string.action_install supportedVersion -> Icons.Default.Refresh to R.string.action_reinstall else -> Icons.Default.Update to R.string.action_update } @@ -77,7 +82,8 @@ fun InfoCard( .weight(1f) .heightIn(min = 50.dp), onClick = onDownloadClick, - shape = ShapeDefaults.Large + shape = ShapeDefaults.Large, + enabled = supportedVersionType != VersionType.ERROR ) { Row( horizontalArrangement = Arrangement.spacedBy(5.dp), @@ -87,14 +93,16 @@ fun InfoCard( imageVector = icon, contentDescription = stringResource(description) ) - if (currentVersion == "-") Text( - stringResource(description), - style = MaterialTheme.typography.labelLarge - ) + if (!currentVersionType.isVersion()) { + Text( + stringResource(description), + style = MaterialTheme.typography.labelLarge + ) + } } } - if (currentVersion != "-") { + if (currentVersionType.isVersion()) { FilledTonalIconButton( modifier = Modifier .weight(1f) diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screen/HomeScreen.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screen/HomeScreen.kt index 397dba9..fd15832 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/screen/HomeScreen.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/screen/HomeScreen.kt @@ -44,6 +44,7 @@ fun HomeScreen( supportedVersion = viewModel.supportedVersion, supportedVersionType = viewModel.supportedVersionType, currentVersion = viewModel.installedVersion, + currentVersionType = viewModel.installedVersionType, onDownloadClick = { showInstallerDialog = true }, onLaunchClick = viewModel::launchAliucord, onUninstallClick = viewModel::uninstallAliucord diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/viewmodel/HomeViewModel.kt b/app/src/main/kotlin/com/aliucord/manager/ui/viewmodel/HomeViewModel.kt index c72b4e8..59d774d 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/viewmodel/HomeViewModel.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/viewmodel/HomeViewModel.kt @@ -3,36 +3,39 @@ package com.aliucord.manager.ui.viewmodel import android.app.Application import android.content.Intent import android.net.Uri -import android.widget.Toast +import android.util.Log import androidx.compose.runtime.* +import androidx.compose.ui.res.stringResource import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.paging.* +import com.aliucord.manager.BuildConfig import com.aliucord.manager.R import com.aliucord.manager.domain.manager.PreferencesManager import com.aliucord.manager.domain.repository.GithubRepository import com.aliucord.manager.network.dto.Commit import com.aliucord.manager.network.utils.fold +import com.aliucord.manager.util.getPackageVersionCode import com.aliucord.manager.util.showToast -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch +import kotlinx.coroutines.* class HomeViewModel( private val application: Application, private val github: GithubRepository, val preferences: PreferencesManager ) : ViewModel() { - private val packageManager = application.packageManager - var supportedVersion by mutableStateOf("") private set - var supportedVersionType by mutableStateOf(R.string.version_unknown) + var supportedVersionType by mutableStateOf(VersionType.NONE) private set var installedVersion by mutableStateOf("") private set + var installedVersionType by mutableStateOf(VersionType.NONE) + private set + val commits = Pager(PagingConfig(pageSize = 30)) { object : PagingSource() { override suspend fun load(params: LoadParams): LoadResult { @@ -61,33 +64,42 @@ class HomeViewModel( init { viewModelScope.launch(Dispatchers.IO) { + _fetchInstalledVersion() _fetchSupportedVersion() + } + } - installedVersion = try { - @Suppress("DEPRECATION") - packageManager.getPackageInfo(preferences.packageName, 0).versionName - } catch (th: Throwable) { - // TODO: translated error message - "-" + private suspend fun _fetchInstalledVersion() { + try { + val (versionName, versionCode) = application.getPackageVersionCode(preferences.packageName) + + withContext(Dispatchers.Main) { + installedVersion = versionName.split("-")[0].trim() + installedVersionType = VersionType.parseVersionCode(versionCode) + } + } catch (t: Throwable) { + Log.e(BuildConfig.TAG, Log.getStackTraceString(t)) + + withContext(Dispatchers.Main) { + installedVersionType = VersionType.ERROR } } } private suspend fun _fetchSupportedVersion() { - github.getDataJson().fold( - success = { - supportedVersion = it.versionName - supportedVersionType = when (it.versionCode[3]) { - '0' -> R.string.version_stable - '1' -> R.string.version_beta - '2' -> R.string.version_alpha - else -> R.string.version_unknown + val version = github.getDataJson() + + withContext(Dispatchers.Main) { + version.fold( + success = { + supportedVersion = it.versionName + supportedVersionType = VersionType.parseVersionCode(it.versionCode.toIntOrNull()) + }, + fail = { + supportedVersionType = VersionType.ERROR } - }, - fail = { - supportedVersionType = R.string.version_load_fail - } - ) + ) + } } fun fetchSupportedVersion() { @@ -97,7 +109,8 @@ class HomeViewModel( } fun launchAliucord() { - val launchIntent = packageManager.getLaunchIntentForPackage(preferences.packageName) + val launchIntent = application.packageManager + .getLaunchIntentForPackage(preferences.packageName) if (launchIntent != null) { application.startActivity(launchIntent) @@ -114,4 +127,41 @@ class HomeViewModel( application.startActivity(uninstallIntent) } + + enum class VersionType { + STABLE, + BETA, + ALPHA, + UNKNOWN, + NONE, + ERROR; + + fun isVersion(): Boolean = when (this) { + STABLE -> true + BETA -> true + ALPHA -> true + else -> false + } + + @Composable + fun toDisplayName() = when (this) { + UNKNOWN -> stringResource(R.string.version_unknown) + STABLE -> stringResource(R.string.version_stable) + BETA -> stringResource(R.string.version_beta) + ALPHA -> stringResource(R.string.version_alpha) + ERROR -> stringResource(R.string.version_load_fail) + NONE -> stringResource(R.string.version_unknown) + } + + companion object { + fun parseVersionCode(versionCode: Int?): VersionType { + return when (versionCode?.div(100)?.mod(10)) { + 0 -> STABLE + 1 -> BETA + 2 -> ALPHA + else -> UNKNOWN + } + } + } + } } diff --git a/app/src/main/kotlin/com/aliucord/manager/util/Util.kt b/app/src/main/kotlin/com/aliucord/manager/util/Util.kt index a3a9e21..5c95f5d 100644 --- a/app/src/main/kotlin/com/aliucord/manager/util/Util.kt +++ b/app/src/main/kotlin/com/aliucord/manager/util/Util.kt @@ -1,8 +1,6 @@ package com.aliucord.manager.util -import android.content.ClipData -import android.content.ClipboardManager -import android.content.Context +import android.content.* import android.os.Environment import android.util.Log import android.widget.Toast @@ -37,3 +35,12 @@ fun Context.saveFile(name: String, text: String): File? { fun Context.showToast(@StringRes text: Int, vararg args: Any, length: Int = Toast.LENGTH_LONG) { Toast.makeText(this, this.getString(text, *args), length).show() } + +/** + * @return (versionName, versionCode) + */ +fun Context.getPackageVersionCode(pkg: String): Pair { + @Suppress("DEPRECATION") + return packageManager.getPackageInfo(pkg, 0) + .let { it.versionName to it.versionCode } +}