feat: dialog previews
This commit is contained in:
parent
ec30627c05
commit
fbe72ef834
13 changed files with 314 additions and 60 deletions
|
|
@ -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
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 },
|
||||
)
|
||||
)
|
||||
}
|
||||
|
|
@ -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 = {},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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 = {},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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 = {},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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 = {})
|
||||
}
|
||||
}
|
||||
|
|
@ -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 = {})
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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 = {},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
@ -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)) },
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue