summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAlbin <albin@mullvad.net>2022-09-12 16:23:41 +0200
committerAlbin <albin@mullvad.net>2022-09-12 16:23:41 +0200
commitc5d2534ba7724c2d254f98c295b17a2d91a08f55 (patch)
tree7263cfb97415eac5c5549d76c0863fcefaeb8808
parente84c3b9f737a5bcf850f1de1710f7d95e1d7462d (diff)
parentcdd6481caadaf841caccb807fb7e5278a40e27ff (diff)
downloadmullvadvpn-c5d2534ba7724c2d254f98c295b17a2d91a08f55.tar.xz
mullvadvpn-c5d2534ba7724c2d254f98c295b17a2d91a08f55.zip
Merge branch 'sort-android-device-list-by-creation-date'
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/Device.kt9
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/AccountCache.kt13
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/StringExtensions.kt13
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/DeviceListViewModel.kt13
-rw-r--r--mullvad-types/src/device.rs2
5 files changed, 35 insertions, 15 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/Device.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/Device.kt
index ee34bc968f..b633920e7f 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/Device.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/Device.kt
@@ -1,15 +1,22 @@
package net.mullvad.mullvadvpn.model
import android.os.Parcelable
+import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
+import net.mullvad.mullvadvpn.util.parseAsDateTime
@Parcelize
data class Device(
val id: String,
val name: String,
val pubkey: ByteArray,
- val ports: ArrayList<DevicePort>
+ val ports: ArrayList<DevicePort>,
+ val created: String
) : Parcelable {
+
+ @IgnoredOnParcel
+ val creationDate by lazy { created.parseAsDateTime() }
+
// Generated by Android Studio
override fun equals(other: Any?): Boolean {
if (this === other) return true
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/AccountCache.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/AccountCache.kt
index 8d1e7dd7e7..db8b2e99d2 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/AccountCache.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/AccountCache.kt
@@ -14,14 +14,11 @@ import net.mullvad.mullvadvpn.model.AccountExpiry
import net.mullvad.mullvadvpn.model.AccountHistory
import net.mullvad.mullvadvpn.model.GetAccountDataResult
import net.mullvad.mullvadvpn.util.JobTracker
+import net.mullvad.mullvadvpn.util.parseAsDateTime
import net.mullvad.talpid.util.EventNotifier
-import org.joda.time.DateTime
-import org.joda.time.format.DateTimeFormat
class AccountCache(private val endpoint: ServiceEndpoint) {
companion object {
- private val EXPIRY_FORMAT = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss z")
-
private sealed class Command {
object CreateAccount : Command()
data class Login(val account: String) : Command()
@@ -170,7 +167,9 @@ class AccountCache(private val endpoint: ServiceEndpoint) {
private suspend fun fetchAccountExpiry(accountToken: String): AccountExpiry {
return fetchAccountData(accountToken).let { result ->
if (result is GetAccountDataResult.Ok) {
- AccountExpiry.Available(result.parseExpiryDate())
+ result.accountData.expiry.parseAsDateTime()?.let { parsedDateTime ->
+ AccountExpiry.Available(parsedDateTime)
+ } ?: AccountExpiry.Missing
} else {
AccountExpiry.Missing
}
@@ -180,8 +179,4 @@ class AccountCache(private val endpoint: ServiceEndpoint) {
private suspend fun fetchAccountData(accountToken: String): GetAccountDataResult {
return daemon.await().getAccountData(accountToken)
}
-
- private fun GetAccountDataResult.Ok.parseExpiryDate(): DateTime {
- return DateTime.parse(this.accountData.expiry, EXPIRY_FORMAT)
- }
}
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 df15c47e19..f2daffccaf 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
@@ -1,5 +1,10 @@
package net.mullvad.mullvadvpn.util
+import org.joda.time.DateTime
+import org.joda.time.format.DateTimeFormat
+
+private const val EXPIRY_FORMAT = "YYYY-MM-dd HH:mm:ss z"
+
fun String.capitalizeFirstCharOfEachWord(): String {
return split(" ")
.joinToString(" ") { word ->
@@ -7,3 +12,11 @@ fun String.capitalizeFirstCharOfEachWord(): String {
}
.trimEnd()
}
+
+fun String.parseAsDateTime(): DateTime? {
+ return try {
+ DateTime.parse(this, DateTimeFormat.forPattern(EXPIRY_FORMAT))
+ } catch (ex: Exception) {
+ null
+ }
+}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/DeviceListViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/DeviceListViewModel.kt
index 4a60508a38..4c051fcbeb 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/DeviceListViewModel.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/DeviceListViewModel.kt
@@ -51,15 +51,20 @@ class DeviceListViewModel(
} else {
cachedDeviceList
}
- val deviceUiItems = devices?.map { device ->
- DeviceListItemUiState(device, loadingDevices.any { device.id == it })
- } ?: emptyList()
+ val deviceUiItems = devices?.sortedBy { it.creationDate }?.map { device ->
+ DeviceListItemUiState(
+ device,
+ loadingDevices.any { loadingDevice ->
+ device.id == loadingDevice
+ }
+ )
+ }
val isLoading = devices == null
val stagedDevice = devices?.firstOrNull { device ->
device.id == stagedDeviceId
}
DeviceListUiState(
- deviceUiItems = deviceUiItems,
+ deviceUiItems = deviceUiItems ?: emptyList(),
isLoading = isLoading,
stagedDevice = stagedDevice
)
diff --git a/mullvad-types/src/device.rs b/mullvad-types/src/device.rs
index 5c64bdf44d..628b86b685 100644
--- a/mullvad-types/src/device.rs
+++ b/mullvad-types/src/device.rs
@@ -24,7 +24,7 @@ pub struct Device {
pub ports: Vec<DevicePort>,
#[cfg_attr(target_os = "android", jnix(skip))]
pub hijack_dns: bool,
- #[cfg_attr(target_os = "android", jnix(skip))]
+ #[cfg_attr(target_os = "android", jnix(map = "|expiry| expiry.to_string()"))]
pub created: DateTime<Utc>,
}