summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-05-19 19:56:01 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-05-28 18:40:38 +0000
commit48c8cc5d9515cdbe12d0aaf856d8a8639acb47f6 (patch)
tree5bd3299172682d0980748d2b502bf635877c9b4a /android
parentde06f0b8a83adcab742a4344c310a3aca5448a16 (diff)
downloadmullvadvpn-48c8cc5d9515cdbe12d0aaf856d8a8639acb47f6.tar.xz
mullvadvpn-48c8cc5d9515cdbe12d0aaf856d8a8639acb47f6.zip
Update `AccountCache` to look for an expiry update
Diffstat (limited to 'android')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt44
1 files changed, 39 insertions, 5 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt
index 4231ff1e40..f63ca84f58 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt
@@ -8,6 +8,13 @@ import net.mullvad.talpid.util.EventNotifier
import org.joda.time.DateTime
import org.joda.time.format.DateTimeFormat
+// Number of retry attempts to check for a changed expiry before giving up.
+// Current value will force the cache to keep fetching for about four minutes or until a new expiry
+// value is received.
+// This is only used if the expiry was invalidated and fetching a new expiry returns the same value
+// as before the invalidation.
+const val MAX_INVALIDATED_RETRIES = 7
+
class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsListener) {
companion object {
public val EXPIRY_FORMAT = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss z")
@@ -27,6 +34,8 @@ class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsList
onAccountExpiryChange.notify(value)
}
+ private var oldAccountExpiry: DateTime? = null
+
val onAccountNumberChange = EventNotifier<String?>(null)
val onAccountExpiryChange = EventNotifier<DateTime?>(null)
@@ -46,8 +55,9 @@ class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsList
val result = daemon.getAccountData(account)
if (result is GetAccountDataResult.Ok) {
- handleNewExpiry(account, result.accountData.expiry)
- break
+ if (handleNewExpiry(account, result.accountData.expiry, retryAttempt)) {
+ break
+ }
} else if (result is GetAccountDataResult.InvalidAccount) {
break
}
@@ -60,6 +70,15 @@ class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsList
}
}
+ fun invalidateAccountExpiry(accountExpiryToInvalidate: DateTime) {
+ synchronized(this) {
+ if (accountExpiry == accountExpiryToInvalidate) {
+ oldAccountExpiry = accountExpiryToInvalidate
+ fetchAccountExpiry()
+ }
+ }
+ }
+
fun onDestroy() {
settingsListener.accountNumberNotifier.unsubscribe(this)
jobTracker.cancelAllJobs()
@@ -74,11 +93,26 @@ class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsList
}
}
- private fun handleNewExpiry(accountNumberUsedForFetch: String, expiryString: String) {
+ private fun handleNewExpiry(
+ accountNumberUsedForFetch: String,
+ expiryString: String,
+ retryAttempt: Int
+ ): Boolean {
synchronized(this) {
- if (accountNumber === accountNumberUsedForFetch) {
- accountExpiry = DateTime.parse(expiryString, EXPIRY_FORMAT)
+ if (accountNumber !== accountNumberUsedForFetch) {
+ return true
+ }
+
+ val newAccountExpiry = DateTime.parse(expiryString, EXPIRY_FORMAT)
+
+ if (newAccountExpiry != oldAccountExpiry || retryAttempt >= MAX_INVALIDATED_RETRIES) {
+ accountExpiry = newAccountExpiry
+ oldAccountExpiry = null
+
+ return true
}
+
+ return false
}
}