diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 2144f1f94542..28d6a17ed1f6 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -106,7 +106,7 @@ - diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/broadcastreceiver/LocaleChangedBroadcastReceiver.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/receiver/LocaleChangedBroadcastReceiver.kt similarity index 92% rename from android/app/src/main/kotlin/net/mullvad/mullvadvpn/broadcastreceiver/LocaleChangedBroadcastReceiver.kt rename to android/app/src/main/kotlin/net/mullvad/mullvadvpn/receiver/LocaleChangedBroadcastReceiver.kt index 28199f8d500a..8969ffd14c16 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/broadcastreceiver/LocaleChangedBroadcastReceiver.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/receiver/LocaleChangedBroadcastReceiver.kt @@ -1,4 +1,4 @@ -package net.mullvad.mullvadvpn.broadcastreceiver +package net.mullvad.mullvadvpn.receiver import android.content.BroadcastReceiver import android.content.Context diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayListExtensions.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayListExtensions.kt index ea017339f6c2..6d308e3b267f 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayListExtensions.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayListExtensions.kt @@ -55,3 +55,6 @@ fun List.getRelayItemsByCodes( ): List = this.filter { codes.contains(it.id) } + this.flatMap { it.descendants() }.filter { codes.contains(it.id) } + +fun List.sortedByName() = + this.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { it.name }) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/RelayListRepository.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/RelayListRepository.kt index fbb1d70ad6f8..69a35c406ba0 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/RelayListRepository.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/RelayListRepository.kt @@ -25,7 +25,7 @@ import net.mullvad.mullvadvpn.lib.model.cities import net.mullvad.mullvadvpn.lib.model.name import net.mullvad.mullvadvpn.lib.shared.RelayLocationTranslationRepository import net.mullvad.mullvadvpn.relaylist.findByGeoLocationId -import net.mullvad.mullvadvpn.util.sortedByName +import net.mullvad.mullvadvpn.relaylist.sortedByName class RelayListRepository( private val managementService: ManagementService, @@ -36,11 +36,11 @@ class RelayListRepository( combine(managementService.relayCountries, translationRepository.translations) { countries, translations -> - countries.translateRelay(translations) + countries.translateRelays(translations) } .stateIn(CoroutineScope(dispatcher), SharingStarted.WhileSubscribed(), emptyList()) - private fun List.translateRelay( + private fun List.translateRelays( translations: Map ): List { if (translations.isEmpty()) { @@ -49,19 +49,16 @@ class RelayListRepository( return Every.list() .modify(this) { - it.copy { + it.copy { RelayItem.Location.Country.name set translations.getOrDefault(it.name, it.name) RelayItem.Location.Country.cities.every(Every.list()).name transform { cityName -> translations.getOrDefault(cityName, cityName) } - RelayItem.Location.Country.cities transform - { cities -> - cities.sortedByName { it.name } - } + RelayItem.Location.Country.cities transform { cities -> cities.sortedByName() } } } - .sortedByName { it.name } + .sortedByName() } val wireguardEndpointData: StateFlow = diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/StringExtensions.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/StringExtensions.kt index ea1adf5e3537..adc64ec41e31 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/StringExtensions.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/StringExtensions.kt @@ -14,6 +14,3 @@ fun String.removeHtmlTags(): String = Html.fromHtml(this, HtmlCompat.FROM_HTML_MODE_LEGACY).toString() fun List.trimAll() = map { it.trim() } - -fun List.sortedByName(comparator: (T) -> String) = - this.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, comparator)) diff --git a/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/RelayLocationTranslationRepository.kt b/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/RelayLocationTranslationRepository.kt index 2a2fc7b8faef..edaa0c1ebc41 100644 --- a/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/RelayLocationTranslationRepository.kt +++ b/android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/RelayLocationTranslationRepository.kt @@ -12,6 +12,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.MainScope import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.withContext @@ -26,29 +27,30 @@ class RelayLocationTranslationRepository( ) { val translations: StateFlow = localeRepository.currentLocale + .filterNotNull() .map { loadTranslations(it) } .stateIn(externalScope, SharingStarted.Eagerly, emptyMap()) - private suspend fun loadTranslations(locale: Locale?): Translations = + private suspend fun loadTranslations(locale: Locale): Translations = withContext(dispatcher) { - Logger.d("Updating translations based $locale") - if (locale == null || locale.language == DEFAULT_LANGUAGE) emptyMap() + Logger.d("Updating translations based on $locale") + if (locale.language == DEFAULT_LANGUAGE) emptyMap() else { // Load current translations val xml = context.resources.getXml(R.xml.relay_locations) - loadRelayTranslation(xml) + xml.loadRelayTranslation() } } - private fun loadRelayTranslation(xml: XmlResourceParser): Map { + private fun XmlResourceParser.loadRelayTranslation(): Map { val translation = mutableMapOf() - while (xml.eventType != XmlResourceParser.END_DOCUMENT) { - if (xml.eventType == XmlResourceParser.START_TAG && xml.name == "string") { - val key = xml.getAttributeValue(null, "name") - val value = xml.nextText() + while (this.eventType != XmlResourceParser.END_DOCUMENT) { + if (this.eventType == XmlResourceParser.START_TAG && this.name == "string") { + val key = this.getAttributeValue(null, "name") + val value = this.nextText() translation[key] = value } - xml.next() + this.next() } return translation.toMap() }