summaryrefslogtreecommitdiffhomepage
path: root/android/app/src
diff options
context:
space:
mode:
authorAlbin <albin@mullvad.net>2022-07-07 09:01:43 +0200
committerAlbin <albin@mullvad.net>2022-07-20 09:59:02 +0200
commit73e7e8d2de28d7fad6a75c835743c45091788038 (patch)
tree6baf3cbd1e50a611a4cabb3497fbb2251bc179b1 /android/app/src
parent98af54098d42ef385398a99b13b593da2376528e (diff)
downloadmullvadvpn-73e7e8d2de28d7fad6a75c835743c45091788038.tar.xz
mullvadvpn-73e7e8d2de28d7fad6a75c835743c45091788038.zip
Refactor url button
Diffstat (limited to 'android/app/src')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt9
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/OutOfTimeFragment.kt12
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/WelcomeFragment.kt12
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/extension/ContextExtensions.kt15
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/SitePaymentButton.kt5
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/UrlButton.kt105
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()
- }
}