diff options
| author | Albin <albin@mullvad.net> | 2022-09-12 16:23:41 +0200 |
|---|---|---|
| committer | Albin <albin@mullvad.net> | 2022-09-12 16:23:41 +0200 |
| commit | c5d2534ba7724c2d254f98c295b17a2d91a08f55 (patch) | |
| tree | 7263cfb97415eac5c5549d76c0863fcefaeb8808 | |
| parent | e84c3b9f737a5bcf850f1de1710f7d95e1d7462d (diff) | |
| parent | cdd6481caadaf841caccb807fb7e5278a40e27ff (diff) | |
| download | mullvadvpn-c5d2534ba7724c2d254f98c295b17a2d91a08f55.tar.xz mullvadvpn-c5d2534ba7724c2d254f98c295b17a2d91a08f55.zip | |
Merge branch 'sort-android-device-list-by-creation-date'
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>, } |
