diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-06-24 23:34:24 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-06-24 23:51:01 +0000 |
| commit | ec8a05df3ae665c242d1cbb2129e555890bdcdda (patch) | |
| tree | 8aaa71b3dc4067bffbcaf8b1ca57ed19b166e803 /android/src/main | |
| parent | c774a5655500721263572e5c9131a9c796557a52 (diff) | |
| download | mullvadvpn-ec8a05df3ae665c242d1cbb2129e555890bdcdda.tar.xz mullvadvpn-ec8a05df3ae665c242d1cbb2129e555890bdcdda.zip | |
Refactor `AccountCache` to use `SettingsListener`
Diffstat (limited to 'android/src/main')
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) + } } |
