diff --git a/app/src/main/java/app/revanced/manager/patcher/aapt/Aapt.kt b/app/src/main/java/app/revanced/manager/patcher/aapt/Aapt.kt index 25e26be4..959768e6 100644 --- a/app/src/main/java/app/revanced/manager/patcher/aapt/Aapt.kt +++ b/app/src/main/java/app/revanced/manager/patcher/aapt/Aapt.kt @@ -1,9 +1,14 @@ package app.revanced.manager.patcher.aapt import android.content.Context +import android.os.Build.SUPPORTED_ABIS as DEVICE_ABIS import java.io.File object Aapt { + private val WORKING_ABIS = setOf("arm64-v8a", "x86", "x86_64") + + fun supportsDevice() = (DEVICE_ABIS intersect WORKING_ABIS).isNotEmpty() + fun binary(context: Context): File? { return File(context.applicationInfo.nativeLibraryDir).resolveAapt() } diff --git a/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt b/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt index 4c23afd4..a4e21297 100644 --- a/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt @@ -8,6 +8,8 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Card +import androidx.compose.material3.CardColors +import androidx.compose.material3.CardDefaults import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -24,13 +26,13 @@ fun NotificationCard( color: Color, icon: ImageVector, text: String, - content: @Composable () -> Unit + content: (@Composable () -> Unit)? = null, ) { Card( + colors = CardDefaults.cardColors(containerColor = color), modifier = Modifier .fillMaxWidth() .clip(RoundedCornerShape(28.dp)) - .background(color) ) { Row( modifier = Modifier @@ -47,11 +49,11 @@ fun NotificationCard( contentDescription = null, ) Text( - modifier = Modifier.width(220.dp), + modifier = if (content != null) Modifier.width(220.dp) else Modifier, text = text, style = MaterialTheme.typography.bodyMedium ) - content() + content?.invoke() } } } \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screen/InstalledAppsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/InstalledAppsScreen.kt index 82bd6f6b..2a2a2b89 100644 --- a/app/src/main/java/app/revanced/manager/ui/screen/InstalledAppsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screen/InstalledAppsScreen.kt @@ -2,10 +2,15 @@ package app.revanced.manager.ui.screen import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.WarningAmber import androidx.compose.material3.ListItem import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -13,14 +18,17 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import app.revanced.manager.R import app.revanced.manager.data.room.apps.installed.InstalledApp +import app.revanced.manager.patcher.aapt.Aapt import app.revanced.manager.ui.component.AppIcon import app.revanced.manager.ui.component.AppLabel import app.revanced.manager.ui.component.LoadingIndicator +import app.revanced.manager.ui.component.NotificationCard import app.revanced.manager.ui.viewmodel.InstalledAppsViewModel import org.koin.androidx.compose.getViewModel @@ -31,43 +39,56 @@ fun InstalledAppsScreen( ) { val installedApps by viewModel.apps.collectAsStateWithLifecycle(initialValue = null) - LazyColumn( - modifier = Modifier.fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = installedApps?.let { if (it.isEmpty()) Arrangement.Center else Arrangement.Top } ?: Arrangement.Center - ) { - installedApps?.let { installedApps -> - - if (installedApps.isNotEmpty()) { - items( - installedApps, - key = { it.currentPackageName } - ) { installedApp -> - viewModel.packageInfoMap[installedApp.currentPackageName].let { packageInfo -> - ListItem( - modifier = Modifier.clickable { onAppClick(installedApp) }, - leadingContent = { - AppIcon( - packageInfo, - contentDescription = null, - Modifier.size(36.dp) - ) - }, - headlineContent = { AppLabel(packageInfo, defaultText = null) }, - supportingContent = { Text(installedApp.currentPackageName) } - ) - - } - } - } else { - item { - Text( - text = stringResource(R.string.no_patched_apps_found), - style = MaterialTheme.typography.titleLarge - ) - } + Column { + if (!Aapt.supportsDevice()) + Box(modifier = Modifier.padding(16.dp)) { + NotificationCard( + color = MaterialTheme.colorScheme.errorContainer, + icon = Icons.Outlined.WarningAmber, + text = stringResource( + R.string.unsupported_architecture_warning + ), + ) } - } ?: item { LoadingIndicator() } + LazyColumn( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = if (installedApps.isNullOrEmpty()) Arrangement.Center else Arrangement.Top + ) { + installedApps?.let { installedApps -> + + if (installedApps.isNotEmpty()) { + items( + installedApps, + key = { it.currentPackageName } + ) { installedApp -> + viewModel.packageInfoMap[installedApp.currentPackageName].let { packageInfo -> + ListItem( + modifier = Modifier.clickable { onAppClick(installedApp) }, + leadingContent = { + AppIcon( + packageInfo, + contentDescription = null, + Modifier.size(36.dp) + ) + }, + headlineContent = { AppLabel(packageInfo, defaultText = null) }, + supportingContent = { Text(installedApp.currentPackageName) } + ) + + } + } + } else { + item { + Text( + text = stringResource(R.string.no_patched_apps_found), + style = MaterialTheme.typography.titleLarge + ) + } + } + + } ?: item { LoadingIndicator() } + } } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5b22bc46..18b5bb75 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -11,6 +11,8 @@ Select an app Select patches + Patching on ARMv7 devices is not yet supported and will most likely fail. + Import Import patch bundle Bundle patches