summaryrefslogtreecommitdiffhomepage
path: root/android/src/main
diff options
context:
space:
mode:
authorAleksandr Granin <aleksandr@mullvad.net>2021-03-19 20:29:03 +0100
committerAleksandr Granin <aleksandr@mullvad.net>2021-03-19 20:29:03 +0100
commitdc3bc4f879fa018d59450c645b23497b2b26de85 (patch)
tree8895e4bbe90169e18bf371a0941bd12d7c91569c /android/src/main
parent71e861965b079209646ee027b33c8f3064e09f66 (diff)
parent06cd2512ed79ba77d82bd4e4aa9fa3e569d6a2a1 (diff)
downloadmullvadvpn-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.kt2
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayNameComparator.kt35
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()
+}