Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 112 additions & 26 deletions app/src/main/java/fr/gouv/ami/home/FranceConnexionScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,71 +6,95 @@ 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
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,
Expand All @@ -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))
}
}
}
}
}
}
Expand Down
40 changes: 40 additions & 0 deletions app/src/main/java/fr/gouv/ami/utils/EmailManager.kt
Original file line number Diff line number Diff line change
@@ -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)
}
}
9 changes: 9 additions & 0 deletions app/src/main/res/drawable/dsfr_mail_fill.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M3,3H21C21.552,3 22,3.448 22,4V20C22,20.552 21.552,21 21,21H3C2.448,21 2,20.552 2,20V4C2,3.448 2.448,3 3,3ZM12.061,11.683L5.647,6.238L4.353,7.762L12.073,14.317L19.654,7.756L18.346,6.244L12.061,11.683Z"
android:fillColor="#FF000000"/>
</vector>
9 changes: 6 additions & 3 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,12 @@
<string name="ssl_error_title">Erreur de certificat</string>
<string name="ssl_error_description">Le certificat n\'est pas reconnu.</string>

<string name="franceConnexion_description">Pour accéder à vos droits, des conseils personnalisés et les échéances liées à votre situation personnelle, merci de vous connecter avec FranceConnect.</string>
<string name="home_title">Me connecter à AMI</string>
<string name="franceConnexion_subtitle">FranceConnect est la solution proposée par l\'Etat pour sécuriser et simplifier la connexion à vos services en ligne.</string>
<string name="FC_button_description">Qu\'est ce que FranceConnect ?</string>
<string name="connection_difficult">Vous n\'arrivez pas à vous connecter ?</string>
<string name="tchap">Contactez-nous sur Tchap</string>
<string name="cannot_connect">Je n\'arrive pas à me connecter</string>
<string name="help_online">Faire une demande en ligne</string>
<string name="help_email">Envoyer un mail</string>

<string name="email_body">Merci de ne pas effacer le texte ci-dessous. \n Mon code d\'identification : %1$s</string>
</resources>