backend implementation

This commit is contained in:
2026-07-25 21:54:24 +03:00
parent c49a5ed087
commit 9254829c5d
28 changed files with 130 additions and 35 deletions
@@ -1,5 +0,0 @@
package ru.shadowsparky.updater.domain
interface UpdateFetcher {
suspend fun fetch(): UpdateInfo
}
@@ -12,6 +12,7 @@ kotlin {
dependencies {
implementation(project(":libs:ui"))
implementation(project(":libs:base"))
api(project(":libs:updater:updater-common"))
implementation(libs.ui.tooling.preview)
}
}
@@ -1,5 +1,8 @@
<resources>
<string name="updater_title_available">Доступно обновление</string>
<string name="updater_title_not_found">Обновления не найдены</string>
<string name="updater_btn_close">Закрыть</string>
<string name="updater_btn_download">Скачать</string>
<string name="updater_changelog_title">Что нового:</string>
<string name="updater_changelog_empty">Улучшения производительности и исправления ошибок.</string>
@@ -22,9 +22,9 @@ class UpdateInteractor(
}
emit(UpdateState.Checking)
try {
val updateInfo = fetcher.fetch()
val serverVersion = updateInfo.versionCode ?: 0L
val currentVersion = appConfig.versionCode ?: 0L
val updateInfo = fetcher.fetch(currentVersion)
val serverVersion = updateInfo.versionCode ?: 0L
if (serverVersion <= currentVersion) {
emit(UpdateState.UpToDate)
@@ -1,24 +1,25 @@
package ru.shadowsparky.updater.presentation
import androiddev.libs.updater.generated.resources.Res
import androiddev.libs.updater.generated.resources.updater_btn_download
import androiddev.libs.updater.generated.resources.updater_btn_grant
import androiddev.libs.updater.generated.resources.updater_btn_install
import androiddev.libs.updater.generated.resources.updater_btn_retry
import androiddev.libs.updater.generated.resources.updater_changelog_empty
import androiddev.libs.updater.generated.resources.updater_changelog_title
import androiddev.libs.updater.generated.resources.updater_desc_permission
import androiddev.libs.updater.generated.resources.updater_download_progress
import androiddev.libs.updater.generated.resources.updater_title_available
import androiddev.libs.updater.generated.resources.updater_title_downloading
import androiddev.libs.updater.generated.resources.updater_title_error
import androiddev.libs.updater.generated.resources.updater_title_permission
import androiddev.libs.updater.generated.resources.updater_title_ready
import androiddev.libs.updater.updater_client.generated.resources.Res
import androiddev.libs.updater.updater_client.generated.resources.updater_btn_close
import androiddev.libs.updater.updater_client.generated.resources.updater_btn_download
import androiddev.libs.updater.updater_client.generated.resources.updater_btn_grant
import androiddev.libs.updater.updater_client.generated.resources.updater_btn_install
import androiddev.libs.updater.updater_client.generated.resources.updater_btn_retry
import androiddev.libs.updater.updater_client.generated.resources.updater_changelog_empty
import androiddev.libs.updater.updater_client.generated.resources.updater_changelog_title
import androiddev.libs.updater.updater_client.generated.resources.updater_desc_permission
import androiddev.libs.updater.updater_client.generated.resources.updater_download_progress
import androiddev.libs.updater.updater_client.generated.resources.updater_title_available
import androiddev.libs.updater.updater_client.generated.resources.updater_title_downloading
import androiddev.libs.updater.updater_client.generated.resources.updater_title_error
import androiddev.libs.updater.updater_client.generated.resources.updater_title_not_found
import androiddev.libs.updater.updater_client.generated.resources.updater_title_permission
import androiddev.libs.updater.updater_client.generated.resources.updater_title_ready
import androidx.compose.animation.AnimatedContent
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
@@ -52,7 +53,7 @@ fun UpdateBottomSheet(
confirmValueChange = { state !is UpdateState.UpdateAvailable || !(state as UpdateState.UpdateAvailable).isForceUpdate }
)
val isVisible = remember(state) { state !is UpdateState.Idle && state !is UpdateState.UpToDate }
val isVisible = remember(state) { state !is UpdateState.Idle }
if (isVisible) {
ModalBottomSheet(
@@ -87,6 +88,9 @@ fun UpdateBottomSheet(
message = currentState.message,
onRetryClick = { component.checkUpdates() }
)
is UpdateState.UpToDate -> {
UpdateNotFoundContent(onSkip = { component.reset() })
}
else -> Unit
}
}
@@ -96,7 +100,7 @@ fun UpdateBottomSheet(
@Composable
private fun UpdateCheckingContent() {
Loading(Modifier.fillMaxSize())
Loading(Modifier.fillMaxWidth())
}
@Composable
@@ -192,6 +196,23 @@ private fun UpdateReadyContent(
}
}
@Composable
private fun UpdateNotFoundContent(
onSkip: () -> Unit,
modifier: Modifier = Modifier
) {
Column(
modifier = modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
Text(text = stringResource(Res.string.updater_title_not_found), style = MaterialTheme.typography.titleLarge)
Button(onClick = onSkip, modifier = Modifier.fillMaxWidth()) {
Text(stringResource(Res.string.updater_btn_close), style = MaterialTheme.typography.labelLarge)
}
}
}
@Composable
private fun UpdateErrorContent(
message: String,
+2
View File
@@ -0,0 +1,2 @@
/build
/bin
@@ -0,0 +1,16 @@
plugins {
alias(libs.plugins.convention.kmp)
alias(libs.plugins.convention.android.lib)
alias(libs.plugins.convention.serialization)
}
kotlin {
sourceSets {
val commonMain by getting {
dependencies {
implementation(project(":libs:base"))
}
}
}
android { namespace = "ru.shadowsparky.updater.common" }
}
@@ -0,0 +1,9 @@
package ru.shadowsparky.updater.domain
interface UpdateFetcher {
suspend fun fetch(versionCode: Long): UpdateInfo
companion object {
const val ARG_VERSION_CODE = "versionCode"
}
}