diff options
| author | Albin <albin@mullvad.net> | 2022-07-12 15:05:21 +0200 |
|---|---|---|
| committer | Albin <albin@mullvad.net> | 2022-07-20 09:59:02 +0200 |
| commit | 5d504ddc2c22652362db57e8c10cac9f296606cc (patch) | |
| tree | 9f4f3e7addbcf3c059c0b817a4bfae54b07be986 /android | |
| parent | 31f0b40c0ab6eccc1b1a7c4717a826b7eb28c62b (diff) | |
| download | mullvadvpn-5d504ddc2c22652362db57e8c10cac9f296606cc.tar.xz mullvadvpn-5d504ddc2c22652362db57e8c10cac9f296606cc.zip | |
Decouple OutOfTimeFragment
Diffstat (limited to 'android')
| -rw-r--r-- | android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/OutOfTimeFragment.kt | 87 |
1 files changed, 56 insertions, 31 deletions
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 9dff03417c..ce6c2f690f 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 @@ -12,25 +12,35 @@ import kotlin.properties.Delegates.observable import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.emptyFlow +import kotlinx.coroutines.flow.flatMapLatest 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.fragments.BaseFragment import net.mullvad.mullvadvpn.ui.serviceconnection.AccountRepository +import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManager +import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionState +import net.mullvad.mullvadvpn.ui.serviceconnection.authTokenCache +import net.mullvad.mullvadvpn.ui.serviceconnection.connectionProxy import net.mullvad.mullvadvpn.ui.widget.Button 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.callbackFlowFromNotifier import net.mullvad.talpid.tunnel.ActionAfterDisconnect import net.mullvad.talpid.tunnel.ErrorStateCause import org.joda.time.DateTime import org.koin.android.ext.android.inject -class OutOfTimeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) { +class OutOfTimeFragment : BaseFragment() { // Injected dependencies private val accountRepository: AccountRepository by inject() + private val serviceConnectionManager: ServiceConnectionManager by inject() private lateinit var headerBar: HeaderBar @@ -44,11 +54,19 @@ class OutOfTimeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) headerBar.tunnelState = state } - 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.out_of_time, container, false) headerBar = view.findViewById<HeaderBar>(R.id.header_bar).apply { @@ -56,14 +74,14 @@ class OutOfTimeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) } view.findViewById<TextView>(R.id.account_credit_has_expired).text = buildString { - append(parentActivity.getString(R.string.account_credit_has_expired)) + append(requireActivity().getString(R.string.account_credit_has_expired)) append(" ") - parentActivity.getString(R.string.add_time_to_account) + requireActivity().getString(R.string.add_time_to_account) } disconnectButton = view.findViewById<Button>(R.id.disconnect).apply { setOnClickAction("disconnect", jobTracker) { - connectionProxy.disconnect() + serviceConnectionManager.connectionProxy()?.disconnect() } } @@ -72,48 +90,32 @@ class OutOfTimeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) setOnClickAction("openAccountPageInBrowser", jobTracker) { setEnabled(false) - context.openAccountPageInBrowser(authTokenCache.fetchAuthToken()) + serviceConnectionManager.authTokenCache()?.fetchAuthToken()?.let { token -> + context.openAccountPageInBrowser(token) + } setEnabled(true) } + + isEnabled = true } redeemButton = view.findViewById<RedeemVoucherButton>(R.id.redeem_voucher).apply { prepare(parentFragmentManager, jobTracker) } - connectionProxy.onStateChange.subscribe(this) { newState -> - jobTracker.newUiJob("updateTunnelState") { - tunnelState = newState - } - } - 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() - } - - override fun onSafelyDestroyView() { - connectionProxy.onStateChange.unsubscribe(this) + super.onStop() } private fun CoroutineScope.launchUiSubscriptionsOnResume() = launch { repeatOnLifecycle(Lifecycle.State.RESUMED) { launchProceedToConnectViewIfExpiryExtended() + launchExpiryPolling() + launchTunnelStateSubscription() } } @@ -125,6 +127,29 @@ class OutOfTimeFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) } } + private fun CoroutineScope.launchExpiryPolling() = launch { + while (true) { + accountRepository.fetchAccountExpiry() + delay(POLL_INTERVAL) + } + } + + private fun CoroutineScope.launchTunnelStateSubscription() = launch { + serviceConnectionManager.connectionState + .flatMapLatest { state -> + if (state is ServiceConnectionState.ConnectedReady) { + callbackFlowFromNotifier( + state.container.connectionProxy.onStateChange + ) + } else { + emptyFlow() + } + } + .collect { newState -> + tunnelState = newState + } + } + private fun updateDisconnectButton() { val state = tunnelState |
