diff --git a/app/src/main/java/com/sadellie/unitto/data/units/AllUnitsRepository.kt b/app/src/main/java/com/sadellie/unitto/data/units/AllUnitsRepository.kt index 2ba3cf55..9f1531c6 100644 --- a/app/src/main/java/com/sadellie/unitto/data/units/AllUnitsRepository.kt +++ b/app/src/main/java/com/sadellie/unitto/data/units/AllUnitsRepository.kt @@ -37,7 +37,7 @@ class AllUnitsRepository @Inject constructor() { /** * This is a collection of all available units. */ - val allUnits: List by lazy { + private val allUnits: List by lazy { mapOfCollections.values.flatten() } @@ -79,12 +79,14 @@ class AllUnitsRepository @Inject constructor() { /** * Looks for a collection of units of the given [UnitGroup]. * - * @param unitGroup Requested [UnitGroup]. If you give it null, you will likely get null. + * @param unitGroup Requested [UnitGroup] * @return List of [AbstractUnit]s. Will return null if the is no collection for the specified * [UnitGroup]. + * + * @throws [NoSuchElementException] from [Map.getValue] */ - fun getCollectionByGroup(unitGroup: UnitGroup?): List? { - return mapOfCollections[unitGroup] + fun getCollectionByGroup(unitGroup: UnitGroup): List { + return mapOfCollections.getValue(unitGroup) } /** @@ -106,11 +108,12 @@ class AllUnitsRepository @Inject constructor() { searchQuery: String, allUnitsGroups: List ): Map> { - val shownUnits: List = - allUnitsGroups.flatMap { getCollectionByGroup(it) ?: listOf() } - - var basicFilteredUnits: Sequence = - getCollectionByGroup(unitGroup = chosenUnitGroup)?.asSequence() ?: shownUnits.asSequence() + var basicFilteredUnits: Sequence = if (chosenUnitGroup == null) { + allUnits.filter { it.group in allUnitsGroups } + } else { + val collection = getCollectionByGroup(chosenUnitGroup) + collection + }.asSequence() if (favoritesOnly) { basicFilteredUnits = basicFilteredUnits.filter { it.isFavorite } @@ -159,7 +162,7 @@ class AllUnitsRepository @Inject constructor() { fun updateBasicUnitsForCurrencies( conversions: Map ) { - getCollectionByGroup(UnitGroup.CURRENCY)?.forEach { + getCollectionByGroup(UnitGroup.CURRENCY).forEach { // Getting rates from map. We set ZERO as default so that it can be skipped val rate = conversions.getOrElse(it.unitId) { BigDecimal.ZERO } // We make sure that we don't divide by zero 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 12ff240a..665733a4 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 @@ -147,8 +147,7 @@ class MainViewModel @Inject constructor( // Now setting up right unit (pair for the left one) unitTo = if (unitFrom.pairedUnit == null) { - // Dangerous btw - allUnitsRepository.getCollectionByGroup(unitFrom.group)!!.first() + allUnitsRepository.getCollectionByGroup(unitFrom.group).first() } else { allUnitsRepository.getById(unitFrom.pairedUnit!!) } diff --git a/app/src/main/java/com/sadellie/unitto/screens/second/SecondViewModel.kt b/app/src/main/java/com/sadellie/unitto/screens/second/SecondViewModel.kt index 575a1989..92b0fd1f 100644 --- a/app/src/main/java/com/sadellie/unitto/screens/second/SecondViewModel.kt +++ b/app/src/main/java/com/sadellie/unitto/screens/second/SecondViewModel.kt @@ -85,9 +85,6 @@ class SecondViewModel @Inject constructor( hideBrokenCurrencies: Boolean ) { viewModelScope.launch { - // Prevent user from seeing invalid list - uiState = uiState.copy(unitsToShow = emptyMap()) - // This is mostly not UI related stuff and viewModelScope.launch uses Dispatchers.Main // So we switch to Default withContext(Dispatchers.Default) { diff --git a/app/src/test/java/com/sadellie/unitto/data/units/AllUnitsRepositoryTest.kt b/app/src/test/java/com/sadellie/unitto/data/units/AllUnitsRepositoryTest.kt index 2bfc1f2d..019c02cf 100644 --- a/app/src/test/java/com/sadellie/unitto/data/units/AllUnitsRepositoryTest.kt +++ b/app/src/test/java/com/sadellie/unitto/data/units/AllUnitsRepositoryTest.kt @@ -25,6 +25,8 @@ class AllUnitsRepositoryTest { private val allUnitsRepository = AllUnitsRepository() + private val allUnits: List = ALL_UNIT_GROUPS.flatMap { allUnitsRepository.getCollectionByGroup(it) } + @Test fun filterAllUnitsNoFiltersLeft() { // No filters applied, empty search query, from Left side list @@ -35,7 +37,7 @@ class AllUnitsRepositoryTest { searchQuery = "", allUnitsGroups = ALL_UNIT_GROUPS ) - assertEquals(allUnitsRepository.allUnits.groupBy { it.group }, result) + assertEquals(allUnits.groupBy { it.group }, result) } @Test @@ -53,7 +55,8 @@ class AllUnitsRepositoryTest { allUnitsGroups = ALL_UNIT_GROUPS ) assertEquals( - mapOf(UnitGroup.SPEED to listOf(allUnitsRepository.getCollectionByGroup(UnitGroup.SPEED)?.first { it.unitId == MyUnitIDS.kilometer_per_hour })), + mapOf(UnitGroup.SPEED to listOf(allUnitsRepository.getCollectionByGroup(UnitGroup.SPEED) + .first { it.unitId == MyUnitIDS.kilometer_per_hour })), result ) } @@ -68,7 +71,7 @@ class AllUnitsRepositoryTest { searchQuery = "", allUnitsGroups = ALL_UNIT_GROUPS ) - assertEquals(allUnitsRepository.allUnits.filter { it.group == UnitGroup.TIME } + assertEquals(allUnits.filter { it.group == UnitGroup.TIME } .groupBy { it.group }, result) } @@ -83,7 +86,7 @@ class AllUnitsRepositoryTest { searchQuery = "", allUnitsGroups = ALL_UNIT_GROUPS ) - assertEquals(allUnitsRepository.allUnits.filter { it.unitId == MyUnitIDS.kilometer } + assertEquals(allUnits.filter { it.unitId == MyUnitIDS.kilometer } .groupBy { it.group }, result) } @@ -102,7 +105,8 @@ class AllUnitsRepositoryTest { allUnitsGroups = ALL_UNIT_GROUPS ) assertEquals( - mapOf(UnitGroup.SPEED to listOf(allUnitsRepository.getCollectionByGroup(UnitGroup.SPEED)?.first { it.unitId == MyUnitIDS.kilometer_per_hour })), + mapOf(UnitGroup.SPEED to listOf(allUnitsRepository.getCollectionByGroup(UnitGroup.SPEED) + .first { it.unitId == MyUnitIDS.kilometer_per_hour })), result ) } @@ -121,7 +125,8 @@ class AllUnitsRepositoryTest { allUnitsGroups = ALL_UNIT_GROUPS ) assertEquals( - mapOf(UnitGroup.CURRENCY to allUnitsRepository.getCollectionByGroup(UnitGroup.CURRENCY)?.filter { it.unitId != MyUnitIDS.currency_btc }), + mapOf(UnitGroup.CURRENCY to allUnitsRepository.getCollectionByGroup(UnitGroup.CURRENCY) + .filter { it.unitId != MyUnitIDS.currency_btc }), result ) } diff --git a/app/src/test/java/com/sadellie/unitto/data/units/AllUnitsTest.kt b/app/src/test/java/com/sadellie/unitto/data/units/AllUnitsTest.kt index ae0fefc2..8d1785df 100644 --- a/app/src/test/java/com/sadellie/unitto/data/units/AllUnitsTest.kt +++ b/app/src/test/java/com/sadellie/unitto/data/units/AllUnitsTest.kt @@ -354,6 +354,6 @@ class AllUnitsTest { fun after() { val unitGroup = history.keys.first() // GROUP : testedCount / totalCount - println("${unitGroup.name} : ${history[unitGroup]?.size} / ${allUnitsRepository.getCollectionByGroup(unitGroup)?.size}") + println("${unitGroup.name} : ${history[unitGroup]?.size} / ${allUnitsRepository.getCollectionByGroup(unitGroup).size}") } }