diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-01-07 12:39:00 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-01-07 12:39:00 -0300 |
| commit | c36a45f09463f604d833b440021323ba28b3f2ed (patch) | |
| tree | 7a62ce4c96243c32697a9d95c1a7288967f378e7 | |
| parent | 243d8d20ef26dbb7d82881b9bb1791509d6c322e (diff) | |
| parent | bb559e507b818342efeb9cd380d88800a5732ac0 (diff) | |
| download | mullvadvpn-c36a45f09463f604d833b440021323ba28b3f2ed.tar.xz mullvadvpn-c36a45f09463f604d833b440021323ba28b3f2ed.zip | |
Merge branch 'handle-no-service-connection'
10 files changed, 94 insertions, 51 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 5967fab80f..4c00f4c100 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,9 @@ Line wrap the file at 100 chars. Th - Fix regression due to which a TAP adapter issue was not given as the specific block reason when the tunnel could not be started. +#### Android +- Fix crash when starting the app right after quitting it. + ## [2019.10] - 2019-12-12 ### Fixed diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt index 2c045a8523..a03b99d9f9 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt @@ -18,7 +18,7 @@ import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.R import org.joda.time.DateTime -class AccountFragment : ServiceDependentFragment() { +class AccountFragment : ServiceDependentFragment(OnNoService.GoBack) { private lateinit var accountExpiryContainer: View private lateinit var accountExpiryDisplay: TextView private lateinit var accountNumberContainer: View diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt index 1c41c912ac..a6b076b03b 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt @@ -15,7 +15,7 @@ import net.mullvad.mullvadvpn.model.TunnelState val KEY_IS_TUNNEL_INFO_EXPANDED = "is_tunnel_info_expanded" -class ConnectFragment : ServiceDependentFragment() { +class ConnectFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) { private lateinit var actionButton: ConnectActionButton private lateinit var switchLocationButton: SwitchLocationButton private lateinit var headerBar: HeaderBar diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/LoginFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/LoginFragment.kt index 094b906622..15bbf26389 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/LoginFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/LoginFragment.kt @@ -18,7 +18,7 @@ import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.model.GetAccountDataResult -class LoginFragment : ServiceDependentFragment() { +class LoginFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) { private lateinit var title: TextView private lateinit var subtitle: TextView private lateinit var loggingInStatus: View diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt index 71c8ffdfb5..c1502fc300 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt @@ -122,6 +122,13 @@ class MainActivity : FragmentActivity() { } } + fun returnToLaunchScreen() { + supportFragmentManager?.beginTransaction()?.apply { + replace(R.id.main_fragment, LaunchFragment()) + commit() + } + } + fun requestVpnPermission(intent: Intent) { startActivityForResult(intent, 0) } diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/RemainingTimeLabel.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/RemainingTimeLabel.kt index ca927e50eb..b80573c5ec 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/RemainingTimeLabel.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/RemainingTimeLabel.kt @@ -3,17 +3,12 @@ package net.mullvad.mullvadvpn.ui import android.content.Context import android.view.View import android.widget.TextView -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.Job -import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.dataproxy.AccountCache import org.joda.time.DateTime import org.joda.time.Duration import org.joda.time.PeriodType -class RemainingTimeLabel(val context: Context, val accountCache: AccountCache, val view: View) { +class RemainingTimeLabel(val context: Context, val view: View) { private val resources = context.resources private val expiredColor = resources.getColor(R.color.red) @@ -21,25 +16,15 @@ class RemainingTimeLabel(val context: Context, val accountCache: AccountCache, v private val label = view.findViewById<TextView>(R.id.remaining_time) - private var updateJob: Job? = null - - fun onResume() { - accountCache.apply { - refetch() - - onAccountDataChange = { _, accountExpiry -> - updateJob?.cancel() - updateJob = updateLabel(accountExpiry) - } + var accountExpiry: DateTime? = null + set(value) { + field = value + updateLabel() } - } - fun onPause() { - accountCache.onAccountDataChange = null - updateJob?.cancel() - } + private fun updateLabel() { + val expiry = accountExpiry - 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/ui/SelectLocationFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SelectLocationFragment.kt index c5dfd81307..dc229dc7c0 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SelectLocationFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SelectLocationFragment.kt @@ -23,7 +23,7 @@ import net.mullvad.mullvadvpn.relaylist.RelayItemDividerDecoration import net.mullvad.mullvadvpn.relaylist.RelayList import net.mullvad.mullvadvpn.relaylist.RelayListAdapter -class SelectLocationFragment : ServiceDependentFragment() { +class SelectLocationFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) { private lateinit var relayListAdapter: RelayListAdapter private lateinit var relayListContainer: ViewSwitcher diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt index fa855137db..96ea5ec1f5 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt @@ -1,5 +1,8 @@ package net.mullvad.mullvadvpn.ui +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.dataproxy.AccountCache import net.mullvad.mullvadvpn.dataproxy.AppVersionInfoCache import net.mullvad.mullvadvpn.dataproxy.ConnectionProxy @@ -10,7 +13,11 @@ import net.mullvad.mullvadvpn.dataproxy.SettingsListener import net.mullvad.mullvadvpn.service.MullvadDaemon import net.mullvad.talpid.ConnectivityListener -open class ServiceDependentFragment : ServiceAwareFragment() { +open class ServiceDependentFragment(val onNoService: OnNoService) : ServiceAwareFragment() { + enum class OnNoService { + GoBack, GoToLaunchScreen + } + lateinit var accountCache: AccountCache private set @@ -49,4 +56,13 @@ open class ServiceDependentFragment : ServiceAwareFragment() { relayListListener = serviceConnection.relayListListener settingsListener = serviceConnection.settingsListener } + + override fun onNoServiceConnection() { + GlobalScope.launch(Dispatchers.Main) { + when (onNoService) { + OnNoService.GoBack -> parentActivity.onBackPressed() + OnNoService.GoToLaunchScreen -> parentActivity.returnToLaunchScreen() + } + } + } } diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt index b52e8432fa..df68241819 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt @@ -17,11 +17,9 @@ import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.dataproxy.AccountCache import net.mullvad.mullvadvpn.dataproxy.AppVersionInfoCache +import org.joda.time.DateTime class SettingsFragment : ServiceAwareFragment() { - private lateinit var accountCache: AccountCache - private lateinit var versionInfoCache: AppVersionInfoCache - private lateinit var accountMenu: View private lateinit var appVersionWarning: View private lateinit var appVersionLabel: TextView @@ -29,12 +27,25 @@ class SettingsFragment : ServiceAwareFragment() { private lateinit var remainingTimeLabel: RemainingTimeLabel private lateinit var wireguardKeysMenu: View - private var updateLoggedInStatusJob: Job? = null + private var active = false + + private var accountCache: AccountCache? = null + private var versionInfoCache: AppVersionInfoCache? = null + private var updateAccountInfoJob: Job? = null private var updateVersionInfoJob: Job? = null override fun onNewServiceConnection(serviceConnection: ServiceConnection) { accountCache = serviceConnection.accountCache versionInfoCache = serviceConnection.appVersionInfoCache + + if (active) { + configureListeners() + } + } + + override fun onNoServiceConnection() { + accountCache = null + versionInfoCache = null } override fun onCreateView( @@ -73,7 +84,7 @@ class SettingsFragment : ServiceAwareFragment() { appVersionWarning = view.findViewById(R.id.app_version_warning) appVersionLabel = view.findViewById<TextView>(R.id.app_version_label) appVersionFooter = view.findViewById(R.id.app_version_footer) - remainingTimeLabel = RemainingTimeLabel(parentActivity, accountCache, view) + remainingTimeLabel = RemainingTimeLabel(parentActivity, view) return view } @@ -81,32 +92,42 @@ class SettingsFragment : ServiceAwareFragment() { override fun onResume() { super.onResume() - remainingTimeLabel.onResume() - - accountCache.onAccountDataChange = { account, _ -> - updateLoggedInStatusJob?.cancel() - updateLoggedInStatusJob = updateLoggedInStatus(account != null) - } - - versionInfoCache.onUpdate = { - updateVersionInfoJob?.cancel() - updateVersionInfoJob = updateVersionInfo() - } + configureListeners() + active = true } override fun onPause() { - versionInfoCache.onUpdate = null - accountCache.onAccountDataChange = null - remainingTimeLabel.onPause() + active = false + versionInfoCache?.onUpdate = null + accountCache?.onAccountDataChange = null + super.onPause() } override fun onDestroyView() { - updateLoggedInStatusJob?.cancel() + updateAccountInfoJob?.cancel() updateVersionInfoJob?.cancel() super.onDestroyView() } + private fun configureListeners() { + accountCache?.apply { + refetch() + + onAccountDataChange = { account, expiry -> + updateAccountInfoJob?.cancel() + updateAccountInfoJob = updateAccountInfo(account != null, expiry) + } + } + + versionInfoCache?.apply { + onUpdate = { + updateVersionInfoJob?.cancel() + updateVersionInfoJob = updateVersionInfo() + } + } + } + private fun openSubFragment(fragment: Fragment) { fragmentManager?.beginTransaction()?.apply { setCustomAnimations( @@ -127,7 +148,15 @@ class SettingsFragment : ServiceAwareFragment() { startActivity(intent) } - private fun updateLoggedInStatus(loggedIn: Boolean) = GlobalScope.launch(Dispatchers.Main) { + private fun updateAccountInfo( + loggedIn: Boolean, + expiry: DateTime? + ) = GlobalScope.launch(Dispatchers.Main) { + updateLoggedInStatus(loggedIn) + remainingTimeLabel.accountExpiry = expiry + } + + private fun updateLoggedInStatus(loggedIn: Boolean) { val visibility = if (loggedIn) { View.VISIBLE } else { @@ -139,9 +168,12 @@ class SettingsFragment : ServiceAwareFragment() { } private fun updateVersionInfo() = GlobalScope.launch(Dispatchers.Main) { - appVersionLabel.setText(versionInfoCache.version ?: "") + val isOutdated = versionInfoCache?.isOutdated ?: false + val isSupported = versionInfoCache?.isSupported ?: true + + appVersionLabel.setText(versionInfoCache?.version ?: "") - if (!versionInfoCache.isOutdated && versionInfoCache.isSupported) { + if (!isOutdated && isSupported) { appVersionWarning.visibility = View.GONE appVersionFooter.visibility = View.GONE } else { diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt index f24a5b7c79..5614fb1f82 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt @@ -30,7 +30,7 @@ import org.joda.time.format.DateTimeFormat val RFC3339_FORMAT = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSSSSSSSSS z") val KEY_AGE_FORMAT = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm") -class WireguardKeyFragment : ServiceDependentFragment() { +class WireguardKeyFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) { private var currentJob: Job? = null private var updateViewsJob: Job? = null private var tunnelStateListener: Int? = null |
