diff --git a/common/src/main/kotlin/org/wycliffeassociates/otter/common/domain/theme/AppTheme.kt b/common/src/main/kotlin/org/wycliffeassociates/otter/common/domain/theme/AppTheme.kt index d7ced4ebd4..230af7338b 100644 --- a/common/src/main/kotlin/org/wycliffeassociates/otter/common/domain/theme/AppTheme.kt +++ b/common/src/main/kotlin/org/wycliffeassociates/otter/common/domain/theme/AppTheme.kt @@ -27,10 +27,8 @@ import javax.inject.Inject class AppTheme @Inject constructor( private val appPrefRepo: IAppPreferencesRepository ) { - val preferredTheme: Single = Single.just(ColorTheme.LIGHT) - /* TODO: uncomment the line below when dark mode is supported: - * // get() = preferredTheme() - */ + val preferredTheme: Single + get() = preferredTheme() private fun preferredTheme(): Single { return appPrefRepo.appTheme() diff --git a/jvm/workbookapp/src/main/kotlin/org/wycliffeassociates/otter/jvm/workbookapp/ui/components/drawer/SettingsView.kt b/jvm/workbookapp/src/main/kotlin/org/wycliffeassociates/otter/jvm/workbookapp/ui/components/drawer/SettingsView.kt index dae5eea34a..a82f76de2d 100644 --- a/jvm/workbookapp/src/main/kotlin/org/wycliffeassociates/otter/jvm/workbookapp/ui/components/drawer/SettingsView.kt +++ b/jvm/workbookapp/src/main/kotlin/org/wycliffeassociates/otter/jvm/workbookapp/ui/components/drawer/SettingsView.kt @@ -149,8 +149,15 @@ class SettingsView : View() { vbox { addClass("app-drawer__section") - label(messages["playbackSettings"]).apply { - addClass("app-drawer__subtitle--small") + hbox { + spacing = 10.0 + label(messages["playbackSettings"]).apply { + addClass("app-drawer__subtitle--small") + } + progressindicator { + prefWidth = 25.0 + prefHeight = 25.0 + } } combobox(viewModel.selectedOutputDeviceProperty, viewModel.outputDevices) { @@ -174,8 +181,15 @@ class SettingsView : View() { } } - label(messages["recordSettings"]).apply { - addClass("app-drawer__subtitle--small") + hbox { + spacing = 10.0 + label(messages["recordSettings"]).apply { + addClass("app-drawer__subtitle--small") + } + progressindicator { + prefWidth = 25.0 + prefHeight = 25.0 + } } combobox(viewModel.selectedInputDeviceProperty, viewModel.inputDevices) { addClass("wa-combobox") @@ -415,9 +429,7 @@ class SettingsView : View() { // Devices are refreshed on dock and on drawer event otherwise it is not loaded the first time. subscribe> { if (it.action == DrawerEventAction.OPEN) { - viewModel.refreshDevices() - focusCloseButton() - resetUpdateLanguagesStatus() + openDrawer() } } } @@ -466,8 +478,16 @@ class SettingsView : View() { } } + private fun openDrawer() { + viewModel.refreshDevices() + focusCloseButton() + resetUpdateLanguagesStatus() + viewModel.watchForNewDevices() + } + private fun collapse() { fire(DrawerEvent(this::class, DrawerEventAction.CLOSE)) + viewModel.onDrawerCollapsed() } private fun initChangeLanguageDialog() { 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 2b53a24dc8..86ae63a0dc 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 @@ -20,6 +20,9 @@ package org.wycliffeassociates.otter.jvm.workbookapp.ui.viewmodel import com.github.thomasnield.rxkotlinfx.observeOnFx import com.jthemedetecor.OsThemeDetector +import io.reactivex.Observable +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.rxkotlin.addTo import io.reactivex.schedulers.Schedulers import javafx.beans.property.SimpleBooleanProperty import javafx.beans.property.SimpleObjectProperty @@ -41,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.util.concurrent.TimeUnit import javax.inject.Inject class SettingsViewModel : ViewModel() { @@ -80,6 +84,7 @@ class SettingsViewModel : ViewModel() { val appColorMode = SimpleObjectProperty() private val osThemeDetector = OsThemeDetector.getDetector() private val isOSDarkMode = SimpleBooleanProperty(osThemeDetector.isDark) + private val disposableDeviceWatcher = CompositeDisposable() val orientationProperty = SimpleObjectProperty() val orientationScaleProperty = orientationProperty.doubleBinding { @@ -125,6 +130,7 @@ class SettingsViewModel : ViewModel() { loadCurrentInputDevice() loadLanguageNamesUrl() loadDefaultLanguageNamesUrl() + watchForNewDevices() supportedThemes.setAll(ColorTheme.values().asList()) theme.preferredTheme @@ -259,6 +265,21 @@ class SettingsViewModel : ViewModel() { loadCurrentInputDevice() } + fun watchForNewDevices() { + disposableDeviceWatcher.clear() + Observable + .interval(2, 2, TimeUnit.SECONDS) + .subscribeOn(Schedulers.io()) + .observeOnFx() + .subscribe { + refreshDevices() + }.addTo(disposableDeviceWatcher) + } + + fun onDrawerCollapsed() { + disposableDeviceWatcher.clear() + } + fun updateLanguage(language: Language) { logger.info("Selected app language: ${language.slug}") localeLanguage.setPreferredLanguage(language)