diff --git a/app/src/main/java/com/sadellie/unitto/screens/main/MainScreen.kt b/app/src/main/java/com/sadellie/unitto/screens/main/MainScreen.kt index f3a8de26..c0f6f9dd 100644 --- a/app/src/main/java/com/sadellie/unitto/screens/main/MainScreen.kt +++ b/app/src/main/java/com/sadellie/unitto/screens/main/MainScreen.kt @@ -115,7 +115,7 @@ private fun MainScreenContent( outputValue = mainScreenUIState.resultValue, unitFrom = mainScreenUIState.unitFrom, unitTo = mainScreenUIState.unitTo, - loadingNetwork = mainScreenUIState.showLoading, + networkLoading = mainScreenUIState.showLoading, networkError = mainScreenUIState.showError, onUnitSelectionClick = navControllerAction, swapUnits = swapMeasurements, diff --git a/app/src/main/java/com/sadellie/unitto/screens/main/MainViewModel.kt b/app/src/main/java/com/sadellie/unitto/screens/main/MainViewModel.kt index 04ad1f0e..6533d726 100644 --- a/app/src/main/java/com/sadellie/unitto/screens/main/MainViewModel.kt +++ b/app/src/main/java/com/sadellie/unitto/screens/main/MainViewModel.kt @@ -169,9 +169,6 @@ class MainViewModel @Inject constructor( * @param symbolToAdd Use 'ugly' version of symbols. */ fun processInput(symbolToAdd: String) { - // We are still loading data from network, don't accept any input yet - if (_showLoading.value) return - val lastTwoSymbols = _latestInputStack.takeLast(2) val lastSymbol: String = lastTwoSymbols.getOrNull(1) ?: lastTwoSymbols[0] val lastSecondSymbol: String? = lastTwoSymbols.getOrNull(0) @@ -362,6 +359,7 @@ class MainViewModel @Inject constructor( _unitFrom .getAndUpdate { _unitTo.value } .also { oldUnitFrom -> _unitTo.update { oldUnitFrom } } + updateCurrenciesRatesIfNeeded() } /** @@ -559,6 +557,10 @@ class MainViewModel @Inject constructor( } _showError.update { true } } finally { + /** + * Loaded, convert (this will trigger flow to call convertInput). Even if there was + * an error, it's OK and user will not see conversion result in that case. + */ _showLoading.update { false } } } @@ -575,7 +577,9 @@ class MainViewModel @Inject constructor( private fun startObserving() { viewModelScope.launch(Dispatchers.Default) { - merge(_input, _unitFrom, _unitTo, _userPrefs).collectLatest { convertInput() } + merge(_input, _unitFrom, _unitTo, _showLoading, _userPrefs).collectLatest { + convertInput() + } } } diff --git a/app/src/main/java/com/sadellie/unitto/screens/main/components/TopScreen.kt b/app/src/main/java/com/sadellie/unitto/screens/main/components/TopScreen.kt index 126d56e9..9ff6d1b6 100644 --- a/app/src/main/java/com/sadellie/unitto/screens/main/components/TopScreen.kt +++ b/app/src/main/java/com/sadellie/unitto/screens/main/components/TopScreen.kt @@ -58,7 +58,7 @@ import com.sadellie.unitto.screens.main.ConverterMode * @param outputValue Current output value (like big decimal). * @param unitFrom [AbstractUnit] on the left. * @param unitTo [AbstractUnit] on the right. - * @param loadingNetwork Are we loading data from network? Shows loading text in TextFields. + * @param networkLoading Are we loading data from network? Shows loading text in TextFields. * @param networkError Did we got errors while trying to get data from network. * @param onUnitSelectionClick Function that is called when clicking unit selection buttons. * @param swapUnits Method to swap units. @@ -72,7 +72,7 @@ fun TopScreenPart( outputValue: String, unitFrom: AbstractUnit?, unitTo: AbstractUnit?, - loadingNetwork: Boolean, + networkLoading: Boolean, networkError: Boolean, onUnitSelectionClick: (String) -> Unit, swapUnits: () -> Unit, @@ -92,8 +92,6 @@ fun TopScreenPart( modifier = Modifier.fillMaxWidth(), primaryText = { when { - loadingNetwork -> stringResource(R.string.loading_label) - networkError -> stringResource(R.string.error_label) converterMode == ConverterMode.BASE -> inputValue.uppercase() else -> Formatter.format(inputValue) } @@ -106,7 +104,7 @@ fun TopScreenPart( modifier = Modifier.fillMaxWidth(), primaryText = { when { - loadingNetwork -> stringResource(R.string.loading_label) + networkLoading -> stringResource(R.string.loading_label) networkError -> stringResource(R.string.error_label) converterMode == ConverterMode.BASE -> outputValue.uppercase() else -> Formatter.format(outputValue)