Skip to content

Commit 0300da9

Browse files
authored
feat: Improve trust plugin dialog design (#2420)
1 parent 4e5057e commit 0300da9

File tree

2 files changed

+55
-9
lines changed

2 files changed

+55
-9
lines changed

app/src/main/java/app/revanced/manager/ui/screen/settings/DownloadsSettingsScreen.kt

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package app.revanced.manager.ui.screen.settings
22

33
import androidx.annotation.StringRes
44
import androidx.compose.foundation.clickable
5+
import androidx.compose.foundation.layout.Arrangement
6+
import androidx.compose.foundation.layout.Column
57
import androidx.compose.foundation.layout.fillMaxSize
68
import androidx.compose.foundation.layout.fillMaxWidth
79
import androidx.compose.foundation.layout.padding
@@ -10,10 +12,13 @@ import androidx.compose.material.icons.Icons
1012
import androidx.compose.material.icons.filled.Delete
1113
import androidx.compose.material.icons.outlined.Delete
1214
import androidx.compose.material3.AlertDialog
15+
import androidx.compose.material3.Card
16+
import androidx.compose.material3.CardDefaults
1317
import androidx.compose.material3.ExperimentalMaterial3Api
1418
import androidx.compose.material3.Icon
1519
import androidx.compose.material3.IconButton
1620
import androidx.compose.material3.MaterialTheme
21+
import androidx.compose.material3.OutlinedCard
1722
import androidx.compose.material3.Scaffold
1823
import androidx.compose.material3.Text
1924
import androidx.compose.material3.TextButton
@@ -28,6 +33,7 @@ import androidx.compose.runtime.saveable.rememberSaveable
2833
import androidx.compose.runtime.setValue
2934
import androidx.compose.ui.Modifier
3035
import androidx.compose.ui.input.nestedscroll.nestedScroll
36+
import androidx.compose.ui.platform.LocalContext
3137
import androidx.compose.ui.res.stringResource
3238
import androidx.compose.ui.text.style.TextAlign
3339
import androidx.compose.ui.unit.dp
@@ -36,10 +42,10 @@ import app.revanced.manager.R
3642
import app.revanced.manager.network.downloader.DownloaderPluginState
3743
import app.revanced.manager.ui.component.AppLabel
3844
import app.revanced.manager.ui.component.AppTopBar
45+
import app.revanced.manager.ui.component.ConfirmDialog
3946
import app.revanced.manager.ui.component.ExceptionViewerDialog
4047
import app.revanced.manager.ui.component.GroupHeader
4148
import app.revanced.manager.ui.component.LazyColumnWithScrollbar
42-
import app.revanced.manager.ui.component.ConfirmDialog
4349
import app.revanced.manager.ui.component.haptics.HapticCheckbox
4450
import app.revanced.manager.ui.component.settings.SettingsListItem
4551
import app.revanced.manager.ui.viewmodel.DownloadsViewModel
@@ -52,6 +58,7 @@ fun DownloadsSettingsScreen(
5258
onBackClick: () -> Unit,
5359
viewModel: DownloadsViewModel = koinViewModel()
5460
) {
61+
val context = LocalContext.current
5562
val downloadedApps by viewModel.downloadedApps.collectAsStateWithLifecycle(emptyList())
5663
val pluginStates by viewModel.downloaderPluginStates.collectAsStateWithLifecycle()
5764
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
@@ -75,7 +82,7 @@ fun DownloadsSettingsScreen(
7582
onBackClick = onBackClick,
7683
actions = {
7784
if (viewModel.appSelection.isNotEmpty()) {
78-
IconButton(onClick = { showDeleteConfirmationDialog = true }) {
85+
IconButton(onClick = { viewModel.deleteApps() }) {
7986
Icon(Icons.Default.Delete, stringResource(R.string.delete))
8087
}
8188
}
@@ -121,6 +128,11 @@ fun DownloadsSettingsScreen(
121128
.digest(androidSignature.toByteArray())
122129
hash.toHexString(format = HexFormat.UpperCase)
123130
}
131+
val appName = remember {
132+
packageInfo.applicationInfo?.loadLabel(context.packageManager)
133+
?.toString()
134+
?: packageName
135+
}
124136

125137
when (state) {
126138
is DownloaderPluginState.Loaded -> TrustDialog(
@@ -130,6 +142,8 @@ fun DownloadsSettingsScreen(
130142
packageName,
131143
signature
132144
),
145+
pluginName = appName,
146+
signature = signature,
133147
onDismiss = ::dismiss,
134148
onConfirm = {
135149
viewModel.revokePluginTrust(packageName)
@@ -147,10 +161,10 @@ fun DownloadsSettingsScreen(
147161
is DownloaderPluginState.Untrusted -> TrustDialog(
148162
title = R.string.downloader_plugin_trust_dialog_title,
149163
body = stringResource(
150-
R.string.downloader_plugin_trust_dialog_body,
151-
packageName,
152-
signature
164+
R.string.downloader_plugin_trust_dialog_body
153165
),
166+
pluginName = appName,
167+
signature = signature,
154168
onDismiss = ::dismiss,
155169
onConfirm = {
156170
viewModel.trustPlugin(packageName)
@@ -226,6 +240,8 @@ fun DownloadsSettingsScreen(
226240
private fun TrustDialog(
227241
@StringRes title: Int,
228242
body: String,
243+
pluginName: String,
244+
signature: String,
229245
onDismiss: () -> Unit,
230246
onConfirm: () -> Unit
231247
) {
@@ -238,10 +254,39 @@ private fun TrustDialog(
238254
},
239255
dismissButton = {
240256
TextButton(onClick = onDismiss) {
241-
Text(stringResource(R.string.dismiss))
257+
Text(stringResource(R.string.cancel))
242258
}
243259
},
244260
title = { Text(stringResource(title)) },
245-
text = { Text(body) }
261+
text = {
262+
Column(verticalArrangement = Arrangement.spacedBy(12.dp)) {
263+
Text(body)
264+
Card {
265+
Column(
266+
Modifier.padding(12.dp),
267+
verticalArrangement = Arrangement.spacedBy(12.dp)
268+
) {
269+
Text(
270+
stringResource(
271+
R.string.downloader_plugin_trust_dialog_plugin,
272+
pluginName
273+
),
274+
)
275+
OutlinedCard(
276+
colors = CardDefaults.outlinedCardColors(
277+
containerColor = MaterialTheme.colorScheme.surfaceContainerHighest
278+
)
279+
) {
280+
Text(
281+
stringResource(
282+
R.string.downloader_plugin_trust_dialog_signature,
283+
signature.chunked(2).joinToString(" ")
284+
), modifier = Modifier.padding(12.dp)
285+
)
286+
}
287+
}
288+
}
289+
}
290+
}
246291
)
247292
}

app/src/main/res/values/strings.xml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,9 @@ You will not be able to update the previously installed apps from this source."<
181181
<string name="downloader_plugin_state_untrusted">Untrusted</string>
182182
<string name="downloader_plugin_trust_dialog_title">Trust plugin?</string>
183183
<string name="downloader_plugin_revoke_trust_dialog_title">Revoke trust?</string>
184-
<string name="downloader_plugin_trust_dialog_body">"Package name: %1$s
185-
Signature (SHA-256): %2$s"</string>
184+
<string name="downloader_plugin_trust_dialog_body">Continuing will allow this plugin to run on your system.\n\nOnly enable this plugin if you trust it. Plugins can execute arbitrary code and may compromise your device.</string>
185+
<string name="downloader_plugin_trust_dialog_signature">Signature:\n\n%s</string>
186+
<string name="downloader_plugin_trust_dialog_plugin">Plugin:\n%s</string>
186187
<string name="downloader_plugin_delete_apps_title">Delete selected apps</string>
187188
<string name="downloader_plugin_delete_apps_description">Are you sure you want to delete the selected apps?</string>
188189
<string name="downloader_settings_no_apps">No downloaded apps found.</string>

0 commit comments

Comments
 (0)