From 7e29c49a1e28cb64f601eda0ca6df75f4355ca5c Mon Sep 17 00:00:00 2001 From: Aline Bonnet Date: Tue, 21 Jul 2026 16:02:44 +0200 Subject: [PATCH 1/4] modify UI for FC screen --- .../fr/gouv/ami/home/FranceConnexionScreen.kt | 73 ++++++++++++------- app/src/main/res/values/strings.xml | 5 +- 2 files changed, 49 insertions(+), 29 deletions(-) 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..86eb1cd 100644 --- a/app/src/main/java/fr/gouv/ami/home/FranceConnexionScreen.kt +++ b/app/src/main/java/fr/gouv/ami/home/FranceConnexionScreen.kt @@ -9,26 +9,25 @@ import androidx.compose.foundation.Image 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.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable 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.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 @@ -44,33 +43,45 @@ fun FranceConnexionScreen(onFcClick: () -> Unit) { val uriHandler = LocalUriHandler.current BaseScreen(viewModel = viewModel()) { - Box( + /*Box( modifier = Modifier .fillMaxSize() .padding(16.dp) - ) { - - Column( + ) {*/ + Column(modifier = Modifier.fillMaxSize().padding(16.dp)) { + 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 +93,34 @@ 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) } ) { - Text(stringResource(R.string.tchap)) + Text( + fontSize = 16.sp, + textDecoration = TextDecoration.Underline, + text = stringResource(R.string.cannot_connect) + ) } } - } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 904af44..b512734 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -23,9 +23,8 @@ 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 From 29b04d698a6c7c711d0382e020ca7ed0d83e1af7 Mon Sep 17 00:00:00 2001 From: Aline Bonnet Date: Tue, 21 Jul 2026 16:55:26 +0200 Subject: [PATCH 2/4] add bottomSheet on FC screen --- .../fr/gouv/ami/home/FranceConnexionScreen.kt | 60 +++++++++++++++++-- app/src/main/res/drawable/dsfr_mail_fill.xml | 9 +++ app/src/main/res/values/strings.xml | 2 + 3 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/drawable/dsfr_mail_fill.xml 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 86eb1cd..458ed4a 100644 --- a/app/src/main/java/fr/gouv/ami/home/FranceConnexionScreen.kt +++ b/app/src/main/java/fr/gouv/ami/home/FranceConnexionScreen.kt @@ -7,7 +7,6 @@ import android.content.res.Configuration import android.net.Uri import androidx.compose.foundation.Image 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 @@ -15,12 +14,21 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults +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.ColorFilter import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource @@ -36,19 +44,22 @@ import fr.gouv.ami.R import fr.gouv.ami.global.BaseScreen import fr.gouv.ami.ui.theme.AMITheme +@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(modifier = Modifier.fillMaxSize().padding(16.dp)) { + ) { Row( modifier = Modifier .weight(1f) @@ -111,7 +122,8 @@ fun FranceConnexionScreen(onFcClick: () -> Unit) { ) { TextButton( onClick = { - context.openOrInstallApp(targetTchap) + showBottomSheet = true + //context.openOrInstallApp(targetTchap) } ) { Text( @@ -122,6 +134,44 @@ fun FranceConnexionScreen(onFcClick: () -> Unit) { } } } + + if (showBottomSheet) { + ModalBottomSheet( + onDismissRequest = { showBottomSheet = false }, + sheetState = sheetState + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + ) { + Row( + modifier = Modifier.padding(vertical = 12.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Image( + modifier = Modifier.padding(end = 8.dp), + painter = painterResource(R.drawable.dsfr_mail_fill), + contentDescription = "image d'application", + colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary) + ) + Text(stringResource(R.string.help_online)) + } + Row( + modifier = Modifier.padding(vertical = 12.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Image( + modifier = Modifier.padding(end = 8.dp), + painter = painterResource(R.drawable.dsfr_edit_fill), + contentDescription = "image d'application", + colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary) + ) + Text(stringResource(R.string.help_email)) + } + } + } + } } } 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 b512734..f6aa1c5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -27,4 +27,6 @@ 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 ? Je n\'arrive pas à me connecter + Faire une demande en ligne + Envoyer un mail From b8e9d70e90c4ff51f4e909684998872811db2f1d Mon Sep 17 00:00:00 2001 From: Aline Bonnet Date: Wed, 22 Jul 2026 10:34:39 +0200 Subject: [PATCH 3/4] add sending email on FC screen --- .../fr/gouv/ami/home/FranceConnexionScreen.kt | 23 +++++++++-- .../java/fr/gouv/ami/utils/EmailManager.kt | 40 +++++++++++++++++++ app/src/main/res/values/strings.xml | 2 + 3 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/fr/gouv/ami/utils/EmailManager.kt 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 458ed4a..e86ceba 100644 --- a/app/src/main/java/fr/gouv/ami/home/FranceConnexionScreen.kt +++ b/app/src/main/java/fr/gouv/ami/home/FranceConnexionScreen.kt @@ -6,6 +6,7 @@ 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.Column import androidx.compose.foundation.layout.Row @@ -43,6 +44,7 @@ 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 @@ -145,26 +147,39 @@ fun FranceConnexionScreen(onFcClick: () -> Unit) { .fillMaxWidth() .padding(16.dp) ) { + //ask for help online Row( - modifier = Modifier.padding(vertical = 12.dp), + 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_mail_fill), - contentDescription = "image d'application", + contentDescription = "online", colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary) ) Text(stringResource(R.string.help_online)) } + //send an email Row( - modifier = Modifier.padding(vertical = 12.dp), + 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_edit_fill), - contentDescription = "image d'application", + 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/values/strings.xml b/app/src/main/res/values/strings.xml index f6aa1c5..22eb761 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -29,4 +29,6 @@ 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 From 4cfeb2460ec537fabada19195d2ae82ae4e3d62b Mon Sep 17 00:00:00 2001 From: Aline Bonnet Date: Wed, 22 Jul 2026 10:36:48 +0200 Subject: [PATCH 4/4] fix contact icons --- app/src/main/java/fr/gouv/ami/home/FranceConnexionScreen.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 e86ceba..3bade4b 100644 --- a/app/src/main/java/fr/gouv/ami/home/FranceConnexionScreen.kt +++ b/app/src/main/java/fr/gouv/ami/home/FranceConnexionScreen.kt @@ -159,7 +159,7 @@ fun FranceConnexionScreen(onFcClick: () -> Unit) { ) { Image( modifier = Modifier.padding(end = 8.dp), - painter = painterResource(R.drawable.dsfr_mail_fill), + painter = painterResource(R.drawable.dsfr_edit_fill), contentDescription = "online", colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary) ) @@ -178,7 +178,7 @@ fun FranceConnexionScreen(onFcClick: () -> Unit) { ) { Image( modifier = Modifier.padding(end = 8.dp), - painter = painterResource(R.drawable.dsfr_edit_fill), + painter = painterResource(R.drawable.dsfr_mail_fill), contentDescription = "email", colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary) )