@@ -2,7 +2,9 @@ package app.revanced.manager.ui.screen.settings
22
33import androidx.annotation.StringRes
44import androidx.compose.foundation.clickable
5+ import androidx.compose.foundation.layout.Arrangement
56import androidx.compose.foundation.layout.Box
7+ import androidx.compose.foundation.layout.Column
68import androidx.compose.foundation.layout.fillMaxSize
79import androidx.compose.foundation.layout.fillMaxWidth
810import androidx.compose.foundation.layout.padding
@@ -11,10 +13,13 @@ import androidx.compose.material.icons.Icons
1113import androidx.compose.material.icons.filled.Delete
1214import androidx.compose.material.icons.outlined.Delete
1315import androidx.compose.material3.AlertDialog
16+ import androidx.compose.material3.Card
17+ import androidx.compose.material3.CardDefaults
1418import androidx.compose.material3.ExperimentalMaterial3Api
1519import androidx.compose.material3.Icon
1620import androidx.compose.material3.IconButton
1721import androidx.compose.material3.MaterialTheme
22+ import androidx.compose.material3.OutlinedCard
1823import androidx.compose.material3.Scaffold
1924import androidx.compose.material3.Text
2025import androidx.compose.material3.TextButton
@@ -32,8 +37,10 @@ import androidx.compose.runtime.setValue
3237import androidx.compose.ui.Alignment
3338import androidx.compose.ui.Modifier
3439import androidx.compose.ui.input.nestedscroll.nestedScroll
40+ import androidx.compose.ui.platform.LocalContext
3541import androidx.compose.ui.res.stringResource
3642import androidx.compose.ui.text.style.TextAlign
43+ import androidx.compose.ui.tooling.preview.Preview
3744import androidx.compose.ui.unit.dp
3845import androidx.compose.ui.zIndex
3946import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -57,6 +64,7 @@ fun DownloadsSettingsScreen(
5764 onBackClick : () -> Unit ,
5865 viewModel : DownloadsViewModel = koinViewModel()
5966) {
67+ val context = LocalContext .current
6068 val pullRefreshState = rememberPullToRefreshState()
6169 val downloadedApps by viewModel.downloadedApps.collectAsStateWithLifecycle(emptyList())
6270 val pluginStates by viewModel.downloaderPluginStates.collectAsStateWithLifecycle()
@@ -81,7 +89,7 @@ fun DownloadsSettingsScreen(
8189 onBackClick = onBackClick,
8290 actions = {
8391 if (viewModel.appSelection.isNotEmpty()) {
84- IconButton (onClick = { showDeleteConfirmationDialog = true }) {
92+ IconButton (onClick = { viewModel.deleteApps() }) {
8593 Icon (Icons .Default .Delete , stringResource(R .string.delete))
8694 }
8795 }
@@ -142,15 +150,20 @@ fun DownloadsSettingsScreen(
142150 .digest(androidSignature.toByteArray())
143151 hash.toHexString(format = HexFormat .UpperCase )
144152 }
153+ val appName = remember {
154+ packageInfo.applicationInfo?.loadLabel(context.packageManager)
155+ ?.toString()
156+ ? : packageName
157+ }
145158
146159 when (state) {
147160 is DownloaderPluginState .Loaded -> TrustDialog (
148161 title = R .string.downloader_plugin_revoke_trust_dialog_title,
149162 body = stringResource(
150163 R .string.downloader_plugin_trust_dialog_body,
151- packageName,
152- signature
153164 ),
165+ pluginName = appName,
166+ signature = signature,
154167 onDismiss = ::dismiss,
155168 onConfirm = {
156169 viewModel.revokePluginTrust(packageName)
@@ -165,19 +178,20 @@ fun DownloadsSettingsScreen(
165178 onDismiss = ::dismiss
166179 )
167180
168- is DownloaderPluginState .Untrusted -> TrustDialog (
169- title = R .string.downloader_plugin_trust_dialog_title,
170- body = stringResource(
171- R .string.downloader_plugin_trust_dialog_body,
172- packageName,
173- signature
174- ),
175- onDismiss = ::dismiss,
176- onConfirm = {
177- viewModel.trustPlugin(packageName)
178- dismiss()
179- }
180- )
181+ is DownloaderPluginState .Untrusted ->
182+ TrustDialog (
183+ title = R .string.downloader_plugin_trust_dialog_title,
184+ body = stringResource(
185+ R .string.downloader_plugin_trust_dialog_body
186+ ),
187+ pluginName = appName,
188+ signature = signature,
189+ onDismiss = ::dismiss,
190+ onConfirm = {
191+ viewModel.trustPlugin(packageName)
192+ dismiss()
193+ }
194+ )
181195 }
182196 }
183197
@@ -242,10 +256,27 @@ fun DownloadsSettingsScreen(
242256 }
243257}
244258
259+ @Preview
260+ @Composable
261+ private fun PreviewTrustDialog () {
262+ TrustDialog (
263+ title = R .string.downloader_plugin_trust_dialog_title,
264+ body = stringResource(
265+ R .string.downloader_plugin_trust_dialog_body,
266+ ),
267+ onDismiss = { },
268+ onConfirm = { },
269+ pluginName = " app.revanced.manager.apkmirror" ,
270+ 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"
271+ )
272+ }
273+
245274@Composable
246275private fun TrustDialog (
247276 @StringRes title : Int ,
248277 body : String ,
278+ pluginName : String ,
279+ signature : String ,
249280 onDismiss : () -> Unit ,
250281 onConfirm : () -> Unit
251282) {
@@ -262,6 +293,35 @@ private fun TrustDialog(
262293 }
263294 },
264295 title = { Text (stringResource(title)) },
265- text = { Text (body) }
296+ text = {
297+ Column (verticalArrangement = Arrangement .spacedBy(12 .dp)) {
298+ Text (body)
299+ Card {
300+ Column (
301+ Modifier .padding(12 .dp),
302+ verticalArrangement = Arrangement .spacedBy(12 .dp)
303+ ) {
304+ Text (
305+ stringResource(
306+ R .string.downloader_plugin_trust_dialog_plugin,
307+ pluginName
308+ ),
309+ )
310+ OutlinedCard (
311+ colors = CardDefaults .outlinedCardColors(
312+ containerColor = MaterialTheme .colorScheme.surfaceContainerHighest
313+ )
314+ ) {
315+ Text (
316+ stringResource(
317+ R .string.downloader_plugin_trust_dialog_signature,
318+ signature.chunked(2 ).joinToString(" " )
319+ ), modifier = Modifier .padding(12 .dp)
320+ )
321+ }
322+ }
323+ }
324+ }
325+ }
266326 )
267327}
0 commit comments