diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-04-28 14:15:06 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-04-28 14:15:06 -0300 |
| commit | 14177d8368a97779b13d20ec89c8c74869308426 (patch) | |
| tree | 397bcedced34765208fdc8d443465dfcaaa5cff4 /android/src | |
| parent | b37cff148fc10c283ebfdd4f63e82cf53f6e45a8 (diff) | |
| parent | 958758db1c2809f2c3c36d0b4bac0575c0cc4813 (diff) | |
| download | mullvadvpn-14177d8368a97779b13d20ec89c8c74869308426.tar.xz mullvadvpn-14177d8368a97779b13d20ec89c8c74869308426.zip | |
Merge branch 'create-account'
Diffstat (limited to 'android/src')
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 |
