Skip to content

Commit 158fcf9

Browse files
authored
Merge pull request #2 from segment-integrations/development
Development to main
2 parents c3da885 + 3be1c60 commit 158fcf9

File tree

2 files changed

+140
-25
lines changed

2 files changed

+140
-25
lines changed

lib/build.gradle.kts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ plugins {
99
val VERSION_NAME: String by project
1010

1111
android {
12-
compileSdk = 31
12+
compileSdk = 33
1313
buildToolsVersion = "31.0.0"
1414

1515
defaultConfig {
1616
multiDexEnabled = true
1717
minSdk = 21
18-
targetSdk = 31
18+
targetSdk = 33
1919

2020
testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner"
2121
consumerProguardFiles("proguard-consumer-rules.pro")
@@ -40,19 +40,19 @@ android {
4040
}
4141

4242
dependencies {
43-
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.5")
43+
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.2")
4444

45-
implementation("com.segment.analytics.kotlin:android:1.5.0")
45+
implementation("com.segment.analytics.kotlin:android:1.6.2")
4646
implementation("androidx.multidex:multidex:2.0.1")
47-
implementation("androidx.core:core-ktx:1.7.0")
47+
implementation("androidx.core:core-ktx:1.9.0")
4848

49-
implementation("androidx.lifecycle:lifecycle-process:2.4.1")
50-
implementation("androidx.lifecycle:lifecycle-common-java8:2.4.1")
49+
implementation("androidx.lifecycle:lifecycle-process:2.5.1")
50+
implementation("androidx.lifecycle:lifecycle-common-java8:2.5.1")
5151
}
5252

5353
// Partner Dependencies
5454
dependencies {
55-
// TODO add your partner deps here
55+
implementation("com.flurry.android:analytics:14.1.0")
5656
}
5757

5858
// Test Dependencies
@@ -63,7 +63,7 @@ dependencies {
6363

6464
// Add Roboelectric dependencies.
6565
testImplementation("org.robolectric:robolectric:4.7.3")
66-
testImplementation("androidx.test:core:1.4.0")
66+
testImplementation("androidx.test:core:1.5.0")
6767

6868
// Add JUnit4 legacy dependencies.
6969
testRuntimeOnly("org.junit.vintage:junit-vintage-engine:5.8.2")
@@ -77,8 +77,8 @@ dependencies {
7777

7878
// Android Test Deps
7979
dependencies {
80-
androidTestImplementation("androidx.test.ext:junit:1.1.3")
81-
androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
80+
androidTestImplementation("androidx.test.ext:junit:1.1.5")
81+
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
8282
}
8383

8484
tasks.withType<Test> {
Lines changed: 129 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,150 @@
11
package 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
310
import com.segment.analytics.kotlin.core.*
411
import com.segment.analytics.kotlin.core.platform.DestinationPlugin
512
import 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

Comments
 (0)