From 9254829c5d1db442faddddfeb8a1ed35a6702ed7 Mon Sep 17 00:00:00 2001 From: Eugene Date: Sat, 25 Jul 2026 21:54:24 +0300 Subject: [PATCH] backend implementation --- apps/vbox/backend/build.gradle.kts | 1 + .../vbox/backend/data/BackendUpdateFetcher.kt | 31 +++++++++++ .../vbox/backend/di/EntryPoint.kt | 7 ++- .../presentation/routing/AuthRouting.kt | 1 + .../presentation/routing/UpdateRouting.kt | 15 +++++ apps/vbox/client/androidApp/build.gradle.kts | 2 +- apps/vbox/client/shared/build.gradle.kts | 2 +- .../vbox/shared/data/VBoxUpdateFetcher.kt | 8 +-- .../updater/domain/UpdateFetcher.kt | 5 -- libs/updater/{ => updater-client}/.gitignore | 0 .../{ => updater-client}/build.gradle.kts | 1 + .../src/androidMain/AndroidManifest.xml | 0 .../updater/data/AndroidUpdateInstaller.kt | 0 .../updater/data/KtorUpdateDownloader.kt | 0 .../src/androidMain/res/xml/file_paths.xml | 0 .../composeResources/values/strings.xml | 3 + .../ru/shadowsparky/updater/UpdaterModule.kt | 0 .../updater/domain/UpdateDownloader.kt | 0 .../updater/domain/UpdateInstaller.kt | 0 .../updater/domain/UpdateInteractor.kt | 4 +- .../updater/domain/UpdateState.kt | 0 .../updater/presentation/UpdateBottomSheet.kt | 55 +++++++++++++------ .../updater/presentation/UpdateComponent.kt | 0 libs/updater/updater-common/.gitignore | 2 + libs/updater/updater-common/build.gradle.kts | 16 ++++++ .../src/commonMain/kotlin/UpdateFetcher.kt | 9 +++ .../src/commonMain/kotlin}/UpdateInfo.kt | 0 settings.gradle.kts | 3 +- 28 files changed, 130 insertions(+), 35 deletions(-) create mode 100644 apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/BackendUpdateFetcher.kt create mode 100644 apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/presentation/routing/UpdateRouting.kt delete mode 100644 libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateFetcher.kt rename libs/updater/{ => updater-client}/.gitignore (100%) rename libs/updater/{ => updater-client}/build.gradle.kts (92%) rename libs/updater/{ => updater-client}/src/androidMain/AndroidManifest.xml (100%) rename libs/updater/{ => updater-client}/src/androidMain/kotlin/ru/shadowsparky/updater/data/AndroidUpdateInstaller.kt (100%) rename libs/updater/{ => updater-client}/src/androidMain/kotlin/ru/shadowsparky/updater/data/KtorUpdateDownloader.kt (100%) rename libs/updater/{ => updater-client}/src/androidMain/res/xml/file_paths.xml (100%) rename libs/updater/{ => updater-client}/src/commonMain/composeResources/values/strings.xml (89%) rename libs/updater/{ => updater-client}/src/commonMain/kotlin/ru/shadowsparky/updater/UpdaterModule.kt (100%) rename libs/updater/{ => updater-client}/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateDownloader.kt (100%) rename libs/updater/{ => updater-client}/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateInstaller.kt (100%) rename libs/updater/{ => updater-client}/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateInteractor.kt (98%) rename libs/updater/{ => updater-client}/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateState.kt (100%) rename libs/updater/{ => updater-client}/src/commonMain/kotlin/ru/shadowsparky/updater/presentation/UpdateBottomSheet.kt (80%) rename libs/updater/{ => updater-client}/src/commonMain/kotlin/ru/shadowsparky/updater/presentation/UpdateComponent.kt (100%) create mode 100644 libs/updater/updater-common/.gitignore create mode 100644 libs/updater/updater-common/build.gradle.kts create mode 100644 libs/updater/updater-common/src/commonMain/kotlin/UpdateFetcher.kt rename libs/updater/{src/commonMain/kotlin/ru/shadowsparky/updater/domain => updater-common/src/commonMain/kotlin}/UpdateInfo.kt (100%) diff --git a/apps/vbox/backend/build.gradle.kts b/apps/vbox/backend/build.gradle.kts index 6673620..4cb8393 100644 --- a/apps/vbox/backend/build.gradle.kts +++ b/apps/vbox/backend/build.gradle.kts @@ -20,6 +20,7 @@ dependencies { implementation(project(":libs:backend-base")) implementation(project(":libs:base")) implementation(project(":libs:http-client")) + implementation(project(":libs:updater:updater-common")) implementation(libs.ktor.server.core.jvm) implementation(libs.ktor.server.host.common.jvm) diff --git a/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/BackendUpdateFetcher.kt b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/BackendUpdateFetcher.kt new file mode 100644 index 0000000..bf49363 --- /dev/null +++ b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/BackendUpdateFetcher.kt @@ -0,0 +1,31 @@ +package ru.shadowsparky.vbox.backend.data + +import kotlinx.coroutines.withContext +import kotlinx.serialization.json.Json +import org.koin.core.annotation.Factory +import ru.shadowsparky.backend.data.EnvFetcher +import ru.shadowsparky.domain.DispatcherProvider +import ru.shadowsparky.updater.domain.UpdateFetcher +import ru.shadowsparky.updater.domain.UpdateInfo +import java.io.File + +@Factory +class BackendUpdateFetcher( + private val envFetcher: EnvFetcher, + private val json: Json, + private val dispatcherProvider: DispatcherProvider +) : UpdateFetcher { + private var config: UpdateInfo? = null + + override suspend fun fetch(versionCode: Long): UpdateInfo = withContext(dispatcherProvider.io) { + config?.let { return@withContext it } + val configPath = envFetcher.get("UPDATE_CONFIG") + if (configPath.isBlank()) { + UpdateInfo() + } else { + json.decodeFromString(File(configPath).readText()).apply { + config = this + } + } + } +} diff --git a/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/di/EntryPoint.kt b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/di/EntryPoint.kt index 2b0458a..26afab3 100644 --- a/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/di/EntryPoint.kt +++ b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/di/EntryPoint.kt @@ -1,12 +1,13 @@ package ru.shadowsparky.vbox.backend.di -import kotlinx.serialization.json.Json import org.koin.core.annotation.Named import org.koin.core.annotation.Single import ru.shadowsparky.backend.data.TokenVerifier import ru.shadowsparky.backend.domain.JwtInfo import ru.shadowsparky.backend.domain.LoginVerifier +import ru.shadowsparky.updater.domain.UpdateFetcher import ru.shadowsparky.vbox.backend.data.BackendRemoteEventHandler +import ru.shadowsparky.vbox.backend.data.BackendUpdateFetcher import ru.shadowsparky.vbox.backend.data.auth.AuthTokenRepositoryFactory import ru.shadowsparky.vbox.backend.data.tags.MovieTagRepositoryFactory import ru.shadowsparky.vbox.backend.data.tags.UserTagRepositoryFactory @@ -22,9 +23,9 @@ class RoutingEntryPoint( val searchFactory: SearchRepositoryFactory, val recentlyFactory: RecentlyWatchedRepositoryFactory, val savedMovieFactory: SavedMovieRepositoryFactory, - val json: Json, val movieTagFactory: MovieTagRepositoryFactory, - val userTagFactory: UserTagRepositoryFactory + val userTagFactory: UserTagRepositoryFactory, + val updateFetcher: UpdateFetcher ) @Single diff --git a/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/presentation/routing/AuthRouting.kt b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/presentation/routing/AuthRouting.kt index c79825b..342142f 100644 --- a/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/presentation/routing/AuthRouting.kt +++ b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/presentation/routing/AuthRouting.kt @@ -46,5 +46,6 @@ fun Routing.setupAuthMethods( setupRecentlyWatched(recentlyFactory) setupSavedMovie(savedMovieFactory) setupTagsRouting(userTagFactory, movieTagFactory) + setupUpdates(updateFetcher) } } diff --git a/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/presentation/routing/UpdateRouting.kt b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/presentation/routing/UpdateRouting.kt new file mode 100644 index 0000000..a00a9ab --- /dev/null +++ b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/presentation/routing/UpdateRouting.kt @@ -0,0 +1,15 @@ +package ru.shadowsparky.vbox.backend.presentation.routing + +import io.ktor.server.response.respond +import io.ktor.server.routing.Routing +import io.ktor.server.routing.get +import io.ktor.server.util.getOrFail +import ru.shadowsparky.updater.domain.UpdateFetcher +import ru.shadowsparky.vbox.shared.domain.DYNAMIC_PREFIX + +fun Routing.setupUpdates(updateFetcher: UpdateFetcher) { + get("$DYNAMIC_PREFIX/checkUpdates") { + val versionCode = call.parameters.getOrFail(UpdateFetcher.ARG_VERSION_CODE).toLong() + call.respond(updateFetcher.fetch(versionCode)) + } +} diff --git a/apps/vbox/client/androidApp/build.gradle.kts b/apps/vbox/client/androidApp/build.gradle.kts index 5f599df..5ed7658 100644 --- a/apps/vbox/client/androidApp/build.gradle.kts +++ b/apps/vbox/client/androidApp/build.gradle.kts @@ -27,7 +27,7 @@ dependencies { implementation(project(":libs:ui")) implementation(project(":libs:http-client")) implementation(project(":libs:video-player")) - implementation(project(":libs:updater")) + implementation(project(":libs:updater:updater-client")) debugImplementation(libs.ui.tooling) implementation(libs.ui.tooling.preview) testImplementation(libs.koin.test) diff --git a/apps/vbox/client/shared/build.gradle.kts b/apps/vbox/client/shared/build.gradle.kts index 87931d9..a1cabb7 100644 --- a/apps/vbox/client/shared/build.gradle.kts +++ b/apps/vbox/client/shared/build.gradle.kts @@ -26,7 +26,7 @@ kotlin { implementation(project(":libs:ui")) implementation(project(":libs:http-client")) implementation(project(":libs:video-player")) - implementation(project(":libs:updater")) + implementation(project(":libs:updater:updater-client")) } androidMain.dependencies { implementation(libs.androidx.appcompat) diff --git a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/data/VBoxUpdateFetcher.kt b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/data/VBoxUpdateFetcher.kt index c527a13..b31e771 100644 --- a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/data/VBoxUpdateFetcher.kt +++ b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/data/VBoxUpdateFetcher.kt @@ -2,7 +2,6 @@ package ru.shadowsparky.vbox.shared.data import io.ktor.client.HttpClient import org.koin.core.annotation.Factory -import ru.shadowsparky.domain.AppConfig import ru.shadowsparky.updater.domain.UpdateFetcher import ru.shadowsparky.updater.domain.UpdateInfo import ru.shadowsparky.vbox.shared.domain.DYNAMIC_PREFIX @@ -12,14 +11,13 @@ import ru.shadowsparky.vbox.shared.domain.getServerConfiguration @Factory class VBoxUpdateFetcher( private val httpClient: HttpClient, - private val serverConfigurationProvider: ServerConfigurationRepository, - private val appConfig: AppConfig + private val serverConfigurationProvider: ServerConfigurationRepository ) : UpdateFetcher { - override suspend fun fetch(): UpdateInfo { + override suspend fun fetch(versionCode: Long): UpdateInfo { return httpClient.get( "$DYNAMIC_PREFIX/checkUpdates", mapOf( - "versionCode" to appConfig.versionCode.toString() + UpdateFetcher.ARG_VERSION_CODE to versionCode.toString() ), serverConfigurationProvider.getServerConfiguration() ) diff --git a/libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateFetcher.kt b/libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateFetcher.kt deleted file mode 100644 index 8f3ee22..0000000 --- a/libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateFetcher.kt +++ /dev/null @@ -1,5 +0,0 @@ -package ru.shadowsparky.updater.domain - -interface UpdateFetcher { - suspend fun fetch(): UpdateInfo -} diff --git a/libs/updater/.gitignore b/libs/updater/updater-client/.gitignore similarity index 100% rename from libs/updater/.gitignore rename to libs/updater/updater-client/.gitignore diff --git a/libs/updater/build.gradle.kts b/libs/updater/updater-client/build.gradle.kts similarity index 92% rename from libs/updater/build.gradle.kts rename to libs/updater/updater-client/build.gradle.kts index 3f660fe..bc18027 100644 --- a/libs/updater/build.gradle.kts +++ b/libs/updater/updater-client/build.gradle.kts @@ -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) } } diff --git a/libs/updater/src/androidMain/AndroidManifest.xml b/libs/updater/updater-client/src/androidMain/AndroidManifest.xml similarity index 100% rename from libs/updater/src/androidMain/AndroidManifest.xml rename to libs/updater/updater-client/src/androidMain/AndroidManifest.xml diff --git a/libs/updater/src/androidMain/kotlin/ru/shadowsparky/updater/data/AndroidUpdateInstaller.kt b/libs/updater/updater-client/src/androidMain/kotlin/ru/shadowsparky/updater/data/AndroidUpdateInstaller.kt similarity index 100% rename from libs/updater/src/androidMain/kotlin/ru/shadowsparky/updater/data/AndroidUpdateInstaller.kt rename to libs/updater/updater-client/src/androidMain/kotlin/ru/shadowsparky/updater/data/AndroidUpdateInstaller.kt diff --git a/libs/updater/src/androidMain/kotlin/ru/shadowsparky/updater/data/KtorUpdateDownloader.kt b/libs/updater/updater-client/src/androidMain/kotlin/ru/shadowsparky/updater/data/KtorUpdateDownloader.kt similarity index 100% rename from libs/updater/src/androidMain/kotlin/ru/shadowsparky/updater/data/KtorUpdateDownloader.kt rename to libs/updater/updater-client/src/androidMain/kotlin/ru/shadowsparky/updater/data/KtorUpdateDownloader.kt diff --git a/libs/updater/src/androidMain/res/xml/file_paths.xml b/libs/updater/updater-client/src/androidMain/res/xml/file_paths.xml similarity index 100% rename from libs/updater/src/androidMain/res/xml/file_paths.xml rename to libs/updater/updater-client/src/androidMain/res/xml/file_paths.xml diff --git a/libs/updater/src/commonMain/composeResources/values/strings.xml b/libs/updater/updater-client/src/commonMain/composeResources/values/strings.xml similarity index 89% rename from libs/updater/src/commonMain/composeResources/values/strings.xml rename to libs/updater/updater-client/src/commonMain/composeResources/values/strings.xml index 1364021..1e65687 100644 --- a/libs/updater/src/commonMain/composeResources/values/strings.xml +++ b/libs/updater/updater-client/src/commonMain/composeResources/values/strings.xml @@ -1,5 +1,8 @@ Доступно обновление + Обновления не найдены + Закрыть + Скачать Что нового: Улучшения производительности и исправления ошибок. diff --git a/libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/UpdaterModule.kt b/libs/updater/updater-client/src/commonMain/kotlin/ru/shadowsparky/updater/UpdaterModule.kt similarity index 100% rename from libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/UpdaterModule.kt rename to libs/updater/updater-client/src/commonMain/kotlin/ru/shadowsparky/updater/UpdaterModule.kt diff --git a/libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateDownloader.kt b/libs/updater/updater-client/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateDownloader.kt similarity index 100% rename from libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateDownloader.kt rename to libs/updater/updater-client/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateDownloader.kt diff --git a/libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateInstaller.kt b/libs/updater/updater-client/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateInstaller.kt similarity index 100% rename from libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateInstaller.kt rename to libs/updater/updater-client/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateInstaller.kt diff --git a/libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateInteractor.kt b/libs/updater/updater-client/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateInteractor.kt similarity index 98% rename from libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateInteractor.kt rename to libs/updater/updater-client/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateInteractor.kt index 0696d6f..1bd0266 100644 --- a/libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateInteractor.kt +++ b/libs/updater/updater-client/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateInteractor.kt @@ -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) diff --git a/libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateState.kt b/libs/updater/updater-client/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateState.kt similarity index 100% rename from libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateState.kt rename to libs/updater/updater-client/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateState.kt diff --git a/libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/presentation/UpdateBottomSheet.kt b/libs/updater/updater-client/src/commonMain/kotlin/ru/shadowsparky/updater/presentation/UpdateBottomSheet.kt similarity index 80% rename from libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/presentation/UpdateBottomSheet.kt rename to libs/updater/updater-client/src/commonMain/kotlin/ru/shadowsparky/updater/presentation/UpdateBottomSheet.kt index c786506..9550ec9 100644 --- a/libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/presentation/UpdateBottomSheet.kt +++ b/libs/updater/updater-client/src/commonMain/kotlin/ru/shadowsparky/updater/presentation/UpdateBottomSheet.kt @@ -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, diff --git a/libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/presentation/UpdateComponent.kt b/libs/updater/updater-client/src/commonMain/kotlin/ru/shadowsparky/updater/presentation/UpdateComponent.kt similarity index 100% rename from libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/presentation/UpdateComponent.kt rename to libs/updater/updater-client/src/commonMain/kotlin/ru/shadowsparky/updater/presentation/UpdateComponent.kt diff --git a/libs/updater/updater-common/.gitignore b/libs/updater/updater-common/.gitignore new file mode 100644 index 0000000..2f230b7 --- /dev/null +++ b/libs/updater/updater-common/.gitignore @@ -0,0 +1,2 @@ +/build +/bin \ No newline at end of file diff --git a/libs/updater/updater-common/build.gradle.kts b/libs/updater/updater-common/build.gradle.kts new file mode 100644 index 0000000..cf3872b --- /dev/null +++ b/libs/updater/updater-common/build.gradle.kts @@ -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" } +} diff --git a/libs/updater/updater-common/src/commonMain/kotlin/UpdateFetcher.kt b/libs/updater/updater-common/src/commonMain/kotlin/UpdateFetcher.kt new file mode 100644 index 0000000..2ed5c0a --- /dev/null +++ b/libs/updater/updater-common/src/commonMain/kotlin/UpdateFetcher.kt @@ -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" + } +} diff --git a/libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateInfo.kt b/libs/updater/updater-common/src/commonMain/kotlin/UpdateInfo.kt similarity index 100% rename from libs/updater/src/commonMain/kotlin/ru/shadowsparky/updater/domain/UpdateInfo.kt rename to libs/updater/updater-common/src/commonMain/kotlin/UpdateInfo.kt diff --git a/settings.gradle.kts b/settings.gradle.kts index f8cd5d7..7a44ba5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -43,4 +43,5 @@ include(":libs:base") include(":libs:ui") include(":libs:http-client") include(":libs:video-player") -include(":libs:updater") +include(":libs:updater:updater-client") +include(":libs:updater:updater-common")