aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/ui/src
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2020-09-14 14:27:55 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2020-09-14 14:40:10 +0200
commit2fc0bb1a03f624e297d2afdeb95231cf906afc21 (patch)
treeb1f9ed3d59683b5bbe4975821988c0e9ce7f2e84 /ui/src
parentui: remove hacky manual check for keyguard (diff)
downloadwireguard-android-2fc0bb1a03f624e297d2afdeb95231cf906afc21.tar.xz
wireguard-android-2fc0bb1a03f624e297d2afdeb95231cf906afc21.zip
coroutines: convert low-hanging fruits
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'ui/src')
-rw-r--r--ui/src/main/java/com/wireguard/android/activity/SettingsActivity.kt12
-rw-r--r--ui/src/main/java/com/wireguard/android/fragment/AppListDialogFragment.kt60
-rw-r--r--ui/src/main/java/com/wireguard/android/preference/ModuleDownloaderPreference.kt46
-rw-r--r--ui/src/main/java/com/wireguard/android/preference/ToolsInstallerPreference.kt48
-rw-r--r--ui/src/main/java/com/wireguard/android/preference/VersionPreference.kt13
5 files changed, 106 insertions, 73 deletions
diff --git a/ui/src/main/java/com/wireguard/android/activity/SettingsActivity.kt b/ui/src/main/java/com/wireguard/android/activity/SettingsActivity.kt
index 88114800..81548fe7 100644
--- a/ui/src/main/java/com/wireguard/android/activity/SettingsActivity.kt
+++ b/ui/src/main/java/com/wireguard/android/activity/SettingsActivity.kt
@@ -19,6 +19,10 @@ import com.wireguard.android.R
import com.wireguard.android.backend.WgQuickBackend
import com.wireguard.android.util.AdminKnobs
import com.wireguard.android.util.ModuleLoader
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
import java.util.ArrayList
import java.util.Arrays
@@ -117,11 +121,13 @@ class SettingsActivity : ThemeChangeAwareActivity() {
moduleInstaller?.parent?.removePreference(moduleInstaller)
} else {
kernelModuleDisabler?.parent?.removePreference(kernelModuleDisabler)
- Application.getAsyncWorker().runAsync(Application.getRootShell()::start).whenComplete { _, e ->
- if (e == null)
+ CoroutineScope(Dispatchers.Main).launch {
+ try {
+ withContext(Dispatchers.IO) { Application.getRootShell().start() }
moduleInstaller?.isVisible = true
- else
+ } catch (_: Exception) {
moduleInstaller?.parent?.removePreference(moduleInstaller)
+ }
}
}
}
diff --git a/ui/src/main/java/com/wireguard/android/fragment/AppListDialogFragment.kt b/ui/src/main/java/com/wireguard/android/fragment/AppListDialogFragment.kt
index 35bd3ce9..1a29c5e6 100644
--- a/ui/src/main/java/com/wireguard/android/fragment/AppListDialogFragment.kt
+++ b/ui/src/main/java/com/wireguard/android/fragment/AppListDialogFragment.kt
@@ -22,6 +22,10 @@ import com.wireguard.android.databinding.ObservableKeyedArrayList
import com.wireguard.android.model.ApplicationData
import com.wireguard.android.util.ErrorMessages
import com.wireguard.android.util.requireTargetFragment
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
class AppListDialogFragment : DialogFragment() {
private val appData = ObservableKeyedArrayList<String, ApplicationData>()
@@ -33,33 +37,37 @@ class AppListDialogFragment : DialogFragment() {
private fun loadData() {
val activity = activity ?: return
val pm = activity.packageManager
- Application.getAsyncWorker().supplyAsync<List<ApplicationData>> {
- val launcherIntent = Intent(Intent.ACTION_MAIN, null)
- launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER)
- val resolveInfos = pm.queryIntentActivities(launcherIntent, 0)
- val applicationData: MutableList<ApplicationData> = ArrayList()
- resolveInfos.forEach {
- val packageName = it.activityInfo.packageName
- val appData = ApplicationData(it.loadIcon(pm), it.loadLabel(pm).toString(), packageName, currentlySelectedApps.contains(packageName))
- applicationData.add(appData)
- appData.addOnPropertyChangedCallback(object : Observable.OnPropertyChangedCallback() {
- override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
- if (propertyId == BR.selected)
- setButtonText()
+ CoroutineScope(Dispatchers.Default).launch {
+ try {
+ val applicationData: MutableList<ApplicationData> = ArrayList()
+ withContext(Dispatchers.IO) {
+ val launcherIntent = Intent(Intent.ACTION_MAIN, null)
+ launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER)
+ val resolveInfos = pm.queryIntentActivities(launcherIntent, 0)
+ resolveInfos.forEach {
+ val packageName = it.activityInfo.packageName
+ val appData = ApplicationData(it.loadIcon(pm), it.loadLabel(pm).toString(), packageName, currentlySelectedApps.contains(packageName))
+ applicationData.add(appData)
+ appData.addOnPropertyChangedCallback(object : Observable.OnPropertyChangedCallback() {
+ override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
+ if (propertyId == BR.selected)
+ setButtonText()
+ }
+ })
}
- })
- }
- applicationData.sortWith(compareBy(String.CASE_INSENSITIVE_ORDER) { it.name })
- applicationData
- }.whenComplete { data, throwable ->
- if (data != null) {
- appData.clear()
- appData.addAll(data)
- } else {
- val error = ErrorMessages[throwable]
- val message = activity.getString(R.string.error_fetching_apps, error)
- Toast.makeText(activity, message, Toast.LENGTH_LONG).show()
- dismissAllowingStateLoss()
+ }
+ applicationData.sortWith(compareBy(String.CASE_INSENSITIVE_ORDER) { it.name })
+ withContext(Dispatchers.Main) {
+ appData.clear()
+ appData.addAll(applicationData)
+ }
+ } catch (e: Exception) {
+ withContext(Dispatchers.Main) {
+ val error = ErrorMessages[e]
+ val message = activity.getString(R.string.error_fetching_apps, error)
+ Toast.makeText(activity, message, Toast.LENGTH_LONG).show()
+ dismissAllowingStateLoss()
+ }
}
}
}
diff --git a/ui/src/main/java/com/wireguard/android/preference/ModuleDownloaderPreference.kt b/ui/src/main/java/com/wireguard/android/preference/ModuleDownloaderPreference.kt
index 055ed449..adf0dc27 100644
--- a/ui/src/main/java/com/wireguard/android/preference/ModuleDownloaderPreference.kt
+++ b/ui/src/main/java/com/wireguard/android/preference/ModuleDownloaderPreference.kt
@@ -15,40 +15,44 @@ import com.wireguard.android.Application
import com.wireguard.android.R
import com.wireguard.android.activity.SettingsActivity
import com.wireguard.android.util.ErrorMessages
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
import kotlin.system.exitProcess
class ModuleDownloaderPreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) {
private var state = State.INITIAL
+ private val coroutineScope = CoroutineScope(Dispatchers.Main)
override fun getSummary() = context.getString(state.messageResourceId)
override fun getTitle() = context.getString(R.string.module_installer_title)
+ @SuppressLint("ApplySharedPref")
override fun onClick() {
setState(State.WORKING)
- Application.getAsyncWorker().supplyAsync(Application.getModuleLoader()::download).whenComplete(this::onDownloadResult)
- }
-
- @SuppressLint("ApplySharedPref")
- private fun onDownloadResult(result: Int, throwable: Throwable?) {
- when {
- throwable != null -> {
- setState(State.FAILURE)
- Toast.makeText(context, ErrorMessages[throwable], Toast.LENGTH_LONG).show()
- }
- result == OsConstants.ENOENT -> setState(State.NOTFOUND)
- result == OsConstants.EXIT_SUCCESS -> {
- setState(State.SUCCESS)
- Application.getSharedPreferences().edit().remove("disable_kernel_module").commit()
- Application.getAsyncWorker().runAsync {
- val restartIntent = Intent(context, SettingsActivity::class.java)
- restartIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
- restartIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
- Application.get().startActivity(restartIntent)
- exitProcess(0)
+ coroutineScope.launch {
+ try {
+ when (withContext(Dispatchers.IO) { Application.getModuleLoader().download() }) {
+ OsConstants.ENOENT -> setState(State.NOTFOUND)
+ OsConstants.EXIT_SUCCESS -> {
+ setState(State.SUCCESS)
+ Application.getSharedPreferences().edit().remove("disable_kernel_module").commit()
+ CoroutineScope(Dispatchers.Default).launch {
+ val restartIntent = Intent(context, SettingsActivity::class.java)
+ restartIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
+ restartIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ Application.get().startActivity(restartIntent)
+ exitProcess(0)
+ }
+ }
+ else -> setState(State.FAILURE)
}
+ } catch (e: Exception) {
+ setState(State.FAILURE)
+ Toast.makeText(context, ErrorMessages[e], Toast.LENGTH_LONG).show()
}
- else -> setState(State.FAILURE)
}
}
diff --git a/ui/src/main/java/com/wireguard/android/preference/ToolsInstallerPreference.kt b/ui/src/main/java/com/wireguard/android/preference/ToolsInstallerPreference.kt
index f7dd932d..e9c0dc36 100644
--- a/ui/src/main/java/com/wireguard/android/preference/ToolsInstallerPreference.kt
+++ b/ui/src/main/java/com/wireguard/android/preference/ToolsInstallerPreference.kt
@@ -10,6 +10,10 @@ import androidx.preference.Preference
import com.wireguard.android.Application
import com.wireguard.android.R
import com.wireguard.android.util.ToolsInstaller
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
/**
* Preference implementing a button that asynchronously runs `ToolsInstaller` and displays the
@@ -17,6 +21,7 @@ import com.wireguard.android.util.ToolsInstaller
*/
class ToolsInstallerPreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) {
private var state = State.INITIAL
+ private val coroutineScope = CoroutineScope(Dispatchers.Main)
override fun getSummary() = context.getString(state.messageResourceId)
@@ -24,30 +29,35 @@ class ToolsInstallerPreference(context: Context, attrs: AttributeSet?) : Prefere
override fun onAttached() {
super.onAttached()
- Application.getAsyncWorker().supplyAsync(Application.getToolsInstaller()::areInstalled).whenComplete(this::onCheckResult)
- }
-
- private fun onCheckResult(state: Int, throwable: Throwable?) {
- when {
- throwable != null || state == ToolsInstaller.ERROR -> setState(State.INITIAL)
- state and ToolsInstaller.YES == ToolsInstaller.YES -> setState(State.ALREADY)
- state and (ToolsInstaller.MAGISK or ToolsInstaller.NO) == ToolsInstaller.MAGISK or ToolsInstaller.NO -> setState(State.INITIAL_MAGISK)
- state and (ToolsInstaller.SYSTEM or ToolsInstaller.NO) == ToolsInstaller.SYSTEM or ToolsInstaller.NO -> setState(State.INITIAL_SYSTEM)
- else -> setState(State.INITIAL)
+ coroutineScope.launch {
+ try {
+ val state = withContext(Dispatchers.IO) { Application.getToolsInstaller().areInstalled() }
+ when {
+ state == ToolsInstaller.ERROR -> setState(State.INITIAL)
+ state and ToolsInstaller.YES == ToolsInstaller.YES -> setState(State.ALREADY)
+ state and (ToolsInstaller.MAGISK or ToolsInstaller.NO) == ToolsInstaller.MAGISK or ToolsInstaller.NO -> setState(State.INITIAL_MAGISK)
+ state and (ToolsInstaller.SYSTEM or ToolsInstaller.NO) == ToolsInstaller.SYSTEM or ToolsInstaller.NO -> setState(State.INITIAL_SYSTEM)
+ else -> setState(State.INITIAL)
+ }
+ } catch (_: Exception) {
+ setState(State.INITIAL)
+ }
}
}
override fun onClick() {
setState(State.WORKING)
- Application.getAsyncWorker().supplyAsync { Application.getToolsInstaller().install() }.whenComplete { result: Int, throwable: Throwable? -> onInstallResult(result, throwable) }
- }
-
- private fun onInstallResult(result: Int, throwable: Throwable?) {
- when {
- throwable != null -> setState(State.FAILURE)
- result and (ToolsInstaller.YES or ToolsInstaller.MAGISK) == ToolsInstaller.YES or ToolsInstaller.MAGISK -> setState(State.SUCCESS_MAGISK)
- result and (ToolsInstaller.YES or ToolsInstaller.SYSTEM) == ToolsInstaller.YES or ToolsInstaller.SYSTEM -> setState(State.SUCCESS_SYSTEM)
- else -> setState(State.FAILURE)
+ coroutineScope.launch {
+ try {
+ val result = withContext(Dispatchers.IO) { Application.getToolsInstaller().install() }
+ when {
+ result and (ToolsInstaller.YES or ToolsInstaller.MAGISK) == ToolsInstaller.YES or ToolsInstaller.MAGISK -> setState(State.SUCCESS_MAGISK)
+ result and (ToolsInstaller.YES or ToolsInstaller.SYSTEM) == ToolsInstaller.YES or ToolsInstaller.SYSTEM -> setState(State.SUCCESS_SYSTEM)
+ else -> setState(State.FAILURE)
+ }
+ } catch (_: Exception) {
+ setState(State.FAILURE)
+ }
}
}
diff --git a/ui/src/main/java/com/wireguard/android/preference/VersionPreference.kt b/ui/src/main/java/com/wireguard/android/preference/VersionPreference.kt
index 0734df45..f944233b 100644
--- a/ui/src/main/java/com/wireguard/android/preference/VersionPreference.kt
+++ b/ui/src/main/java/com/wireguard/android/preference/VersionPreference.kt
@@ -16,6 +16,10 @@ import com.wireguard.android.R
import com.wireguard.android.backend.Backend
import com.wireguard.android.backend.GoBackend
import com.wireguard.android.backend.WgQuickBackend
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
import java.util.Locale
class VersionPreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) {
@@ -45,11 +49,12 @@ class VersionPreference(context: Context, attrs: AttributeSet?) : Preference(con
init {
Application.getBackendAsync().thenAccept { backend ->
versionSummary = getContext().getString(R.string.version_summary_checking, getBackendPrettyName(context, backend).toLowerCase(Locale.ENGLISH))
- Application.getAsyncWorker().supplyAsync(backend::getVersion).whenComplete { version, exception ->
- versionSummary = if (exception == null)
- getContext().getString(R.string.version_summary, getBackendPrettyName(context, backend), version)
- else
+ CoroutineScope(Dispatchers.Main).launch {
+ versionSummary = try {
+ getContext().getString(R.string.version_summary, getBackendPrettyName(context, backend), withContext(Dispatchers.IO) { backend.version })
+ } catch (_: Exception) {
getContext().getString(R.string.version_summary_unknown, getBackendPrettyName(context, backend).toLowerCase(Locale.ENGLISH))
+ }
notifyChanged()
}
}