Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f9d4478 authored by Jonathan Klee's avatar Jonathan Klee
Browse files

feat(build): add anonymousLess product flavor

Introduce full and anonymousLess product flavors controlled by ANONYMOUS_MODE_ENABLED BuildConfig flag.
The anonymousLess flavor hides the anonymous login button at compile time.
parent 6cfbaaeb
Loading
Loading
Loading
Loading
Loading
+32 −7
Original line number Diff line number Diff line
@@ -8,8 +8,8 @@ variables:
  GRADLE_USER_HOME: "$CI_PROJECT_DIR/.gradle"
  GRADLE_OPTS: "-Dorg.gradle.daemon=false"
  SENTRY_DSN: $SENTRY_DSN
  APK_PATH: "app/build/outputs/apk/release"
  UNSIGNED_APK: "AppLounge_release.apk"
  APK_PATH: "app/build/outputs/apk/full/release"
  UNSIGNED_APK: "AppLounge_fullRelease.apk"
  COMMUNITY_APK: "AppLounge_release_community.apk"
  OFFICIAL_APK: "AppLounge_release_official.apk"
  TEST_APK: "AppLounge_release_test.apk"
@@ -95,10 +95,35 @@ build-release:
  <<: *build_rules
  stage: build
  script:
    - ./gradlew assembleRelease
    - ./gradlew assembleFullRelease
  artifacts:
    paths:
      - app/build/outputs/apk/release
      - app/build/outputs/apk/full/release

build-release-anonymous-less:
  stage: build
  rules:
    - when: manual
  allow_failure: true
  interruptible: false
  tags:
    - android-app
  cache:
    - key:
        prefix: "android-app-${CI_PROJECT_ID}-${CI_DEFAULT_BRANCH}"
        files:
          - gradle/wrapper/gradle-wrapper.properties
          - gradle/libs.versions.toml
      paths:
        - .gradle/wrapper/dists/
        - .gradle/caches/modules-2/
        - .gradle/caches/build-cache-1/
      policy: pull
  script:
    - ./gradlew assembleAnonymousLessRelease
  artifacts:
    paths:
      - app/build/outputs/apk/anonymousLess/release

analysis:
  stage: code-quality
@@ -116,8 +141,8 @@ tests:
  <<: *build_rules
  needs: []
  script:
    - ./gradlew testReleaseUnitTest jacocoReleaseReport -PtestAccountName="$testAccountName" -PtestAccountPwd="$testAccountPwd" -PtestServerUrl="$testServerUrl"
    - python3 scripts/print_instruction_coverage.py app/build/reports/jacoco/jacocoReleaseReport/jacocoReleaseReport.xml
    - ./gradlew testFullReleaseUnitTest jacocoFullReleaseReport -PtestAccountName="$testAccountName" -PtestAccountPwd="$testAccountPwd" -PtestServerUrl="$testServerUrl"
    - python3 scripts/print_instruction_coverage.py app/build/reports/jacoco/jacocoFullReleaseReport/jacocoFullReleaseReport.xml
  coverage: "/Total.*?([0-9]{1,3})%/"
  artifacts:
    paths:
@@ -126,7 +151,7 @@ tests:
      junit: app/build/test-results/*/TEST-*.xml
      coverage_report:
        coverage_format: jacoco
        path: app/build/reports/jacoco/jacocoReleaseReport/jacocoReleaseReport.xml
        path: app/build/reports/jacoco/jacocoFullReleaseReport/jacocoFullReleaseReport.xml

generate-apks:
  stage: build
+26 −10
Original line number Diff line number Diff line
@@ -89,15 +89,16 @@ def isAndroidProject = { Project module ->
    return module.plugins.hasPlugin('com.android.application') || module.plugins.hasPlugin('com.android.library')
}

def collectJacocoTestTaskNames = { Project module, String unitTestTaskName ->
def collectJacocoTestTaskNames = { Project module, String appTestTaskName, String libraryTestTaskName ->
    if (isAndroidProject(module)) {
        return [unitTestTaskName]
        return module.plugins.hasPlugin('com.android.application') ? [appTestTaskName] : [libraryTestTaskName]
    }

    return ['test']
}

def collectJacocoClassDirectories = { Project module, String variantName ->
def collectJacocoClassDirectories = { Project module, String appVariantName, String libraryVariantName ->
    def variantName = module.plugins.hasPlugin('com.android.application') ? appVariantName : libraryVariantName
    def variantCap = variantName.capitalize()
    def classDirectories = [
            module.fileTree(module.layout.buildDirectory.dir("intermediates/javac/${variantName}/classes").get().asFile) {
@@ -135,8 +136,8 @@ def collectJacocoSourceDirectories = { Project module ->
    ]
}

def collectJacocoExecutionData = { Project module, String unitTestTaskName ->
    return collectJacocoTestTaskNames(module, unitTestTaskName).collect { testTaskName ->
def collectJacocoExecutionData = { Project module, String appTestTaskName, String libraryTestTaskName ->
    return collectJacocoTestTaskNames(module, appTestTaskName, libraryTestTaskName).collect { testTaskName ->
        module.fileTree(dir: module.layout.buildDirectory.get().asFile, includes: [
                "jacoco/${testTaskName}.exec",
                "outputs/unit_test_code_coverage/**/${testTaskName}.exec",
@@ -202,6 +203,19 @@ android {
        }
    }

    flavorDimensions "variant"

    productFlavors {
        full {
            dimension "variant"
            buildConfigField "boolean", "ANONYMOUS_MODE_ENABLED", "true"
        }
        anonymousLess {
            dimension "variant"
            buildConfigField "boolean", "ANONYMOUS_MODE_ENABLED", "false"
        }
    }

    buildTypes {
        debug {
            signingConfig = signingConfigs.platformConfig
@@ -234,16 +248,18 @@ android {
androidComponents {
    onVariants(selector().all()) { variant ->
        variant.outputs.each { output ->
            output.outputFileName.set("AppLounge_${variant.buildType}.apk")
            output.outputFileName.set("AppLounge_${variant.name}.apk")
        }

        def variantCap = variant.name.capitalize()
        def unitTestTaskName = "test${variantCap}UnitTest"
        def buildTypeCap = variant.buildType.capitalize()
        def appTestTaskName = "test${variantCap}UnitTest"
        def libraryTestTaskName = "test${buildTypeCap}UnitTest"
        def reportTaskName = "jacoco${variantCap}Report"

        tasks.register(reportTaskName, JacocoReport) {
            dependsOn(jacocoCoverageProjects.collectMany { module ->
                collectJacocoTestTaskNames(module, unitTestTaskName).collect { testTaskName ->
                collectJacocoTestTaskNames(module, appTestTaskName, libraryTestTaskName).collect { testTaskName ->
                    "${module.path}:${testTaskName}"
                }
            })
@@ -259,7 +275,7 @@ androidComponents {

            classDirectories.from = files(
                jacocoCoverageProjects.collectMany { module ->
                    collectJacocoClassDirectories(module, variant.name)
                    collectJacocoClassDirectories(module, variant.name, variant.buildType)
                }
            )

@@ -271,7 +287,7 @@ androidComponents {

            executionData.from = files(
                jacocoCoverageProjects.collect { module ->
                    collectJacocoExecutionData(module, unitTestTaskName)
                    collectJacocoExecutionData(module, appTestTaskName, libraryTestTaskName)
                }
            )
        }
+28 −25
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import foundation.e.apps.BuildConfig
import foundation.e.apps.R
import foundation.e.apps.feature.auth.login.LoginSelectionTestTags

@@ -197,6 +198,7 @@ private fun LoginSelectionButtons(
        ) {
            Text(text = stringResource(R.string.sign_in_google))
        }
        if (BuildConfig.ANONYMOUS_MODE_ENABLED) {
            Spacer(modifier = Modifier.height(ButtonVerticalSpacing))
            OutlinedButton(
                onClick = onAnonymousClick,
@@ -225,6 +227,7 @@ private fun LoginSelectionButtons(
                }
            }
            Spacer(modifier = Modifier.height(ButtonVerticalSpacing))
        }
        Text(
            text = stringResource(R.string.or),
            style = MaterialTheme.typography.bodyMedium,