Skip to content

Commit e3bf5ce

Browse files
committed
Updating the testapp.
1 parent 020abc8 commit e3bf5ce

File tree

7 files changed

+222
-2
lines changed

7 files changed

+222
-2
lines changed

testapp/build.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ android {
3737
dependencies {
3838
implementation(project(mapOf("path" to ":lib")))
3939

40+
implementation("com.segment.analytics.kotlin.destinations:consent:1.0.0-SNAPSHOT")
41+
implementation("com.segment.analytics.kotlin:android:1.13.1")
42+
implementation("com.onetrust.cmp:native-sdk:202303.2.0.0")
43+
implementation("com.squareup.okhttp3:okhttp:4.10.0")
44+
implementation(project(":lib"))
45+
4046
implementation("androidx.core:core-ktx:1.10.1")
4147
implementation("androidx.appcompat:appcompat:1.6.1")
4248
implementation("com.google.android.material:material:1.6.0")

testapp/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
android:allowBackup="true"
77
android:icon="@mipmap/ic_launcher"
88
android:label="@string/app_name"
9+
android:name=".MainApplication"
910
android:roundIcon="@mipmap/ic_launcher_round"
1011
android:supportsRtl="true"
1112
android:theme="@style/Theme.Analyticskotlindestinationtemplate">

testapp/src/main/java/com/segment/analytics/destinations/mydestination/testapp/MainActivity.kt

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,59 @@ package com.segment.analytics.destinations.mydestination.testapp
22

33
import androidx.appcompat.app.AppCompatActivity
44
import android.os.Bundle
5+
import android.util.Log
6+
import android.widget.Button
7+
import com.google.android.material.snackbar.Snackbar
8+
import com.onetrust.otpublishers.headless.Public.OTCallback
9+
import com.onetrust.otpublishers.headless.Public.Response.OTResponse
10+
import java.text.SimpleDateFormat
11+
import java.util.*
512

613
class MainActivity : AppCompatActivity() {
14+
companion object {
15+
private const val TAG = MainApplication.TAG + "/activity"
16+
}
17+
718
override fun onCreate(savedInstanceState: Bundle?) {
819
super.onCreate(savedInstanceState)
920
setContentView(R.layout.activity_main)
21+
22+
val button = findViewById<Button>(R.id.sendTrackEventButton)
23+
button.setOnClickListener {v ->
24+
val sdf = SimpleDateFormat("M/dd/yyyy hh:mm:ss.SSS")
25+
val currentDate = sdf.format(Date())
26+
MainApplication.analytics.track("Test Event ${currentDate}")
27+
28+
if (v != null) {
29+
Snackbar.make(v, "Track Event created.", Snackbar.LENGTH_LONG).show()
30+
}
31+
}
32+
33+
34+
setupOneTrust()
35+
}
36+
37+
private fun setupOneTrust() {
38+
MainApplication.otPublishersHeadlessSDK.startSDK(
39+
MainApplication.DOMAIN_URL,
40+
MainApplication.DOMAIN_ID,
41+
"en",
42+
null,
43+
false,
44+
object : OTCallback {
45+
override fun onSuccess(p0: OTResponse) {
46+
Log.d(TAG, "onSuccess: SDK Started")
47+
if (!MainApplication.haveShownOTBanner) {
48+
MainApplication.otPublishersHeadlessSDK.showBannerUI(this@MainActivity)
49+
MainApplication.haveShownOTBanner = true
50+
}
51+
}
52+
53+
override fun onFailure(p0: OTResponse) {
54+
Log.d(TAG, "onFailure: Failed to start SDK")
55+
}
56+
57+
}
58+
)
1059
}
1160
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.segment.analytics.destinations.mydestination.testapp
2+
3+
import android.app.Application
4+
import android.content.Context
5+
import android.util.Log
6+
import com.onetrust.otpublishers.headless.Public.OTPublishersHeadlessSDK
7+
import com.segment.analytics.kotlin.core.Analytics
8+
import com.segment.analytics.kotlin.android.Analytics
9+
import com.segment.analytics.kotlin.core.platform.policies.CountBasedFlushPolicy
10+
import com.segment.analytics.kotlin.core.platform.policies.FrequencyFlushPolicy
11+
import com.segment.analytics.kotlin.destinations.consent.ConsentBlockingPlugin
12+
import com.segment.analytics.kotlin.destinations.consent.ConsentManagementPlugin
13+
import com.segment.analytics.kotlin.destinations.consent.onetrust.OneTrustConsentCategoryProvider
14+
import sovran.kotlin.SynchronousStore
15+
16+
class MainApplication: Application() {
17+
18+
companion object {
19+
const val TAG = "main"
20+
var appContext: Context? = null
21+
private set
22+
lateinit var analytics: Analytics
23+
24+
var haveShownOTBanner = false
25+
lateinit var otPublishersHeadlessSDK: OTPublishersHeadlessSDK
26+
27+
// Update these:
28+
private const val SEGMENT_WRITE_KEY = "<Your Segment WRITEKEY>"
29+
const val DOMAIN_URL = "<Your OneTrust Domain URL>"
30+
const val DOMAIN_ID = "<Your OneTrust Domain ID>"
31+
const val WEBHOOK_URL = "<Your webhook.site webhook url>"
32+
}
33+
34+
35+
override fun onCreate() {
36+
super.onCreate()
37+
38+
appContext = this
39+
otPublishersHeadlessSDK = OTPublishersHeadlessSDK(this)
40+
41+
Analytics.debugLogsEnabled = true
42+
43+
analytics = Analytics(SEGMENT_WRITE_KEY, applicationContext) {
44+
this.collectDeviceId = true
45+
this.trackApplicationLifecycleEvents = true
46+
this.trackDeepLinks = true
47+
this.flushPolicies = listOf(
48+
CountBasedFlushPolicy(1), // Flush after each event
49+
FrequencyFlushPolicy(5000) // Flush after 5 Seconds
50+
)
51+
}
52+
53+
// List of categories we care about: Must be configured on the Segment
54+
// web app.
55+
val categories = listOf<String>("C0001", "C0002")
56+
val consentCategoryProvider = OneTrustConsentCategoryProvider(otPublishersHeadlessSDK, categories)
57+
val store = SynchronousStore()
58+
val consentPlugin = ConsentManagementPlugin(store, consentCategoryProvider)
59+
val consentBlockingPlugin = ConsentBlockingPlugin("Segment.io", store, true)
60+
61+
// Add the Consent Plugin directly to analytics
62+
analytics.add(consentPlugin)
63+
64+
65+
// Add the WebhookPlugin that will post to given WEBHOOK_URL
66+
val webhookDestinationPlugin = WebhookPlugin(WEBHOOK_URL)
67+
// Add the webhook destination plugin into the main timeline
68+
analytics.add(webhookDestinationPlugin)
69+
// Add the blocking plugin to this destination
70+
webhookDestinationPlugin.add(ConsentBlockingPlugin("Webhook", store))
71+
}
72+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package com.segment.analytics.destinations.mydestination.testapp
2+
3+
import android.util.Log
4+
import com.segment.analytics.kotlin.core.*
5+
import com.segment.analytics.kotlin.core.platform.DestinationPlugin
6+
import com.segment.analytics.kotlin.core.platform.Plugin
7+
import kotlinx.coroutines.CoroutineScope
8+
import kotlinx.coroutines.Dispatchers
9+
import kotlinx.coroutines.launch
10+
import kotlinx.coroutines.withContext
11+
import kotlinx.serialization.json.JsonPrimitive
12+
import kotlinx.serialization.json.buildJsonObject
13+
import okhttp3.MediaType.Companion.toMediaType
14+
import okhttp3.OkHttpClient
15+
import okhttp3.Request
16+
import okhttp3.RequestBody.Companion.toRequestBody
17+
18+
class WebhookPlugin(
19+
private val webhookUrl: String
20+
) : DestinationPlugin() {
21+
override val key: String = "Webhook"
22+
override lateinit var analytics: Analytics
23+
val JSON = "application/json; charset=utf-8".toMediaType()
24+
val okHttpClient = OkHttpClient()
25+
private val TAG = MainApplication.TAG + "/WebhookDestination"
26+
27+
28+
override fun track(payload: TrackEvent): BaseEvent? {
29+
uploadPayload(payload)
30+
return payload
31+
}
32+
33+
override fun identify(payload: IdentifyEvent): BaseEvent? {
34+
uploadPayload(payload)
35+
return payload
36+
}
37+
38+
override fun screen(payload: ScreenEvent): BaseEvent? {
39+
uploadPayload(payload)
40+
return payload
41+
}
42+
43+
override fun group(payload: GroupEvent): BaseEvent? {
44+
uploadPayload(payload)
45+
return payload
46+
}
47+
48+
override fun alias(payload: AliasEvent): BaseEvent? {
49+
uploadPayload(payload)
50+
return payload
51+
}
52+
53+
private fun uploadPayload(payload: BaseEvent) {
54+
CoroutineScope(Dispatchers.Main).launch {
55+
Log.d(TAG, "uploadPayload: $payload")
56+
sendPayloadToWebhook(analytics, webhookUrl, payload)
57+
}
58+
}
59+
60+
private suspend fun sendPayloadToWebhook(
61+
analytics: Analytics,
62+
webhookUrl: String,
63+
payload: BaseEvent
64+
) {
65+
withContext(analytics.networkIODispatcher) {
66+
67+
68+
val jsonPayload = buildJsonObject {
69+
put("type", JsonPrimitive(payload.type.toString()))
70+
if (payload is TrackEvent) {
71+
put("event", JsonPrimitive(payload.event))
72+
put("properties", payload.properties)
73+
put("context", payload.context)
74+
}
75+
}
76+
77+
val payloadString = jsonPayload.toString()
78+
val body = payloadString.toRequestBody(JSON)
79+
val request = Request.Builder().url(webhookUrl).post(body).build()
80+
81+
try {
82+
val response = okHttpClient.newCall(request).execute()
83+
response.body?.close()
84+
} catch (e: Exception) {
85+
println("Error ${e}")
86+
Log.d(MainApplication.TAG, "sendPayloadToWebhook: Error sending payload $e", e)
87+
}
88+
}
89+
}
90+
}

testapp/src/main/res/layout/activity_main.xml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
android:layout_height="match_parent"
77
tools:context=".MainActivity">
88

9-
<TextView
9+
<Button
10+
android:id="@+id/sendTrackEventButton"
1011
android:layout_width="wrap_content"
1112
android:layout_height="wrap_content"
12-
android:text="Hello World!"
13+
android:text="@string/send_track_event"
1314
app:layout_constraintBottom_toBottomOf="parent"
1415
app:layout_constraintLeft_toLeftOf="parent"
1516
app:layout_constraintRight_toRightOf="parent"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
<resources>
22
<string name="app_name">testApp</string>
3+
<string name="send_track_event">Send Track Event</string>
34
</resources>

0 commit comments

Comments
 (0)