summaryrefslogtreecommitdiffhomepage
path: root/android/src
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-04-28 14:15:06 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-04-28 14:15:06 -0300
commit14177d8368a97779b13d20ec89c8c74869308426 (patch)
tree397bcedced34765208fdc8d443465dfcaaa5cff4 /android/src
parentb37cff148fc10c283ebfdd4f63e82cf53f6e45a8 (diff)
parent958758db1c2809f2c3c36d0b4bac0575c0cc4813 (diff)
downloadmullvadvpn-14177d8368a97779b13d20ec89c8c74869308426.tar.xz
mullvadvpn-14177d8368a97779b13d20ec89c8c74869308426.zip
Merge branch 'create-account'
Diffstat (limited to 'android/src')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt5
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/LoginFragment.kt92
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/util/JobTracker.kt9
-rw-r--r--android/src/main/res/layout/login.xml13
-rw-r--r--android/src/main/res/values/strings.xml3
5 files changed, 75 insertions, 47 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt
index 9c34ecb5d7..75b3e35177 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt
@@ -33,6 +33,10 @@ class MullvadDaemon(val vpnService: MullvadVpnService) {
connect(daemonInterfaceAddress)
}
+ fun createNewAccount(): String? {
+ return createNewAccount(daemonInterfaceAddress)
+ }
+
fun disconnect() {
disconnect(daemonInterfaceAddress)
}
@@ -121,6 +125,7 @@ class MullvadDaemon(val vpnService: MullvadVpnService) {
private external fun deinitialize()
private external fun connect(daemonInterfaceAddress: Long)
+ private external fun createNewAccount(daemonInterfaceAddress: Long): String?
private external fun disconnect(daemonInterfaceAddress: Long)
private external fun generateWireguardKey(daemonInterfaceAddress: Long): KeygenEvent?
private external fun getAccountData(
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 7b92118335..c8663eb149 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/LoginFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/LoginFragment.kt
@@ -1,22 +1,19 @@
package net.mullvad.mullvadvpn.ui
-import android.content.Intent
-import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import kotlinx.coroutines.CompletableDeferred
-import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import net.mullvad.mullvadvpn.R
import net.mullvad.mullvadvpn.model.GetAccountDataResult
+import net.mullvad.mullvadvpn.ui.widget.Button
+import net.mullvad.mullvadvpn.util.JobTracker
class LoginFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
private lateinit var title: TextView
@@ -26,12 +23,9 @@ class LoginFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
private lateinit var loginFailStatus: View
private lateinit var accountInput: AccountInput
+ private val jobTracker = JobTracker()
private val loggedIn = CompletableDeferred<Unit>()
- private var loginJob: Deferred<Boolean>? = null
- private var advanceToNextScreenJob: Job? = null
- private var fetchHistoryJob: Job? = null
-
override fun onSafelyCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@@ -50,7 +44,8 @@ class LoginFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
accountInput = AccountInput(view, parentActivity.resources)
accountInput.onLogin = { accountToken -> login(accountToken) }
- view.findViewById<View>(R.id.create_account).setOnClickListener { createAccount() }
+ view.findViewById<Button>(R.id.create_account)
+ .setOnClickAction("createAccount", jobTracker) { createAccount() }
fetchHistory()
@@ -58,23 +53,41 @@ class LoginFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
}
override fun onSafelyResume() {
- advanceToNextScreenJob = GlobalScope.launch(Dispatchers.Main) {
+ jobTracker.newUiJob("advanceToNextScreen") {
loggedIn.join()
openConnectScreen()
}
+
fetchHistory()
}
override fun onSafelyPause() {
- advanceToNextScreenJob?.cancel()
- fetchHistoryJob?.cancel()
+ jobTracker.cancelJob("advanceToNextScreen")
}
- private fun createAccount() {
- val uri = Uri.parse(parentActivity.getString(R.string.create_account_url))
- val intent = Intent(Intent.ACTION_VIEW, uri)
+ override fun onSafelyDestroyView() {
+ jobTracker.cancelAllJobs()
+ }
+
+ private suspend fun createAccount() {
+ title.setText(R.string.logging_in_title)
+ subtitle.setText(R.string.creating_new_account)
+
+ loggingInStatus.visibility = View.VISIBLE
+ loginFailStatus.visibility = View.GONE
+ loggedInStatus.visibility = View.GONE
+
+ accountInput.state = LoginState.InProgress
- startActivity(intent)
+ val accountToken = jobTracker.runOnBackground {
+ daemon.createNewAccount()
+ }
+
+ if (accountToken == null) {
+ loginFailure(R.string.failed_to_create_account)
+ } else {
+ loggedIn(resources.getString(R.string.account_created))
+ }
}
private fun login(accountToken: String) {
@@ -91,45 +104,44 @@ class LoginFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
}
private fun fetchHistory() {
- fetchHistoryJob?.cancel()
- fetchHistoryJob = GlobalScope.launch(Dispatchers.Main) {
- val history = GlobalScope.async(Dispatchers.Default) {
+ jobTracker.newUiJob("fetchHistory") {
+ accountInput.accountHistory = jobTracker.runOnBackground() {
daemon.getAccountHistory()
}
- accountInput.accountHistory = history.await()
}
}
private fun performLogin(accountToken: String) = GlobalScope.launch(Dispatchers.Main) {
- loginJob?.cancel()
- loginJob = GlobalScope.async(Dispatchers.Default) {
- val accountDataResult = daemon.getAccountData(accountToken)
+ jobTracker.newUiJob("login") {
+ val loginSucceeded = jobTracker.runOnBackground {
+ val accountDataResult = daemon.getAccountData(accountToken)
- when (accountDataResult) {
- is GetAccountDataResult.Ok, is GetAccountDataResult.RpcError -> {
- daemon.setAccount(accountToken)
- true
+ when (accountDataResult) {
+ is GetAccountDataResult.Ok, is GetAccountDataResult.RpcError -> {
+ daemon.setAccount(accountToken)
+ true
+ }
+ else -> false
}
- else -> false
}
- }
- if (loginJob?.await() ?: false) {
- loggedIn()
- } else {
- loginFailure()
+ if (loginSucceeded) {
+ loggedIn("")
+ } else {
+ loginFailure(R.string.login_fail_description)
+ }
}
}
- private suspend fun loggedIn() {
- showLoggedInMessage()
+ private suspend fun loggedIn(subtitleMessage: String) {
+ showLoggedInMessage(subtitleMessage)
delay(1000)
loggedIn.complete(Unit)
}
- private fun showLoggedInMessage() {
+ private fun showLoggedInMessage(subtitleMessage: String) {
title.setText(R.string.logged_in_title)
- subtitle.setText("")
+ subtitle.setText(subtitleMessage)
loggingInStatus.visibility = View.GONE
loginFailStatus.visibility = View.GONE
@@ -145,9 +157,9 @@ class LoginFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen) {
}
}
- private fun loginFailure() {
+ private fun loginFailure(description: Int) {
title.setText(R.string.login_fail_title)
- subtitle.setText(R.string.login_fail_description)
+ subtitle.setText(description)
loggingInStatus.visibility = View.GONE
loginFailStatus.visibility = View.VISIBLE
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/util/JobTracker.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/util/JobTracker.kt
index 29802b5bce..7be0668f61 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/util/JobTracker.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/util/JobTracker.kt
@@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.util
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.Job
+import kotlinx.coroutines.async
import kotlinx.coroutines.launch
class JobTracker {
@@ -49,6 +50,14 @@ class JobTracker {
return newJob(name, GlobalScope.launch(Dispatchers.Main) { jobBody() })
}
+ suspend fun <T> runOnBackground(jobBody: suspend () -> T): T {
+ val job = GlobalScope.async(Dispatchers.Default) { jobBody() }
+
+ newJob(job)
+
+ return job.await()
+ }
+
fun cancelJob(name: String) {
synchronized(namedJobs) {
namedJobs.remove(name)?.let { oldJobId ->
diff --git a/android/src/main/res/layout/login.xml b/android/src/main/res/layout/login.xml
index dc52d47c4f..5b90712841 100644
--- a/android/src/main/res/layout/login.xml
+++ b/android/src/main/res/layout/login.xml
@@ -1,4 +1,5 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:mullvad="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -139,12 +140,10 @@
android:textColor="@color/white80"
android:textSize="13sp"
android:text="@string/dont_have_an_account" />
- <Button android:id="@+id/create_account"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:padding="9dp"
- android:drawableRight="@drawable/icon_extlink"
- android:text="@string/create_account"
- style="@style/BlueButton" />
+ <net.mullvad.mullvadvpn.ui.widget.Button android:id="@+id/create_account"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ mullvad:buttonColor="blue"
+ mullvad:text="@string/create_account" />
</LinearLayout>
</LinearLayout>
diff --git a/android/src/main/res/values/strings.xml b/android/src/main/res/values/strings.xml
index cbef0fe68c..ff70bf0730 100644
--- a/android/src/main/res/values/strings.xml
+++ b/android/src/main/res/values/strings.xml
@@ -29,6 +29,9 @@
<string name="dont_have_an_account">Don\'t have an account
number?</string>
<string name="create_account">Create account</string>
+ <string name="creating_new_account">Creating new account</string>
+ <string name="failed_to_create_account">Failed to create account</string>
+ <string name="account_created">Account created</string>
<string name="settings">Settings</string>
<string name="settings_account">Account</string>
<string name="less_than_a_day_left">less than a day