diff --git a/app/src/main/java/app/revanced/manager/ui/screen/settings/DownloadsSettingsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/settings/DownloadsSettingsScreen.kt index 96247a03..cd276b6e 100644 --- a/app/src/main/java/app/revanced/manager/ui/screen/settings/DownloadsSettingsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screen/settings/DownloadsSettingsScreen.kt @@ -2,7 +2,9 @@ package app.revanced.manager.ui.screen.settings import androidx.annotation.StringRes 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.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -10,10 +12,13 @@ import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Delete import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedCard import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TextButton @@ -31,8 +36,10 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -59,6 +66,7 @@ fun DownloadsSettingsScreen( val downloadedApps by viewModel.downloadedApps.collectAsStateWithLifecycle(emptyList()) val pluginStates by viewModel.downloaderPluginStates.collectAsStateWithLifecycle() val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) + val context = LocalContext.current Scaffold( topBar = { @@ -129,15 +137,18 @@ fun DownloadsSettingsScreen( .digest(androidSignature.toByteArray()) hash.toHexString(format = HexFormat.UpperCase) } + val appName = packageInfo.applicationInfo?.loadLabel(context.packageManager) + ?.toString() + ?: packageName when (state) { is DownloaderPluginState.Loaded -> TrustDialog( title = R.string.downloader_plugin_revoke_trust_dialog_title, body = stringResource( R.string.downloader_plugin_trust_dialog_body, - packageName, - signature ), + pluginName = appName, + signature = signature, onDismiss = ::dismiss, onConfirm = { viewModel.revokePluginTrust(packageName) @@ -152,19 +163,20 @@ fun DownloadsSettingsScreen( onDismiss = ::dismiss ) - is DownloaderPluginState.Untrusted -> TrustDialog( - title = R.string.downloader_plugin_trust_dialog_title, - body = stringResource( - R.string.downloader_plugin_trust_dialog_body, - packageName, - signature - ), - onDismiss = ::dismiss, - onConfirm = { - viewModel.trustPlugin(packageName) - dismiss() - } - ) + is DownloaderPluginState.Untrusted -> + TrustDialog( + title = R.string.downloader_plugin_trust_dialog_title, + body = stringResource( + R.string.downloader_plugin_trust_dialog_body + ), + pluginName = appName, + signature = signature, + onDismiss = ::dismiss, + onConfirm = { + viewModel.trustPlugin(packageName) + dismiss() + } + ) } } @@ -229,10 +241,27 @@ fun DownloadsSettingsScreen( } } +@Preview +@Composable +private fun PreviewTrustDialog() { + TrustDialog( + title = R.string.downloader_plugin_trust_dialog_title, + body = stringResource( + R.string.downloader_plugin_trust_dialog_body, + ), + onDismiss = { }, + onConfirm = { }, + pluginName = "app.revanced.manager.apkmirror", + signature = "23 01 84 F6 0B AE 2F EA F2 44 F1 0A 8B AC 05 3C 8F F3 3A 18 3B CC 36 5B 4D 8B 87 6D 2B 7F 48 09" + ) +} + @Composable private fun TrustDialog( @StringRes title: Int, body: String, + pluginName: String, + signature: String, onDismiss: () -> Unit, onConfirm: () -> Unit ) { @@ -249,6 +278,35 @@ private fun TrustDialog( } }, title = { Text(stringResource(title)) }, - text = { Text(body) } + text = { + Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { + Text(body) + Card { + Column( + Modifier.padding(12.dp), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + Text( + stringResource( + R.string.downloader_plugin_trust_dialog_plugin, + pluginName + ), + ) + OutlinedCard( + colors = CardDefaults.outlinedCardColors( + containerColor = MaterialTheme.colorScheme.surfaceContainerHighest + ) + ) { + Text( + stringResource( + R.string.downloader_plugin_trust_dialog_signature, + signature.chunked(2).joinToString(" ") + ), modifier = Modifier.padding(12.dp) + ) + } + } + } + } + } ) } \ 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 fab90c15..f756ec93 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -137,7 +137,9 @@ Untrusted Trust plugin? Revoke trust? - Package name: %1$s\nSignature (SHA-256): %2$s + By continuing you\'ve agreed to running external plugins.\n\nDo not allow any suspicious plugin(s) to be installed as they can run arbitrary code. + Signature:\n\n%s + Plugin:\n%s No downloaded apps found Search apps…