From f24e28ed45466a8c0d2212e1feaab0645afa5bdc Mon Sep 17 00:00:00 2001 From: MohitMaliFtechiz Date: Mon, 10 Mar 2025 14:12:19 +0530 Subject: [PATCH] Improved the `SnackbarHostStateExtension` for better reusability. --- .../core/error/ErrorActivityScreen.kt | 4 +- .../extensions/SnackbarHostStateExtension.kt | 27 ++++++++- .../kiwixmobile/core/main/AddNoteDialog.kt | 4 +- .../core/main/AddNoteDialogScreen.kt | 56 ++++++++++++++++++- 4 files changed, 82 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/error/ErrorActivityScreen.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/error/ErrorActivityScreen.kt index e1220e10e..856d84e9c 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/error/ErrorActivityScreen.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/error/ErrorActivityScreen.kt @@ -78,7 +78,7 @@ fun ErrorActivityScreen( horizontalAlignment = Alignment.CenterHorizontally ) { CrashTitle(crashTitleStringId) - CrashImage() + AppIcon() CrashMessage(messageStringId) CrashCheckBoxList( checkBoxData, @@ -121,7 +121,7 @@ private fun CrashTitle( } @Composable -private fun CrashImage() { +private fun AppIcon() { Image( bitmap = ImageBitmap.loadBitmapFromMipmap(LocalContext.current, R.mipmap.ic_launcher), contentDescription = stringResource(id = string.app_name), diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/extensions/SnackbarHostStateExtension.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/extensions/SnackbarHostStateExtension.kt index 507c539a1..ce33ee173 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/extensions/SnackbarHostStateExtension.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/extensions/SnackbarHostStateExtension.kt @@ -18,26 +18,47 @@ package org.kiwix.kiwixmobile.core.extensions +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Snackbar +import androidx.compose.material3.SnackbarDuration +import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.SnackbarResult import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch +/** + * A custom Snackbar host for displaying snackbars with a consistent style in the Kiwix app. + * + * This Composable wraps the default [SnackbarHost] and applies a custom action text color + * using the primary color from the Material theme. + * + * @param snackbarHostState The state that controls the visibility and content of the Snackbar. + */ @Composable -fun rememberSnackbarHostState(): SnackbarHostState = remember { SnackbarHostState() } +fun KiwixSnackbarHost(snackbarHostState: SnackbarHostState) { + SnackbarHost(hostState = snackbarHostState) { snackbarData -> + Snackbar( + snackbarData = snackbarData, + actionColor = MaterialTheme.colorScheme.primary + ) + } +} fun SnackbarHostState.snack( message: String, actionLabel: String? = null, actionClick: (() -> Unit)? = null, + // Default duration is 4 seconds. + snackbarDuration: SnackbarDuration = SnackbarDuration.Short, lifecycleScope: CoroutineScope ) { lifecycleScope.launch { val result = showSnackbar( message = message, - actionLabel = actionLabel + actionLabel = actionLabel, + duration = snackbarDuration ) if (result == SnackbarResult.ActionPerformed) { actionClick?.invoke() diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/AddNoteDialog.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/AddNoteDialog.kt index 2ad16e154..bcdd14efc 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/AddNoteDialog.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/AddNoteDialog.kt @@ -33,6 +33,7 @@ import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.Share import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.TextFieldValue @@ -44,7 +45,6 @@ import org.kiwix.kiwixmobile.core.CoreApp.Companion.coreComponent import org.kiwix.kiwixmobile.core.CoreApp.Companion.instance import org.kiwix.kiwixmobile.core.R import org.kiwix.kiwixmobile.core.extensions.closeKeyboard -import org.kiwix.kiwixmobile.core.extensions.rememberSnackbarHostState import org.kiwix.kiwixmobile.core.extensions.snack import org.kiwix.kiwixmobile.core.extensions.toast import org.kiwix.kiwixmobile.core.page.notes.adapter.NoteListItem @@ -173,7 +173,7 @@ class AddNoteDialog : DialogFragment() { savedInstanceState: Bundle? ): View? = ComposeView(requireContext()).apply { setContent { - snackBarHostState = rememberSnackbarHostState() + snackBarHostState = remember { SnackbarHostState() } AddNoteDialogScreen( articleTitle.toString(), navigationIcon = { diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/AddNoteDialogScreen.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/AddNoteDialogScreen.kt index 8be05ed97..2fe4cc291 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/AddNoteDialogScreen.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/AddNoteDialogScreen.kt @@ -18,16 +18,20 @@ package org.kiwix.kiwixmobile.core.main +import android.content.res.Configuration import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Delete +import androidx.compose.material.icons.filled.Share import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.material3.TextField @@ -46,9 +50,15 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.KeyboardCapitalization import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.tooling.preview.Preview import org.kiwix.kiwixmobile.core.R +import org.kiwix.kiwixmobile.core.extensions.KiwixSnackbarHost import org.kiwix.kiwixmobile.core.ui.components.KiwixAppBar +import org.kiwix.kiwixmobile.core.ui.components.NavigationIcon import org.kiwix.kiwixmobile.core.ui.models.ActionMenuItem +import org.kiwix.kiwixmobile.core.ui.models.IconItem +import org.kiwix.kiwixmobile.core.ui.models.IconItem.Drawable +import org.kiwix.kiwixmobile.core.ui.models.IconItem.Vector import org.kiwix.kiwixmobile.core.ui.theme.KiwixTheme import org.kiwix.kiwixmobile.core.utils.ComposeDimens.FIVE_DP import org.kiwix.kiwixmobile.core.utils.ComposeDimens.FOUR_DP @@ -70,11 +80,14 @@ fun AddNoteDialogScreen( val focusRequester = remember { FocusRequester() } val focusManager = LocalFocusManager.current KiwixTheme { - Scaffold(snackbarHost = { SnackbarHost(hostState = snackBarHostState) }) { paddingValues -> + Scaffold( + snackbarHost = { KiwixSnackbarHost(snackbarHostState = snackBarHostState) } + ) { paddingValues -> Column( modifier = Modifier .fillMaxWidth() .background(Color.Transparent) + .imePadding() .padding(paddingValues), ) { KiwixAppBar(R.string.note, navigationIcon, actionMenuItems) @@ -145,3 +158,42 @@ private fun NoteTextField( ) ) } + +@Preview +@Preview(name = "Night mode", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +fun PreviewAddNoteDialog() { + AddNoteDialogScreen( + "Demo note", + navigationIcon = { + NavigationIcon( + iconItem = IconItem.Drawable(R.drawable.ic_close_white_24dp), + onClick = {} + ) + }, + noteText = TextFieldValue(""), + actionMenuItems = listOf( + ActionMenuItem( + Vector(Icons.Default.Delete), + R.string.delete, + { }, + isEnabled = false + ), + ActionMenuItem( + Vector(Icons.Default.Share), + R.string.share, + { }, + isEnabled = false + ), + ActionMenuItem( + Drawable(R.drawable.ic_save), + R.string.save, + { }, + isEnabled = false + ) + ), + onTextChange = { text -> }, + isNoteFileExist = true, + snackBarHostState = SnackbarHostState() + ) +}