Skip to content

Commit 47129cd

Browse files
Ushiebrosssh
authored andcommitted
feat: Redesign trust dialog
1 parent 7c5552f commit 47129cd

File tree

2 files changed

+80
-18
lines changed

2 files changed

+80
-18
lines changed

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

Lines changed: 77 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ 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
56
import androidx.compose.foundation.layout.Box
7+
import androidx.compose.foundation.layout.Column
68
import androidx.compose.foundation.layout.fillMaxSize
79
import androidx.compose.foundation.layout.fillMaxWidth
810
import androidx.compose.foundation.layout.padding
@@ -11,10 +13,13 @@ import androidx.compose.material.icons.Icons
1113
import androidx.compose.material.icons.filled.Delete
1214
import androidx.compose.material.icons.outlined.Delete
1315
import androidx.compose.material3.AlertDialog
16+
import androidx.compose.material3.Card
17+
import androidx.compose.material3.CardDefaults
1418
import androidx.compose.material3.ExperimentalMaterial3Api
1519
import androidx.compose.material3.Icon
1620
import androidx.compose.material3.IconButton
1721
import androidx.compose.material3.MaterialTheme
22+
import androidx.compose.material3.OutlinedCard
1823
import androidx.compose.material3.Scaffold
1924
import androidx.compose.material3.Text
2025
import androidx.compose.material3.TextButton
@@ -32,8 +37,10 @@ import androidx.compose.runtime.setValue
3237
import androidx.compose.ui.Alignment
3338
import androidx.compose.ui.Modifier
3439
import androidx.compose.ui.input.nestedscroll.nestedScroll
40+
import androidx.compose.ui.platform.LocalContext
3541
import androidx.compose.ui.res.stringResource
3642
import androidx.compose.ui.text.style.TextAlign
43+
import androidx.compose.ui.tooling.preview.Preview
3744
import androidx.compose.ui.unit.dp
3845
import androidx.compose.ui.zIndex
3946
import 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
246275
private 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
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,9 @@
142142
<string name="downloader_plugin_state_untrusted">Untrusted</string>
143143
<string name="downloader_plugin_trust_dialog_title">Trust plugin?</string>
144144
<string name="downloader_plugin_revoke_trust_dialog_title">Revoke trust?</string>
145-
<string name="downloader_plugin_trust_dialog_body">Package name: %1$s\nSignature (SHA-256): %2$s</string>
145+
<string name="downloader_plugin_trust_dialog_body">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.</string>
146+
<string name="downloader_plugin_trust_dialog_signature">Signature:\n\n%s</string>
147+
<string name="downloader_plugin_trust_dialog_plugin">Plugin:\n%s</string>
146148
<string name="downloader_plugin_delete_apps_title">Delete selected apps</string>
147149
<string name="downloader_plugin_delete_apps_description">Are you sure you want to delete the selected apps?</string>
148150
<string name="downloader_settings_no_apps">No downloaded apps found</string>

0 commit comments

Comments
 (0)