Simple domain module

This commit is contained in:
Syer10
2022-06-30 11:11:01 -04:00
parent 873f3715a6
commit c97528e0bf
33 changed files with 240 additions and 110 deletions

View File

@@ -14,6 +14,7 @@ dependencies {
implementation(projects.core)
implementation(projects.i18n)
implementation(projects.data)
implementation(projects.domain)
implementation(projects.uiCore)
implementation(projects.presentation)

View File

@@ -9,7 +9,7 @@ package ca.gosyer.jui.android
import android.annotation.SuppressLint
import android.content.Context
import ca.gosyer.jui.core.di.AppScope
import ca.gosyer.jui.data.DataComponent
import ca.gosyer.jui.domain.DomainComponent
import ca.gosyer.jui.ui.base.UiComponent
import me.tatarka.inject.annotations.Component
import me.tatarka.inject.annotations.Provides
@@ -20,7 +20,7 @@ abstract class AppComponent(
@get:AppScope
@get:Provides
val context: Context
) : DataComponent, UiComponent {
) : DomainComponent, UiComponent {
abstract val appMigrations: AppMigrations

View File

@@ -5,7 +5,7 @@ import androidx.activity.compose.setContent
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.runtime.CompositionLocalProvider
import ca.gosyer.jui.android.data.download.AndroidDownloadService
import ca.gosyer.jui.data.base.WebsocketService.Actions
import ca.gosyer.jui.domain.base.WebsocketService.Actions
import ca.gosyer.jui.ui.base.theme.AppTheme
import ca.gosyer.jui.ui.main.MainMenu

View File

@@ -20,13 +20,13 @@ import ca.gosyer.jui.android.util.notificationManager
import ca.gosyer.jui.core.lang.chop
import ca.gosyer.jui.core.lang.throwIfCancellation
import ca.gosyer.jui.core.prefs.getAsFlow
import ca.gosyer.jui.data.base.WebsocketService.Actions
import ca.gosyer.jui.data.base.WebsocketService.Status
import ca.gosyer.jui.data.download.DownloadService
import ca.gosyer.jui.data.download.DownloadService.Companion.status
import ca.gosyer.jui.data.download.model.DownloadState
import ca.gosyer.jui.data.download.model.DownloadStatus
import ca.gosyer.jui.data.server.requests.downloadsQuery
import ca.gosyer.jui.domain.base.WebsocketService.Actions
import ca.gosyer.jui.domain.base.WebsocketService.Status
import ca.gosyer.jui.domain.download.DownloadService
import ca.gosyer.jui.domain.download.DownloadService.Companion.status
import ca.gosyer.jui.i18n.MR
import dev.icerock.moko.resources.desc.desc
import dev.icerock.moko.resources.format

View File

@@ -18,7 +18,7 @@ import ca.gosyer.jui.android.AppComponent
import ca.gosyer.jui.android.data.notification.Notifications
import ca.gosyer.jui.android.util.notificationBuilder
import ca.gosyer.jui.android.util.notificationManager
import ca.gosyer.jui.data.update.UpdateChecker.Update
import ca.gosyer.jui.domain.update.UpdateChecker.Update
import ca.gosyer.jui.i18n.MR
import dev.icerock.moko.resources.desc.desc
import kotlinx.coroutines.flow.singleOrNull

View File

@@ -9,18 +9,14 @@ package ca.gosyer.jui.data
import ca.gosyer.jui.core.di.AppScope
import ca.gosyer.jui.core.prefs.PreferenceStoreFactory
import ca.gosyer.jui.data.catalog.CatalogPreferences
import ca.gosyer.jui.data.download.DownloadService
import ca.gosyer.jui.data.extension.ExtensionPreferences
import ca.gosyer.jui.data.library.LibraryPreferences
import ca.gosyer.jui.data.library.LibraryUpdateService
import ca.gosyer.jui.data.migration.MigrationPreferences
import ca.gosyer.jui.data.migration.Migrations
import ca.gosyer.jui.data.reader.ReaderPreferences
import ca.gosyer.jui.data.server.Http
import ca.gosyer.jui.data.server.HttpProvider
import ca.gosyer.jui.data.server.ServerPreferences
import ca.gosyer.jui.data.ui.UiPreferences
import ca.gosyer.jui.data.update.UpdateChecker
import ca.gosyer.jui.data.update.UpdatePreferences
import me.tatarka.inject.annotations.Provides
@@ -29,14 +25,6 @@ actual interface DataComponent {
val httpProvider: HttpProvider
val downloadService: DownloadService
val libraryUpdateService: LibraryUpdateService
val migrations: Migrations
val updateChecker: UpdateChecker
val http: Http
val serverPreferences: ServerPreferences
@@ -102,25 +90,5 @@ actual interface DataComponent {
val httpFactory: Http
get() = httpProvider.get(serverPreferences)
@get:AppScope
@get:Provides
val libraryUpdateServiceFactory: LibraryUpdateService
get() = LibraryUpdateService(serverPreferences, http)
@get:AppScope
@get:Provides
val downloadServiceFactory: DownloadService
get() = DownloadService(serverPreferences, http)
@get:AppScope
@get:Provides
val migrationsFactory: Migrations
get() = Migrations(migrationPreferences, readerPreferences)
@get:AppScope
@get:Provides
val updateCheckerFactory: UpdateChecker
get() = UpdateChecker(updatePreferences, http)
companion object
}

View File

@@ -9,20 +9,15 @@ package ca.gosyer.jui.data
import ca.gosyer.jui.core.di.AppScope
import ca.gosyer.jui.core.prefs.PreferenceStoreFactory
import ca.gosyer.jui.data.catalog.CatalogPreferences
import ca.gosyer.jui.data.download.DownloadService
import ca.gosyer.jui.data.extension.ExtensionPreferences
import ca.gosyer.jui.data.library.LibraryPreferences
import ca.gosyer.jui.data.library.LibraryUpdateService
import ca.gosyer.jui.data.migration.MigrationPreferences
import ca.gosyer.jui.data.migration.Migrations
import ca.gosyer.jui.data.reader.ReaderPreferences
import ca.gosyer.jui.data.server.Http
import ca.gosyer.jui.data.server.HttpProvider
import ca.gosyer.jui.data.server.ServerHostPreferences
import ca.gosyer.jui.data.server.ServerPreferences
import ca.gosyer.jui.data.server.ServerService
import ca.gosyer.jui.data.ui.UiPreferences
import ca.gosyer.jui.data.update.UpdateChecker
import ca.gosyer.jui.data.update.UpdatePreferences
import me.tatarka.inject.annotations.Provides
@@ -31,16 +26,6 @@ actual interface DataComponent {
val httpProvider: HttpProvider
val downloadService: DownloadService
val libraryUpdateService: LibraryUpdateService
val migrations: Migrations
val updateChecker: UpdateChecker
val serverService: ServerService
val http: Http
val serverHostPreferences: ServerHostPreferences
@@ -113,30 +98,5 @@ actual interface DataComponent {
val httpFactory: Http
get() = httpProvider.get(serverPreferences)
@get:AppScope
@get:Provides
val serverServiceFactory: ServerService
get() = ServerService(serverHostPreferences)
@get:AppScope
@get:Provides
val libraryUpdateServiceFactory: LibraryUpdateService
get() = LibraryUpdateService(serverPreferences, http)
@get:AppScope
@get:Provides
val downloadServiceFactory: DownloadService
get() = DownloadService(serverPreferences, http)
@get:AppScope
@get:Provides
val migrationsFactory: Migrations
get() = Migrations(migrationPreferences, readerPreferences)
@get:AppScope
@get:Provides
val updateCheckerFactory: UpdateChecker
get() = UpdateChecker(updatePreferences, http)
companion object
}

View File

@@ -21,6 +21,7 @@ dependencies {
implementation(projects.core)
implementation(projects.i18n)
implementation(projects.data)
implementation(projects.domain)
implementation(projects.uiCore)
implementation(projects.presentation)

View File

@@ -7,14 +7,14 @@
package ca.gosyer.jui.desktop
import ca.gosyer.jui.core.di.AppScope
import ca.gosyer.jui.data.DataComponent
import ca.gosyer.jui.domain.DomainComponent
import ca.gosyer.jui.ui.base.UiComponent
import me.tatarka.inject.annotations.Component
import me.tatarka.inject.annotations.Provides
@AppScope
@Component
abstract class AppComponent : DataComponent, UiComponent {
abstract class AppComponent : DomainComponent, UiComponent {
abstract val appMigrations: AppMigrations

View File

@@ -0,0 +1,81 @@
@Suppress("DSL_SCOPE_VIOLATION")
plugins {
id(libs.plugins.kotlin.multiplatform.get().pluginId)
id(libs.plugins.kotlin.serialization.get().pluginId)
id(libs.plugins.android.library.get().pluginId)
id(libs.plugins.ksp.get().pluginId)
id(libs.plugins.buildkonfig.get().pluginId)
id(libs.plugins.kotlinter.get().pluginId)
}
kotlin {
android {
compilations {
all {
kotlinOptions.jvmTarget = Config.androidJvmTarget.toString()
}
}
}
jvm("desktop") {
compilations {
all {
kotlinOptions.jvmTarget = Config.desktopJvmTarget.toString()
}
}
}
sourceSets {
all {
languageSettings {
optIn("kotlin.RequiresOptIn")
optIn("kotlinx.coroutines.ExperimentalCoroutinesApi")
}
}
val commonMain by getting {
dependencies {
api(kotlin("stdlib-common"))
api(libs.coroutines.core)
api(libs.serialization.json)
api(libs.kotlinInject.runtime)
api(libs.ktor.core)
api(libs.ktor.websockets)
api(libs.okio)
api(libs.dateTime)
api(projects.core)
api(projects.i18n)
api(projects.data)
}
}
val commonTest by getting {
dependencies {
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))
}
}
val desktopMain by getting {
dependencies {
api(kotlin("stdlib-jdk8"))
}
}
val desktopTest by getting {
}
val androidMain by getting {
dependencies {
api(kotlin("stdlib-jdk8"))
}
}
val androidTest by getting {
}
}
}
dependencies {
add("kspDesktop", libs.kotlinInject.compiler)
add("kspAndroid", libs.kotlinInject.compiler)
}
buildkonfig {
packageName = "ca.gosyer.jui.domain.build"
}

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="ca.gosyer.jui.domain"/>

View File

@@ -0,0 +1,46 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package ca.gosyer.jui.domain
import ca.gosyer.jui.core.di.AppScope
import ca.gosyer.jui.data.DataComponent
import ca.gosyer.jui.domain.download.DownloadService
import ca.gosyer.jui.domain.library.LibraryUpdateService
import ca.gosyer.jui.domain.migration.RunMigrations
import ca.gosyer.jui.domain.update.UpdateChecker
import me.tatarka.inject.annotations.Provides
actual interface DomainComponent : DataComponent {
val downloadService: DownloadService
val libraryUpdateService: LibraryUpdateService
val migrations: RunMigrations
val updateChecker: UpdateChecker
@get:AppScope
@get:Provides
val libraryUpdateServiceFactory: LibraryUpdateService
get() = LibraryUpdateService(serverPreferences, http)
@get:AppScope
@get:Provides
val downloadServiceFactory: DownloadService
get() = DownloadService(serverPreferences, http)
@get:AppScope
@get:Provides
val migrationsFactory: RunMigrations
get() = RunMigrations(migrationPreferences, readerPreferences)
@get:AppScope
@get:Provides
val updateCheckerFactory: UpdateChecker
get() = UpdateChecker(updatePreferences, http)
}

View File

@@ -0,0 +1,9 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package ca.gosyer.jui.domain
expect interface DomainComponent

View File

@@ -4,7 +4,7 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package ca.gosyer.jui.data.base
package ca.gosyer.jui.domain.base
import ca.gosyer.jui.core.lang.throwIfCancellation
import ca.gosyer.jui.data.server.Http

View File

@@ -4,15 +4,15 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package ca.gosyer.jui.data.download
package ca.gosyer.jui.domain.download
import ca.gosyer.jui.data.base.WebsocketService
import ca.gosyer.jui.data.download.model.DownloadChapter
import ca.gosyer.jui.data.download.model.DownloadStatus
import ca.gosyer.jui.data.download.model.DownloaderStatus
import ca.gosyer.jui.data.server.Http
import ca.gosyer.jui.data.server.ServerPreferences
import ca.gosyer.jui.data.server.requests.downloadsQuery
import ca.gosyer.jui.domain.base.WebsocketService
import io.ktor.websocket.Frame
import io.ktor.websocket.readText
import kotlinx.coroutines.flow.MutableStateFlow

View File

@@ -4,13 +4,13 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package ca.gosyer.jui.data.library
package ca.gosyer.jui.domain.library
import ca.gosyer.jui.data.base.WebsocketService
import ca.gosyer.jui.data.library.model.UpdateStatus
import ca.gosyer.jui.data.server.Http
import ca.gosyer.jui.data.server.ServerPreferences
import ca.gosyer.jui.data.server.requests.updatesQuery
import ca.gosyer.jui.domain.base.WebsocketService
import io.ktor.websocket.Frame
import io.ktor.websocket.readText
import kotlinx.coroutines.flow.MutableStateFlow

View File

@@ -4,13 +4,14 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package ca.gosyer.jui.data.migration
package ca.gosyer.jui.domain.migration
import ca.gosyer.jui.data.build.BuildKonfig
import ca.gosyer.jui.data.migration.MigrationPreferences
import ca.gosyer.jui.data.reader.ReaderPreferences
import ca.gosyer.jui.domain.build.BuildKonfig
import me.tatarka.inject.annotations.Inject
class Migrations @Inject constructor(
class RunMigrations @Inject constructor(
private val migrationPreferences: MigrationPreferences,
private val readerPreferences: ReaderPreferences
) {

View File

@@ -4,9 +4,11 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package ca.gosyer.jui.data.reader
package ca.gosyer.jui.domain.reader
import ca.gosyer.jui.core.prefs.getAsFlow
import ca.gosyer.jui.data.reader.ReaderModePreferences
import ca.gosyer.jui.data.reader.ReaderPreferences
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.MutableStateFlow

View File

@@ -4,12 +4,13 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package ca.gosyer.jui.data.update
package ca.gosyer.jui.domain.update
import ca.gosyer.jui.core.lang.IO
import ca.gosyer.jui.data.build.BuildKonfig
import ca.gosyer.jui.data.server.Http
import ca.gosyer.jui.data.update.UpdatePreferences
import ca.gosyer.jui.data.update.model.GithubRelease
import ca.gosyer.jui.domain.build.BuildKonfig
import io.ktor.client.call.body
import io.ktor.client.request.get
import kotlinx.coroutines.Dispatchers

View File

@@ -0,0 +1,55 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package ca.gosyer.jui.domain
import ca.gosyer.jui.core.di.AppScope
import ca.gosyer.jui.data.DataComponent
import ca.gosyer.jui.domain.download.DownloadService
import ca.gosyer.jui.domain.library.LibraryUpdateService
import ca.gosyer.jui.domain.migration.RunMigrations
import ca.gosyer.jui.domain.server.ServerService
import ca.gosyer.jui.domain.update.UpdateChecker
import me.tatarka.inject.annotations.Provides
actual interface DomainComponent : DataComponent {
val downloadService: DownloadService
val libraryUpdateService: LibraryUpdateService
val migrations: RunMigrations
val updateChecker: UpdateChecker
val serverService: ServerService
@get:AppScope
@get:Provides
val serverServiceFactory: ServerService
get() = ServerService(serverHostPreferences)
@get:AppScope
@get:Provides
val libraryUpdateServiceFactory: LibraryUpdateService
get() = LibraryUpdateService(serverPreferences, http)
@get:AppScope
@get:Provides
val downloadServiceFactory: DownloadService
get() = DownloadService(serverPreferences, http)
@get:AppScope
@get:Provides
val migrationsFactory: RunMigrations
get() = RunMigrations(migrationPreferences, readerPreferences)
@get:AppScope
@get:Provides
val updateCheckerFactory: UpdateChecker
get() = UpdateChecker(updatePreferences, http)
}

View File

@@ -4,12 +4,13 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package ca.gosyer.jui.data.server
package ca.gosyer.jui.domain.server
import ca.gosyer.jui.core.io.copyTo
import ca.gosyer.jui.core.io.userDataDir
import ca.gosyer.jui.core.lang.withIOContext
import ca.gosyer.jui.data.build.BuildKonfig
import ca.gosyer.jui.data.server.ServerHostPreferences
import ca.gosyer.jui.domain.build.BuildKonfig
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.DelicateCoroutinesApi

View File

@@ -57,6 +57,7 @@ kotlin {
api(projects.core)
api(projects.i18n)
api(projects.data)
api(projects.domain)
api(projects.uiCore)
api(compose.desktop.currentOs)
api(compose("org.jetbrains.compose.ui:ui-util"))

View File

@@ -8,8 +8,8 @@ package ca.gosyer.jui.ui.downloads
import android.content.Intent
import androidx.core.content.ContextCompat
import ca.gosyer.jui.data.base.WebsocketService
import ca.gosyer.jui.data.download.DownloadService
import ca.gosyer.jui.domain.base.WebsocketService
import ca.gosyer.jui.domain.download.DownloadService
import ca.gosyer.jui.uicore.vm.ContextWrapper
internal actual fun startDownloadService(

View File

@@ -6,8 +6,8 @@
package ca.gosyer.jui.ui.downloads
import ca.gosyer.jui.data.base.WebsocketService
import ca.gosyer.jui.data.download.DownloadService
import ca.gosyer.jui.domain.base.WebsocketService
import ca.gosyer.jui.domain.download.DownloadService
import ca.gosyer.jui.uicore.vm.ContextWrapper
internal expect fun startDownloadService(

View File

@@ -6,11 +6,11 @@
package ca.gosyer.jui.ui.downloads
import ca.gosyer.jui.data.base.WebsocketService.Actions
import ca.gosyer.jui.data.download.DownloadService
import ca.gosyer.jui.data.models.Chapter
import ca.gosyer.jui.data.server.interactions.ChapterInteractionHandler
import ca.gosyer.jui.data.server.interactions.DownloadInteractionHandler
import ca.gosyer.jui.domain.base.WebsocketService.Actions
import ca.gosyer.jui.domain.download.DownloadService
import ca.gosyer.jui.uicore.vm.ContextWrapper
import ca.gosyer.jui.uicore.vm.ViewModel
import kotlinx.coroutines.CoroutineScope

View File

@@ -9,8 +9,8 @@ package ca.gosyer.jui.ui.main.about
import ca.gosyer.jui.data.base.DateHandler
import ca.gosyer.jui.data.models.About
import ca.gosyer.jui.data.server.interactions.SettingsInteractionHandler
import ca.gosyer.jui.data.update.UpdateChecker
import ca.gosyer.jui.data.update.UpdateChecker.Update
import ca.gosyer.jui.domain.update.UpdateChecker
import ca.gosyer.jui.domain.update.UpdateChecker.Update
import ca.gosyer.jui.uicore.vm.ContextWrapper
import ca.gosyer.jui.uicore.vm.ViewModel
import kotlinx.coroutines.flow.MutableSharedFlow

View File

@@ -32,7 +32,7 @@ import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.unit.dp
import androidx.compose.ui.util.fastForEach
import ca.gosyer.jui.data.models.About
import ca.gosyer.jui.data.update.UpdateChecker
import ca.gosyer.jui.domain.update.UpdateChecker
import ca.gosyer.jui.i18n.MR
import ca.gosyer.jui.presentation.build.BuildKonfig
import ca.gosyer.jui.ui.base.navigation.Toolbar

View File

@@ -19,8 +19,8 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import ca.gosyer.jui.data.base.WebsocketService
import ca.gosyer.jui.data.download.model.DownloaderStatus
import ca.gosyer.jui.domain.base.WebsocketService
import ca.gosyer.jui.i18n.MR
import ca.gosyer.jui.ui.downloads.DownloadsScreenViewModel
import ca.gosyer.jui.uicore.resources.stringResource

View File

@@ -8,7 +8,6 @@ package ca.gosyer.jui.ui.manga
import ca.gosyer.jui.core.lang.withIOContext
import ca.gosyer.jui.data.base.DateHandler
import ca.gosyer.jui.data.download.DownloadService
import ca.gosyer.jui.data.models.Category
import ca.gosyer.jui.data.models.Chapter
import ca.gosyer.jui.data.models.Manga
@@ -17,6 +16,7 @@ import ca.gosyer.jui.data.server.interactions.ChapterInteractionHandler
import ca.gosyer.jui.data.server.interactions.LibraryInteractionHandler
import ca.gosyer.jui.data.server.interactions.MangaInteractionHandler
import ca.gosyer.jui.data.ui.UiPreferences
import ca.gosyer.jui.domain.download.DownloadService
import ca.gosyer.jui.ui.base.chapter.ChapterDownloadItem
import ca.gosyer.jui.uicore.vm.ContextWrapper
import ca.gosyer.jui.uicore.vm.ViewModel

View File

@@ -11,11 +11,11 @@ import ca.gosyer.jui.core.prefs.getAsFlow
import ca.gosyer.jui.data.models.Chapter
import ca.gosyer.jui.data.models.Manga
import ca.gosyer.jui.data.models.MangaMeta
import ca.gosyer.jui.data.reader.ReaderModeWatch
import ca.gosyer.jui.data.reader.ReaderPreferences
import ca.gosyer.jui.data.reader.model.Direction
import ca.gosyer.jui.data.server.interactions.ChapterInteractionHandler
import ca.gosyer.jui.data.server.interactions.MangaInteractionHandler
import ca.gosyer.jui.domain.reader.ReaderModeWatch
import ca.gosyer.jui.ui.reader.model.MoveTo
import ca.gosyer.jui.ui.reader.model.Navigation
import ca.gosyer.jui.ui.reader.model.PageMove

View File

@@ -10,10 +10,10 @@ import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateMapOf
import androidx.compose.runtime.snapshotFlow
import androidx.compose.runtime.snapshots.SnapshotStateList
import ca.gosyer.jui.data.download.DownloadService
import ca.gosyer.jui.data.models.Chapter
import ca.gosyer.jui.data.server.interactions.ChapterInteractionHandler
import ca.gosyer.jui.data.server.interactions.UpdatesInteractionHandler
import ca.gosyer.jui.domain.download.DownloadService
import ca.gosyer.jui.ui.base.chapter.ChapterDownloadItem
import ca.gosyer.jui.uicore.vm.ContextWrapper
import ca.gosyer.jui.uicore.vm.ViewModel

View File

@@ -6,8 +6,8 @@
package ca.gosyer.jui.ui.downloads
import ca.gosyer.jui.data.base.WebsocketService
import ca.gosyer.jui.data.download.DownloadService
import ca.gosyer.jui.domain.base.WebsocketService
import ca.gosyer.jui.domain.download.DownloadService
import ca.gosyer.jui.uicore.vm.ContextWrapper
internal actual fun startDownloadService(

View File

@@ -21,6 +21,7 @@ include("desktop")
include("core")
include("i18n")
include("data")
include("domain")
include("ui-core")
include("presentation")
include("android")