summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
Diffstat (limited to 'android')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/WelcomeFragment.kt61
1 files changed, 37 insertions, 24 deletions
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 05152e5f62..74db3c3118 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
@@ -15,34 +15,50 @@ import androidx.lifecycle.repeatOnLifecycle
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.flow.debounce
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.fragments.BaseFragment
import net.mullvad.mullvadvpn.ui.serviceconnection.AccountRepository
import net.mullvad.mullvadvpn.ui.serviceconnection.DeviceRepository
+import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManager
+import net.mullvad.mullvadvpn.ui.serviceconnection.authTokenCache
import net.mullvad.mullvadvpn.ui.widget.HeaderBar
import net.mullvad.mullvadvpn.ui.widget.RedeemVoucherButton
import net.mullvad.mullvadvpn.ui.widget.SitePaymentButton
+import net.mullvad.mullvadvpn.util.JobTracker
+import net.mullvad.mullvadvpn.util.UNKNOWN_STATE_DEBOUNCE_DELAY_MILLISECONDS
+import net.mullvad.mullvadvpn.util.addDebounceForUnknownState
import org.joda.time.DateTime
import org.koin.android.ext.android.inject
val POLL_INTERVAL: Long = 15 /* s */ * 1000 /* ms */
-class WelcomeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
+class WelcomeFragment : BaseFragment() {
// Injected dependencies
private val accountRepository: AccountRepository by inject()
private val deviceRepository: DeviceRepository by inject()
+ private val serviceConnectionManager: ServiceConnectionManager by inject()
private lateinit var accountLabel: TextView
private lateinit var sitePaymentButton: SitePaymentButton
- override fun onSafelyCreateView(
+ @Deprecated("Refactor code to instead rely on Lifecycle.")
+ private val jobTracker = JobTracker()
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ lifecycleScope.launchUiSubscriptionsOnResume()
+ }
+
+ override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
- ): View {
+ ): View? {
val view = inflater.inflate(R.layout.welcome, container, false)
view.findViewById<HeaderBar>(R.id.header_bar).apply {
@@ -54,9 +70,9 @@ class WelcomeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
}
view.findViewById<TextView>(R.id.pay_to_start_using).text = buildString {
- append(parentActivity.getString(R.string.pay_to_start_using))
+ append(requireActivity().getString(R.string.pay_to_start_using))
append(" ")
- append(parentActivity.getString(R.string.add_time_to_account))
+ append(requireActivity().getString(R.string.add_time_to_account))
}
sitePaymentButton = view.findViewById<SitePaymentButton>(R.id.site_payment).apply {
@@ -64,7 +80,9 @@ class WelcomeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
setOnClickAction("openAccountPageInBrowser", jobTracker) {
setEnabled(false)
- context.openAccountPageInBrowser(authTokenCache.fetchAuthToken())
+ serviceConnectionManager.authTokenCache()?.fetchAuthToken()?.let { token ->
+ context.openAccountPageInBrowser(token)
+ }
setEnabled(true)
}
}
@@ -76,32 +94,22 @@ class WelcomeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
return view
}
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- lifecycleScope.launchUiSubscriptionsOnResume()
- }
-
- override fun onSafelyStart() {
- jobTracker.newBackgroundJob("pollAccountData") {
- while (true) {
- accountRepository.fetchAccountExpiry()
- delay(POLL_INTERVAL)
- }
- }
- }
-
- override fun onSafelyStop() {
+ override fun onStop() {
jobTracker.cancelAllJobs()
+ super.onStop()
}
private fun CoroutineScope.launchUiSubscriptionsOnResume() = launch {
repeatOnLifecycle(Lifecycle.State.RESUMED) {
launchUpdateAccountNumberOnDeviceChanges()
launchAdvanceToConnectViewOnExpiryExtended()
+ launchExpiryPolling()
}
}
private fun CoroutineScope.launchUpdateAccountNumberOnDeviceChanges() = launch {
deviceRepository.deviceState
+ .debounce { it.addDebounceForUnknownState(UNKNOWN_STATE_DEBOUNCE_DELAY_MILLISECONDS) }
.collect { state ->
updateAccountNumber(state.token())
}
@@ -113,6 +121,13 @@ class WelcomeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
}
}
+ private fun CoroutineScope.launchExpiryPolling() = launch {
+ while (true) {
+ accountRepository.fetchAccountExpiry()
+ delay(POLL_INTERVAL)
+ }
+ }
+
private fun updateAccountNumber(rawAccountNumber: String?) {
val accountText = rawAccountNumber?.let { account ->
addSpacesToAccountText(account)
@@ -146,9 +161,7 @@ class WelcomeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
val tomorrow = DateTime.now().plusDays(1)
if (expiry.isAfter(tomorrow)) {
- jobTracker.newUiJob("advanceToConnectScreen") {
- advanceToConnectScreen()
- }
+ advanceToConnectScreen()
}
}
}
@@ -165,7 +178,7 @@ class WelcomeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
val clipboardLabel = resources.getString(R.string.mullvad_account_number)
val toastMessage = resources.getString(R.string.copied_mullvad_account_number)
- val context = parentActivity
+ val context = requireActivity()
val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clipData = ClipData.newPlainText(clipboardLabel, accountToken)