From dc67ef4d6f44f6ae72bfe0964d3106cd23dc1143 Mon Sep 17 00:00:00 2001 From: Volodymyr Chekyrta Date: Mon, 12 Feb 2024 19:11:22 +0200 Subject: [PATCH 1/5] feat: Firebase config --- app/build.gradle | 27 ++++++----- .../main/java/org/openedx/app/OpenEdXApp.kt | 11 +---- .../org/edx/builder/ConfigHelper.groovy | 45 +++++++++++++++++++ .../org/openedx/core/config/FirebaseConfig.kt | 6 +-- default_config/dev/config.yaml | 7 +++ default_config/prod/config.yaml | 7 +++ default_config/stage/config.yaml | 7 +++ 7 files changed, 88 insertions(+), 22 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a0f268eb6..d8aa5db2b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,14 +1,19 @@ -plugins { - id 'com.android.application' - id 'org.jetbrains.kotlin.android' - id 'kotlin-parcelize' - id 'kotlin-kapt' - id 'com.google.firebase.crashlytics' -} - def config = configHelper.fetchConfig() def appId = config.getOrDefault("APPLICATION_ID", "org.openedx.app") def platformName = config.getOrDefault("PLATFORM_NAME", "OpenEdx").toLowerCase() +def firebaseConfig = config.get('FIREBASE') +def firebaseEnabled = firebaseConfig?.getOrDefault('ENABLED', false) + +apply plugin: 'com.android.application' +apply plugin: 'org.jetbrains.kotlin.android' +apply plugin: 'kotlin-parcelize' +apply plugin: 'kotlin-kapt' +if (firebaseEnabled) { + apply plugin: 'com.google.gms.google-services' + apply plugin: 'com.google.firebase.crashlytics' + + configHelper.generateGoogleServicesJson(appId) +} android { compileSdk 34 @@ -57,8 +62,10 @@ android { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - firebaseCrashlytics { - mappingFileUploadEnabled false + if (firebaseEnabled) { + firebaseCrashlytics { + mappingFileUploadEnabled false + } } } } diff --git a/app/src/main/java/org/openedx/app/OpenEdXApp.kt b/app/src/main/java/org/openedx/app/OpenEdXApp.kt index 9f1f95977..865290940 100644 --- a/app/src/main/java/org/openedx/app/OpenEdXApp.kt +++ b/app/src/main/java/org/openedx/app/OpenEdXApp.kt @@ -26,15 +26,8 @@ class OpenEdXApp : Application() { screenModule ) } - val firebaseConfig = config.getFirebaseConfig() - if (firebaseConfig.enabled) { - val options = FirebaseOptions.Builder() - .setProjectId(firebaseConfig.projectId) - .setApplicationId(firebaseConfig.applicationId) - .setApiKey(firebaseConfig.apiKey) - .setGcmSenderId(firebaseConfig.gcmSenderId) - .build() - Firebase.initialize(this, options) + if (config.getFirebaseConfig().enabled) { + Firebase.initialize(this) } } diff --git a/buildSrc/src/main/groovy/org/edx/builder/ConfigHelper.groovy b/buildSrc/src/main/groovy/org/edx/builder/ConfigHelper.groovy index ed78319bc..32f1fb678 100644 --- a/buildSrc/src/main/groovy/org/edx/builder/ConfigHelper.groovy +++ b/buildSrc/src/main/groovy/org/edx/builder/ConfigHelper.groovy @@ -95,4 +95,49 @@ class ConfigHelper { it.write(new JsonBuilder(configJson).toPrettyString()) } } + + def generateGoogleServicesJson(applicationId) { + def config = fetchConfig() + def firebase = config.get("FIREBASE") + if (!firebase) { + return + } + if (!firebase.getOrDefault("ENABLED", false)) { + return + } + + def googleServicesJsonPath = projectDir.path + "/app/" + new File(googleServicesJsonPath).mkdirs() + + def projectInfo = [ + project_number: firebase.getOrDefault("PROJECT_NUMBER", ""), + project_id : firebase.getOrDefault("PROJECT_ID", ""), + storage_bucket: "${firebase.getOrDefault("PROJECT_ID", "")}.appspot.com" + ] + def clientInfo = [ + mobilesdk_app_id : firebase.getOrDefault("APPLICATION_ID", ""), + android_client_info: [ + package_name: applicationId + ] + ] + def client = [ + client_info : clientInfo, + oauth_client: [], + api_key : [[current_key: firebase.getOrDefault("API_KEY", "")]], + services : [ + appinvite_service: [ + other_platform_oauth_client: [] + ] + ] + ] + def configJson = [ + project_info : projectInfo, + client : [client], + configuration_version: "1" + ] + + new FileWriter(googleServicesJsonPath + "/google-services.json").withWriter { + it.write(new JsonBuilder(configJson).toPrettyString()) + } + } } diff --git a/core/src/main/java/org/openedx/core/config/FirebaseConfig.kt b/core/src/main/java/org/openedx/core/config/FirebaseConfig.kt index b003c3230..db8010d70 100644 --- a/core/src/main/java/org/openedx/core/config/FirebaseConfig.kt +++ b/core/src/main/java/org/openedx/core/config/FirebaseConfig.kt @@ -6,6 +6,9 @@ data class FirebaseConfig( @SerializedName("ENABLED") val enabled: Boolean = false, + @SerializedName("PROJECT_NUMBER") + val gcmSenderId: String = "", + @SerializedName("PROJECT_ID") val projectId: String = "", @@ -14,7 +17,4 @@ data class FirebaseConfig( @SerializedName("API_KEY") val apiKey: String = "", - - @SerializedName("GCM_SENDER_ID") - val gcmSenderId: String = "", ) diff --git a/default_config/dev/config.yaml b/default_config/dev/config.yaml index f074ddd9d..4b9ae4b61 100644 --- a/default_config/dev/config.yaml +++ b/default_config/dev/config.yaml @@ -28,6 +28,13 @@ PROGRAM: PROGRAM_URL: '' PROGRAM_DETAIL_URL_TEMPLATE: '' +FIREBASE: + ENABLED: false + PROJECT_NUMBER: '' + PROJECT_ID: '' + APPLICATION_ID: '' + API_KEY: '' + GOOGLE: ENABLED: false CLIENT_ID: '' diff --git a/default_config/prod/config.yaml b/default_config/prod/config.yaml index 25df957a0..4647d16a8 100644 --- a/default_config/prod/config.yaml +++ b/default_config/prod/config.yaml @@ -28,6 +28,13 @@ PROGRAM: PROGRAM_URL: '' PROGRAM_DETAIL_URL_TEMPLATE: '' +FIREBASE: + ENABLED: false + PROJECT_NUMBER: '' + PROJECT_ID: '' + APPLICATION_ID: '' + API_KEY: '' + GOOGLE: ENABLED: false CLIENT_ID: '' diff --git a/default_config/stage/config.yaml b/default_config/stage/config.yaml index 25df957a0..4647d16a8 100644 --- a/default_config/stage/config.yaml +++ b/default_config/stage/config.yaml @@ -28,6 +28,13 @@ PROGRAM: PROGRAM_URL: '' PROGRAM_DETAIL_URL_TEMPLATE: '' +FIREBASE: + ENABLED: false + PROJECT_NUMBER: '' + PROJECT_ID: '' + APPLICATION_ID: '' + API_KEY: '' + GOOGLE: ENABLED: false CLIENT_ID: '' From 5f13afd42215e5031134a27e301f03f084b0b362 Mon Sep 17 00:00:00 2001 From: Volodymyr Chekyrta Date: Tue, 13 Feb 2024 11:43:46 +0200 Subject: [PATCH 2/5] feat: Firebase config Added preBuild generateGoogleServicesJson task to ensure that the file is generated after a build variant is changed --- app/build.gradle | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index d8aa5db2b..1a3560f7f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,7 +12,11 @@ if (firebaseEnabled) { apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.firebase.crashlytics' - configHelper.generateGoogleServicesJson(appId) + tasks.register('generateGoogleServicesJson') { + configHelper.generateGoogleServicesJson(appId) + } + + preBuild.dependsOn(generateGoogleServicesJson) } android { From 46a5a583d2ebe954691c32864f191c9c8fef1614 Mon Sep 17 00:00:00 2001 From: Volodymyr Chekyrta Date: Wed, 21 Feb 2024 13:57:03 +0200 Subject: [PATCH 3/5] refactor: Feedback addressed --- app/.gitignore | 3 ++- app/build.gradle | 6 ++++++ app/src/main/java/org/openedx/app/AnalyticsManager.kt | 2 +- .../src/main/groovy/org/edx/builder/ConfigHelper.groovy | 8 ++++++++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/.gitignore b/app/.gitignore index 42afabfd2..2abde4aab 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ -/build \ No newline at end of file +/build +/google-services.json diff --git a/app/build.gradle b/app/build.gradle index 726ff3377..645059efb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,6 +17,12 @@ if (firebaseEnabled) { } preBuild.dependsOn(generateGoogleServicesJson) +} else { + tasks.register('removeGoogleServicesJson') { + configHelper.removeGoogleServicesJson() + } + + preBuild.dependsOn(removeGoogleServicesJson) } android { diff --git a/app/src/main/java/org/openedx/app/AnalyticsManager.kt b/app/src/main/java/org/openedx/app/AnalyticsManager.kt index d2604ca1d..e474416dd 100644 --- a/app/src/main/java/org/openedx/app/AnalyticsManager.kt +++ b/app/src/main/java/org/openedx/app/AnalyticsManager.kt @@ -22,7 +22,7 @@ class AnalyticsManager( init { // Initialise all the analytics libraries here - if (config.getFirebaseConfig().projectId.isNotBlank()) { + if (config.getFirebaseConfig().enabled) { addAnalyticsTracker(FirebaseAnalytics(context = context)) } val segmentConfig = config.getSegmentConfig() diff --git a/buildSrc/src/main/groovy/org/edx/builder/ConfigHelper.groovy b/buildSrc/src/main/groovy/org/edx/builder/ConfigHelper.groovy index 32f1fb678..10ca3e8db 100644 --- a/buildSrc/src/main/groovy/org/edx/builder/ConfigHelper.groovy +++ b/buildSrc/src/main/groovy/org/edx/builder/ConfigHelper.groovy @@ -140,4 +140,12 @@ class ConfigHelper { it.write(new JsonBuilder(configJson).toPrettyString()) } } + + def removeGoogleServicesJson() { + def googleServicesJsonPath = projectDir.path + "/app/google-services.json" + def file = new File(googleServicesJsonPath) + if (file.exists()) { + file.delete() + } + } } From 83af60f88bc126a651bddc5f15632d2c068eda76 Mon Sep 17 00:00:00 2001 From: Volodymyr Chekyrta Date: Wed, 21 Feb 2024 14:25:24 +0200 Subject: [PATCH 4/5] refactor: Removed unused fields --- default_config/dev/config.yaml | 1 - default_config/prod/config.yaml | 1 - default_config/stage/config.yaml | 1 - 3 files changed, 3 deletions(-) diff --git a/default_config/dev/config.yaml b/default_config/dev/config.yaml index 8c940ef66..ae255c430 100644 --- a/default_config/dev/config.yaml +++ b/default_config/dev/config.yaml @@ -36,7 +36,6 @@ FIREBASE: PROJECT_ID: '' APPLICATION_ID: '' API_KEY: '' - GCM_SENDER_ID: '' SEGMENT_IO: ENABLED: false diff --git a/default_config/prod/config.yaml b/default_config/prod/config.yaml index cdaa040a0..804e4a45f 100644 --- a/default_config/prod/config.yaml +++ b/default_config/prod/config.yaml @@ -36,7 +36,6 @@ FIREBASE: PROJECT_ID: '' APPLICATION_ID: '' API_KEY: '' - GCM_SENDER_ID: '' SEGMENT_IO: ENABLED: false diff --git a/default_config/stage/config.yaml b/default_config/stage/config.yaml index cdaa040a0..804e4a45f 100644 --- a/default_config/stage/config.yaml +++ b/default_config/stage/config.yaml @@ -36,7 +36,6 @@ FIREBASE: PROJECT_ID: '' APPLICATION_ID: '' API_KEY: '' - GCM_SENDER_ID: '' SEGMENT_IO: ENABLED: false From b09a621952a1b1815175c8444def545fe22e3d3a Mon Sep 17 00:00:00 2001 From: Volodymyr Chekyrta Date: Fri, 23 Feb 2024 11:08:22 +0200 Subject: [PATCH 5/5] refactor: Added comments to Firebase configuration --- default_config/dev/config.yaml | 2 +- default_config/prod/config.yaml | 2 +- default_config/stage/config.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/default_config/dev/config.yaml b/default_config/dev/config.yaml index ae255c430..09c746827 100644 --- a/default_config/dev/config.yaml +++ b/default_config/dev/config.yaml @@ -34,7 +34,7 @@ FIREBASE: CLOUD_MESSAGING_ENABLED: false PROJECT_NUMBER: '' PROJECT_ID: '' - APPLICATION_ID: '' + APPLICATION_ID: '' #App ID field from the Firebase console or mobilesdk_app_id from the google-services.json file. API_KEY: '' SEGMENT_IO: diff --git a/default_config/prod/config.yaml b/default_config/prod/config.yaml index 804e4a45f..3cc0b6592 100644 --- a/default_config/prod/config.yaml +++ b/default_config/prod/config.yaml @@ -34,7 +34,7 @@ FIREBASE: CLOUD_MESSAGING_ENABLED: false PROJECT_NUMBER: '' PROJECT_ID: '' - APPLICATION_ID: '' + APPLICATION_ID: '' #App ID field from the Firebase console or mobilesdk_app_id from the google-services.json file. API_KEY: '' SEGMENT_IO: diff --git a/default_config/stage/config.yaml b/default_config/stage/config.yaml index 804e4a45f..3cc0b6592 100644 --- a/default_config/stage/config.yaml +++ b/default_config/stage/config.yaml @@ -34,7 +34,7 @@ FIREBASE: CLOUD_MESSAGING_ENABLED: false PROJECT_NUMBER: '' PROJECT_ID: '' - APPLICATION_ID: '' + APPLICATION_ID: '' #App ID field from the Firebase console or mobilesdk_app_id from the google-services.json file. API_KEY: '' SEGMENT_IO: