Skip to content

Instantly share code, notes, and snippets.

@shadmanadman
Last active August 13, 2025 17:35
Show Gist options
  • Select an option

  • Save shadmanadman/5dcec441611d3d1868c2b25249388f30 to your computer and use it in GitHub Desktop.

Select an option

Save shadmanadman/5dcec441611d3d1868c2b25249388f30 to your computer and use it in GitHub Desktop.
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