11package com.segment.analytics.kotlin.destinations.flurry
22
3+ import android.app.Activity
4+ import android.content.Context
5+ import android.util.Log
6+ import com.flurry.android.Constants
7+ import com.flurry.android.FlurryAgent
8+ import com.flurry.android.FlurryAgentListener
9+ import com.segment.analytics.kotlin.android.plugins.AndroidLifecycle
310import com.segment.analytics.kotlin.core.*
411import com.segment.analytics.kotlin.core.platform.DestinationPlugin
512import com.segment.analytics.kotlin.core.platform.Plugin
13+ import com.segment.analytics.kotlin.core.platform.plugins.logger.log
14+ import com.segment.analytics.kotlin.core.utilities.toContent
15+ import kotlinx.serialization.Serializable
16+ import kotlinx.serialization.json.JsonObject
617
7- class FlurryDestination : DestinationPlugin () {
8- override val key: String = " Flurry"
18+ class FlurryDestination :
19+ DestinationPlugin (), AndroidLifecycle {
20+ companion object {
21+ private const val FLURRY_FULL_KEY = " Flurry"
22+ }
23+
24+ override val key: String = FLURRY_FULL_KEY
25+ internal var flurryAgentBuilder: FlurryAgent .Builder = FlurryAgent .Builder ()
26+ internal var flurrySettings: FlurrySettings ? = null
927
1028 override fun update (settings : Settings , type : Plugin .UpdateType ) {
1129 super .update(settings, type)
12- if (type == Plugin .UpdateType .Initial ) {
30+ if (settings.hasIntegrationSettings(this )) {
31+ this .flurrySettings = settings.destinationSettings(key, FlurrySettings .serializer())
32+ if (type == Plugin .UpdateType .Initial ) {
33+ val sessionContinueMillis: Long =
34+ flurrySettings!! .sessionContinueSeconds * 1000
35+ flurryAgentBuilder
36+ .withContinueSessionMillis(sessionContinueMillis)
37+ .withCaptureUncaughtExceptions(flurrySettings!! .captureUncaughtExceptions)
38+ .withLogEnabled(true )
39+ .withLogLevel(Log .VERBOSE )
40+ .withListener(
41+ FlurryAgentListener () {
42+ fun onSessionStarted () {
43+ analytics.log(" onSessionStarted" )
44+ }
45+ })
46+ .build(analytics.configuration.application as Context , flurrySettings!! .apiKey)
47+ analytics.log(
48+ " FlurryAgent.Builder()\n " +
49+ " .withContinueSessionMillis($sessionContinueMillis )\n " +
50+ " .withCaptureUncaughtExceptions(${flurrySettings!! .captureUncaughtExceptions} )\n " +
51+ " .withLogEnabled(true)\n " +
52+ " .withLogLevel(Log.VERBOSE)\n " +
53+ " .build(application as Context, ${flurrySettings!! .apiKey} )"
54+ )
55+
56+ // It will track where app is being used. It will use cached value (to avoid excessive battery usage) when location reporting is enabled.
57+ FlurryAgent .setReportLocation(flurrySettings!! .reportLocation)
58+ analytics.log(" FlurryAgent.setReportLocation(${flurrySettings!! .reportLocation} )" )
59+
60+ // Start a session so that queued events can be delivered (even if no activities are started).
61+ FlurryAgent .onStartSession(analytics.configuration.application as Context )
62+ analytics.log(" FlurryAgent.onStartSession(application)" )
63+ }
1364 }
1465 }
1566
16- override fun alias (payload : AliasEvent ): BaseEvent ? {
17- return super .alias(payload)
67+
68+ override fun identify (payload : IdentifyEvent ): BaseEvent {
69+ FlurryAgent .setUserId(payload.userId)
70+ analytics.log(" FlurryAgent.setUserId(${payload.userId} )" )
71+
72+ val traitsMap = payload.traits.asStringMap()
73+ val age: Int = (traitsMap[" age" ] ? : " 0" ).toInt()
74+ if (age > 0 ) {
75+ FlurryAgent .setAge(age)
76+ analytics.log(" FlurryAgent.setAge($age )" )
77+ }
78+
79+ val gender: String = (traitsMap[" gender" ] ? : " " )
80+ if (gender.isNotEmpty()) {
81+ val genderConstant: Byte =
82+ if (gender.equals(" female" , true ) ||
83+ gender.equals(" f" , true )
84+ ) {
85+ Constants .FEMALE
86+ } else if (gender.equals(" male" , true ) ||
87+ gender.equals(" m" , true )
88+ ) {
89+ Constants .MALE
90+ } else {
91+ Constants .UNKNOWN
92+ }
93+ FlurryAgent .setGender(genderConstant)
94+ analytics.log(" FlurryAgent.setGender($gender )" )
95+ }
96+ return payload
1897 }
1998
20- override fun group (payload : GroupEvent ): BaseEvent ? {
21- return super .group(payload)
99+ override fun screen (payload : ScreenEvent ): BaseEvent {
100+ val properties: Map <String , String > = payload.properties.asStringMap()
101+ FlurryAgent .logEvent(payload.name, properties)
102+ analytics.log(" FlurryAgent.logEvent(${payload.name} , ${properties} )" )
103+ return payload
22104 }
23105
24- override fun identify (payload : IdentifyEvent ): BaseEvent ? {
25- return super .identify(payload)
106+ override fun track (payload : TrackEvent ): BaseEvent {
107+ val properties: Map <String , String > = payload.properties.asStringMap()
108+ FlurryAgent .logEvent(payload.event, properties)
109+ analytics.log(" FlurryAgent.logEvent(${payload.event} , ${properties} )" )
110+ return payload
26111 }
27112
28- override fun screen (payload : ScreenEvent ): BaseEvent ? {
29- return super .screen(payload)
113+ /* *
114+ * AndroidActivity Lifecycle Methods
115+ */
116+ override fun onActivityStarted (activity : Activity ? ) {
117+ super .onActivityStarted(activity)
118+ FlurryAgent .onStartSession(activity!! )
119+ analytics.log(" FlurryAgent.onStartSession(application)" )
30120 }
31121
32- override fun track (payload : TrackEvent ): BaseEvent ? {
33- return super .track(payload)
122+ override fun onActivityStopped (activity : Activity ? ) {
123+ super .onActivityStopped(activity)
124+ FlurryAgent .onEndSession(activity!! )
125+ analytics.log(" FlurryAgent.onEndSession(application)" )
34126 }
35- }
127+ }
128+
129+ /* *
130+ * Flurry Settings data class.
131+ */
132+ @Serializable
133+ data class FlurrySettings (
134+ // Flurry API Key
135+ var apiKey : String ,
136+ // Enabling this will log uncaught exceptions, default is false
137+ var captureUncaughtExceptions : Boolean = false ,
138+ // report location
139+ var reportLocation : Boolean = true ,
140+ // Enabling this will send data through screen calls as events.
141+ var screenTracksEvents : Boolean ,
142+ // Session Continue Seconds, default is 10
143+ val sessionContinueSeconds : Long = 10 ,
144+ // Enabling this will send data to Flurry securely.
145+ var useHttps : Boolean
146+ )
147+
148+ private fun JsonObject.asStringMap (): Map <String , String > = this .mapValues { (_, value) ->
149+ value.toContent().toString()
150+ }
0 commit comments