diff --git a/app/src/main/java/app/revanced/manager/patcher/worker/PatcherWorker.kt b/app/src/main/java/app/revanced/manager/patcher/worker/PatcherWorker.kt index 1359d34..3a9955f 100644 --- a/app/src/main/java/app/revanced/manager/patcher/worker/PatcherWorker.kt +++ b/app/src/main/java/app/revanced/manager/patcher/worker/PatcherWorker.kt @@ -134,7 +134,7 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : Log.d(tag, "Adding ${patches.size} patch(es)") patcher.addPatches(patches) - // patcher.addFiles(listOf(integrations)) {} + patcher.addFiles(listOf(integrations)) {} patcher.applyPatches().forEach { (patch, result) -> if (result.isSuccess) { diff --git a/app/src/main/java/app/revanced/manager/ui/component/SplitAPKDialog.kt b/app/src/main/java/app/revanced/manager/ui/component/SplitAPKDialog.kt new file mode 100644 index 0000000..29815b9 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/component/SplitAPKDialog.kt @@ -0,0 +1,42 @@ +package app.revanced.manager.ui.component + +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import app.revanced.manager.R + +@Composable +fun SplitAPKDialog( + onDismiss: () -> Unit, + onConfirm: () -> Unit +) { + AlertDialog(onDismissRequest = onDismiss, shape = RoundedCornerShape(12.dp), + title = { + Text(stringResource(id = R.string.warning), textAlign = TextAlign.Center) + }, + text = { + Text(stringResource(R.string.split_apk_warning)) + }, + confirmButton = { + Button( + onClick = { + onConfirm() + onDismiss() + } + ) { + Text(text = "OK") + } + }, + dismissButton = { + OutlinedButton(onClick = onDismiss) { + Text(text = "Cancel") + } + } + ) +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screen/PatcherScreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/PatcherScreen.kt index 654d011..d2c024a 100644 --- a/app/src/main/java/app/revanced/manager/ui/screen/PatcherScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screen/PatcherScreen.kt @@ -4,13 +4,14 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Build import androidx.compose.material3.* -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue +import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import app.revanced.manager.R import app.revanced.manager.Variables.patches @@ -18,6 +19,7 @@ import app.revanced.manager.Variables.selectedAppPackage import app.revanced.manager.Variables.selectedPatches import app.revanced.manager.ui.Resource import app.revanced.manager.ui.component.FloatingActionButton +import app.revanced.manager.ui.component.SplitAPKDialog import app.revanced.manager.ui.viewmodel.PatcherViewModel import org.koin.androidx.compose.getViewModel @@ -32,11 +34,14 @@ fun PatcherScreen( val selectedAppPackage by selectedAppPackage val hasAppSelected = selectedAppPackage.isPresent val patchesLoaded = patches.value is Resource.Success + var showDialog by remember { mutableStateOf(false) } Scaffold(floatingActionButton = { FloatingActionButton( enabled = hasAppSelected && viewModel.anyPatchSelected(), - onClick = { viewModel.startPatcher() }, + onClick = { + if (viewModel.checkSplitApk()) { showDialog = true } else viewModel.startPatcher() + }, icon = { Icon(Icons.Default.Build, contentDescription = "Patch") }, text = { Text(text = "Patch") } ) @@ -47,6 +52,8 @@ fun PatcherScreen( .padding(paddingValues) .padding(16.dp), ) { + if (showDialog) + SplitAPKDialog(onDismiss = { showDialog = false }, onConfirm = { viewModel.startPatcher() }) Card( modifier = Modifier .padding(4.dp) @@ -63,7 +70,8 @@ fun PatcherScreen( text = if (patchesLoaded) { selectedAppPackage.orElse(stringResource(R.string.card_application_not_selected)) } else { - stringResource(R.string.card_application_not_loaded)}, + stringResource(R.string.card_application_not_loaded) + }, style = MaterialTheme.typography.bodyMedium, modifier = Modifier.padding(0.dp, 8.dp) ) diff --git a/app/src/main/java/app/revanced/manager/ui/viewmodel/PatcherViewModel.kt b/app/src/main/java/app/revanced/manager/ui/viewmodel/PatcherViewModel.kt index 2a17754..a92c442 100644 --- a/app/src/main/java/app/revanced/manager/ui/viewmodel/PatcherViewModel.kt +++ b/app/src/main/java/app/revanced/manager/ui/viewmodel/PatcherViewModel.kt @@ -109,6 +109,15 @@ class PatcherViewModel(private val app: Application, private val api: API) : Vie } } + fun checkSplitApk(): Boolean { + if (getSelectedPackageInfo()!!.applicationInfo!!.metaData!!.getBoolean("com.android.vending.splits.required", false)) { + Log.d(tag, "APK is split.") + return true + } + Log.d(tag, "APK is not split.") + return false + } + private fun loadPatches() = viewModelScope.launch { try { val file = api.downloadPatchBundle(app.filesDir) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 58fb491..b5ad59a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,6 +7,7 @@ Settings Updates Manager + Update Manager Update Patches Installed Update All @@ -75,4 +76,6 @@ ReVanced Manager is patching Theme Apply - + Warning + You have selected a resource patch and a split APK installation was detected so patching errors can occur.\nAre you sure you want to proceed with patching a split base APK? + \ No newline at end of file