commit 780d5b98588453fe51e8b77203210a79283cff89
parent b549f77260dcdc475d6e988737efcbdf58987429
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Wed, 22 Nov 2023 16:53:21 +0100

fix(manager): back handler

Diffstat:
Mmanager/src/main/AndroidManifest.xml | 6+++++-
Mmanager/src/main/kotlin/me/rhunk/snapenhance/manager/ui/tab/impl/download/InstallPackageTab.kt | 2++
Mmanager/src/main/kotlin/me/rhunk/snapenhance/manager/ui/tab/impl/download/LSPatchTab.kt | 197++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Mmanager/src/main/kotlin/me/rhunk/snapenhance/manager/ui/tab/impl/download/SnapchatPatchTab.kt | 6+++---
4 files changed, 119 insertions(+), 92 deletions(-)

diff --git a/manager/src/main/AndroidManifest.xml b/manager/src/main/AndroidManifest.xml @@ -13,7 +13,11 @@ tools:targetApi="34" android:enableOnBackInvokedCallback="true" android:icon="@android:drawable/ic_input_add"> - <activity android:name=".ui.MainActivity" android:exported="true" android:theme="@style/AppTheme"> + <activity + android:name=".ui.MainActivity" + android:exported="true" + android:theme="@style/AppTheme" + android:screenOrientation="nosensor"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> diff --git a/manager/src/main/kotlin/me/rhunk/snapenhance/manager/ui/tab/impl/download/InstallPackageTab.kt b/manager/src/main/kotlin/me/rhunk/snapenhance/manager/ui/tab/impl/download/InstallPackageTab.kt @@ -4,6 +4,7 @@ import android.content.Intent import android.net.Uri import android.widget.Toast import androidx.activity.ComponentActivity +import androidx.activity.compose.BackHandler import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.layout.* @@ -107,6 +108,7 @@ class InstallPackageTab : Tab("install_app") { } else it } ?: false } + BackHandler(installStage != InstallStage.DONE || installStage != InstallStage.ERROR) {} Column( modifier = Modifier.fillMaxSize().padding(16.dp), horizontalAlignment = Alignment.CenterHorizontally, diff --git a/manager/src/main/kotlin/me/rhunk/snapenhance/manager/ui/tab/impl/download/LSPatchTab.kt b/manager/src/main/kotlin/me/rhunk/snapenhance/manager/ui/tab/impl/download/LSPatchTab.kt @@ -1,6 +1,7 @@ package me.rhunk.snapenhance.manager.ui.tab.impl.download import android.os.Bundle +import androidx.activity.compose.BackHandler import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll @@ -15,8 +16,11 @@ import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog +import androidx.navigation.NavGraphBuilder +import androidx.navigation.compose.composable +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.cancel +import kotlinx.coroutines.Job import kotlinx.coroutines.launch import me.rhunk.snapenhance.manager.data.APKMirror import me.rhunk.snapenhance.manager.data.DownloadItem @@ -25,15 +29,19 @@ import me.rhunk.snapenhance.manager.ui.components.DowngradeNoticeDialog import me.rhunk.snapenhance.manager.ui.tab.Tab import okio.use import java.io.File +import kotlin.properties.Delegates class LSPatchTab : Tab("lspatch") { - private var localItemFile: File? = null - private var downloadItem: DownloadItem? = null - private var snapEnhanceModule: File? = null - private var patchedApk by mutableStateOf<File?>(null) private val apkMirror = APKMirror() - private fun patch(log: (Any?) -> Unit, onProgress: (Float) -> Unit) { + private fun patch( + log: (Any?) -> Unit, + onProgress: (Float) -> Unit, + downloadItem: DownloadItem? = null, + snapEnhanceModule: File? = null, + localItemFile: File? = null, + patchedApk: MutableState<File?>, + ) { var apkFile: File? = localItemFile downloadItem?.let { @@ -91,118 +99,131 @@ class LSPatchTab : Tab("lspatch") { log("== Patching apk ==") val outputFiles = lsPatch.patchSplits(listOf(apkFile!!)) - patchedApk = outputFiles["base.apk"] ?: run { + patchedApk.value = outputFiles["base.apk"] ?: run { log("== Failed to patch apk ==") return } return } - patchedApk = apkFile + patchedApk.value = apkFile } - @Composable @Suppress("DEPRECATION") - override fun Content() { - this.localItemFile = remember { getArguments()?.getString("localItemFile")?.let { File(it) } } - this.downloadItem = remember { getArguments()?.getParcelable("downloadItem") } - this.snapEnhanceModule = remember { - getArguments()?.getString("modulePath")?.let { - File(it) + override fun build(navGraphBuilder: NavGraphBuilder) { + var currentJob: Job? = null + val coroutineScope = CoroutineScope(Dispatchers.IO) + val patchedApk = mutableStateOf<File?>(null) + val status = mutableStateOf("") + var progress by mutableFloatStateOf(-1f) + var isRunning by Delegates.observable(false) { _, _, newValue -> + if (!newValue) { + currentJob?.cancel() + currentJob = null + progress = -1f } } - val coroutineScope = rememberCoroutineScope() - var showDowngradeNoticeDialog by remember { mutableStateOf(false) } - - var status by remember { mutableStateOf("") } - var progress by remember { mutableFloatStateOf(-1f) } - - LaunchedEffect(this.snapEnhanceModule) { - patchedApk = null - coroutineScope.launch(Dispatchers.IO) { - runCatching { - patch(log = { + navGraphBuilder.composable(route) { + var showDowngradeNoticeDialog by remember { mutableStateOf(false) } + + LaunchedEffect(Unit) { + if (isRunning) return@LaunchedEffect + status.value = "" + coroutineScope.launch(Dispatchers.IO) { + isRunning = true + runCatching { + patch( + localItemFile = getArguments()?.getString("localItemFile")?.let { File(it) } , + log = { + coroutineScope.launch { + status.value += when (it) { + is Throwable -> it.message + "\n" + it.stackTraceToString() + else -> it.toString() + } + "\n" + } + }, + downloadItem = getArguments()?.getParcelable("downloadItem"), + snapEnhanceModule = getArguments()?.getString("modulePath")?.let { + File(it) + }, + patchedApk = patchedApk, + onProgress = { progress = it } + ) + }.onFailure { coroutineScope.launch { - status += when (it) { - is Throwable -> it.message + "\n" + it.stackTraceToString() - else -> it.toString() - } + "\n" + status.value += it.message + "\n" + it.stackTraceToString() } - }) { - progress = it } - }.onFailure { - coroutineScope.launch { - status += it.message + "\n" + it.stackTraceToString() - } - } + isRunning = false + }.also { currentJob = it } } - } - DisposableEffect(Unit) { - onDispose { - coroutineScope.cancel() + DisposableEffect(Unit) { + onDispose { + if (isRunning) return@onDispose + patchedApk.value = null + } } - } - val scrollState = rememberScrollState() - - fun triggerInstallation(shouldUninstall: Boolean) { - navigation.navigateTo(InstallPackageTab::class, args = Bundle().apply { - putString("downloadPath", patchedApk?.absolutePath) - putString("appPackage", sharedConfig.snapchatPackageName) - putBoolean("uninstall", shouldUninstall) - }) - } + val scrollState = rememberScrollState() - Column( - modifier = Modifier - .fillMaxSize() - .padding(20.dp), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(10.dp) - ) { - Card( + fun triggerInstallation(shouldUninstall: Boolean) { + navigation.navigateTo(InstallPackageTab::class, args = Bundle().apply { + putString("downloadPath", patchedApk.value?.absolutePath) + putString("appPackage", sharedConfig.snapchatPackageName) + putBoolean("uninstall", shouldUninstall) + }) + } + BackHandler(isRunning) {} + Column( modifier = Modifier - .weight(1f) - .padding(10.dp), + .fillMaxSize() + .padding(20.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(10.dp) ) { - Column( + Card( modifier = Modifier - .fillMaxSize() - .verticalScroll(scrollState) + .weight(1f) + .padding(10.dp), ) { - Text(text = status, overflow = TextOverflow.Visible, modifier = Modifier.padding(10.dp)) + Column( + modifier = Modifier + .fillMaxSize() + .verticalScroll(scrollState) + ) { + Text(text = status.value, overflow = TextOverflow.Visible, modifier = Modifier.padding(10.dp)) + } } - } - if (progress != -1f) { - LinearProgressIndicator(progress = progress, modifier = Modifier.height(10.dp), strokeCap = StrokeCap.Round) - } - - if (patchedApk != null) { - Button(modifier = Modifier.fillMaxWidth(), onClick = { - triggerInstallation(true) - }) { - Text(text = "Uninstall & Install") + if (progress != -1f) { + LinearProgressIndicator(progress = progress, modifier = Modifier.height(10.dp), strokeCap = StrokeCap.Round) } - Button(modifier = Modifier.fillMaxWidth(), onClick = { - showDowngradeNoticeDialog = true - }) { - Text(text = "Update") + if (patchedApk.value != null) { + Button(modifier = Modifier.fillMaxWidth(), onClick = { + triggerInstallation(true) + }) { + Text(text = "Uninstall & Install") + } + + Button(modifier = Modifier.fillMaxWidth(), onClick = { + showDowngradeNoticeDialog = true + }) { + Text(text = "Update") + } } - } - LaunchedEffect(status) { - scrollState.scrollTo(scrollState.maxValue) + LaunchedEffect(status) { + scrollState.scrollTo(scrollState.maxValue) + } } - } - if (showDowngradeNoticeDialog) { - Dialog(onDismissRequest = { showDowngradeNoticeDialog = false }) { - DowngradeNoticeDialog(onDismiss = { showDowngradeNoticeDialog = false }, onSuccess = { - triggerInstallation(false) - }) + if (showDowngradeNoticeDialog) { + Dialog(onDismissRequest = { showDowngradeNoticeDialog = false }) { + DowngradeNoticeDialog(onDismiss = { showDowngradeNoticeDialog = false }, onSuccess = { + triggerInstallation(false) + }) + } } } } diff --git a/manager/src/main/kotlin/me/rhunk/snapenhance/manager/ui/tab/impl/download/SnapchatPatchTab.kt b/manager/src/main/kotlin/me/rhunk/snapenhance/manager/ui/tab/impl/download/SnapchatPatchTab.kt @@ -279,7 +279,7 @@ class SnapchatPatchTab : Tab("snapchat_download") { navigation.navigateTo(LSPatchTab::class, args = Bundle().apply { putParcelable("downloadItem", selectedSnapchatVersion) putString("modulePath", installedSnapEnhanceVersion?.applicationInfo?.sourceDir) - }, noHistory = true) + }) } ) { Text("Download & Patch") @@ -292,7 +292,7 @@ class SnapchatPatchTab : Tab("snapchat_download") { navigation.navigateTo(LSPatchTab::class, args = Bundle().apply { putString("localItemFile", installedSnapchatPackage?.applicationInfo?.sourceDir ?: return@apply) putString("modulePath", installedSnapEnhanceVersion?.applicationInfo?.sourceDir ?: return@apply) - }, noHistory = true) + }) } ) { Text("Patch from existing installation") @@ -306,7 +306,7 @@ class SnapchatPatchTab : Tab("snapchat_download") { onClick = { navigation.navigateTo(LSPatchTab::class, args = Bundle().apply { putParcelable("downloadItem", selectedSnapchatVersion) - }, noHistory = true) + }) } ) { Text("Install/Restore Original Snapchat")