From fa05b18d323bb236eacea7e6a19b161a4c4e9f54 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 11 Jan 2024 20:45:22 +0100 Subject: [PATCH 01/10] Create gplay and fdroid variant --- app/build.gradle.kts | 21 ++++++++++++++++--- .../io/element/android/x/di/AppModule.kt | 6 ++---- .../main/kotlin/extension/KoverExtension.kt | 6 +++--- .../android/samples/minimal/Singleton.kt | 6 ++---- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 543a414091..05f7bdf139 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -69,7 +69,7 @@ android { } signingConfigs { - named("debug") { + getByName("debug") { keyAlias = "androiddebugkey" keyPassword = "android" storeFile = file("./signature/debug.keystore") @@ -87,13 +87,13 @@ android { } buildTypes { - named("debug") { + getByName("debug") { resValue("string", "app_name", "Element X dbg") applicationIdSuffix = ".debug" signingConfig = signingConfigs.getByName("debug") } - named("release") { + getByName("release") { resValue("string", "app_name", "Element X") signingConfig = signingConfigs.getByName("debug") @@ -143,6 +143,21 @@ android { buildFeatures { buildConfig = true } + flavorDimensions += "store" + productFlavors { + create("gplay") { + dimension = "store" + isDefault = true + buildConfigField("String", "SHORT_FLAVOR_DESCRIPTION", "\"G\"") + buildConfigField("String", "FLAVOR_DESCRIPTION", "\"GooglePlay\"") + + } + create("fdroid") { + dimension = "store" + buildConfigField("String", "SHORT_FLAVOR_DESCRIPTION", "\"F\"") + buildConfigField("String", "FLAVOR_DESCRIPTION", "\"FDroid\"") + } + } } androidComponents { diff --git a/app/src/main/kotlin/io/element/android/x/di/AppModule.kt b/app/src/main/kotlin/io/element/android/x/di/AppModule.kt index 995dcf61e5..bf4880b372 100644 --- a/app/src/main/kotlin/io/element/android/x/di/AppModule.kt +++ b/app/src/main/kotlin/io/element/android/x/di/AppModule.kt @@ -91,10 +91,8 @@ object AppModule { gitRevisionDate = "TODO", // BuildConfig.GIT_BRANCH_NAME, gitBranchName = "TODO", - // BuildConfig.FLAVOR_DESCRIPTION, - flavorDescription = "TODO", - // BuildConfig.SHORT_FLAVOR_DESCRIPTION, - flavorShortDescription = "TODO", + flavorDescription = BuildConfig.FLAVOR_DESCRIPTION, + flavorShortDescription = BuildConfig.SHORT_FLAVOR_DESCRIPTION, ) @Provides diff --git a/plugins/src/main/kotlin/extension/KoverExtension.kt b/plugins/src/main/kotlin/extension/KoverExtension.kt index 42b7a5bc1f..9185bfb1b0 100644 --- a/plugins/src/main/kotlin/extension/KoverExtension.kt +++ b/plugins/src/main/kotlin/extension/KoverExtension.kt @@ -97,8 +97,8 @@ fun Project.setupKover() { defaults { // add reports of both 'debug' and 'release' Android build variants to default reports - mergeWith("debug") - mergeWith("release") + mergeWith("gplayDebug") + mergeWith("gplayRelease") verify { onCheck = true @@ -202,7 +202,7 @@ fun Project.setupKover() { } } - androidReports("release") {} + androidReports("gplayRelease") {} } } diff --git a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/Singleton.kt b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/Singleton.kt index cc54fd051f..fc8fe81d8a 100644 --- a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/Singleton.kt +++ b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/Singleton.kt @@ -43,10 +43,8 @@ object Singleton { gitRevisionDate = "TODO", // BuildConfig.GIT_BRANCH_NAME, gitBranchName = "TODO", - // BuildConfig.FLAVOR_DESCRIPTION, - flavorDescription = "TODO", - // BuildConfig.SHORT_FLAVOR_DESCRIPTION, - flavorShortDescription = "TODO", + flavorDescription = "NA", + flavorShortDescription = "NA", ) init { From db6b52f8bfef5b3aa19fe874d745f7d19ccfffc0 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 11 Jan 2024 21:02:26 +0100 Subject: [PATCH 02/10] Update gradle tasks and paths regarding the new gplay and fdroid flavor. --- .github/workflows/build.yml | 6 +++--- .github/workflows/maestro.yml | 2 +- .github/workflows/nightly.yml | 2 +- .github/workflows/release.yml | 6 +++--- app/build.gradle.kts | 2 +- tools/release/release.sh | 6 +++--- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e220ec76e4..c93d1a2ab0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -47,14 +47,14 @@ jobs: ELEMENT_ANDROID_MAPTILER_API_KEY: ${{ secrets.MAPTILER_KEY }} ELEMENT_ANDROID_MAPTILER_LIGHT_MAP_ID: ${{ secrets.MAPTILER_LIGHT_MAP_ID }} ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }} - run: ./gradlew :app:assembleDebug -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES + run: ./gradlew :app:assembleGplayDebug :app:assembleFDroidDebug -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES - name: Upload APK APKs if: ${{ matrix.variant == 'debug' }} uses: actions/upload-artifact@v4 with: name: elementx-debug path: | - app/build/outputs/apk/debug/*.apk + app/build/outputs/apk/gplay/debug/*.apk - uses: rnkdsh/action-upload-diawi@v1.5.4 id: diawi # Do not fail the whole build if Diawi upload fails @@ -64,7 +64,7 @@ jobs: if: ${{ matrix.variant == 'debug' && github.event_name == 'pull_request' && env.token != '' }} with: token: ${{ env.token }} - file: app/build/outputs/apk/debug/app-arm64-v8a-debug.apk + file: app/build/outputs/apk/gplay/debug/app-gplay-arm64-v8a-debug.apk - name: Add or update PR comment with QR Code to download APK. if: ${{ matrix.variant == 'debug' && github.event_name == 'pull_request' && steps.diawi.conclusion == 'success' }} uses: NejcZdovc/comment-pr@v2 diff --git a/.github/workflows/maestro.yml b/.github/workflows/maestro.yml index 0e2dc74b92..c6d4c44d80 100644 --- a/.github/workflows/maestro.yml +++ b/.github/workflows/maestro.yml @@ -53,7 +53,7 @@ jobs: api-key: ${{ secrets.MAESTRO_CLOUD_API_KEY }} # Doc says (https://github.com/mobile-dev-inc/action-maestro-cloud#android): # app-file should point to an x86 compatible APK file, so upload the x86_64 one (much smaller than the universal APK). - app-file: app/build/outputs/apk/debug/app-x86_64-debug.apk + app-file: app/build/outputs/apk/gplay/debug/app-gplay-x86_64-debug.apk env: | USERNAME=maestroelement PASSWORD=${{ secrets.MATRIX_MAESTRO_ACCOUNT_PASSWORD }} diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 91976f56a0..b1e9dddde9 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -45,7 +45,7 @@ jobs: - name: Additionally upload Nightly APK to browserstack for testing continue-on-error: true # don't block anything by this upload failing (for now) run: | - curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_PASSWORD" -X POST "https://api-cloud.browserstack.com/app-automate/upload" -F "file=@app/build/outputs/apk/nightly/app-universal-nightly.apk" -F "custom_id=element-x-android-nightly" + curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_PASSWORD" -X POST "https://api-cloud.browserstack.com/app-automate/upload" -F "file=@app/build/outputs/apk/gplay/nightly/app-gplay-universal-nightly.apk" -F "custom_id=element-x-android-nightly" env: BROWSERSTACK_USERNAME: ${{ secrets.ELEMENT_ANDROID_BROWSERSTACK_USERNAME }} BROWSERSTACK_PASSWORD: ${{ secrets.ELEMENT_ANDROID_BROWSERSTACK_ACCESS_KEY }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 59b5f60cec..97e3634a6a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,10 +31,10 @@ jobs: ELEMENT_ANDROID_MAPTILER_API_KEY: ${{ secrets.MAPTILER_KEY }} ELEMENT_ANDROID_MAPTILER_LIGHT_MAP_ID: ${{ secrets.MAPTILER_LIGHT_MAP_ID }} ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }} - run: ./gradlew bundleRelease $CI_GRADLE_ARG_PROPERTIES + run: ./gradlew bundleGplayRelease $CI_GRADLE_ARG_PROPERTIES - name: Upload bundle as artifact uses: actions/upload-artifact@v4 with: - name: elementx-app-bundle-unsigned + name: elementx-app-gplay-bundle-unsigned path: | - app/build/outputs/bundle/release/app-release.aab + app/build/outputs/bundle/gplayRelease/app-gplay-release.aab diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 05f7bdf139..c5918bfef7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -124,7 +124,7 @@ android { // We upload the universal APK to fix this error: // "App Distribution found more than 1 output file for this variant. // Please contact firebase-support@google.com for help using APK splits with App Distribution." - artifactPath = "$rootDir/app/build/outputs/apk/nightly/app-universal-nightly.apk" + artifactPath = "$rootDir/app/build/outputs/apk/gplay/nightly/app-gplay-universal-nightly.apk" // artifactType = "AAB" // artifactPath = "$rootDir/app/build/outputs/bundle/nightly/app-nightly.aab" // This file will be generated by the GitHub action diff --git a/tools/release/release.sh b/tools/release/release.sh index 26a94cb09e..f793ac2a4e 100755 --- a/tools/release/release.sh +++ b/tools/release/release.sh @@ -143,7 +143,7 @@ git commit -a -m "Setting version for the release ${version}" printf "\n================================================================================\n" printf "Building the bundle locally first...\n" -./gradlew clean app:bundleRelease +./gradlew clean app:bundleGplayRelease printf "\n================================================================================\n" printf "Running towncrier...\n" @@ -218,7 +218,7 @@ fi printf "\n================================================================================\n" printf "Wait for the GitHub action https://github.com/element-hq/element-x-android/actions/workflows/release.yml?query=branch%%3Amain to build the 'main' branch.\n" -read -p "After GHA is finished, please enter the artifact URL (for 'elementx-app-bundle-unsigned'): " artifactUrl +read -p "After GHA is finished, please enter the artifact URL (for 'elementx-app-gplay-bundle-unsigned'): " artifactUrl printf "\n================================================================================\n" printf "Downloading the artifact...\n" @@ -235,7 +235,7 @@ python3 ./tools/github/download_github_artifacts.py \ printf "\n================================================================================\n" printf "Unzipping the artifact...\n" -unzip ${targetPath}/elementx-app-bundle-unsigned.zip -d ${targetPath} +unzip ${targetPath}/elementx-app-gplay-bundle-unsigned.zip -d ${targetPath} unsignedBundlePath="${targetPath}/app-release.aab" signedBundlePath="${targetPath}/app-release-signed.aab" From 31fe516a49901642b04348f30b482bd444053e8e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 11 Jan 2024 21:25:14 +0100 Subject: [PATCH 03/10] Ensure that FDroid build will not include Firebase push provider. `allLibrariesImpl()` is also used by the midule uitest, and in this case `gplayImplementation` cannot be found. Since the push provider modules do not contain any ui, it's fine to move the dependency declaration to the app module. --- app/build.gradle.kts | 5 +++++ plugins/src/main/kotlin/extension/DependencyHandleScope.kt | 4 ---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c5918bfef7..e7fd35b08f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -237,6 +237,11 @@ dependencies { implementation(projects.appconfig) anvil(projects.anvilcodegen) + // Comment to not include firebase in the project + "gplayImplementation"(projects.libraries.pushproviders.firebase) + // Comment to not include unified push in the project + implementation(projects.libraries.pushproviders.unifiedpush) + implementation(libs.appyx.core) implementation(libs.androidx.splash) implementation(libs.androidx.core) diff --git a/plugins/src/main/kotlin/extension/DependencyHandleScope.kt b/plugins/src/main/kotlin/extension/DependencyHandleScope.kt index 625d2cf7dc..caa928c51d 100644 --- a/plugins/src/main/kotlin/extension/DependencyHandleScope.kt +++ b/plugins/src/main/kotlin/extension/DependencyHandleScope.kt @@ -87,10 +87,6 @@ fun DependencyHandlerScope.allLibrariesImpl() { implementation(project(":libraries:permissions:impl")) implementation(project(":libraries:push:impl")) implementation(project(":libraries:push:impl")) - // Comment to not include firebase in the project - implementation(project(":libraries:pushproviders:firebase")) - // Comment to not include unified push in the project - implementation(project(":libraries:pushproviders:unifiedpush")) implementation(project(":libraries:featureflag:impl")) implementation(project(":libraries:pushstore:impl")) implementation(project(":libraries:preferences:impl")) From 4286be7cfb4ce8f6c55b28de9ecfc97ad3ab9166 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 11 Jan 2024 21:33:08 +0100 Subject: [PATCH 04/10] Add fdroid of gplay to the rageshake data as a label. --- .../features/rageshake/impl/reporter/DefaultBugReporter.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt index 2fc834086a..2123717f8e 100755 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt @@ -199,6 +199,7 @@ class DefaultBugReporter @Inject constructor( // add some github labels builder.addFormDataPart("label", buildMeta.versionName) + builder.addFormDataPart("label", buildMeta.flavorDescription) if (crashCallStack.isNotEmpty() && withCrashLogs) { builder.addFormDataPart("label", "crash") } From a455a03a0f0a6b909bc69d2895c081446d49b1e8 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 11 Jan 2024 21:38:11 +0100 Subject: [PATCH 05/10] Also export fdroid build as artifact. --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c93d1a2ab0..e25784de00 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -55,6 +55,7 @@ jobs: name: elementx-debug path: | app/build/outputs/apk/gplay/debug/*.apk + app/build/outputs/apk/fdroid/debug/*.apk - uses: rnkdsh/action-upload-diawi@v1.5.4 id: diawi # Do not fail the whole build if Diawi upload fails From df9f6a980928a0cd527d9292fe64830f1b7fb879 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 11 Jan 2024 21:38:48 +0100 Subject: [PATCH 06/10] Cleanup --- app/build.gradle.kts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e7fd35b08f..35de2038c0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -150,7 +150,6 @@ android { isDefault = true buildConfigField("String", "SHORT_FLAVOR_DESCRIPTION", "\"G\"") buildConfigField("String", "FLAVOR_DESCRIPTION", "\"GooglePlay\"") - } create("fdroid") { dimension = "store" From 55db8fb200a6012fd0e5e9478aaa2a342913e610 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 11 Jan 2024 22:03:34 +0100 Subject: [PATCH 07/10] Only call setupKover() for the app, not for minimal. minimal does not have the gplay variant. --- app/build.gradle.kts | 5 +++++ .../kotlin/io.element.android-compose-application.gradle.kts | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 35de2038c0..e977af4c86 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -20,6 +20,8 @@ import com.android.build.api.variant.FilterConfiguration.FilterType.ABI import extension.allFeaturesImpl import extension.allLibrariesImpl import extension.allServicesImpl +import extension.koverDependencies +import extension.setupKover import org.jetbrains.kotlin.cli.common.toBooleanLenient plugins { @@ -36,6 +38,8 @@ plugins { // id("com.google.gms.google-services") } +setupKover() + android { namespace = "io.element.android.x" @@ -270,4 +274,5 @@ dependencies { testImplementation(projects.libraries.matrix.test) ksp(libs.showkase.processor) + koverDependencies() } diff --git a/plugins/src/main/kotlin/io.element.android-compose-application.gradle.kts b/plugins/src/main/kotlin/io.element.android-compose-application.gradle.kts index 015f0d4db8..2ac8fb8b72 100644 --- a/plugins/src/main/kotlin/io.element.android-compose-application.gradle.kts +++ b/plugins/src/main/kotlin/io.element.android-compose-application.gradle.kts @@ -17,12 +17,10 @@ /** * This will generate the plugin "io.element.android-compose-application" to use by app and samples modules */ -import extension.koverDependencies import extension.androidConfig import extension.commonDependencies import extension.composeConfig import extension.composeDependencies -import extension.setupKover import org.gradle.accessors.dm.LibrariesForLibs val libs = the() @@ -32,8 +30,6 @@ plugins { id("com.autonomousapps.dependency-analysis") } -setupKover() - android { androidConfig(project) composeConfig(libs) @@ -46,5 +42,4 @@ dependencies { commonDependencies(libs) composeDependencies(libs) coreLibraryDesugaring(libs.android.desugar) - koverDependencies() } From e0d4ece5b7d35e9ea6b66912b56f0266de755b16 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 11 Jan 2024 22:19:43 +0100 Subject: [PATCH 08/10] Fix gradle task ambiguity. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e25784de00..dd138f8e67 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -83,7 +83,7 @@ jobs: run: ./gradlew compileReleaseSources -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES - name: Compile nightly sources if: ${{ matrix.variant == 'nightly' }} - run: ./gradlew compileNightlySources -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES + run: ./gradlew compileGplayNightlySources -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES - name: Compile samples minimal if: ${{ matrix.variant == 'samples' }} run: ./gradlew :samples:minimal:assemble $CI_GRADLE_ARG_PROPERTIES From 1ab10a9e64eb4eaee5849d1cc004296f7cb55c83 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 12 Jan 2024 09:16:50 +0100 Subject: [PATCH 09/10] var -> val --- .../rageshake/impl/reporter/DefaultBugReporterTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterTest.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterTest.kt index 44e085c569..da25571266 100755 --- a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterTest.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterTest.kt @@ -48,7 +48,7 @@ class DefaultBugReporterTest { val sut = createDefaultBugReporter(server) var onUploadCancelledCalled = false var onUploadFailedCalled = false - var progressValues = mutableListOf() + val progressValues = mutableListOf() var onUploadSucceedCalled = false sut.sendBugReport( withDevicesLogs = true, @@ -97,7 +97,7 @@ class DefaultBugReporterTest { var onUploadCancelledCalled = false var onUploadFailedCalled = false var onUploadFailedReason: String? = null - var progressValues = mutableListOf() + val progressValues = mutableListOf() var onUploadSucceedCalled = false sut.sendBugReport( withDevicesLogs = true, From 592bdb0a575a59d31a1402215d99cba40b2bae2f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 12 Jan 2024 09:18:50 +0100 Subject: [PATCH 10/10] Fix test. The change is due to the new label send to the server. --- .../rageshake/impl/reporter/DefaultBugReporterTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterTest.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterTest.kt index da25571266..c5317e5e48 100755 --- a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterTest.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterTest.kt @@ -80,7 +80,7 @@ class DefaultBugReporterTest { server.shutdown() assertThat(onUploadCancelledCalled).isFalse() assertThat(onUploadFailedCalled).isFalse() - assertThat(progressValues.size).isEqualTo(10) + assertThat(progressValues.size).isEqualTo(11) assertThat(onUploadSucceedCalled).isTrue() } @@ -131,7 +131,7 @@ class DefaultBugReporterTest { assertThat(onUploadCancelledCalled).isFalse() assertThat(onUploadFailedCalled).isTrue() assertThat(onUploadFailedReason).isEqualTo("An error body") - assertThat(progressValues.size).isEqualTo(10) + assertThat(progressValues.size).isEqualTo(11) assertThat(onUploadSucceedCalled).isFalse() }