初めに
今回は、FirebaseTrackingEvent
の汎用的な実装方法を紹介していこうと思います。
本文
まずは、どの画面からでも呼び出せるようにFirebaseTrackingEvent
のinterface
を作っていきます。
interface TrackingService {
fun track(
trackingEvent: TrackingEvent,
)
}
次に、interface
の本実装をしていきます。
class TrackingServiceImpl @Inject constructor(
private val firebaseAnalytics: FirebaseAnalytics
) : TrackingService {
override fun track(trackingEvent: TrackingEvent) {
firebaseAnalytics.logEvent(
trackingEvent.key,
trackingEvent.parameters.toBundle(),
)
}
}
// TrackingEventのパラメータをBundleに詰め替える拡張関数
fun Map<String, Any>.toBundle(): Bundle = Bundle().apply {
this@toBundle.forEach { (key, value) ->
when (value) {
is String -> this.putString(key, value)
is Int -> this.putInt(key, value)
is Long -> this.putLong(key, value)
is Boolean -> this.putBoolean(key, value)
else -> throw IllegalArgumentException()
}
}
}
次にinterface
の本実装側で出てきたTrackingEvent
というデータクラスを実装します。
これはtracking時にデータを格納する際に利用するデータクラスです
abstract class TrackingEvent(
val key: String,
val parameters: Map<String, Any> = emptyMap(),
)
最後に先述のコードを使った凡例を書いて終わりにしようと思います
class SomthingFragmentButtonTapEvent(example: Example) : TrackingEvent(
key = "somthing_fragment_button_tap",
parameters = mapOf("example" to example)
)
最後に
触る機会が少なく、アプリを初めから作ってないとわからない部分だったりするので何かのお役に立てれば幸いです。
備忘録としての役割が強いので、わかりづらかったら申し訳ないです