diff options
| author | Aleksandr Granin <aleksandr@mullvad.net> | 2021-03-19 20:29:03 +0100 |
|---|---|---|
| committer | Aleksandr Granin <aleksandr@mullvad.net> | 2021-03-19 20:29:03 +0100 |
| commit | dc3bc4f879fa018d59450c645b23497b2b26de85 (patch) | |
| tree | 8895e4bbe90169e18bf371a0941bd12d7c91569c /android/src/main | |
| parent | 71e861965b079209646ee027b33c8f3064e09f66 (diff) | |
| parent | 06cd2512ed79ba77d82bd4e4aa9fa3e569d6a2a1 (diff) | |
| download | mullvadvpn-dc3bc4f879fa018d59450c645b23497b2b26de85.tar.xz mullvadvpn-dc3bc4f879fa018d59450c645b23497b2b26de85.zip | |
Merge branch 'improve-relay-sorting'
Diffstat (limited to 'android/src/main')
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt | 2 | ||||
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayNameComparator.kt | 35 |
2 files changed, 36 insertions, 1 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt index 781155df51..aed15f9508 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayList.kt @@ -21,7 +21,7 @@ class RelayList { for (relay in validCityRelays) { relays.add(Relay(relayCity, relay.hostname, relay.active)) } - relays.sortBy({ it.name }) + relays.sortWith(RelayNameComparator) if (relays.isNotEmpty()) { cities.add(relayCity) diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayNameComparator.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayNameComparator.kt new file mode 100644 index 0000000000..32f473b194 --- /dev/null +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayNameComparator.kt @@ -0,0 +1,35 @@ +package net.mullvad.mullvadvpn.relaylist + +internal object RelayNameComparator : Comparator<Relay> { + override fun compare(o1: Relay, o2: Relay): Int { + val partitions1 = o1.name.split(regex) + val partitions2 = o2.name.split(regex) + return if (partitions1.size > partitions2.size) + partitions1 compareWith partitions2 + else + -(partitions2 compareWith partitions1) + } + + private infix fun List<String>.compareWith(other: List<String>): Int { + this.forEachIndexed { index, s -> + if (other.size <= index) + return 1 + val partsCompareResult = compareStringOrInt(other[index], s) + if (partsCompareResult != 0) + return partsCompareResult + } + return 0 + } + + private fun compareStringOrInt(s1: String, s2: String): Int { + val int1 = s1.toIntOrNull() + val int2 = s2.toIntOrNull() + return if (int1 == null || int2 == null || int1 == int2) { + s2.compareTo(s1) + } else { + int2.compareTo(int1) + } + } + + private val regex = "(?<=\\d)(?=\\D)|(?<=\\D)(?=\\d)".toRegex() +} |
