diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-05-28 15:26:39 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-05-28 15:26:39 -0300 |
| commit | 92979541abdc20125d0248902f99ee781e930dc6 (patch) | |
| tree | 91e2f3ac75fa227ee37d4c76fc9788f52a16a01f /android/src/main | |
| parent | 7b09d3c81f2e44d12c3424c19f78c71f825738f7 (diff) | |
| parent | 29c7be227ad4e7335190f0f9410a669ce0440c15 (diff) | |
| download | mullvadvpn-92979541abdc20125d0248902f99ee781e930dc6.tar.xz mullvadvpn-92979541abdc20125d0248902f99ee781e930dc6.zip | |
Merge branch 'account-cache-event-notifier'
Diffstat (limited to 'android/src/main')
7 files changed, 69 insertions, 49 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 cdd90b0d3c..4231ff1e40 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt @@ -4,6 +4,7 @@ import kotlin.math.min import kotlinx.coroutines.delay import net.mullvad.mullvadvpn.model.GetAccountDataResult import net.mullvad.mullvadvpn.util.JobTracker +import net.mullvad.talpid.util.EventNotifier import org.joda.time.DateTime import org.joda.time.format.DateTimeFormat @@ -15,16 +16,20 @@ class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsList private val jobTracker = JobTracker() private var accountNumber: String? = null - private var accountExpiry: DateTime? = null + set(value) { + field = value + onAccountNumberChange.notify(value) + } - var onAccountDataChange: ((String?, DateTime?) -> Unit)? = null + private var accountExpiry: DateTime? = null set(value) { - synchronized(this) { - field = value - notifyChange() - } + field = value + onAccountExpiryChange.notify(value) } + val onAccountNumberChange = EventNotifier<String?>(null) + val onAccountExpiryChange = EventNotifier<DateTime?>(null) + init { settingsListener.accountNumberNotifier.subscribe(this) { accountNumber -> handleNewAccountNumber(accountNumber) @@ -32,23 +37,25 @@ class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsList } fun fetchAccountExpiry() { - accountNumber?.let { account -> - jobTracker.newBackgroundJob("fetch") { - var retryAttempt = 0 + synchronized(this) { + accountNumber?.let { account -> + jobTracker.newBackgroundJob("fetch") { + var retryAttempt = 0 - do { - val result = daemon.getAccountData(account) + do { + val result = daemon.getAccountData(account) - if (result is GetAccountDataResult.Ok) { - handleNewExpiry(account, result.accountData.expiry) - break - } else if (result is GetAccountDataResult.InvalidAccount) { - break - } + if (result is GetAccountDataResult.Ok) { + handleNewExpiry(account, result.accountData.expiry) + break + } else if (result is GetAccountDataResult.InvalidAccount) { + break + } - retryAttempt += 1 - delay(calculateRetryFetchDelay(retryAttempt)) - } while (onAccountDataChange != null) + retryAttempt += 1 + delay(calculateRetryFetchDelay(retryAttempt)) + } while (onAccountExpiryChange.hasListeners()) + } } } } @@ -60,10 +67,9 @@ class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsList private fun handleNewAccountNumber(newAccountNumber: String?) { synchronized(this) { - accountNumber = newAccountNumber accountExpiry = null + accountNumber = newAccountNumber - notifyChange() fetchAccountExpiry() } } @@ -72,15 +78,10 @@ class AccountCache(val daemon: MullvadDaemon, val settingsListener: SettingsList synchronized(this) { if (accountNumber === accountNumberUsedForFetch) { accountExpiry = DateTime.parse(expiryString, EXPIRY_FORMAT) - notifyChange() } } } - private fun notifyChange() { - onAccountDataChange?.invoke(accountNumber, accountExpiry) - } - private fun calculateRetryFetchDelay(retryAttempt: Int): Long { // delay in seconds = 2 ^ retryAttempt capped at 2^13 (8192) val exponent = min(retryAttempt, 13) diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt index d01fb0edfa..3787d2bafe 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt @@ -42,20 +42,25 @@ class AccountFragment : ServiceDependentFragment(OnNoService.GoBack) { } override fun onSafelyResume() { - accountCache.onAccountDataChange = { accountNumber, accountExpiry -> - jobTracker.newUiJob("updateView") { - updateView(accountNumber, accountExpiry) + accountCache.onAccountNumberChange.subscribe(this) { accountNumber -> + jobTracker.newUiJob("updateAccountNumber") { + accountNumberView.information = accountNumber + } + } + + accountCache.onAccountExpiryChange.subscribe(this) { accountExpiry -> + jobTracker.newUiJob("updateAccountExpiry") { + updateAccountExpiry(accountExpiry) } } } override fun onSafelyPause() { - accountCache.onAccountDataChange = null + accountCache.onAccountNumberChange.unsubscribe(this) + accountCache.onAccountExpiryChange.unsubscribe(this) } - private fun updateView(accountNumber: String?, accountExpiry: DateTime?) { - accountNumberView.information = accountNumber - + private fun updateAccountExpiry(accountExpiry: DateTime?) { if (accountExpiry != null) { accountExpiryView.information = expiryFormatter.format(accountExpiry.toDate()) } else { diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt index 6b8fe59409..2a9d54f59e 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt @@ -90,7 +90,7 @@ class ConnectFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) { } } - accountCache.onAccountDataChange = { _, expiry -> + accountCache.onAccountExpiryChange.subscribe(this) { expiry -> if (expiry?.isBeforeNow() ?: false) { openOutOfTimeScreen() } else if (expiry != null) { @@ -100,10 +100,10 @@ class ConnectFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) { } override fun onSafelyPause() { - accountCache.onAccountDataChange = null locationInfoCache.onNewLocation = null relayListListener.onRelayListChange = null + accountCache.onAccountExpiryChange.unsubscribe(this) keyStatusListener.onKeyStatusChange.unsubscribe(this) connectionProxy.onUiStateChange.unsubscribe(this) diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/OutOfTimeFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/OutOfTimeFragment.kt index 8c584b7404..ef79da99c3 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/OutOfTimeFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/OutOfTimeFragment.kt @@ -66,7 +66,7 @@ class OutOfTimeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) } override fun onSafelyResume() { - accountCache.onAccountDataChange = { _, expiry -> + accountCache.onAccountExpiryChange.subscribe(this) { expiry -> checkExpiry(expiry) } @@ -79,7 +79,7 @@ class OutOfTimeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) } override fun onSafelyPause() { - accountCache.onAccountDataChange = null + accountCache.onAccountExpiryChange.unsubscribe(this) jobTracker.cancelJob("pollAccountData") } diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt index db0cfa15ed..e4955a44d0 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt @@ -13,7 +13,6 @@ import android.widget.TextView import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.dataproxy.AppVersionInfoCache import net.mullvad.mullvadvpn.service.AccountCache -import org.joda.time.DateTime class SettingsFragment : ServiceAwareFragment() { private lateinit var accountMenu: View @@ -102,16 +101,26 @@ class SettingsFragment : ServiceAwareFragment() { override fun onPause() { active = false versionInfoCache?.onUpdate = null - accountCache?.onAccountDataChange = null + + accountCache?.apply { + onAccountNumberChange.unsubscribe(this@SettingsFragment) + onAccountExpiryChange.unsubscribe(this@SettingsFragment) + } super.onPause() } private fun configureListeners() { accountCache?.apply { - onAccountDataChange = { account, expiry -> + onAccountNumberChange.subscribe(this@SettingsFragment) { account -> + jobTracker.newUiJob("updateLoggedInStatus") { + updateLoggedInStatus(account != null) + } + } + + onAccountExpiryChange.subscribe(this@SettingsFragment) { expiry -> jobTracker.newUiJob("updateAccountInfo") { - updateAccountInfo(account != null, expiry) + remainingTimeLabel.accountExpiry = expiry } } @@ -145,11 +154,6 @@ class SettingsFragment : ServiceAwareFragment() { startActivity(intent) } - private fun updateAccountInfo(loggedIn: Boolean, expiry: DateTime?) { - updateLoggedInStatus(loggedIn) - remainingTimeLabel.accountExpiry = expiry - } - private fun updateLoggedInStatus(loggedIn: Boolean) { val visibility = if (loggedIn) { View.VISIBLE diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WelcomeFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WelcomeFragment.kt index ff133c369d..246c105398 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WelcomeFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WelcomeFragment.kt @@ -49,8 +49,11 @@ class WelcomeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) { } override fun onSafelyResume() { - accountCache.onAccountDataChange = { account, expiry -> + accountCache.onAccountNumberChange.subscribe(this) { account -> updateAccountNumber(account) + } + + accountCache.onAccountExpiryChange.subscribe(this) { expiry -> checkExpiry(expiry) } @@ -63,7 +66,8 @@ class WelcomeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) { } override fun onSafelyPause() { - accountCache.onAccountDataChange = null + accountCache.onAccountNumberChange.unsubscribe(this) + accountCache.onAccountExpiryChange.unsubscribe(this) jobTracker.cancelJob("pollAccountData") } diff --git a/android/src/main/kotlin/net/mullvad/talpid/util/EventNotifier.kt b/android/src/main/kotlin/net/mullvad/talpid/util/EventNotifier.kt index 289f4a19b5..bcd27820b8 100644 --- a/android/src/main/kotlin/net/mullvad/talpid/util/EventNotifier.kt +++ b/android/src/main/kotlin/net/mullvad/talpid/util/EventNotifier.kt @@ -30,6 +30,12 @@ class EventNotifier<T>(private val initialValue: T) { } } + fun hasListeners(): Boolean { + synchronized(this) { + return !listeners.isEmpty() + } + } + fun unsubscribe(id: Any) { synchronized(this) { listeners.remove(id) |
