diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/detail/ConfirmDialogViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/detail/ConfirmDialogViewModel.kt index dec0327..1cfc22e 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/detail/ConfirmDialogViewModel.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/detail/ConfirmDialogViewModel.kt @@ -5,8 +5,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.AndroidViewModel -import com.pixelized.biblib.R -import com.pixelized.biblib.utils.extention.context import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @@ -18,15 +16,10 @@ class ConfirmDialogViewModel @Inject constructor( var dialog by mutableStateOf(null) private set - fun show(email: String) { + fun show(bookId: Int, email: String) { this.dialog = ConfirmDialogUio( + bookId = bookId, email = email, - title = context.getString(R.string.detail_send_confirm_title), - description = context.getString(R.string.detail_send_confirm_description), - help = context.getString(R.string.detail_send_confirm_help), - helpUrl = context.getString(R.string.detail_send_confirm_help_url), - confirm = context.getString(R.string.detail_send_confirm_confirm_action), - cancel = context.getString(R.string.detail_send_confirm_cancel_action), ) } diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/detail/DetailScreen.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/detail/DetailScreen.kt index 7f816b8..a48ff8e 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/detail/DetailScreen.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/detail/DetailScreen.kt @@ -1,6 +1,5 @@ package com.pixelized.biblib.ui.screen.home.detail -import android.content.Context import androidx.compose.animation.animateContentSize import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState @@ -42,7 +41,7 @@ data class BookDetailUio( author = "Asimov", date = "1951", series = "Foundation - 1", - description = "", // "En ce début de treizième millénaire, l'Empire n'a jamais été aussi puissant, aussi étendu à travers toute la galaxie. C'est dans sa capitale, Trantor, que l'éminent savant Hari Seldon invente la psychohistoire, une science nouvelle permettant de prédire l'avenir. Grâce à elle, Seldon prévoit l'effondrement de l'Empire d'ici cinq siècles, suivi d'une ère de ténèbres de trente mille ans. Réduire cette période à mille ans est peut-être possible, à condition de mener à terme son projet : la Fondation, chargée de rassembler toutes les connaissances humaines. Une entreprise visionnaire qui rencontre de nombreux et puissants détracteurs...", + description = "En ce début de treizième millénaire, l'Empire n'a jamais été aussi puissant, aussi étendu à travers toute la galaxie. C'est dans sa capitale, Trantor, que l'éminent savant Hari Seldon invente la psychohistoire, une science nouvelle permettant de prédire l'avenir. Grâce à elle, Seldon prévoit l'effondrement de l'Empire d'ici cinq siècles, suivi d'une ère de ténèbres de trente mille ans. Réduire cette période à mille ans est peut-être possible, à condition de mener à terme son projet : la Fondation, chargée de rassembler toutes les connaissances humaines. Une entreprise visionnaire qui rencontre de nombreux et puissants détracteurs...", rating = 4.5f, language = "Français", cover = "", @@ -107,7 +106,7 @@ fun DetailScreen( .padding(bottom = MaterialTheme.bibLib.dimen.dp16), profileViewModel = profileViewModel, onEmail = { mail -> - confirmViewModel.show(email = mail) + confirmViewModel.show(bookId = detail.id, email = mail) } ) }, @@ -131,7 +130,10 @@ fun DetailScreen( context.showToast(context.getString(R.string.error_no_amazon_email)) } mails.size == 1 -> { - confirmViewModel.show(email = mails.first()) + confirmViewModel.show( + bookId = detail.id, + email = mails.first() + ) } else -> { scope.launch { emailSheetState.show() } @@ -151,7 +153,6 @@ fun DetailScreen( ConfirmDialog( modifier = Modifier.padding(all = MaterialTheme.bibLib.dimen.dp32), confirmViewModel = confirmViewModel, - detail = detail, onConfirm = { id, email -> scope.launch { confirmViewModel.hide() diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/detail/DetailScreenConfirm.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/detail/DetailScreenConfirm.kt index 956cac6..6628ff2 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/detail/DetailScreenConfirm.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/detail/DetailScreenConfirm.kt @@ -12,6 +12,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview @@ -22,28 +23,20 @@ import com.pixelized.biblib.R import com.pixelized.biblib.ui.theme.BibLibTheme import com.pixelized.biblib.utils.extention.bibLib import com.pixelized.biblib.utils.extention.default +import com.pixelized.biblib.utils.extention.highlight +import com.pixelized.biblib.utils.extention.stringRegex @Stable @Immutable data class ConfirmDialogUio( + val bookId: Int, val email: String, - val title: String, - val description: String, - val help: String, - val helpUrl: String, - val confirm: String, - val cancel: String, ) { companion object { @Composable fun preview() = ConfirmDialogUio( + bookId = 90, email = "R.Daneel.Olivaw.Kindle@gmail.com", - title = stringResource(R.string.detail_send_confirm_title), - description = stringResource(R.string.detail_send_confirm_description), - help = stringResource(R.string.detail_send_confirm_help), - helpUrl = stringResource(R.string.detail_send_confirm_help_url), - confirm = stringResource(R.string.detail_send_confirm_confirm_action), - cancel = stringResource(R.string.detail_send_confirm_cancel_action), ) } } @@ -52,7 +45,6 @@ data class ConfirmDialogUio( fun ConfirmDialog( modifier: Modifier = Modifier, confirmViewModel: ConfirmDialogViewModel, - detail: BookDetailUio, onConfirm: (bookId: Int, mail: String) -> Unit = { _, _ -> }, onHelp: (url: String) -> Unit = default(), onDismiss: () -> Unit @@ -62,8 +54,8 @@ fun ConfirmDialog( modifier = modifier, uio = dialog, onDismissRequest = onDismiss, - onConfirm = { onConfirm(detail.id, dialog.email) }, onHelp = onHelp, + onConfirm = onConfirm, ) } } @@ -75,7 +67,7 @@ fun ConfirmDialog( uio: ConfirmDialogUio, onDismissRequest: () -> Unit = default(), onHelp: (url: String) -> Unit = default(), - onConfirm: (mail: String) -> Unit = default(), + onConfirm: (bookId: Int, mail: String) -> Unit = { _, _ -> }, ) { Dialog( onDismissRequest = onDismissRequest, @@ -97,8 +89,10 @@ fun ConfirmDialogContent( uio: ConfirmDialogUio, onDismissRequest: () -> Unit = default(), onHelp: (url: String) -> Unit = default(), - onConfirm: (mail: String) -> Unit = default(), + onConfirm: (bookId: Int, mail: String) -> Unit = { _, _ -> }, ) { + val amazonHelpUri = stringResource(R.string.detail_send_confirm_help_url) + Card( modifier = modifier, backgroundColor = MaterialTheme.bibLib.colors.dialogBackground, @@ -108,14 +102,14 @@ fun ConfirmDialogContent( modifier = Modifier.padding(bottom = MaterialTheme.bibLib.dimen.dp16), style = MaterialTheme.typography.h6, color = MaterialTheme.bibLib.colors.typography.medium, - text = uio.title + text = stringResource(R.string.detail_send_confirm_title) ) Text( modifier = Modifier.padding(bottom = MaterialTheme.bibLib.dimen.dp16), style = MaterialTheme.typography.body1, color = MaterialTheme.bibLib.colors.typography.medium, - text = uio.description + text = rememberDescription() ) Text( @@ -127,14 +121,14 @@ fun ConfirmDialogContent( Text( modifier = Modifier - .clickable(onClick = { onHelp(uio.helpUrl) }) + .clickable(onClick = { onHelp(amazonHelpUri) }) .padding(vertical = MaterialTheme.bibLib.dimen.dp8), textAlign = TextAlign.Center, style = MaterialTheme.typography.caption, color = MaterialTheme.bibLib.colors.typography.strong, overflow = TextOverflow.Ellipsis, maxLines = 1, - text = uio.help + text = stringResource(R.string.detail_send_confirm_help), ) Row( @@ -147,19 +141,30 @@ fun ConfirmDialogContent( colors = ButtonDefaults.outlinedButtonColors(), onClick = onDismissRequest, ) { - Text(text = uio.cancel) + Text( + text = stringResource(R.string.detail_send_confirm_confirm_action) + ) } Button( colors = ButtonDefaults.buttonColors(), - onClick = { onConfirm(uio.email) } + onClick = { onConfirm(uio.bookId, uio.email) } ) { - Text(text = uio.confirm) + Text( + text = stringResource(R.string.detail_send_confirm_cancel_action) + ) } } } } } +@Composable +private fun rememberDescription(): AnnotatedString { + val email = stringResource(id = R.string.martin_sender) + val description = stringResource(R.string.detail_send_confirm_description, email) + return description.highlight(highlight = stringRegex(email)) +} + @Composable @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) diff --git a/app/src/main/java/com/pixelized/biblib/utils/extention/StringEx.kt b/app/src/main/java/com/pixelized/biblib/utils/extention/StringEx.kt index a1c28c9..349a1b1 100644 --- a/app/src/main/java/com/pixelized/biblib/utils/extention/StringEx.kt +++ b/app/src/main/java/com/pixelized/biblib/utils/extention/StringEx.kt @@ -1,7 +1,42 @@ package com.pixelized.biblib.utils.extention +import androidx.compose.material.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.withStyle import java.util.* fun String.capitalize() = this.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() +} + +@Composable +fun stringRegex( + annotatedText: String +) = remember(annotatedText) { + Regex(annotatedText) +} + +@Composable +fun String.highlight( + highlight: Regex, + defaultStyle: SpanStyle = MaterialTheme.typography.body1.toSpanStyle(), + strongStyle: SpanStyle = defaultStyle.copy(fontWeight = FontWeight.Bold), +): AnnotatedString = remember(this, highlight, defaultStyle, strongStyle) { + buildAnnotatedString { + withStyle(defaultStyle) { + append(this@highlight) + } + highlight.find(this@highlight)?.let { result -> + addStyle( + style = strongStyle, + start = result.range.first, + end = result.range.last + 1, + ) + } + } } \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 3eb74d2..81a2fd7 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -29,7 +29,6 @@ Oups! le téléchargement de la librairy à échoué ! Vous êtes hors ligne. Vous n\'avez aucun mail lié à votre compte. Merci de vous rendre sur https://bib.bibulle.fr/ et d\'éditez voter profile pour en ajouter un. - Ouverture de BibLibrary. Téléchargement de BibLibrary. @@ -51,7 +50,7 @@ Envoyer cet eBook à : Envoyer sur votre Kindle - Assurez-vous que votre Kindle dispose d\'une connexion Internet et que l\'adresse e-mail suivante est correctement configurée. + Assurez-vous que votre Kindle dispose d\'une connexion Internet, que %1$s est un expéditeur approuvé et que l\'adresse e-mail suivante est correctement configurée sur votre compte Amazon. Aide à la configuration du kindle https://www.amazon.fr/gp/help/customer/display.html?nodeId=G7NECT4B4ZWHQ8WV Oui diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f3044ab..87e494a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,6 +2,7 @@ BibLibrary %1$s: %2$s - %3$d Not implemented yet. + famille.martin@gmail.com @@ -61,11 +62,11 @@ Send this eBook to: Send to your Kindle - Make sure your Kindle has an internet connection and the following email address is correctly set up. + Make sure your Kindle has an internet connection, that %1$s is an approved expeditor and that the following email address is correctly set up on your Amazon Account. Help me configure my kindle https://www.amazon.co.uk/gp/help/customer/display.html?nodeId=G7NECT4B4ZWHQ8WV - Oui - Annuler + Yes + Cancel Search on Biblib Search