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