From 9a31d6d624dbd45b88a3da12dd478a6075e75e3b Mon Sep 17 00:00:00 2001
From: rushiiMachine <33725716+rushiiMachine@users.noreply.github.com>
Date: Wed, 5 Mar 2025 16:59:43 -0800
Subject: [PATCH] feat: add button for info about obtaining patched APK
---
INFO.md | 26 +++++++++++
app/src/main/AndroidManifest.xml | 10 ----
.../network/service/AliucordGithubService.kt | 4 +-
.../patcher/steps/patch/SmaliPatchStep.kt | 2 +-
.../components/MainActionButton.kt | 2 +-
.../ui/components/settings/SettingsSwitch.kt | 3 +-
.../manager/ui/screens/home/HomeScreen.kt | 4 +-
.../ui/screens/patching/PatchingScreen.kt | 32 ++++++-------
.../ui/screens/settings/SettingsScreen.kt | 46 ++++++++++++-------
app/src/main/res/values/strings.xml | 1 +
app/src/main/res/xml/provider_paths.xml | 6 ---
11 files changed, 80 insertions(+), 56 deletions(-)
create mode 100644 INFO.md
rename app/src/main/kotlin/com/aliucord/manager/ui/{screens/patching => }/components/MainActionButton.kt (95%)
delete mode 100644 app/src/main/res/xml/provider_paths.xml
diff --git a/INFO.md b/INFO.md
new file mode 100644
index 0000000..f72ecbd
--- /dev/null
+++ b/INFO.md
@@ -0,0 +1,26 @@
+## Obtaining Patched APKs
+
+Unfortunately, starting with Android 10, file managers cannot access external data of other apps without root.
+You will have to manually download the patched APK via `adb`.
+
+ADB command (assuming the first user profile):
+
+```shell
+$ adb pull /storage/emulated/0/Android/data/com.aliucord.manager/cache/patched/patched.apk
+```
+
+This file should only be used after the patching process has successfully completed.
+If the process failed at any step before "Installing", then the APK will be unusable.
+
+The patched APK **should not be reused on another device**. Refer to the section [below](#backing-up-aliucord)
+for more information.
+
+## Backing up Aliucord
+
+Note: This section is about the app installation itself, not the installed plugins, themes, and settings.
+
+The patched Aliucord APK is tailored to the current device's Android version and CPU architecture.
+Reusing a patched Aliucord APK from one device on another will likely break. Backing up and
+restoring on another device will likely break.
+
+Install Aliucord **directly via Manager** on the device you wish to use it on.
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 7fe1b13..1090a8c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -33,16 +33,6 @@
android:name=".installers.pm.PMIntentReceiver"
android:exported="false" />
-
-
-
-
Unit = {},
pref: Boolean,
onPrefChange: (Boolean) -> Unit,
+ modifier: Modifier = Modifier,
) {
SettingsItem(
- modifier = Modifier.clickable(enabled = !disabled) { onPrefChange(!pref) },
+ modifier = modifier.clickable(enabled = !disabled) { onPrefChange(!pref) },
text = { Text(text = label, softWrap = true) },
icon = icon,
secondaryText = {
diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/home/HomeScreen.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/home/HomeScreen.kt
index c9f81d3..0f3213d 100644
--- a/app/src/main/kotlin/com/aliucord/manager/ui/screens/home/HomeScreen.kt
+++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/home/HomeScreen.kt
@@ -12,11 +12,10 @@ import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.*
-import androidx.compose.runtime.*
+import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
-import androidx.compose.ui.graphics.*
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@@ -36,7 +35,6 @@ import com.aliucord.manager.ui.util.paddings.PaddingValuesSides
import com.aliucord.manager.ui.util.paddings.exclude
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
-import kotlin.math.*
@Parcelize
class HomeScreen : Screen, Parcelable {
diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/patching/PatchingScreen.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/patching/PatchingScreen.kt
index 25e9ee5..63d72d5 100644
--- a/app/src/main/kotlin/com/aliucord/manager/ui/screens/patching/PatchingScreen.kt
+++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/patching/PatchingScreen.kt
@@ -246,24 +246,24 @@ class PatchingScreen(private val data: PatchOptions) : Screen, Parcelable {
icon = painterResource(R.drawable.ic_refresh),
onClick = model::restart,
)
-
- MainActionButton(
- text = stringResource(R.string.setting_clear_cache),
- icon = painterResource(R.drawable.ic_delete_forever),
- enabled = !cacheCleared,
- colors = IconButtonDefaults.filledTonalIconButtonColors(
- containerColor = MaterialTheme.colorScheme.error,
- ),
- onClick = {
- cacheCleared = true
- model.clearCache()
- },
- modifier = Modifier
- .padding(top = 14.dp)
- .fillMaxWidth()
- )
}
}
+
+ MainActionButton(
+ text = stringResource(R.string.setting_clear_cache),
+ icon = painterResource(R.drawable.ic_delete_forever),
+ enabled = !cacheCleared,
+ colors = IconButtonDefaults.filledTonalIconButtonColors(
+ containerColor = MaterialTheme.colorScheme.error,
+ ),
+ onClick = {
+ cacheCleared = true
+ model.clearCache()
+ },
+ modifier = Modifier
+ .padding(top = 14.dp)
+ .fillMaxWidth()
+ )
}
}
}
diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/settings/SettingsScreen.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/settings/SettingsScreen.kt
index 50bede3..f37c052 100644
--- a/app/src/main/kotlin/com/aliucord/manager/ui/screens/settings/SettingsScreen.kt
+++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/settings/SettingsScreen.kt
@@ -13,14 +13,16 @@ import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
-import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.koin.getScreenModel
import com.aliucord.manager.R
+import com.aliucord.manager.network.service.AliucordGithubService
import com.aliucord.manager.ui.components.BackButton
+import com.aliucord.manager.ui.components.MainActionButton
import com.aliucord.manager.ui.components.settings.*
import com.aliucord.manager.ui.screens.settings.components.ThemeDialog
import kotlinx.parcelize.IgnoredOnParcel
@@ -34,6 +36,7 @@ class SettingsScreen : Screen, Parcelable {
@Composable
override fun Content() {
val model = getScreenModel()
+ var clearedCache by rememberSaveable { mutableStateOf(false) }
Scaffold(
topBar = {
@@ -76,10 +79,9 @@ class SettingsScreen : Screen, Parcelable {
label = stringResource(R.string.setting_dynamic_color),
secondaryLabel = stringResource(R.string.setting_dynamic_color_desc),
pref = preferences.dynamicColor,
- icon = { Icon(painterResource(R.drawable.ic_palette), null) }
- ) {
- preferences.dynamicColor = it
- }
+ icon = { Icon(painterResource(R.drawable.ic_palette), null) },
+ onPrefChange = { preferences.dynamicColor = it },
+ )
}
SettingsHeader(stringResource(R.string.settings_advanced))
@@ -88,10 +90,9 @@ class SettingsScreen : Screen, Parcelable {
label = stringResource(R.string.settings_developer_options),
secondaryLabel = stringResource(R.string.settings_developer_options_desc),
pref = preferences.devMode,
- icon = { Icon(painterResource(R.drawable.ic_code), null) }
- ) {
- preferences.devMode = it
- }
+ icon = { Icon(painterResource(R.drawable.ic_code), null) },
+ onPrefChange = { preferences.devMode = it },
+ )
SettingsSwitch(
label = stringResource(R.string.setting_keep_patched_apks),
@@ -99,23 +100,34 @@ class SettingsScreen : Screen, Parcelable {
icon = { Icon(painterResource(R.drawable.ic_delete_forever), null) },
pref = preferences.keepPatchedApks,
onPrefChange = model::setKeepPatchedApks,
+ modifier = Modifier.padding(bottom = 18.dp),
)
- var clearedCache by rememberSaveable { mutableStateOf(false) }
- Button(
- shape = ShapeDefaults.Large,
+ MainActionButton(
+ text = stringResource(R.string.setting_clear_cache),
+ icon = painterResource(R.drawable.ic_delete_forever),
enabled = !clearedCache,
+ colors = IconButtonDefaults.filledTonalIconButtonColors(
+ containerColor = MaterialTheme.colorScheme.error,
+ ),
onClick = {
clearedCache = true
model.clearCacheDir()
},
modifier = Modifier
+ .padding(horizontal = 18.dp, vertical = 10.dp)
.fillMaxWidth()
- .padding(18.dp),
- ) {
- Text(
- text = stringResource(R.string.setting_clear_cache),
- textAlign = TextAlign.Center
+ )
+
+ if (preferences.keepPatchedApks) {
+ val handler = LocalUriHandler.current
+ MainActionButton(
+ text = stringResource(R.string.setting_see_patched_apks),
+ icon = painterResource(R.drawable.ic_launch),
+ onClick = { handler.openUri(AliucordGithubService.PATCHED_APKS_INFO_URL) },
+ modifier = Modifier
+ .padding(horizontal = 18.dp, vertical = 9.dp)
+ .fillMaxWidth()
)
}
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 166f960..eec3953 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -50,6 +50,7 @@
Keep patched APKs
Keep all patched files and APKs after installing for debugging.
This device does not support external cache directories!
+ See patched APKs
System
Dark
diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml
deleted file mode 100644
index 135fca2..0000000
--- a/app/src/main/res/xml/provider_paths.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-