Last active
August 13, 2025 17:35
-
-
Save shadmanadman/5dcec441611d3d1868c2b25249388f30 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| data class AnalyticsEvent( | |
| val name: String, | |
| val params: Map<String, Any?> = emptyMap() | |
| ) | |
| // Common abstraction | |
| interface AnalyticsService { | |
| fun logEvent(event: AnalyticsEvent) | |
| } | |
| // Multibinding set | |
| object AnalyticsRegistry { | |
| private val services = mutableSetOf<AnalyticsService>() | |
| fun register(service: AnalyticsService) { | |
| services += service | |
| } | |
| fun unregister(service: AnalyticsService) { | |
| services -= service | |
| } | |
| fun logEvent(event: AnalyticsEvent) { | |
| services.forEach { it.logEvent(event) } | |
| } | |
| } | |
| // Android | |
| class FirebaseAnalyticsService( | |
| private val firebaseAnalytics: FirebaseAnalytics | |
| ) : AnalyticsService { | |
| override fun logEvent(event: AnalyticsEvent) { | |
| firebaseAnalytics.logEvent(event.name) { | |
| event.params.forEach { (key, value) -> | |
| when (value) { | |
| is String -> param(key, value) | |
| is Int -> param(key, value.toLong()) | |
| is Long -> param(key, value) | |
| is Double -> param(key, value) | |
| } | |
| } | |
| } | |
| } | |
| } | |
| class AmplitudeAnalyticsService( | |
| private val amplitude: com.amplitude.api.Amplitude | |
| ) : AnalyticsService { | |
| override fun logEvent(event: AnalyticsEvent) { | |
| amplitude.logEvent(event.name, JSONObject(event.params)) | |
| } | |
| } | |
| // ios | |
| class IOSFirebaseAnalyticsService : AnalyticsService { | |
| override fun logEvent(event: AnalyticsEvent) { | |
| FIRAnalytics.logEventWithName( | |
| name = event.name, | |
| parameters = event.params.mapValues { (_, value) -> | |
| when (value) { | |
| is String -> value as NSString | |
| is Int -> NSNumber(value) | |
| is Long -> NSNumber(value) | |
| is Double -> NSNumber(value) | |
| else -> null | |
| } | |
| } | |
| ) | |
| } | |
| } | |
| // usage | |
| // Register services at platfrom specefic | |
| fun initAnalytics() { | |
| AnalyticsRegistry.register(FirebaseAnalyticsService(FirebaseAnalytics.getInstance(appContext))) | |
| // AnalyticsRegistry.register(AmplitudeAnalyticsService(amplitudeInstance)) | |
| } | |
| // Send event anywhere in shared code | |
| AnalyticsRegistry.logEvent( | |
| AnalyticsEvent( | |
| name = AnalyticsEvents.Auth.LOGIN_SUCCESS, | |
| params = mapOf( | |
| AnalyticsEvents.Params.METHOD to AnalyticsEvents.Methods.PHONE, | |
| AnalyticsEvents.Params.USER_ID to "12345" | |
| ) | |
| ) | |
| ) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment