Use HMPP and deduplicate a bunch of platform specific code

This commit is contained in:
Syer10
2022-08-01 22:10:22 -04:00
parent 0612c50bda
commit 85cae9608c
21 changed files with 200 additions and 445 deletions

View File

@@ -57,23 +57,28 @@ kotlin {
}
}
val desktopMain by getting {
val jvmMain by creating {
dependsOn(commonMain)
dependencies {
api(kotlin("stdlib-jdk8"))
api(libs.ktor.okHttp)
}
}
val desktopTest by getting {
}
val androidMain by getting {
val desktopMain by getting {
dependsOn(jvmMain)
dependencies {
api(kotlin("stdlib-jdk8"))
api(libs.ktor.okHttp)
}
}
val androidTest by getting {
val desktopTest by getting
val androidMain by getting {
dependsOn(jvmMain)
dependencies {
api(kotlin("stdlib-jdk8"))
}
}
val androidTest by getting
}
}

View File

@@ -6,112 +6,6 @@
package ca.gosyer.jui.domain
import ca.gosyer.jui.core.CoreComponent
import ca.gosyer.jui.core.di.AppScope
import ca.gosyer.jui.domain.download.service.DownloadService
import ca.gosyer.jui.domain.extension.service.ExtensionPreferences
import ca.gosyer.jui.domain.library.service.LibraryPreferences
import ca.gosyer.jui.domain.library.service.LibraryUpdateService
import ca.gosyer.jui.domain.migration.interactor.RunMigrations
import ca.gosyer.jui.domain.migration.service.MigrationPreferences
import ca.gosyer.jui.domain.reader.service.ReaderPreferences
import ca.gosyer.jui.domain.server.Http
import ca.gosyer.jui.domain.server.HttpProvider
import ca.gosyer.jui.domain.server.service.ServerPreferences
import ca.gosyer.jui.domain.source.service.CatalogPreferences
import ca.gosyer.jui.domain.ui.service.UiPreferences
import ca.gosyer.jui.domain.updates.interactor.UpdateChecker
import ca.gosyer.jui.domain.updates.service.UpdatePreferences
import me.tatarka.inject.annotations.Provides
actual interface DomainComponent : CoreComponent {
// Providers
val httpProvider: HttpProvider
// Factories
val migrations: RunMigrations
val updateChecker: UpdateChecker
// Singletons
val downloadService: DownloadService
val libraryUpdateService: LibraryUpdateService
val http: Http
val serverPreferences: ServerPreferences
val extensionPreferences: ExtensionPreferences
val catalogPreferences: CatalogPreferences
val libraryPreferences: LibraryPreferences
val readerPreferences: ReaderPreferences
val uiPreferences: UiPreferences
val migrationPreferences: MigrationPreferences
val updatePreferences: UpdatePreferences
@get:AppScope
@get:Provides
val serverPreferencesFactory: ServerPreferences
get() = ServerPreferences(preferenceFactory.create("server"))
@get:AppScope
@get:Provides
val extensionPreferencesFactory: ExtensionPreferences
get() = ExtensionPreferences(preferenceFactory.create("extension"))
@get:AppScope
@get:Provides
val catalogPreferencesFactory: CatalogPreferences
get() = CatalogPreferences(preferenceFactory.create("catalog"))
@get:AppScope
@get:Provides
val libraryPreferencesFactory: LibraryPreferences
get() = LibraryPreferences(preferenceFactory.create("library"))
@get:AppScope
@get:Provides
val readerPreferencesFactory: ReaderPreferences
get() = ReaderPreferences(preferenceFactory.create("reader")) { name ->
preferenceFactory.create("reader", name)
}
@get:AppScope
@get:Provides
val uiPreferencesFactory: UiPreferences
get() = UiPreferences(preferenceFactory.create("ui"))
@get:AppScope
@get:Provides
val migrationPreferencesFactory: MigrationPreferences
get() = MigrationPreferences(preferenceFactory.create("migration"))
@get:AppScope
@get:Provides
val updatePreferencesFactory: UpdatePreferences
get() = UpdatePreferences(preferenceFactory.create("update"))
@get:AppScope
@get:Provides
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)
actual interface DomainComponent : SharedDomainComponent {
companion object
}

View File

@@ -6,4 +6,4 @@
package ca.gosyer.jui.domain
expect interface DomainComponent
expect interface DomainComponent : SharedDomainComponent

View File

@@ -0,0 +1,115 @@
/*
* 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.CoreComponent
import ca.gosyer.jui.core.di.AppScope
import ca.gosyer.jui.domain.download.service.DownloadService
import ca.gosyer.jui.domain.extension.service.ExtensionPreferences
import ca.gosyer.jui.domain.library.service.LibraryPreferences
import ca.gosyer.jui.domain.library.service.LibraryUpdateService
import ca.gosyer.jui.domain.migration.interactor.RunMigrations
import ca.gosyer.jui.domain.migration.service.MigrationPreferences
import ca.gosyer.jui.domain.reader.service.ReaderPreferences
import ca.gosyer.jui.domain.server.Http
import ca.gosyer.jui.domain.server.HttpProvider
import ca.gosyer.jui.domain.server.service.ServerPreferences
import ca.gosyer.jui.domain.source.service.CatalogPreferences
import ca.gosyer.jui.domain.ui.service.UiPreferences
import ca.gosyer.jui.domain.updates.interactor.UpdateChecker
import ca.gosyer.jui.domain.updates.service.UpdatePreferences
import me.tatarka.inject.annotations.Provides
interface SharedDomainComponent : CoreComponent {
// Providers
val httpProvider: HttpProvider
// Factories
val migrations: RunMigrations
val updateChecker: UpdateChecker
// Singletons
val downloadService: DownloadService
val libraryUpdateService: LibraryUpdateService
val http: Http
val serverPreferences: ServerPreferences
val extensionPreferences: ExtensionPreferences
val catalogPreferences: CatalogPreferences
val libraryPreferences: LibraryPreferences
val readerPreferences: ReaderPreferences
val uiPreferences: UiPreferences
val migrationPreferences: MigrationPreferences
val updatePreferences: UpdatePreferences
@get:AppScope
@get:Provides
val serverPreferencesFactory: ServerPreferences
get() = ServerPreferences(preferenceFactory.create("server"))
@get:AppScope
@get:Provides
val extensionPreferencesFactory: ExtensionPreferences
get() = ExtensionPreferences(preferenceFactory.create("extension"))
@get:AppScope
@get:Provides
val catalogPreferencesFactory: CatalogPreferences
get() = CatalogPreferences(preferenceFactory.create("catalog"))
@get:AppScope
@get:Provides
val libraryPreferencesFactory: LibraryPreferences
get() = LibraryPreferences(preferenceFactory.create("library"))
@get:AppScope
@get:Provides
val readerPreferencesFactory: ReaderPreferences
get() = ReaderPreferences(preferenceFactory.create("reader")) { name ->
preferenceFactory.create("reader", name)
}
@get:AppScope
@get:Provides
val uiPreferencesFactory: UiPreferences
get() = UiPreferences(preferenceFactory.create("ui"))
@get:AppScope
@get:Provides
val migrationPreferencesFactory: MigrationPreferences
get() = MigrationPreferences(preferenceFactory.create("migration"))
@get:AppScope
@get:Provides
val updatePreferencesFactory: UpdatePreferences
get() = UpdatePreferences(preferenceFactory.create("update"))
@get:AppScope
@get:Provides
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)
}

View File

@@ -11,6 +11,7 @@ import ca.gosyer.jui.domain.server.model.Auth
import ca.gosyer.jui.domain.server.model.Proxy
import ca.gosyer.jui.domain.server.service.ServerPreferences
import io.ktor.client.HttpClient
import io.ktor.client.HttpClientConfig
import io.ktor.client.engine.HttpClientEngineConfig
import io.ktor.client.engine.HttpClientEngineFactory
import io.ktor.client.engine.ProxyBuilder
@@ -32,12 +33,15 @@ import io.ktor.client.plugins.auth.Auth as AuthPlugin
typealias Http = HttpClient
@Suppress("NO_ACTUAL_FOR_EXPECT")
expect val Engine: HttpClientEngineFactory<HttpClientEngineConfig>
expect fun HttpClientConfig<HttpClientEngineConfig>.configurePlatform()
class HttpProvider @Inject constructor() {
fun get(serverPreferences: ServerPreferences): Http {
return HttpClient(Engine) {
configurePlatform()
engine {
proxy = when (serverPreferences.proxy().get()) {
Proxy.NO_PROXY -> null

View File

@@ -6,129 +6,28 @@
package ca.gosyer.jui.domain
import ca.gosyer.jui.core.CoreComponent
import ca.gosyer.jui.core.di.AppScope
import ca.gosyer.jui.domain.download.service.DownloadService
import ca.gosyer.jui.domain.extension.service.ExtensionPreferences
import ca.gosyer.jui.domain.library.service.LibraryPreferences
import ca.gosyer.jui.domain.library.service.LibraryUpdateService
import ca.gosyer.jui.domain.migration.interactor.RunMigrations
import ca.gosyer.jui.domain.migration.service.MigrationPreferences
import ca.gosyer.jui.domain.reader.service.ReaderPreferences
import ca.gosyer.jui.domain.server.Http
import ca.gosyer.jui.domain.server.HttpProvider
import ca.gosyer.jui.domain.server.service.ServerHostPreferences
import ca.gosyer.jui.domain.server.service.ServerPreferences
import ca.gosyer.jui.domain.server.service.ServerService
import ca.gosyer.jui.domain.source.service.CatalogPreferences
import ca.gosyer.jui.domain.ui.service.UiPreferences
import ca.gosyer.jui.domain.updates.interactor.UpdateChecker
import ca.gosyer.jui.domain.updates.service.UpdatePreferences
import me.tatarka.inject.annotations.Provides
actual interface DomainComponent : CoreComponent {
// Providers
val httpProvider: HttpProvider
// Factories
val migrations: RunMigrations
val updateChecker: UpdateChecker
actual interface DomainComponent : SharedDomainComponent {
// Singletons
val downloadService: DownloadService
val libraryUpdateService: LibraryUpdateService
val serverService: ServerService
val http: Http
val serverHostPreferences: ServerHostPreferences
val serverPreferences: ServerPreferences
val extensionPreferences: ExtensionPreferences
val catalogPreferences: CatalogPreferences
val libraryPreferences: LibraryPreferences
val readerPreferences: ReaderPreferences
val uiPreferences: UiPreferences
val migrationPreferences: MigrationPreferences
val updatePreferences: UpdatePreferences
@get:AppScope
@get:Provides
val serverHostPreferencesFactory: ServerHostPreferences
get() = ServerHostPreferences(preferenceFactory.create("host"))
@get:AppScope
@get:Provides
val serverPreferencesFactory: ServerPreferences
get() = ServerPreferences(preferenceFactory.create("server"))
@get:AppScope
@get:Provides
val extensionPreferencesFactory: ExtensionPreferences
get() = ExtensionPreferences(preferenceFactory.create("extension"))
@get:AppScope
@get:Provides
val catalogPreferencesFactory: CatalogPreferences
get() = CatalogPreferences(preferenceFactory.create("catalog"))
@get:AppScope
@get:Provides
val libraryPreferencesFactory: LibraryPreferences
get() = LibraryPreferences(preferenceFactory.create("library"))
@get:AppScope
@get:Provides
val readerPreferencesFactory: ReaderPreferences
get() = ReaderPreferences(preferenceFactory.create("reader")) { name ->
preferenceFactory.create("reader", name)
}
@get:AppScope
@get:Provides
val uiPreferencesFactory: UiPreferences
get() = UiPreferences(preferenceFactory.create("ui"))
@get:AppScope
@get:Provides
val migrationPreferencesFactory: MigrationPreferences
get() = MigrationPreferences(preferenceFactory.create("migration"))
@get:AppScope
@get:Provides
val updatePreferencesFactory: UpdatePreferences
get() = UpdatePreferences(preferenceFactory.create("update"))
@get:AppScope
@get:Provides
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)
companion object
}

View File

@@ -6,9 +6,18 @@
package ca.gosyer.jui.domain.server
import io.ktor.client.HttpClientConfig
import io.ktor.client.engine.HttpClientEngineConfig
import io.ktor.client.engine.HttpClientEngineFactory
import io.ktor.client.engine.okhttp.OkHttp
import io.ktor.client.engine.okhttp.OkHttpConfig
actual val Engine: HttpClientEngineFactory<HttpClientEngineConfig>
get() = OkHttp
actual fun HttpClientConfig<HttpClientEngineConfig>.configurePlatform() {
@Suppress("UNCHECKED_CAST")
(this as HttpClientConfig<OkHttpConfig>).realConfigurePlatform()
}
private fun HttpClientConfig<OkHttpConfig>.realConfigurePlatform() {}