From fbe72ef8343ef703ad8fd2e94b17fd7dde3ddaed Mon Sep 17 00:00:00 2001 From: rushiiMachine <33725716+rushiiMachine@users.noreply.github.com> Date: Sun, 18 May 2025 12:51:55 -0700 Subject: [PATCH] feat: dialog previews --- .../dialogs/StoragePermissionsDialog.kt | 134 ++++++++++-------- .../manager/ui/previews/TextBannerPreview.kt | 66 +++++++++ .../dialogs/DeleteLogsDialogPreview.kt | 19 +++ .../dialogs/InstallerAbortDialogPreview.kt | 19 +++ .../dialogs/NetworkWarningDialogPreview.kt | 19 +++ .../dialogs/PlayProtectDialogPreview.kt | 16 +++ .../StoragePermissionsDialogPreview.kt | 29 ++++ .../ui/previews/dialogs/ThemeDialogPreview.kt | 23 +++ .../dialogs/UninstallPluginDialogPreview.kt | 21 +++ .../UnknownSourcesPermissionDialogPreview.kt | 16 +++ .../components/dialogs/DeleteLogsDialog.kt | 4 + .../dialogs/UninstallPluginDialog.kt | 6 +- app/src/main/res/values/strings.xml | 2 +- 13 files changed, 314 insertions(+), 60 deletions(-) create mode 100644 app/src/main/kotlin/com/aliucord/manager/ui/previews/TextBannerPreview.kt create mode 100644 app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/DeleteLogsDialogPreview.kt create mode 100644 app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/InstallerAbortDialogPreview.kt create mode 100644 app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/NetworkWarningDialogPreview.kt create mode 100644 app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/PlayProtectDialogPreview.kt create mode 100644 app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/StoragePermissionsDialogPreview.kt create mode 100644 app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/ThemeDialogPreview.kt create mode 100644 app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/UninstallPluginDialogPreview.kt create mode 100644 app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/UnknownSourcesPermissionDialogPreview.kt diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/components/dialogs/StoragePermissionsDialog.kt b/app/src/main/kotlin/com/aliucord/manager/ui/components/dialogs/StoragePermissionsDialog.kt index 340ade5..fc87db7 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/components/dialogs/StoragePermissionsDialog.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/components/dialogs/StoragePermissionsDialog.kt @@ -23,80 +23,98 @@ import com.aliucord.manager.R import com.google.accompanist.permissions.* @Composable +@OptIn(ExperimentalPermissionsApi::class) fun StoragePermissionsDialog() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - ManageStorageDialog() + var manageStorageGranted by remember { mutableStateOf(Environment.isExternalStorageManager()) } + + if (!manageStorageGranted) { + ManageStorageDialog( + onGranted = { manageStorageGranted = true }, + ) + } } else { - ExternalStorageDialog() + val writeStorageState = rememberPermissionState(Manifest.permission.WRITE_EXTERNAL_STORAGE) + + if (!writeStorageState.status.isGranted) { + ExternalStorageDialog(onRequestPermission = writeStorageState::launchPermissionRequest) + } } } @Composable @RequiresApi(Build.VERSION_CODES.R) -private fun ManageStorageDialog() { - var manageStorageGranted by remember { mutableStateOf(Environment.isExternalStorageManager()) } - - if (!manageStorageGranted) { - AlertDialog( - onDismissRequest = {}, - confirmButton = { - val launcher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (Environment.isExternalStorageManager()) { - manageStorageGranted = true - } +fun ManageStorageDialog( + onGranted: () -> Unit, +) { + AlertDialog( + onDismissRequest = {}, + confirmButton = { + val launcher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (Environment.isExternalStorageManager()) { + onGranted() } + } - Button( - onClick = { - Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) - .setData("package:${BuildConfig.APPLICATION_ID}".toUri()) - .let { launcher.launch(it) } - } - ) { - Text(stringResource(R.string.action_open_settings)) + Button( + onClick = { + Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) + .setData("package:${BuildConfig.APPLICATION_ID}".toUri()) + .let { launcher.launch(it) } } - }, - icon = { - Icon( - painter = painterResource(R.drawable.ic_tools), - contentDescription = null, - modifier = Modifier.size(32.dp), - ) - }, - title = { Text(stringResource(R.string.permissions_grant_title)) }, - text = { - Text( - text = stringResource(R.string.storage_permissions_grant_body), - textAlign = TextAlign.Center, - ) - }, - properties = DialogProperties( - dismissOnBackPress = false, - dismissOnClickOutside = false + ) { + Text(stringResource(R.string.action_open_settings)) + } + }, + icon = { + Icon( + painter = painterResource(R.drawable.ic_tools), + contentDescription = null, + modifier = Modifier.size(32.dp), ) + }, + title = { Text(stringResource(R.string.permissions_grant_title)) }, + text = { + Text( + text = stringResource(R.string.storage_permissions_grant_body), + textAlign = TextAlign.Center, + ) + }, + properties = DialogProperties( + dismissOnBackPress = false, + dismissOnClickOutside = false ) - } + ) } @Composable -@OptIn(ExperimentalPermissionsApi::class) -private fun ExternalStorageDialog() { - val writeStorageState = rememberPermissionState(Manifest.permission.WRITE_EXTERNAL_STORAGE) - - if (!writeStorageState.status.isGranted) { - AlertDialog( - onDismissRequest = {}, - confirmButton = { - Button(onClick = writeStorageState::launchPermissionRequest) { - Text(stringResource(R.string.action_confirm)) - } - }, - title = { Text(stringResource(R.string.permissions_grant_title)) }, - text = { Text(stringResource(R.string.storage_permissions_grant_body)) }, - properties = DialogProperties( - dismissOnBackPress = false, - dismissOnClickOutside = false +fun ExternalStorageDialog( + onRequestPermission: () -> Unit, +) { + AlertDialog( + onDismissRequest = {}, + confirmButton = { + Button(onClick = onRequestPermission) { + Text(stringResource(android.R.string.ok)) + } + }, + title = { Text(stringResource(R.string.permissions_grant_title)) }, + text = { + Text( + text = stringResource(R.string.storage_permissions_grant_body), + textAlign = TextAlign.Center, ) + }, + icon = { + Icon( + painter = painterResource(R.drawable.ic_tools), + contentDescription = null, + modifier = Modifier.size(32.dp), + ) + }, + properties = DialogProperties( + dismissOnBackPress = false, + dismissOnClickOutside = false ) - } + ) } diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/previews/TextBannerPreview.kt b/app/src/main/kotlin/com/aliucord/manager/ui/previews/TextBannerPreview.kt new file mode 100644 index 0000000..28aae8a --- /dev/null +++ b/app/src/main/kotlin/com/aliucord/manager/ui/previews/TextBannerPreview.kt @@ -0,0 +1,66 @@ +package com.aliucord.manager.ui.previews + +import android.content.res.Configuration +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.* +import com.aliucord.manager.R +import com.aliucord.manager.ui.components.ManagerTheme +import com.aliucord.manager.ui.components.customColors +import com.aliucord.manager.ui.screens.patching.components.TextBanner + +@Composable +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) +private fun ButtonVotePreview( + @PreviewParameter(TextBannerParametersProvider::class) + parameters: TextBannerParameters, +) { + ManagerTheme { + TextBanner( + text = parameters.text(), + icon = parameters.icon(), + iconColor = parameters.iconColor(), + outlineColor = parameters.outlineColor(), + containerColor = parameters.containerColor(), + ) + } +} + +private data class TextBannerParameters( + val text: @Composable () -> String, + val icon: @Composable () -> Painter, + val iconColor: @Composable () -> Color, + val outlineColor: @Composable () -> Color?, + val containerColor: @Composable () -> Color, +) + +private class TextBannerParametersProvider : PreviewParameterProvider { + override val values = sequenceOf( + TextBannerParameters( + text = { stringResource(R.string.installer_banner_minimization) }, + icon = { painterResource(R.drawable.ic_warning) }, + iconColor = { MaterialTheme.customColors.onWarningContainer }, + outlineColor = { MaterialTheme.customColors.warning }, + containerColor = { MaterialTheme.customColors.warningContainer }, + ), + TextBannerParameters( + text = { stringResource(R.string.installer_banner_failure) }, + icon = { painterResource(R.drawable.ic_warning) }, + iconColor = { MaterialTheme.colorScheme.error }, + outlineColor = { null }, + containerColor = { MaterialTheme.colorScheme.errorContainer }, + ), + TextBannerParameters( + text = { stringResource(R.string.installer_banner_success) }, + icon = { painterResource(R.drawable.ic_check_circle) }, + iconColor = { Color(0xFF59B463) }, + outlineColor = { MaterialTheme.colorScheme.surfaceVariant }, + containerColor = { MaterialTheme.colorScheme.surfaceContainerHigh }, + ) + ) +} diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/DeleteLogsDialogPreview.kt b/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/DeleteLogsDialogPreview.kt new file mode 100644 index 0000000..52bdf57 --- /dev/null +++ b/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/DeleteLogsDialogPreview.kt @@ -0,0 +1,19 @@ +package com.aliucord.manager.ui.previews.dialogs + +import android.content.res.Configuration +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.aliucord.manager.ui.components.ManagerTheme +import com.aliucord.manager.ui.screens.logs.components.dialogs.DeleteLogsDialog + +@Composable +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) +private fun DeleteLogsDialogPreview() { + ManagerTheme { + DeleteLogsDialog( + onConfirm = {}, + onDismiss = {}, + ) + } +} diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/InstallerAbortDialogPreview.kt b/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/InstallerAbortDialogPreview.kt new file mode 100644 index 0000000..f4270c7 --- /dev/null +++ b/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/InstallerAbortDialogPreview.kt @@ -0,0 +1,19 @@ +package com.aliucord.manager.ui.previews.dialogs + +import android.content.res.Configuration +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.aliucord.manager.ui.components.ManagerTheme +import com.aliucord.manager.ui.components.dialogs.InstallerAbortDialog + +@Composable +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) +private fun InstallerAbortDialogPreview() { + ManagerTheme { + InstallerAbortDialog( + onConfirm = {}, + onDismiss = {}, + ) + } +} diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/NetworkWarningDialogPreview.kt b/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/NetworkWarningDialogPreview.kt new file mode 100644 index 0000000..711e967 --- /dev/null +++ b/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/NetworkWarningDialogPreview.kt @@ -0,0 +1,19 @@ +package com.aliucord.manager.ui.previews.dialogs + +import android.content.res.Configuration +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.aliucord.manager.ui.components.ManagerTheme +import com.aliucord.manager.ui.components.dialogs.NetworkWarningDialog + +@Composable +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) +private fun NetworkWarningDialogPreview() { + ManagerTheme { + NetworkWarningDialog( + onConfirm = {}, + onDismiss = {}, + ) + } +} diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/PlayProtectDialogPreview.kt b/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/PlayProtectDialogPreview.kt new file mode 100644 index 0000000..5cfd099 --- /dev/null +++ b/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/PlayProtectDialogPreview.kt @@ -0,0 +1,16 @@ +package com.aliucord.manager.ui.previews.dialogs + +import android.content.res.Configuration +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.aliucord.manager.ui.components.ManagerTheme +import com.aliucord.manager.ui.components.dialogs.PlayProtectDialog + +@Composable +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) +private fun PlayProtectDialogPreview() { + ManagerTheme { + PlayProtectDialog(onDismiss = {}) + } +} diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/StoragePermissionsDialogPreview.kt b/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/StoragePermissionsDialogPreview.kt new file mode 100644 index 0000000..aabebb1 --- /dev/null +++ b/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/StoragePermissionsDialogPreview.kt @@ -0,0 +1,29 @@ +package com.aliucord.manager.ui.previews.dialogs + +import android.content.res.Configuration +import android.os.Build +import androidx.annotation.RequiresApi +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.aliucord.manager.ui.components.ManagerTheme +import com.aliucord.manager.ui.components.dialogs.ExternalStorageDialog +import com.aliucord.manager.ui.components.dialogs.ManageStorageDialog + +@Composable +@RequiresApi(Build.VERSION_CODES.R) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) +private fun ManageStorageDialogPreview() { + ManagerTheme { + ManageStorageDialog(onGranted = {}) + } +} + +@Composable +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) +private fun ExternalStorageDialogPreview() { + ManagerTheme { + ExternalStorageDialog(onRequestPermission = {}) + } +} diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/ThemeDialogPreview.kt b/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/ThemeDialogPreview.kt new file mode 100644 index 0000000..3b52d84 --- /dev/null +++ b/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/ThemeDialogPreview.kt @@ -0,0 +1,23 @@ +package com.aliucord.manager.ui.previews.dialogs + +import android.content.res.Configuration +import androidx.compose.runtime.* +import androidx.compose.ui.tooling.preview.Preview +import com.aliucord.manager.ui.components.ManagerTheme +import com.aliucord.manager.ui.components.Theme +import com.aliucord.manager.ui.screens.settings.components.ThemeDialog + +@Composable +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) +private fun ThemeDialogPreview() { + val (theme, setTheme) = remember { mutableStateOf(Theme.SYSTEM) } + + ManagerTheme { + ThemeDialog( + currentTheme = theme, + onDismissRequest = {}, + onConfirm = setTheme, + ) + } +} diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/UninstallPluginDialogPreview.kt b/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/UninstallPluginDialogPreview.kt new file mode 100644 index 0000000..a80ddd8 --- /dev/null +++ b/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/UninstallPluginDialogPreview.kt @@ -0,0 +1,21 @@ +package com.aliucord.manager.ui.previews.dialogs + +import android.content.res.Configuration +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.aliucord.manager.ui.components.ManagerTheme +import com.aliucord.manager.ui.screens.logs.components.dialogs.DeleteLogsDialog +import com.aliucord.manager.ui.screens.plugins.components.dialogs.UninstallPluginDialog + +@Composable +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) +private fun UninstallPluginDialogPreview() { + ManagerTheme { + UninstallPluginDialog( + pluginName = "FakeNitro", + onConfirm = {}, + onDismiss = {}, + ) + } +} diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/UnknownSourcesPermissionDialogPreview.kt b/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/UnknownSourcesPermissionDialogPreview.kt new file mode 100644 index 0000000..e81e278 --- /dev/null +++ b/app/src/main/kotlin/com/aliucord/manager/ui/previews/dialogs/UnknownSourcesPermissionDialogPreview.kt @@ -0,0 +1,16 @@ +package com.aliucord.manager.ui.previews.dialogs + +import android.content.res.Configuration +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.aliucord.manager.ui.components.ManagerTheme +import com.aliucord.manager.ui.components.dialogs.UnknownSourcesPermissionDialog + +@Composable +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) +private fun UnknownSourcesPermissionDialogPreview() { + ManagerTheme { + UnknownSourcesPermissionDialog() + } +} diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/logs/components/dialogs/DeleteLogsDialog.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/logs/components/dialogs/DeleteLogsDialog.kt index 77c3d02..1c1c470 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/screens/logs/components/dialogs/DeleteLogsDialog.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/logs/components/dialogs/DeleteLogsDialog.kt @@ -1,10 +1,13 @@ package com.aliucord.manager.ui.screens.logs.components.dialogs +import androidx.compose.foundation.layout.size import androidx.compose.material3.* import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp import com.aliucord.manager.R @Composable @@ -18,6 +21,7 @@ fun DeleteLogsDialog( Icon( painter = painterResource(R.drawable.ic_delete_forever), contentDescription = null, + modifier = Modifier.size(32.dp), ) }, title = { Text(stringResource(R.string.logs_wipe_title)) }, diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screens/plugins/components/dialogs/UninstallPluginDialog.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screens/plugins/components/dialogs/UninstallPluginDialog.kt index 46a4af3..b0598ae 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/screens/plugins/components/dialogs/UninstallPluginDialog.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/screens/plugins/components/dialogs/UninstallPluginDialog.kt @@ -1,10 +1,13 @@ package com.aliucord.manager.ui.screens.plugins.components.dialogs +import androidx.compose.foundation.layout.size import androidx.compose.material3.* import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp import com.aliucord.manager.R @Composable @@ -19,6 +22,7 @@ fun UninstallPluginDialog( Icon( painter = painterResource(R.drawable.ic_delete_forever), contentDescription = null, + modifier = Modifier.size(32.dp), ) }, title = { @@ -26,7 +30,7 @@ fun UninstallPluginDialog( }, text = { Text( - text = stringResource(R.string.plugins_delete_plugin_body), + text = stringResource(R.string.plugins_delete_plugin_body, pluginName), textAlign = TextAlign.Center, ) }, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ba12cbf..3ce951f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -62,7 +62,7 @@ Plugins View changelog Uninstall %s - Are you sure you want to uninstall this plugin? + Are you sure you want to uninstall the %s plugin? No plugins installed! Changelog Media §plugin§%1$s§ v%2$s