summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
Diffstat (limited to 'android')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/AccountCache.kt55
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt19
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt4
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/OutOfTimeFragment.kt4
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt22
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WelcomeFragment.kt8
-rw-r--r--android/src/main/kotlin/net/mullvad/talpid/util/EventNotifier.kt6
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)