feat: dialog previews

This commit is contained in:
rushiiMachine 2025-05-18 12:51:55 -07:00
parent ec30627c05
commit fbe72ef834
No known key found for this signature in database
GPG key ID: DCBE5952BB3B6420
13 changed files with 314 additions and 60 deletions

View file

@ -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
)
}
)
}

View file

@ -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<TextBannerParameters> {
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 },
)
)
}

View file

@ -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 = {},
)
}
}

View file

@ -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 = {},
)
}
}

View file

@ -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 = {},
)
}
}

View file

@ -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 = {})
}
}

View file

@ -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 = {})
}
}

View file

@ -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,
)
}
}

View file

@ -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 = {},
)
}
}

View file

@ -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()
}
}

View file

@ -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)) },

View file

@ -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,
)
},

View file

@ -62,7 +62,7 @@
<string name="plugins_title">Plugins</string>
<string name="plugins_view_changelog">View changelog</string>
<string name="plugins_delete_plugin">Uninstall %s</string>
<string name="plugins_delete_plugin_body">Are you sure you want to uninstall this plugin?</string>
<string name="plugins_delete_plugin_body">Are you sure you want to uninstall the %s plugin?</string>
<string name="plugins_none_installed">No plugins installed!</string>
<string name="plugins_changelog_media">Changelog Media</string>
<string name="plugins_plugin_title">§plugin§%1$s§ v%2$s</string>