diff --git a/app/src/main/java/fr/gouv/ami/home/FranceConnexionScreen.kt b/app/src/main/java/fr/gouv/ami/home/FranceConnexionScreen.kt index 208b7fa..3bade4b 100644 --- a/app/src/main/java/fr/gouv/ami/home/FranceConnexionScreen.kt +++ b/app/src/main/java/fr/gouv/ami/home/FranceConnexionScreen.kt @@ -6,29 +6,37 @@ import android.content.pm.PackageManager import android.content.res.Configuration import android.net.Uri import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.Button -import androidx.compose.material3.ButtonColors import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.Scaffold +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text import androidx.compose.material3.TextButton +import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Color.Companion.Gray +import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.LinkAnnotation -import androidx.compose.ui.text.buildAnnotatedString -import androidx.compose.ui.text.withLink +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -36,41 +44,57 @@ import androidx.lifecycle.viewmodel.compose.viewModel import fr.gouv.ami.R import fr.gouv.ami.global.BaseScreen import fr.gouv.ami.ui.theme.AMITheme +import fr.gouv.ami.utils.EmailManager +@OptIn(ExperimentalMaterial3Api::class) @Composable fun FranceConnexionScreen(onFcClick: () -> Unit) { val targetTchap = "fr.gouv.tchap.a" val context = LocalContext.current val uriHandler = LocalUriHandler.current + val sheetState = rememberModalBottomSheetState() + var showBottomSheet by remember { mutableStateOf(false) } + BaseScreen(viewModel = viewModel()) { - Box( + Column( modifier = Modifier .fillMaxSize() .padding(16.dp) ) { - - Column( + Row( modifier = Modifier - .fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center + .weight(1f) + .fillMaxWidth(), + verticalAlignment = Alignment.Bottom, + horizontalArrangement = Arrangement.Center ) { Image( painter = painterResource(R.drawable.ic_application), contentDescription = "image d'application" ) + } + Column( + modifier = Modifier + .fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { Text( - modifier = Modifier.padding(vertical = 16.dp), - text = stringResource(R.string.franceConnexion_description), fontSize = 16.sp + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + textAlign = TextAlign.Center, + fontSize = 22.sp, + fontWeight = FontWeight.Bold, + text = stringResource(R.string.home_title) ) Text( modifier = Modifier.padding( - vertical = 24.dp + bottom = 24.dp ), text = stringResource(R.string.franceConnexion_subtitle), - fontSize = 12.sp, - color = Gray + fontSize = 14.sp ) Button( onClick = onFcClick, @@ -82,24 +106,86 @@ fun FranceConnexionScreen(onFcClick: () -> Unit) { ) } TextButton( - onClick = {uriHandler.openUri("https://franceconnect.gouv.fr/")} - ) { Text(stringResource(R.string.FC_button_description))} + onClick = { uriHandler.openUri("https://franceconnect.gouv.fr/") } + ) { + Text( + fontSize = 14.sp, + textDecoration = TextDecoration.Underline, + text = stringResource(R.string.FC_button_description) + ) + } } Column( - modifier = Modifier.fillMaxSize(), - verticalArrangement = Arrangement.Bottom, - horizontalAlignment = Alignment.CenterHorizontally + modifier = Modifier + .weight(1f) + .fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Bottom ) { - Text(stringResource(R.string.connection_difficult)) TextButton( onClick = { - context.openOrInstallApp(targetTchap) + showBottomSheet = true + //context.openOrInstallApp(targetTchap) } ) { - Text(stringResource(R.string.tchap)) + Text( + fontSize = 16.sp, + textDecoration = TextDecoration.Underline, + text = stringResource(R.string.cannot_connect) + ) } } + } + if (showBottomSheet) { + ModalBottomSheet( + onDismissRequest = { showBottomSheet = false }, + sheetState = sheetState + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + ) { + //ask for help online + Row( + modifier = Modifier + .padding(vertical = 12.dp) + .clickable( + onClick = { + showBottomSheet = false + }), + verticalAlignment = Alignment.CenterVertically + ) { + Image( + modifier = Modifier.padding(end = 8.dp), + painter = painterResource(R.drawable.dsfr_edit_fill), + contentDescription = "online", + colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary) + ) + Text(stringResource(R.string.help_online)) + } + //send an email + Row( + modifier = Modifier + .padding(vertical = 12.dp) + .clickable(onClick = { + showBottomSheet = false + val emailManager = EmailManager(context) + emailManager.emailTo() + }), + verticalAlignment = Alignment.CenterVertically + ) { + Image( + modifier = Modifier.padding(end = 8.dp), + painter = painterResource(R.drawable.dsfr_mail_fill), + contentDescription = "email", + colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary) + ) + Text(stringResource(R.string.help_email)) + } + } + } } } } diff --git a/app/src/main/java/fr/gouv/ami/utils/EmailManager.kt b/app/src/main/java/fr/gouv/ami/utils/EmailManager.kt new file mode 100644 index 0000000..17ff2e5 --- /dev/null +++ b/app/src/main/java/fr/gouv/ami/utils/EmailManager.kt @@ -0,0 +1,40 @@ +package fr.gouv.ami.utils + +import android.content.Context +import android.content.Intent +import android.net.Uri +import fr.gouv.ami.R +import androidx.core.net.toUri + +class EmailManager(val context: Context) { + + val TAG = this::class.java.simpleName + + val managerStorage = ManagerLocalStorage(context) + val deviceId = managerStorage.getOrCreateDeviceId() + + val target = "equipe-ami@numerique.gouv.fr" + val body = context.getString(R.string.email_body, deviceId) + + fun emailTo( + subject: String? = null, + ) { + val mailto = StringBuilder().apply { + append("mailto:").append(target).append("?") + subject?.let { + append("subject=").append(Uri.encode(it)).append("&") + } + append("body=").append(Uri.encode(body)).append("&") + + replace(length - 1, length, "") + } + val intent = Intent().apply { + action = Intent.ACTION_SENDTO + addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) + addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT) + addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK) + data = mailto.toString().toUri() + } + context.startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/dsfr_mail_fill.xml b/app/src/main/res/drawable/dsfr_mail_fill.xml new file mode 100644 index 0000000..fcc5d0f --- /dev/null +++ b/app/src/main/res/drawable/dsfr_mail_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 904af44..22eb761 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -23,9 +23,12 @@ Erreur de certificat Le certificat n\'est pas reconnu. - Pour accéder à vos droits, des conseils personnalisés et les échéances liées à votre situation personnelle, merci de vous connecter avec FranceConnect. + Me connecter à AMI FranceConnect est la solution proposée par l\'Etat pour sécuriser et simplifier la connexion à vos services en ligne. Qu\'est ce que FranceConnect ? - Vous n\'arrivez pas à vous connecter ? - Contactez-nous sur Tchap + Je n\'arrive pas à me connecter + Faire une demande en ligne + Envoyer un mail + + Merci de ne pas effacer le texte ci-dessous. \n Mon code d\'identification : %1$s