summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/AccountFragment.kt32
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt9
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/RemainingTimeLabel.kt23
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/SettingsFragment.kt6
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AccountCache.kt76
5 files changed, 86 insertions, 60 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/AccountFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/AccountFragment.kt
index 8bcd8506a7..a0a0ef291f 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/AccountFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/AccountFragment.kt
@@ -58,25 +58,33 @@ class AccountFragment : Fragment() {
accountNumberContainer.setOnClickListener { copyAccountNumberToClipboard() }
- updateViewJob = updateView()
-
return view
}
- private fun updateView() = GlobalScope.launch(Dispatchers.Main) {
- val accountCache = parentActivity.accountCache
- val accountNumber = accountCache.accountNumber.await()
+ override fun onResume() {
+ super.onResume()
+
+ parentActivity.accountCache.onAccountDataChange = { accountNumber, accountExpiry ->
+ updateViewJob = updateView(accountNumber, accountExpiry)
+ }
+ }
+
+ override fun onPause() {
+ parentActivity.accountCache.onAccountDataChange = null
+ super.onPause()
+ }
+
+ private fun updateView(accountNumber: String?, accountExpiry: DateTime?) =
+ GlobalScope.launch(Dispatchers.Main) {
if (accountNumber != null) {
- accountNumberDisplay.setText(accountCache.accountNumber.await())
+ accountNumberDisplay.setText(accountNumber)
accountNumberContainer.visibility = View.VISIBLE
+ }
- val accountExpiry = accountCache.accountExpiry.await()
-
- if (accountExpiry != null) {
- accountExpiryDisplay.setText(formatExpiry(accountExpiry))
- accountExpiryContainer.visibility = View.VISIBLE
- }
+ if (accountExpiry != null) {
+ accountExpiryDisplay.setText(formatExpiry(accountExpiry))
+ accountExpiryContainer.visibility = View.VISIBLE
}
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
index 5d871e0511..d0cdaa4d87 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
@@ -36,11 +36,11 @@ class MainActivity : FragmentActivity() {
val settings
get() = runBlocking { asyncSettings.await() }
- val accountCache = AccountCache(this)
val locationInfoCache = LocationInfoCache(asyncDaemon)
val problemReport = MullvadProblemReport()
var relayListListener = RelayListListener(this)
var settingsListener = SettingsListener(this)
+ val accountCache = AccountCache(settingsListener, asyncDaemon)
private var waitForDaemonJob: Job? = null
@@ -109,13 +109,6 @@ class MainActivity : FragmentActivity() {
}
}
- fun refetchSettings() {
- if (asyncSettings.isCompleted) {
- asyncSettings = fetchSettings()
- accountCache.settings = asyncSettings
- }
- }
-
private fun addInitialFragment() {
supportFragmentManager?.beginTransaction()?.apply {
add(R.id.main_fragment, LaunchFragment())
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/RemainingTimeLabel.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/RemainingTimeLabel.kt
index 6e772c1675..f0335d3914 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/RemainingTimeLabel.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/RemainingTimeLabel.kt
@@ -1,9 +1,9 @@
package net.mullvad.mullvadvpn
-import kotlinx.coroutines.async
import kotlinx.coroutines.launch
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.Job
import org.joda.time.format.DateTimeFormat
import org.joda.time.DateTime
@@ -23,22 +23,25 @@ class RemainingTimeLabel(val parentActivity: MainActivity, val view: View) {
private val label = view.findViewById<TextView>(R.id.remaining_time)
- private var updateJob = updateLabel()
+ private var updateJob: Job? = null
fun onResume() {
- if (updateJob.isCompleted) {
- parentActivity.refetchSettings()
- updateJob = updateLabel()
+ parentActivity.accountCache.apply {
+ refetch()
+
+ onAccountDataChange = { accountNumber, accountExpiry ->
+ updateJob?.cancel()
+ updateJob = updateLabel(accountExpiry)
+ }
}
}
- fun onDestroy() {
- updateJob.cancel()
+ fun onPause() {
+ parentActivity.accountCache.onAccountDataChange = null
+ updateJob?.cancel()
}
- private fun updateLabel() = GlobalScope.launch(Dispatchers.Main) {
- val expiry = accountCache.accountExpiry.await()
-
+ private fun updateLabel(expiry: DateTime?) = GlobalScope.launch(Dispatchers.Main) {
if (expiry != null) {
val remainingTime = Duration(DateTime.now(), expiry)
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/SettingsFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/SettingsFragment.kt
index 3400d43e58..f82ef1e0a9 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/SettingsFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/SettingsFragment.kt
@@ -51,9 +51,9 @@ class SettingsFragment : Fragment() {
remainingTimeLabel.onResume()
}
- override fun onDestroyView() {
- remainingTimeLabel.onDestroy()
- super.onDestroyView()
+ override fun onPause() {
+ remainingTimeLabel.onPause()
+ super.onPause()
}
private fun openSubFragment(fragment: Fragment) {
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AccountCache.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AccountCache.kt
index 41d23b4a26..f47ffd5bb6 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AccountCache.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AccountCache.kt
@@ -1,54 +1,76 @@
package net.mullvad.mullvadvpn.dataproxy
-import kotlinx.coroutines.async
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.Job
import org.joda.time.format.DateTimeFormat
import org.joda.time.DateTime
-import net.mullvad.mullvadvpn.MainActivity
+import net.mullvad.mullvadvpn.MullvadDaemon
val EXPIRY_FORMAT = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss z")
-class AccountCache(val parentActivity: MainActivity) {
- private var daemon = parentActivity.asyncDaemon
+class AccountCache(val settingsListener: SettingsListener, val daemon: Deferred<MullvadDaemon>) {
+ private var fetchJob: Job? = null
+ private var accountNumber: String? = null
+ private var accountExpiry: DateTime? = null
- var settings = parentActivity.asyncSettings
+ var onAccountDataChange: ((String?, DateTime?) -> Unit)? = null
set(value) {
- field = value
- accountNumber = fetchAccountNumber()
- accountExpiry = fetchAccountExpiry()
+ synchronized(this) {
+ field = value
+ notifyChange()
+ }
+ }
+
+ init {
+ settingsListener.onAccountNumberChange = { accountNumber ->
+ handleNewAccountNumber(accountNumber)
}
+ }
- var accountNumber = fetchAccountNumber()
- private set
- var accountExpiry = fetchAccountExpiry()
- private set
+ fun refetch() {
+ fetchJob?.cancel()
+ fetchJob = fetchAccountExpiry()
+ }
fun onDestroy() {
- accountExpiry.cancel()
- accountNumber.cancel()
+ settingsListener.onAccountNumberChange = null
+
+ fetchJob?.cancel()
}
- private fun fetchAccountNumber() = GlobalScope.async(Dispatchers.Default) {
- settings.await().accountToken
+ private fun handleNewAccountNumber(newAccountNumber: String?) {
+ synchronized(this) {
+ accountNumber = newAccountNumber
+ accountExpiry = null
+
+ notifyChange()
+ refetch()
+ }
}
- private fun fetchAccountExpiry() = GlobalScope.async(Dispatchers.Default) {
- val accountNumber = accountNumber.await()
+ private fun fetchAccountExpiry() = GlobalScope.launch(Dispatchers.Default) {
+ val accountNumber = this@AccountCache.accountNumber
+ val accountData = accountNumber?.let { account ->
+ daemon.await().getAccountData(account)
+ }
- if (accountNumber != null) {
- val accountData = daemon.await().getAccountData(accountNumber)
- val accountExpiry = accountData?.expiry
+ synchronized(this@AccountCache) {
+ if (this@AccountCache.accountNumber === accountNumber) {
+ accountExpiry = accountData?.expiry?.let { expiry ->
+ DateTime.parse(expiry, EXPIRY_FORMAT)
+ }
- if (accountExpiry != null) {
- DateTime.parse(accountExpiry, EXPIRY_FORMAT)
- } else {
- null
+ notifyChange()
}
- } else {
- null
}
}
+
+ private fun notifyChange() {
+ onAccountDataChange?.invoke(accountNumber, accountExpiry)
+ }
}