diff options
| author | Albin <albin@mullvad.net> | 2022-07-07 09:01:43 +0200 |
|---|---|---|
| committer | Albin <albin@mullvad.net> | 2022-07-20 09:59:02 +0200 |
| commit | 73e7e8d2de28d7fad6a75c835743c45091788038 (patch) | |
| tree | 6baf3cbd1e50a611a4cabb3497fbb2251bc179b1 /android/app/src | |
| parent | 98af54098d42ef385398a99b13b593da2376528e (diff) | |
| download | mullvadvpn-73e7e8d2de28d7fad6a75c835743c45091788038.tar.xz mullvadvpn-73e7e8d2de28d7fad6a75c835743c45091788038.zip | |
Refactor url button
Diffstat (limited to 'android/app/src')
6 files changed, 39 insertions, 119 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt index c648c3f7e6..e078856049 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt @@ -15,6 +15,7 @@ import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.model.TunnelState +import net.mullvad.mullvadvpn.ui.extension.openAccountPageInBrowser import net.mullvad.mullvadvpn.ui.serviceconnection.AccountRepository import net.mullvad.mullvadvpn.ui.serviceconnection.DeviceRepository import net.mullvad.mullvadvpn.ui.widget.Button @@ -85,8 +86,10 @@ class AccountFragment : ServiceDependentFragment(OnNoService.GoBack) { sitePaymentButton = view.findViewById<SitePaymentButton>(R.id.site_payment).apply { newAccount = false - prepare(authTokenCache, jobTracker) { - checkForAddedTime() + setOnClickAction("openAccountPageInBrowser", jobTracker) { + setEnabled(false) + context.openAccountPageInBrowser(authTokenCache.fetchAuthToken()) + setEnabled(true) } } @@ -123,8 +126,6 @@ class AccountFragment : ServiceDependentFragment(OnNoService.GoBack) { uiState.errorState.cause is ErrorStateCause.IsOffline } } - - sitePaymentButton.updateAuthTokenCache(authTokenCache) } override fun onSafelyStop() { diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/OutOfTimeFragment.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/OutOfTimeFragment.kt index 03aa10c264..9dff03417c 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/OutOfTimeFragment.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/OutOfTimeFragment.kt @@ -16,6 +16,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.model.TunnelState +import net.mullvad.mullvadvpn.ui.extension.openAccountPageInBrowser import net.mullvad.mullvadvpn.ui.serviceconnection.AccountRepository import net.mullvad.mullvadvpn.ui.widget.Button import net.mullvad.mullvadvpn.ui.widget.HeaderBar @@ -68,7 +69,12 @@ class OutOfTimeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) sitePaymentButton = view.findViewById<SitePaymentButton>(R.id.site_payment).apply { newAccount = false - prepare(authTokenCache, jobTracker) + + setOnClickAction("openAccountPageInBrowser", jobTracker) { + setEnabled(false) + context.openAccountPageInBrowser(authTokenCache.fetchAuthToken()) + setEnabled(true) + } } redeemButton = view.findViewById<RedeemVoucherButton>(R.id.redeem_voucher).apply { @@ -95,12 +101,10 @@ class OutOfTimeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) delay(POLL_INTERVAL) } } - - sitePaymentButton.updateAuthTokenCache(authTokenCache) } override fun onSafelyStop() { - jobTracker.cancelJob("pollAccountData") + jobTracker.cancelAllJobs() } override fun onSafelyDestroyView() { diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/WelcomeFragment.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/WelcomeFragment.kt index 3acf9b3eee..05152e5f62 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/WelcomeFragment.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/WelcomeFragment.kt @@ -18,6 +18,7 @@ import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.model.TunnelState +import net.mullvad.mullvadvpn.ui.extension.openAccountPageInBrowser import net.mullvad.mullvadvpn.ui.serviceconnection.AccountRepository import net.mullvad.mullvadvpn.ui.serviceconnection.DeviceRepository import net.mullvad.mullvadvpn.ui.widget.HeaderBar @@ -60,7 +61,12 @@ class WelcomeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) { sitePaymentButton = view.findViewById<SitePaymentButton>(R.id.site_payment).apply { newAccount = true - prepare(authTokenCache, jobTracker) + + setOnClickAction("openAccountPageInBrowser", jobTracker) { + setEnabled(false) + context.openAccountPageInBrowser(authTokenCache.fetchAuthToken()) + setEnabled(true) + } } view.findViewById<RedeemVoucherButton>(R.id.redeem_voucher).apply { @@ -81,12 +87,10 @@ class WelcomeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) { delay(POLL_INTERVAL) } } - - sitePaymentButton.updateAuthTokenCache(authTokenCache) } override fun onSafelyStop() { - jobTracker.cancelJob("pollAccountData") + jobTracker.cancelAllJobs() } private fun CoroutineScope.launchUiSubscriptionsOnResume() = launch { diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/extension/ContextExtensions.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/extension/ContextExtensions.kt new file mode 100644 index 0000000000..bedfff3a73 --- /dev/null +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/extension/ContextExtensions.kt @@ -0,0 +1,15 @@ +package net.mullvad.mullvadvpn.ui.extension + +import android.content.Context +import android.content.Intent +import android.net.Uri +import net.mullvad.mullvadvpn.R + +fun Context.openAccountPageInBrowser(authToken: String) { + startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse(getString(R.string.account_url) + "?token=$authToken") + ) + ) +} diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/SitePaymentButton.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/SitePaymentButton.kt index af936f1686..35d0c2326f 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/SitePaymentButton.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/SitePaymentButton.kt @@ -20,9 +20,4 @@ class SitePaymentButton : UrlButton { label = context.getString(R.string.buy_more_credit) } } - - init { - url = context.getString(R.string.account_url) - withToken = true - } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/UrlButton.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/UrlButton.kt index a7573fc7c4..c1b700e433 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/UrlButton.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/UrlButton.kt @@ -1,119 +1,20 @@ package net.mullvad.mullvadvpn.ui.widget import android.content.Context -import android.content.Intent -import android.net.Uri import android.util.AttributeSet -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.async import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.ui.serviceconnection.AuthTokenCache -import net.mullvad.mullvadvpn.util.JobTracker open class UrlButton : Button { - private lateinit var authTokenCache: AuthTokenCache + constructor(context: Context) : super(context) - private var shouldEnable = true - - var url: String? = null - var withToken = false - - constructor(context: Context) : super(context) {} - - constructor(context: Context, attributes: AttributeSet) : super(context, attributes) { - loadAttributes(attributes) - } + constructor(context: Context, attributes: AttributeSet) : super(context, attributes) constructor(context: Context, attributes: AttributeSet, defaultStyleAttribute: Int) : - super(context, attributes, defaultStyleAttribute) { - loadAttributes(attributes) - } - - constructor( - context: Context, - attributes: AttributeSet, - defaultStyleAttribute: Int, - defaultStyleResource: Int - ) : super(context, attributes, defaultStyleAttribute, defaultStyleResource) { - loadAttributes(attributes) - } + super(context, attributes, defaultStyleAttribute) init { super.setEnabled(false) super.detailImage = context.getDrawable(R.drawable.icon_extlink) super.showSpinner = true } - - fun prepare( - authTokenCache: AuthTokenCache, - jobTracker: JobTracker, - jobName: String = "fetchUrl", - extraOnClickAction: (suspend () -> Unit)? = null - ) { - synchronized(this) { - super.setEnabled(shouldEnable) - - this.authTokenCache = authTokenCache - - setOnClickAction(jobName, jobTracker) { - super.setEnabled(false) - - context.startActivity(buildIntent(jobTracker)) - extraOnClickAction?.invoke() - - super.setEnabled(true) - } - } - } - - fun updateAuthTokenCache(authTokenCache: AuthTokenCache) { - synchronized(this) { - this.authTokenCache = authTokenCache - } - } - - override fun setEnabled(enabled: Boolean) { - synchronized(this) { - shouldEnable = enabled - - if (!withToken || this::authTokenCache.isInitialized) { - super.setEnabled(enabled) - } - } - } - - private fun loadAttributes(attributes: AttributeSet) { - context.theme.obtainStyledAttributes(attributes, R.styleable.Url, 0, 0).apply { - try { - url = getString(R.styleable.Url_url) - } finally { - recycle() - } - } - - context.theme.obtainStyledAttributes(attributes, R.styleable.UrlButton, 0, 0).apply { - try { - withToken = getBoolean(R.styleable.UrlButton_withToken, false) - } finally { - recycle() - } - } - } - - private suspend fun buildIntent(jobTracker: JobTracker): Intent { - val buildIntent = GlobalScope.async(Dispatchers.Default) { - val uri = if (withToken) { - Uri.parse(url + "?token=" + authTokenCache.fetchAuthToken()) - } else { - Uri.parse(url) - } - - Intent(Intent.ACTION_VIEW, uri) - } - - jobTracker.newJob(buildIntent) - - return buildIntent.await() - } } |
