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…