diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2020-09-14 14:27:55 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2020-09-14 14:40:10 +0200 |
commit | 2fc0bb1a03f624e297d2afdeb95231cf906afc21 (patch) | |
tree | b1f9ed3d59683b5bbe4975821988c0e9ce7f2e84 /ui/src/main/java/com/wireguard | |
parent | dd0ff8fe60daea6ae3666b5fe655c37303b77626 (diff) |
coroutines: convert low-hanging fruits
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'ui/src/main/java/com/wireguard')
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() } } |