Skip to content

Commit e61523e

Browse files
feat: foundation lib and analytic plugin implementation (#395)
1 parent a005e85 commit e61523e

File tree

216 files changed

+917
-1786
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

216 files changed

+917
-1786
lines changed

Documentation/ConfigurationManagement.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ TOKEN_TYPE: "JWT"
4949

5050
FIREBASE:
5151
ENABLED: false
52-
ANALYTICS_SOURCE: ''
5352
CLOUD_MESSAGING_ENABLED: false
5453
PROJECT_NUMBER: ''
5554
PROJECT_ID: ''
@@ -82,7 +81,6 @@ android:
8281
- **Facebook:** Sign in and Sign up via Facebook
8382
- **Branch:** Deeplinks
8483
- **Braze:** Cloud Messaging
85-
- **SegmentIO:** Analytics
8684

8785
## Available Feature Flags
8886
- **PRE_LOGIN_EXPERIENCE_ENABLED:** Enables the pre login courses discovery experience.

app/build.gradle

Lines changed: 8 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,12 @@ def appId = config.getOrDefault("APPLICATION_ID", "org.openedx.app")
33
def themeDirectory = config.getOrDefault("THEME_DIRECTORY", "openedx")
44
def firebaseConfig = config.get('FIREBASE')
55
def firebaseEnabled = firebaseConfig?.getOrDefault('ENABLED', false)
6-
def fullstoryConfig = config.get("FULLSTORY")
7-
def fullstoryEnabled = fullstoryConfig?.getOrDefault('ENABLED', false)
86

97
apply plugin: 'com.android.application'
108
apply plugin: 'org.jetbrains.kotlin.android'
119
apply plugin: 'kotlin-parcelize'
12-
apply plugin: 'kotlin-kapt'
13-
14-
if (fullstoryEnabled) {
15-
apply plugin: 'fullstory'
16-
}
10+
apply plugin: 'com.google.devtools.ksp'
11+
apply plugin: 'org.jetbrains.kotlin.plugin.compose'
1712

1813
if (firebaseEnabled) {
1914
apply plugin: 'com.google.gms.google-services'
@@ -32,18 +27,6 @@ if (firebaseEnabled) {
3227
preBuild.dependsOn(removeGoogleServicesJson)
3328
}
3429

35-
if (fullstoryEnabled) {
36-
def fullstoryOrgId = fullstoryConfig?.get("ORG_ID")
37-
38-
fullstory {
39-
org fullstoryOrgId
40-
composeEnabled true
41-
composeSelectorVersion 4
42-
enabledVariants 'debug|release'
43-
logcatLevel 'error'
44-
}
45-
}
46-
4730
android {
4831
compileSdk 34
4932

@@ -117,9 +100,6 @@ android {
117100
compose true
118101
buildConfig true
119102
}
120-
composeOptions {
121-
kotlinCompilerExtensionVersion = "$compose_compiler_version"
122-
}
123103
bundle {
124104
language {
125105
enableSplit = false
@@ -146,29 +126,24 @@ dependencies {
146126
implementation project(path: ':discussion')
147127
implementation project(path: ':whatsnew')
148128

149-
kapt "androidx.room:room-compiler:$room_version"
129+
ksp "androidx.room:room-compiler:$room_version"
150130

151131
implementation 'androidx.core:core-splashscreen:1.0.1'
152132

153133
api platform("com.google.firebase:firebase-bom:$firebase_version")
154134
api "com.google.firebase:firebase-messaging"
155135

156-
// Segment Library
157-
implementation "com.segment.analytics.kotlin:android:1.14.2"
158-
// Segment's Firebase integration
159-
implementation 'com.segment.analytics.kotlin.destinations:firebase:1.5.2'
160136
// Braze SDK Integration
161-
implementation "com.braze:braze-segment-kotlin:1.4.2"
162137
implementation "com.braze:android-sdk-ui:30.2.0"
163138

164-
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
165-
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
166-
androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version"
167-
debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_version"
139+
// Plugins
140+
implementation("com.github.openedx:openedx-app-firebase-analytics-android:1.0.0")
141+
142+
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
143+
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
168144
testImplementation "junit:junit:$junit_version"
169145
testImplementation "io.mockk:mockk:$mockk_version"
170146
testImplementation "io.mockk:mockk-android:$mockk_version"
171-
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version"
172147
testImplementation "androidx.arch.core:core-testing:$android_arch_version"
173148
}
174149

app/proguard-rules.pro

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@
4646
-dontwarn com.google.crypto.tink.subtle.Ed25519Sign
4747
-dontwarn com.google.crypto.tink.subtle.Ed25519Verify
4848
-dontwarn com.google.crypto.tink.subtle.X25519
49-
-dontwarn com.segment.analytics.kotlin.core.platform.plugins.logger.LogFilterKind
50-
-dontwarn com.segment.analytics.kotlin.core.platform.plugins.logger.LogTargetKt
5149
-dontwarn edu.umd.cs.findbugs.annotations.NonNull
5250
-dontwarn edu.umd.cs.findbugs.annotations.Nullable
5351
-dontwarn edu.umd.cs.findbugs.annotations.SuppressFBWarnings

app/src/main/java/org/openedx/app/AnalyticsManager.kt

Lines changed: 11 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,46 @@
11
package org.openedx.app
22

3-
import android.content.Context
4-
import org.openedx.app.analytics.Analytics
5-
import org.openedx.app.analytics.FirebaseAnalytics
6-
import org.openedx.app.analytics.FullstoryAnalytics
7-
import org.openedx.app.analytics.SegmentAnalytics
83
import org.openedx.auth.presentation.AuthAnalytics
9-
import org.openedx.core.config.Config
104
import org.openedx.core.presentation.CoreAnalytics
115
import org.openedx.core.presentation.dialog.appreview.AppReviewAnalytics
126
import org.openedx.course.presentation.CourseAnalytics
137
import org.openedx.dashboard.presentation.DashboardAnalytics
148
import org.openedx.discovery.presentation.DiscoveryAnalytics
159
import org.openedx.discussion.presentation.DiscussionAnalytics
10+
import org.openedx.foundation.interfaces.Analytics
1611
import org.openedx.profile.presentation.ProfileAnalytics
1712
import org.openedx.whatsnew.presentation.WhatsNewAnalytics
1813

19-
class AnalyticsManager(
20-
context: Context,
21-
config: Config,
22-
) : AppAnalytics, AppReviewAnalytics, AuthAnalytics, CoreAnalytics, CourseAnalytics,
23-
DashboardAnalytics, DiscoveryAnalytics, DiscussionAnalytics, ProfileAnalytics,
24-
WhatsNewAnalytics {
14+
class AnalyticsManager : AppAnalytics, AppReviewAnalytics, AuthAnalytics, CoreAnalytics,
15+
CourseAnalytics, DashboardAnalytics, DiscoveryAnalytics, DiscussionAnalytics,
16+
ProfileAnalytics, WhatsNewAnalytics {
2517

26-
private val services: ArrayList<Analytics> = arrayListOf()
18+
private val analytics: MutableList<Analytics> = mutableListOf()
2719

28-
init {
29-
// Initialise all the analytics libraries here
30-
if (config.getFirebaseConfig().enabled) {
31-
addAnalyticsTracker(FirebaseAnalytics(context = context))
32-
}
33-
34-
val segmentConfig = config.getSegmentConfig()
35-
if (segmentConfig.enabled && segmentConfig.segmentWriteKey.isNotBlank()) {
36-
addAnalyticsTracker(SegmentAnalytics(context = context, config = config))
37-
}
38-
39-
if (config.getFullstoryConfig().isEnabled) {
40-
addAnalyticsTracker(FullstoryAnalytics())
41-
}
42-
}
43-
44-
private fun addAnalyticsTracker(analytic: Analytics) {
45-
services.add(analytic)
20+
fun addAnalyticsTracker(analytic: Analytics) {
21+
analytics.add(analytic)
4622
}
4723

4824
private fun logEvent(event: Event, params: Map<String, Any?> = mapOf()) {
49-
services.forEach { analytics ->
25+
analytics.forEach { analytics ->
5026
analytics.logEvent(event.eventName, params)
5127
}
5228
}
5329

5430
override fun logScreenEvent(screenName: String, params: Map<String, Any?>) {
55-
services.forEach { analytics ->
31+
analytics.forEach { analytics ->
5632
analytics.logScreenEvent(screenName, params)
5733
}
5834
}
5935

6036
override fun logEvent(event: String, params: Map<String, Any?>) {
61-
services.forEach { analytics ->
37+
analytics.forEach { analytics ->
6238
analytics.logEvent(event, params)
6339
}
6440
}
6541

6642
private fun setUserId(userId: Long) {
67-
services.forEach { analytics ->
43+
analytics.forEach { analytics ->
6844
analytics.logUserId(userId)
6945
}
7046
}

app/src/main/java/org/openedx/app/AppActivity.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@ import org.openedx.app.deeplink.DeepLink
2525
import org.openedx.auth.presentation.logistration.LogistrationFragment
2626
import org.openedx.auth.presentation.signin.SignInFragment
2727
import org.openedx.core.data.storage.CorePreferences
28-
import org.openedx.core.extension.requestApplyInsetsWhenAttached
2928
import org.openedx.core.presentation.global.InsetHolder
3029
import org.openedx.core.presentation.global.WindowSizeHolder
31-
import org.openedx.core.ui.WindowSize
32-
import org.openedx.core.ui.WindowType
3330
import org.openedx.core.utils.Logger
3431
import org.openedx.core.worker.CalendarSyncScheduler
3532
import org.openedx.course.presentation.download.DownloadDialogManager
33+
import org.openedx.foundation.extension.requestApplyInsetsWhenAttached
34+
import org.openedx.foundation.presentation.WindowSize
35+
import org.openedx.foundation.presentation.WindowType
3636
import org.openedx.profile.presentation.ProfileRouter
3737
import org.openedx.whatsnew.WhatsNewManager
3838
import org.openedx.whatsnew.presentation.whatsnew.WhatsNewFragment

app/src/main/java/org/openedx/app/AppViewModel.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ import org.openedx.app.deeplink.DeepLink
1818
import org.openedx.app.deeplink.DeepLinkRouter
1919
import org.openedx.app.system.push.RefreshFirebaseTokenWorker
2020
import org.openedx.app.system.push.SyncFirebaseTokenWorker
21-
import org.openedx.core.BaseViewModel
22-
import org.openedx.core.SingleEventLiveData
2321
import org.openedx.core.config.Config
2422
import org.openedx.core.data.model.User
2523
import org.openedx.core.data.storage.CorePreferences
@@ -28,8 +26,10 @@ import org.openedx.core.system.notifier.DownloadNotifier
2826
import org.openedx.core.system.notifier.app.AppNotifier
2927
import org.openedx.core.system.notifier.app.LogoutEvent
3028
import org.openedx.core.system.notifier.app.SignInEvent
31-
import org.openedx.core.utils.FileUtil
32-
29+
import org.openedx.core.utils.Directories
30+
import org.openedx.foundation.presentation.BaseViewModel
31+
import org.openedx.foundation.presentation.SingleEventLiveData
32+
import org.openedx.foundation.utils.FileUtil
3333

3434
@SuppressLint("StaticFieldLeak")
3535
class AppViewModel(
@@ -104,7 +104,7 @@ class AppViewModel(
104104
}
105105

106106
private fun resetAppDirectory() {
107-
fileUtil.deleteOldAppDirectory()
107+
fileUtil.deleteOldAppDirectory(Directories.VIDEOS.name)
108108
preferencesManager.canResetAppDirectory = false
109109
}
110110

app/src/main/java/org/openedx/app/MainViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ import kotlinx.coroutines.flow.asSharedFlow
1010
import kotlinx.coroutines.flow.distinctUntilChanged
1111
import kotlinx.coroutines.flow.launchIn
1212
import kotlinx.coroutines.flow.onEach
13-
import org.openedx.core.BaseViewModel
1413
import org.openedx.core.config.Config
1514
import org.openedx.core.system.notifier.DiscoveryNotifier
1615
import org.openedx.core.system.notifier.NavigationToDiscovery
1716
import org.openedx.discovery.presentation.DiscoveryNavigator
17+
import org.openedx.foundation.presentation.BaseViewModel
1818

1919
class MainViewModel(
2020
private val config: Config,

app/src/main/java/org/openedx/app/OpenEdXApp.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@ import org.openedx.app.di.appModule
1414
import org.openedx.app.di.networkingModule
1515
import org.openedx.app.di.screenModule
1616
import org.openedx.core.config.Config
17+
import org.openedx.firebase.OEXFirebaseAnalytics
1718

1819
class OpenEdXApp : Application() {
1920

2021
private val config by inject<Config>()
22+
private val pluginManager by inject<PluginManager>()
2123

2224
override fun onCreate() {
2325
super.onCreate()
@@ -58,5 +60,13 @@ class OpenEdXApp : Application() {
5860
BrazeDeeplinkHandler.setBrazeDeeplinkHandler(BranchBrazeDeeplinkHandler())
5961
}
6062
}
63+
64+
initPlugins()
65+
}
66+
67+
private fun initPlugins() {
68+
if (config.getFirebaseConfig().enabled) {
69+
pluginManager.addPlugin(OEXFirebaseAnalytics(context = this))
70+
}
6171
}
6272
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.openedx.app
2+
3+
import org.openedx.foundation.interfaces.Analytics
4+
5+
class PluginManager(
6+
private val analyticsManager: AnalyticsManager
7+
) {
8+
9+
fun addPlugin(analytics: Analytics) {
10+
analyticsManager.addAnalyticsTracker(analytics)
11+
}
12+
}

app/src/main/java/org/openedx/app/analytics/Analytics.kt

Lines changed: 0 additions & 7 deletions
This file was deleted.

0 commit comments

Comments
 (0)