diff --git a/common/src/main/kotlin/org/wycliffeassociates/otter/common/domain/languages/LanguageDataSource.kt b/common/src/main/kotlin/org/wycliffeassociates/otter/common/domain/languages/LanguageDataSource.kt index 8bd6732577..20a0e03c3b 100644 --- a/common/src/main/kotlin/org/wycliffeassociates/otter/common/domain/languages/LanguageDataSource.kt +++ b/common/src/main/kotlin/org/wycliffeassociates/otter/common/domain/languages/LanguageDataSource.kt @@ -18,7 +18,11 @@ */ package org.wycliffeassociates.otter.common.domain.languages +import com.fasterxml.jackson.core.JsonFactory +import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.fasterxml.jackson.module.kotlin.readValue +import com.fasterxml.jackson.module.kotlin.registerKotlinModule import io.reactivex.Observable import org.wycliffeassociates.otter.common.data.primitives.Language import org.wycliffeassociates.otter.common.persistence.ILanguageDataSource @@ -26,10 +30,28 @@ import org.wycliffeassociates.otter.common.persistence.LanguagesApi import retrofit2.Retrofit import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory import retrofit2.converter.jackson.JacksonConverterFactory +import java.io.File import javax.inject.Inject class LanguageDataSource @Inject constructor() : ILanguageDataSource { override fun fetchLanguageNames(url: String): Observable> { + return if (File(url).exists()) { + fetchLocalFile(url) + } else { + fetchEndpoint(url) + } + } + + private fun fetchLocalFile(path: String): Observable> { + return Observable + .fromCallable { + ObjectMapper(JsonFactory()) + .registerKotlinModule() + .readValue>(File(path)) + } + } + + private fun fetchEndpoint(url: String): Observable> { // Using localhost as a base url is a workaround, because retrofit always requires base url to be set, // even for full dynamic urls like in this case. // When retrofit sees that base url and target url are different (scheme, domain), diff --git a/jvm/workbookapp/src/main/kotlin/org/wycliffeassociates/otter/jvm/workbookapp/ui/viewmodel/SettingsViewModel.kt b/jvm/workbookapp/src/main/kotlin/org/wycliffeassociates/otter/jvm/workbookapp/ui/viewmodel/SettingsViewModel.kt index 86ae63a0dc..943c427158 100644 --- a/jvm/workbookapp/src/main/kotlin/org/wycliffeassociates/otter/jvm/workbookapp/ui/viewmodel/SettingsViewModel.kt +++ b/jvm/workbookapp/src/main/kotlin/org/wycliffeassociates/otter/jvm/workbookapp/ui/viewmodel/SettingsViewModel.kt @@ -44,6 +44,7 @@ import org.wycliffeassociates.otter.jvm.device.audio.AudioDeviceProvider import org.wycliffeassociates.otter.jvm.workbookapp.di.IDependencyGraphProvider import org.wycliffeassociates.otter.jvm.workbookapp.ui.components.drawer.ThemeColorEvent import tornadofx.* +import java.io.File import java.util.concurrent.TimeUnit import javax.inject.Inject @@ -51,12 +52,18 @@ class SettingsViewModel : ViewModel() { private val logger = LoggerFactory.getLogger(SettingsViewModel::class.java) - @Inject lateinit var audioDeviceProvider: AudioDeviceProvider - @Inject lateinit var appPrefRepository: IAppPreferencesRepository - @Inject lateinit var pluginRepository: IAudioPluginRepository - @Inject lateinit var localeLanguage: LocaleLanguage - @Inject lateinit var theme: AppTheme - @Inject lateinit var importLanguages: ImportLanguages + @Inject + lateinit var audioDeviceProvider: AudioDeviceProvider + @Inject + lateinit var appPrefRepository: IAppPreferencesRepository + @Inject + lateinit var pluginRepository: IAudioPluginRepository + @Inject + lateinit var localeLanguage: LocaleLanguage + @Inject + lateinit var theme: AppTheme + @Inject + lateinit var importLanguages: ImportLanguages private val audioPluginViewModel: AudioPluginViewModel by inject() private val workbookDataStore: WorkbookDataStore by inject() @@ -314,13 +321,23 @@ class SettingsViewModel : ViewModel() { fun updateLanguageNamesUrl() { val matchRegex = "^https?://.*".toRegex() val replaceRegex = "^h?t?t?p?s?:?/+(.*)".toRegex() - if (!matchRegex.matches(languageNamesUrlProperty.value)) { - val cleaned = languageNamesUrlProperty.value.replace(replaceRegex, "$1") - languageNamesUrlProperty.set("https://$cleaned") + val url = languageNamesUrlProperty.value + + val formattedUrl = when { + File(url).exists() -> { + File(url).invariantSeparatorsPath + } + !matchRegex.matches(url) -> { + val cleaned = url.replace(replaceRegex, "$1") + "https://$cleaned" + } + else -> url } + languageNamesUrlProperty.set(formattedUrl) + appPrefRepository - .setLanguageNamesUrl(languageNamesUrlProperty.value) + .setLanguageNamesUrl(formattedUrl) .subscribe() }