From 567310a6e7fdd7cefdaba3f3eef71b78d7b0f078 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Leb=C3=A8gue?= Date: Thu, 19 Feb 2026 16:27:32 +0100 Subject: [PATCH 1/4] feat(forgottenPasswordURL): add the redirection page --- app/build.gradle | 1 + .../com/xpeho/xpeapp/ui/page/LoginPage.kt | 65 ++++++++++++++----- 2 files changed, 51 insertions(+), 15 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 35d1a7b..51acc7c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -186,6 +186,7 @@ dependencies { implementation 'androidx.compose.material:material-icons-extended:1.7.8' implementation "androidx.compose.animation:animation-core:1.10.0" implementation 'androidx.fragment:fragment-ktx:1.8.9' + implementation("androidx.browser:browser:1.8.0") // Test implementation 'androidx.lifecycle:lifecycle-runtime-compose:2.10.0' diff --git a/app/src/main/java/com/xpeho/xpeapp/ui/page/LoginPage.kt b/app/src/main/java/com/xpeho/xpeapp/ui/page/LoginPage.kt index 6b3a8d2..fe8c5d4 100644 --- a/app/src/main/java/com/xpeho/xpeapp/ui/page/LoginPage.kt +++ b/app/src/main/java/com/xpeho/xpeapp/ui/page/LoginPage.kt @@ -1,5 +1,9 @@ package com.xpeho.xpeapp.ui.page +import android.net.Uri +import androidx.browser.customtabs.CustomTabColorSchemeParams +import androidx.browser.customtabs.CustomTabsIntent +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -17,11 +21,15 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction 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 @@ -37,11 +45,9 @@ import com.xpeho.xpeapp.ui.viewModel.viewModelFactory import com.xpeho.xpeho_ui_android.ClickyButton import com.xpeho.xpeho_ui_android.InputText import com.xpeho.xpeho_ui_android.foundations.Colors as XpehoColors +import androidx.core.net.toUri +import com.xpeho.xpeapp.BuildConfig -/** - * Login page - * @param onLoginSuccess: Callback when login is successful - */ @Composable fun LoginPage(onLoginSuccess: () -> Unit) { val wordpressViewModel = viewModel( @@ -52,14 +58,12 @@ fun LoginPage(onLoginSuccess: () -> Unit) { sendAnalyticsEvent(AnalyticsEventName.LOGIN_PAGE) - // If login is successful, notify of login success LaunchedEffect(wordpressViewModel.wordpressState) { if (wordpressViewModel.wordpressState is WordpressUiState.SUCCESS) { onLoginSuccess() } } - // If login fails, show error dialog if (wordpressViewModel.wordpressState is WordpressUiState.ERROR) { CustomDialog( title = stringResource(id = R.string.login_page_error_title), @@ -76,15 +80,12 @@ fun LoginPage(onLoginSuccess: () -> Unit) { private fun LoginPageContent( wordpressViewModel: WordpressViewModel, ) { - LoginPageContentColumn( - wordpressViewModel, - ) -} + val context = LocalContext.current + val focusManager = LocalFocusManager.current + + // Configuration de l'URL pour le reset de mot de passe + val pwdResetUrl = "https://xpeapp-pwd-reset.web.app/" -@Composable -private fun LoginPageContentColumn( - wordpressViewModel: WordpressViewModel, -) { Column( modifier = Modifier .fillMaxSize() @@ -101,9 +102,43 @@ private fun LoginPageContentColumn( LoginPageButton( wordpressViewModel, ) + Spacer(modifier = Modifier.height(26.dp)) + ForgotPasswordText() } } +@Composable +private fun ForgotPasswordText() { + val context = LocalContext.current + val focusManager = LocalFocusManager.current + + Text( + text = "Mot de passe oubliƩ ?", + color = XpehoColors.CONTENT_COLOR, + fontSize = 16.sp, + fontWeight = FontWeight.Bold, + modifier = Modifier + .clickable { + focusManager.clearFocus() + + val defaultColors = CustomTabColorSchemeParams.Builder() + .setToolbarColor(XpehoColors.XPEHO_COLOR.toArgb()) + .build() + + val customTabsIntent = CustomTabsIntent.Builder() + .setDefaultColorSchemeParams(defaultColors) + .setShowTitle(true) + .setShareState(CustomTabsIntent.SHARE_STATE_OFF) + .setUrlBarHidingEnabled(true) + .build() + + // Utilisation de l'URL depuis le BuildConfig comme dans ton code + customTabsIntent.launchUrl(context, BuildConfig.PASSWORD_RESET_URL.toUri()) + } + .padding(8.dp) + ) +} + @Composable private fun LoginPageIcon() { Icon( @@ -207,4 +242,4 @@ fun ErrorTextMessage(message: String) { @Composable fun ErrorTextMessagePreview() { ErrorTextMessage(message = "Veuillez entrer votre email") -} +} \ No newline at end of file From 2ce01f44c9d99ac72faa4ef63af8b1e5ad2bb876 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Leb=C3=A8gue?= Date: Thu, 19 Feb 2026 16:32:20 +0100 Subject: [PATCH 2/4] feat(removeUnusedElement): removed unused element --- app/src/main/java/com/xpeho/xpeapp/ui/page/LoginPage.kt | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/src/main/java/com/xpeho/xpeapp/ui/page/LoginPage.kt b/app/src/main/java/com/xpeho/xpeapp/ui/page/LoginPage.kt index fe8c5d4..65133e0 100644 --- a/app/src/main/java/com/xpeho/xpeapp/ui/page/LoginPage.kt +++ b/app/src/main/java/com/xpeho/xpeapp/ui/page/LoginPage.kt @@ -80,12 +80,6 @@ fun LoginPage(onLoginSuccess: () -> Unit) { private fun LoginPageContent( wordpressViewModel: WordpressViewModel, ) { - val context = LocalContext.current - val focusManager = LocalFocusManager.current - - // Configuration de l'URL pour le reset de mot de passe - val pwdResetUrl = "https://xpeapp-pwd-reset.web.app/" - Column( modifier = Modifier .fillMaxSize() @@ -132,7 +126,6 @@ private fun ForgotPasswordText() { .setUrlBarHidingEnabled(true) .build() - // Utilisation de l'URL depuis le BuildConfig comme dans ton code customTabsIntent.launchUrl(context, BuildConfig.PASSWORD_RESET_URL.toUri()) } .padding(8.dp) From 4bf656da4616b22dd4cf5f64f503d97adf6eea95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Leb=C3=A8gue?= Date: Thu, 19 Feb 2026 16:54:17 +0100 Subject: [PATCH 3/4] feat(validateSecrets): add mandatory secrets verification step in CI workflow --- .github/workflows/sonar_android.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sonar_android.yaml b/.github/workflows/sonar_android.yaml index 390b04c..af23674 100644 --- a/.github/workflows/sonar_android.yaml +++ b/.github/workflows/sonar_android.yaml @@ -46,7 +46,7 @@ jobs: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} run: | - echo ${{ secrets.GOOGLE_SERVICE_FILE }} | base64 -d > app/google-services.json + echo "${{ secrets.GOOGLE_SERVICE_FILE }}" | base64 -d > app/google-services.json mkdir -p app/config - echo ${{ secrets.UAT_CONFIG_FILE }} | base64 -d > app/config/uat.properties + echo "${{ secrets.UAT_CONFIG_FILE }}" | base64 -d > app/config/uat.properties ./gradlew assembleDebug jacocoTestReport sonar From fdcb48ec4963881b2f4a1125f84dfe20f31d81a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Leb=C3=A8gue?= Date: Mon, 23 Feb 2026 10:39:22 +0100 Subject: [PATCH 4/4] feat(refactoComment): remove/add comments --- app/src/main/java/com/xpeho/xpeapp/ui/page/LoginPage.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/java/com/xpeho/xpeapp/ui/page/LoginPage.kt b/app/src/main/java/com/xpeho/xpeapp/ui/page/LoginPage.kt index 65133e0..f03752e 100644 --- a/app/src/main/java/com/xpeho/xpeapp/ui/page/LoginPage.kt +++ b/app/src/main/java/com/xpeho/xpeapp/ui/page/LoginPage.kt @@ -48,6 +48,10 @@ import com.xpeho.xpeho_ui_android.foundations.Colors as XpehoColors import androidx.core.net.toUri import com.xpeho.xpeapp.BuildConfig +/** + * Login page + * @param onLoginSuccess: Callback when login is successful + */ @Composable fun LoginPage(onLoginSuccess: () -> Unit) { val wordpressViewModel = viewModel( @@ -58,12 +62,14 @@ fun LoginPage(onLoginSuccess: () -> Unit) { sendAnalyticsEvent(AnalyticsEventName.LOGIN_PAGE) + // If login is successful, notify of login success LaunchedEffect(wordpressViewModel.wordpressState) { if (wordpressViewModel.wordpressState is WordpressUiState.SUCCESS) { onLoginSuccess() } } + // If login fails, show error dialog if (wordpressViewModel.wordpressState is WordpressUiState.ERROR) { CustomDialog( title = stringResource(id = R.string.login_page_error_title),