From 9225318e1ad5fa80fc4338d5b213bd3614ca992a Mon Sep 17 00:00:00 2001 From: Emiliano Frascaro Date: Thu, 13 Aug 2026 20:19:20 +0200 Subject: [PATCH] Aggiunge il flavor Android collaudo installabile accanto all'app di produzione. Usa un applicationId distinto, icona con fascia gialla e API su collaudo.matchlivetv.it. Co-authored-by: Cursor --- native/android/app/build.gradle.kts | 34 +++++++++++++----- .../app/src/collaudo/AndroidManifest.xml | 17 +++++++++ .../collaudo/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3841 bytes .../collaudo/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2331 bytes .../collaudo/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5632 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 10428 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 17982 bytes .../src/collaudo/res/values-de/strings.xml | 4 +++ .../src/collaudo/res/values-en/strings.xml | 4 +++ .../src/collaudo/res/values-es/strings.xml | 4 +++ .../src/collaudo/res/values-fr/strings.xml | 4 +++ .../app/src/collaudo/res/values/strings.xml | 4 +++ .../match_live_tv/ui/login/LoginScreen.kt | 19 ++++++++++ .../app/src/main/res/values/strings.xml | 1 + scripts/build_native_android_apk_collaudo.sh | 14 ++++++++ scripts/build_native_android_apk_prod.sh | 4 +-- scripts/e2e_native_android_emulator.sh | 8 ++--- 17 files changed, 103 insertions(+), 14 deletions(-) create mode 100644 native/android/app/src/collaudo/AndroidManifest.xml create mode 100644 native/android/app/src/collaudo/res/mipmap-hdpi/ic_launcher.png create mode 100644 native/android/app/src/collaudo/res/mipmap-mdpi/ic_launcher.png create mode 100644 native/android/app/src/collaudo/res/mipmap-xhdpi/ic_launcher.png create mode 100644 native/android/app/src/collaudo/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 native/android/app/src/collaudo/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 native/android/app/src/collaudo/res/values-de/strings.xml create mode 100644 native/android/app/src/collaudo/res/values-en/strings.xml create mode 100644 native/android/app/src/collaudo/res/values-es/strings.xml create mode 100644 native/android/app/src/collaudo/res/values-fr/strings.xml create mode 100644 native/android/app/src/collaudo/res/values/strings.xml create mode 100755 scripts/build_native_android_apk_collaudo.sh diff --git a/native/android/app/build.gradle.kts b/native/android/app/build.gradle.kts index 669b08b..5dcf6ce 100644 --- a/native/android/app/build.gradle.kts +++ b/native/android/app/build.gradle.kts @@ -30,6 +30,7 @@ android { val apiBaseUrl = project.findProperty("API_BASE_URL") as String? ?: "https://www.matchlivetv.it" buildConfigField("String", "API_BASE_URL", "\"$apiBaseUrl\"") + buildConfigField("boolean", "IS_COLLAUDO", "false") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" // Anche in defaultConfig: AGP estrae simboli se le .so non sono giĆ  stripped. @@ -38,6 +39,23 @@ android { } } + flavorDimensions += "env" + productFlavors { + create("prod") { + dimension = "env" + isDefault = true + } + create("collaudo") { + dimension = "env" + applicationId = "com.matchlivetv.match_live_tv.collaudo" + versionNameSuffix = "-collaudo" + val collaudoApi = project.findProperty("API_BASE_URL") as String? + ?: "https://collaudo.matchlivetv.it" + buildConfigField("String", "API_BASE_URL", "\"$collaudoApi\"") + buildConfigField("boolean", "IS_COLLAUDO", "true") + } + } + signingConfigs { if (keystorePropertiesFile.exists()) { create("release") { @@ -138,31 +156,31 @@ fun findLlvmObjcopy(): File { val injectNativeDebugSymbolsInReleaseBundle by tasks.registering { description = "Embed native-debug-symbols.zip (.so.sym) into the release AAB intermediary" - val mergeNative = tasks.named("mergeReleaseNativeLibs") - val packageBundle = tasks.named("packageReleaseBundle") + val mergeNative = tasks.named("mergeProdReleaseNativeLibs") + val packageBundle = tasks.named("packageProdReleaseBundle") dependsOn(mergeNative, packageBundle) inputs.dir( layout.buildDirectory.dir( - "intermediates/merged_native_libs/release/mergeReleaseNativeLibs/out/lib", + "intermediates/merged_native_libs/prodRelease/mergeProdReleaseNativeLibs/out/lib", ), ) inputs.file( layout.buildDirectory.file( - "intermediates/intermediary_bundle/release/packageReleaseBundle/intermediary-bundle.aab", + "intermediates/intermediary_bundle/prodRelease/packageProdReleaseBundle/intermediary-bundle.aab", ), ) outputs.file( layout.buildDirectory.file( - "intermediates/intermediary_bundle/release/packageReleaseBundle/intermediary-bundle.aab", + "intermediates/intermediary_bundle/prodRelease/packageProdReleaseBundle/intermediary-bundle.aab", ), ) doLast { val libsDir = layout.buildDirectory - .dir("intermediates/merged_native_libs/release/mergeReleaseNativeLibs/out/lib") + .dir("intermediates/merged_native_libs/prodRelease/mergeProdReleaseNativeLibs/out/lib") .get() .asFile val aabFile = layout.buildDirectory - .file("intermediates/intermediary_bundle/release/packageReleaseBundle/intermediary-bundle.aab") + .file("intermediates/intermediary_bundle/prodRelease/packageProdReleaseBundle/intermediary-bundle.aab") .get() .asFile require(libsDir.isDirectory) { "Native libs missing: $libsDir" } @@ -234,6 +252,6 @@ val injectNativeDebugSymbolsInReleaseBundle by tasks.registering { } } -tasks.matching { it.name == "signReleaseBundle" }.configureEach { +tasks.matching { it.name == "signProdReleaseBundle" }.configureEach { dependsOn(injectNativeDebugSymbolsInReleaseBundle) } diff --git a/native/android/app/src/collaudo/AndroidManifest.xml b/native/android/app/src/collaudo/AndroidManifest.xml new file mode 100644 index 0000000..f95f1bb --- /dev/null +++ b/native/android/app/src/collaudo/AndroidManifest.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/native/android/app/src/collaudo/res/mipmap-hdpi/ic_launcher.png b/native/android/app/src/collaudo/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..dce2b295aa574aa2c1a6f9316d5d19e6aa9a1509 GIT binary patch literal 3841 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 aF#aEUdn$-~0T&Pe0000 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 literal 0 HcmV?d00001 diff --git a/native/android/app/src/collaudo/res/values-de/strings.xml b/native/android/app/src/collaudo/res/values-de/strings.xml new file mode 100644 index 0000000..4d4dd7d --- /dev/null +++ b/native/android/app/src/collaudo/res/values-de/strings.xml @@ -0,0 +1,4 @@ + + + Match Live TV Collaudo + diff --git a/native/android/app/src/collaudo/res/values-en/strings.xml b/native/android/app/src/collaudo/res/values-en/strings.xml new file mode 100644 index 0000000..4d4dd7d --- /dev/null +++ b/native/android/app/src/collaudo/res/values-en/strings.xml @@ -0,0 +1,4 @@ + + + Match Live TV Collaudo + diff --git a/native/android/app/src/collaudo/res/values-es/strings.xml b/native/android/app/src/collaudo/res/values-es/strings.xml new file mode 100644 index 0000000..4d4dd7d --- /dev/null +++ b/native/android/app/src/collaudo/res/values-es/strings.xml @@ -0,0 +1,4 @@ + + + Match Live TV Collaudo + diff --git a/native/android/app/src/collaudo/res/values-fr/strings.xml b/native/android/app/src/collaudo/res/values-fr/strings.xml new file mode 100644 index 0000000..4d4dd7d --- /dev/null +++ b/native/android/app/src/collaudo/res/values-fr/strings.xml @@ -0,0 +1,4 @@ + + + Match Live TV Collaudo + diff --git a/native/android/app/src/collaudo/res/values/strings.xml b/native/android/app/src/collaudo/res/values/strings.xml new file mode 100644 index 0000000..4d4dd7d --- /dev/null +++ b/native/android/app/src/collaudo/res/values/strings.xml @@ -0,0 +1,4 @@ + + + Match Live TV Collaudo + diff --git a/native/android/app/src/main/kotlin/com/matchlivetv/match_live_tv/ui/login/LoginScreen.kt b/native/android/app/src/main/kotlin/com/matchlivetv/match_live_tv/ui/login/LoginScreen.kt index 808b223..92102e7 100644 --- a/native/android/app/src/main/kotlin/com/matchlivetv/match_live_tv/ui/login/LoginScreen.kt +++ b/native/android/app/src/main/kotlin/com/matchlivetv/match_live_tv/ui/login/LoginScreen.kt @@ -1,5 +1,6 @@ package com.matchlivetv.match_live_tv.ui.login +import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -7,6 +8,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll @@ -31,6 +33,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.focus.FocusDirection import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalFocusManager @@ -38,6 +41,7 @@ import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTagsAsResourceId +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation @@ -45,6 +49,7 @@ import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.unit.dp +import com.matchlivetv.match_live_tv.BuildConfig import com.matchlivetv.match_live_tv.R import com.matchlivetv.match_live_tv.data.AppContainer import com.matchlivetv.match_live_tv.ui.components.LanguagePickerDialog @@ -122,6 +127,20 @@ fun LoginScreen( .padding(horizontal = 24.dp, vertical = 16.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { + if (BuildConfig.IS_COLLAUDO) { + Text( + text = stringResource(R.string.collaudo_banner), + color = Color.Black, + fontWeight = FontWeight.Bold, + textAlign = TextAlign.Center, + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(8.dp)) + .background(MatchColors.AccentYellow) + .padding(vertical = 8.dp), + ) + Spacer(Modifier.height(16.dp)) + } MatchLiveWordmark(showSlogan = true) Spacer(Modifier.height(48.dp)) Text( diff --git a/native/android/app/src/main/res/values/strings.xml b/native/android/app/src/main/res/values/strings.xml index d91925b..d547316 100644 --- a/native/android/app/src/main/res/values/strings.xml +++ b/native/android/app/src/main/res/values/strings.xml @@ -1,6 +1,7 @@ Match Live TV + AMBIENTE COLLAUDO Ogni partita, ogni evento, per i tuoi tifosi. Lingua Sistema diff --git a/scripts/build_native_android_apk_collaudo.sh b/scripts/build_native_android_apk_collaudo.sh new file mode 100755 index 0000000..67efac3 --- /dev/null +++ b/scripts/build_native_android_apk_collaudo.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -euo pipefail +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +ANDROID_DIR="$ROOT/native/android" +API_BASE_URL="${API_BASE_URL:-https://collaudo.matchlivetv.it}" + +cd "$ANDROID_DIR" +chmod +x gradlew +./gradlew assembleCollaudoRelease -PAPI_BASE_URL="$API_BASE_URL" + +APK="$ANDROID_DIR/app/build/outputs/apk/collaudo/release/app-collaudo-release.apk" +echo "APK: $APK" +echo "API_BASE_URL=$API_BASE_URL" +echo "applicationId=com.matchlivetv.match_live_tv.collaudo" diff --git a/scripts/build_native_android_apk_prod.sh b/scripts/build_native_android_apk_prod.sh index 6d10aa3..44751f2 100755 --- a/scripts/build_native_android_apk_prod.sh +++ b/scripts/build_native_android_apk_prod.sh @@ -6,8 +6,8 @@ API_BASE_URL="${API_BASE_URL:-https://www.matchlivetv.it}" cd "$ANDROID_DIR" chmod +x gradlew -./gradlew assembleRelease -PAPI_BASE_URL="$API_BASE_URL" +./gradlew assembleProdRelease -PAPI_BASE_URL="$API_BASE_URL" -APK="$ANDROID_DIR/app/build/outputs/apk/release/app-release.apk" +APK="$ANDROID_DIR/app/build/outputs/apk/prod/release/app-prod-release.apk" echo "APK: $APK" echo "API_BASE_URL=$API_BASE_URL" diff --git a/scripts/e2e_native_android_emulator.sh b/scripts/e2e_native_android_emulator.sh index 3a70a0b..da2b30e 100755 --- a/scripts/e2e_native_android_emulator.sh +++ b/scripts/e2e_native_android_emulator.sh @@ -14,7 +14,7 @@ echo "==> Device: $DEVICE" cd "$ANDROID_DIR" chmod +x gradlew echo "==> Build debug + androidTest APK (API_BASE_URL=$API_BASE_URL)" -./gradlew assembleDebug assembleDebugAndroidTest -PAPI_BASE_URL="$API_BASE_URL" +./gradlew assembleProdDebug assembleProdDebugAndroidTest -PAPI_BASE_URL="$API_BASE_URL" echo "==> Reset app state on $DEVICE" "$ADB" -s "$DEVICE" shell am force-stop com.matchlivetv.match_live_tv @@ -24,11 +24,11 @@ echo "==> Reset app state on $DEVICE" "$ADB" -s "$DEVICE" shell pm grant com.matchlivetv.match_live_tv android.permission.POST_NOTIFICATIONS echo "==> Install on $DEVICE" -"$ADB" -s "$DEVICE" install -r app/build/outputs/apk/debug/app-debug.apk -"$ADB" -s "$DEVICE" install -r app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk +"$ADB" -s "$DEVICE" install -r app/build/outputs/apk/prod/debug/app-prod-debug.apk +"$ADB" -s "$DEVICE" install -r app/build/outputs/apk/androidTest/prod/debug/app-prod-debug-androidTest.apk echo "==> Run E2E tests" -./gradlew connectedDebugAndroidTest \ +./gradlew connectedProdDebugAndroidTest \ -Pandroid.testInstrumentationRunnerArguments.class=com.matchlivetv.match_live_tv.E2EWizardFlowTest \ -PAPI_BASE_URL="$API_BASE_URL"