diff options
Diffstat (limited to 'ui/src/main/java/com/wireguard/android/preference')
3 files changed, 63 insertions, 44 deletions
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() } } |