summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-01-07 12:39:00 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-01-07 12:39:00 -0300
commitc36a45f09463f604d833b440021323ba28b3f2ed (patch)
tree7a62ce4c96243c32697a9d95c1a7288967f378e7
parent243d8d20ef26dbb7d82881b9bb1791509d6c322e (diff)
parentbb559e507b818342efeb9cd380d88800a5732ac0 (diff)
downloadmullvadvpn-c36a45f09463f604d833b440021323ba28b3f2ed.tar.xz
mullvadvpn-c36a45f09463f604d833b440021323ba28b3f2ed.zip
Merge branch 'handle-no-service-connection'
-rw-r--r--CHANGELOG.md3
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AccountFragment.kt2
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt2
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/LoginFragment.kt2
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt7
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/RemainingTimeLabel.kt29
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SelectLocationFragment.kt2
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt18
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt78
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/WireguardKeyFragment.kt2
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