From 667ac6282f3248ab008f428e080c76f26180c7c4 Mon Sep 17 00:00:00 2001 From: Nullptr Date: Fri, 21 Oct 2022 19:57:24 +0800 Subject: [PATCH] Fix coroutine stuck --- .../lspatch/manager/AppBroadcastReceiver.kt | 5 +-- .../lsposed/lspatch/ui/page/NewPatchScreen.kt | 2 +- .../lspatch/ui/page/manage/AppManagePage.kt | 4 +-- .../lspatch/ui/viewmodel/NewPatchViewModel.kt | 34 +++++++++---------- .../ui/viewmodel/manage/AppManageViewModel.kt | 5 +-- 5 files changed, 26 insertions(+), 24 deletions(-) diff --git a/manager/src/main/java/org/lsposed/lspatch/manager/AppBroadcastReceiver.kt b/manager/src/main/java/org/lsposed/lspatch/manager/AppBroadcastReceiver.kt index f222b28..d9be08f 100644 --- a/manager/src/main/java/org/lsposed/lspatch/manager/AppBroadcastReceiver.kt +++ b/manager/src/main/java/org/lsposed/lspatch/manager/AppBroadcastReceiver.kt @@ -5,7 +5,8 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.util.Log -import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.launch +import org.lsposed.lspatch.lspApp import org.lsposed.lspatch.util.LSPPackageManager class AppBroadcastReceiver : BroadcastReceiver() { @@ -30,7 +31,7 @@ class AppBroadcastReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.action in actions) { - runBlocking { + lspApp.globalScope.launch { Log.i(TAG, "Received intent: $intent") LSPPackageManager.fetchAppList() } diff --git a/manager/src/main/java/org/lsposed/lspatch/ui/page/NewPatchScreen.kt b/manager/src/main/java/org/lsposed/lspatch/ui/page/NewPatchScreen.kt index 79bfe7e..7b4fedb 100644 --- a/manager/src/main/java/org/lsposed/lspatch/ui/page/NewPatchScreen.kt +++ b/manager/src/main/java/org/lsposed/lspatch/ui/page/NewPatchScreen.kt @@ -391,7 +391,7 @@ private fun InstallDialog(patchApp: AppInfo, onFinish: (Int, String?) -> Unit) { val scope = rememberCoroutineScope() var uninstallFirst by remember { mutableStateOf(ShizukuApi.isPackageInstalledWithoutPatch(patchApp.app.packageName)) } var installing by remember { mutableStateOf(0) } - val doInstall = suspend { + suspend fun doInstall() { Log.i(TAG, "Installing app ${patchApp.app.packageName}") installing = 1 val (status, message) = LSPPackageManager.install() diff --git a/manager/src/main/java/org/lsposed/lspatch/ui/page/manage/AppManagePage.kt b/manager/src/main/java/org/lsposed/lspatch/ui/page/manage/AppManagePage.kt index 0a14311..b450b7a 100644 --- a/manager/src/main/java/org/lsposed/lspatch/ui/page/manage/AppManagePage.kt +++ b/manager/src/main/java/org/lsposed/lspatch/ui/page/manage/AppManagePage.kt @@ -229,8 +229,8 @@ fun AppManageBody( } ) val uninstallSuccessfully = stringResource(R.string.manage_uninstall_successfully) - val launcher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (it.resultCode == Activity.RESULT_OK) { + val launcher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == Activity.RESULT_OK) { scope.launch { snackbarHost.showSnackbar(uninstallSuccessfully) } diff --git a/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt b/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt index 656ae62..d170a91 100644 --- a/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt +++ b/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/NewPatchViewModel.kt @@ -66,11 +66,13 @@ class NewPatchViewModel : ViewModel() { } fun dispatch(action: ViewAction) { - when (action) { - is ViewAction.DoneInit -> doneInit() - is ViewAction.ConfigurePatch -> configurePatch(action.app) - is ViewAction.SubmitPatch -> submitPatch() - is ViewAction.LaunchPatch -> launchPatch() + viewModelScope.launch { + when (action) { + is ViewAction.DoneInit -> doneInit() + is ViewAction.ConfigurePatch -> configurePatch(action.app) + is ViewAction.SubmitPatch -> submitPatch() + is ViewAction.LaunchPatch -> launchPatch() + } } } @@ -95,19 +97,17 @@ class NewPatchViewModel : ViewModel() { patchState = PatchState.PATCHING } - private fun launchPatch() { + private suspend fun launchPatch() { logger.i("Launch patch") - viewModelScope.launch { - patchState = try { - Patcher.patch(logger, patchOptions) - PatchState.FINISHED - } catch (t: Throwable) { - logger.e(t.message.orEmpty()) - logger.e(t.stackTraceToString()) - PatchState.ERROR - } finally { - LSPPackageManager.cleanTmpApkDir() - } + patchState = try { + Patcher.patch(logger, patchOptions) + PatchState.FINISHED + } catch (t: Throwable) { + logger.e(t.message.orEmpty()) + logger.e(t.stackTraceToString()) + PatchState.ERROR + } finally { + LSPPackageManager.cleanTmpApkDir() } } } diff --git a/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/manage/AppManageViewModel.kt b/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/manage/AppManageViewModel.kt index ecf3782..9732117 100644 --- a/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/manage/AppManageViewModel.kt +++ b/manager/src/main/java/org/lsposed/lspatch/ui/viewmodel/manage/AppManageViewModel.kt @@ -11,6 +11,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.google.gson.Gson import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.lsposed.lspatch.Patcher import org.lsposed.lspatch.lspApp @@ -69,8 +70,8 @@ class AppManageViewModel : ViewModel() { } } - suspend fun dispatch(action: ViewAction) { - withContext(viewModelScope.coroutineContext) { + fun dispatch(action: ViewAction) { + viewModelScope.launch { when (action) { is ViewAction.UpdateLoader -> updateLoader(action.appInfo, action.config) is ViewAction.ClearUpdateLoaderResult -> updateLoaderState = ProcessingState.Idle