Skip to content

Commit 7d60633

Browse files
Merge branch 'development'
2 parents 9622fc6 + 112acd3 commit 7d60633

File tree

20 files changed

+144
-137
lines changed

20 files changed

+144
-137
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ repositories {
2525
2626
dependencies {
2727
28-
def version = '1.0.13'
28+
def version = '1.0.16'
2929
3030
// add the basic analytics interface library - incl. LoggerDispatcher
3131
compile "com.sofakingforever.analytics:analytics:version@aar"

analytics/build.gradle

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ android {
4141
// unitTests.returnDefaultValues = true
4242
// }
4343
}
44+
repositories {
45+
mavenCentral()
46+
47+
}
4448

4549
dependencies {
4650

@@ -60,6 +64,7 @@ dependencies {
6064
androidTestImplementation 'org.mockito:mockito-android:2.7.22'
6165

6266
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
67+
implementation 'com.sofakingforever.repoverse:repoverse:1.0.2'
6368

6469

6570

@@ -69,9 +74,6 @@ dependencies {
6974
// testCompile 'org.powermock:powermock-api-mockito:1.6.5'
7075

7176

72-
}
73-
repositories {
74-
mavenCentral()
7577
}
7678
ext {
7779
bintrayRepo = 'analytics'

analytics/src/main/java/com/sofakingforever/analytics/Analytics.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class Analytics(val settings: AnalyticsSettings, private vararg val dispatchers:
1919
init {
2020

2121
// check for new library version if enabled
22-
if (settings.checkForUpdates) VersionChecker.onCheckVersion()
22+
if (settings.checkForUpdates) VersionChecker.invoke()
2323

2424
// init all dispatchers
2525
dispatchers.forEach { dispatcher ->

analytics/src/main/java/com/sofakingforever/analytics/AnalyticsDispatcher.kt

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package com.sofakingforever.analytics
22

33
import android.content.Context
4-
import com.sofakingforever.analytics.events.ContentViewEvent
5-
import com.sofakingforever.analytics.events.CustomEvent
6-
import com.sofakingforever.analytics.events.InviteEvent
7-
import com.sofakingforever.analytics.events.SetUserProperty
4+
import com.sofakingforever.analytics.events.*
85
import com.sofakingforever.analytics.events.base.Event
96
import com.sofakingforever.analytics.exceptions.UnsupportedEventException
107

@@ -21,14 +18,13 @@ interface AnalyticsDispatcher {
2118

2219
val kit: AnalyticsKit
2320

24-
val dispatcherName : String
21+
val dispatcherName: String
2522

2623
/**
2724
* Should call the analytics library's initiation methods
2825
*/
2926
fun initDispatcher(context: Context)
3027

31-
3228
fun trackContentView(contentView: ContentViewEvent)
3329

3430
fun trackCustomEvent(event: CustomEvent)
@@ -37,22 +33,48 @@ interface AnalyticsDispatcher {
3733

3834
fun setUserProperty(property: SetUserProperty)
3935

36+
fun setUserProperties(properties: SetUserProperties)
37+
4038
/**
4139
* This method is called from the parent @Analytics class for each event.
4240
* Override this method if you plan on interfacing your own event types.
4341
*/
4442
fun track(event: Event) {
43+
// track the event only if it is not configured as excluded
4544
if (event.isConsideredIncluded(kit)) {
46-
// track the event only if it is not configured as excluded
47-
when (event) {
48-
// track each type differently
49-
is CustomEvent -> trackCustomEvent(event)
50-
is ContentViewEvent -> trackContentView(event)
51-
is InviteEvent -> trackInviteEvent(event)
52-
is SetUserProperty -> setUserProperty(event)
53-
// alert developer if this is a customized event implementation
54-
else -> throw UnsupportedEventException(event)
45+
46+
var handled = false
47+
48+
// track for each type differently, including multiple implementations
49+
if (event is CustomEvent) {
50+
trackCustomEvent(event)
51+
handled = true
52+
}
53+
54+
if (event is ContentViewEvent) {
55+
trackContentView(event)
56+
handled = true
57+
}
58+
59+
if (event is InviteEvent) {
60+
trackInviteEvent(event)
61+
handled = true
5562
}
63+
64+
if (event is SetUserProperty) {
65+
setUserProperty(event)
66+
handled = true
67+
}
68+
69+
if (event is SetUserProperties) {
70+
setUserProperties(event)
71+
handled = true
72+
}
73+
74+
if (!handled) {
75+
throw UnsupportedEventException(event)
76+
}
77+
5678
}
5779
}
5880

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.sofakingforever.analytics.events
2+
3+
import com.sofakingforever.analytics.AnalyticsKit
4+
import com.sofakingforever.analytics.events.base.Event
5+
6+
interface SetUserProperties : Event {
7+
fun getUserProperties(kit: AnalyticsKit): MutableMap<String, Any> {
8+
return mutableMapOf()
9+
}
10+
}

analytics/src/main/java/com/sofakingforever/analytics/kits/logger/LoggerDispatcherImpl.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@ import android.content.Context
44
import android.util.Log
55
import com.sofakingforever.analytics.AnalyticsDispatcher
66
import com.sofakingforever.analytics.AnalyticsKit
7-
import com.sofakingforever.analytics.events.ContentViewEvent
8-
import com.sofakingforever.analytics.events.CustomEvent
9-
import com.sofakingforever.analytics.events.InviteEvent
10-
import com.sofakingforever.analytics.events.SetUserProperty
7+
import com.sofakingforever.analytics.events.*
118

129
/**
1310
* This is just a logger implementation, Use this if you're in DEBUG mode.
@@ -17,6 +14,7 @@ import com.sofakingforever.analytics.events.SetUserProperty
1714
*/
1815
class LoggerDispatcherImpl(override val init: Boolean) : AnalyticsDispatcher {
1916

17+
2018
override val dispatcherName: String = "LoggerDispatcher"
2119

2220
constructor() : this(true)
@@ -45,4 +43,7 @@ class LoggerDispatcherImpl(override val init: Boolean) : AnalyticsDispatcher {
4543
override fun setUserProperty(property: SetUserProperty) {
4644
Log.d(tag, "Tracking user property ${property.key} = ${property.value}")
4745
}
46+
override fun setUserProperties(properties: SetUserProperties) {
47+
Log.d(tag, "Tracking user properties ${properties.getUserProperties(kit)}")
48+
}
4849
}

analytics/src/main/java/com/sofakingforever/analytics/version/Version.kt

Lines changed: 0 additions & 37 deletions
This file was deleted.
Lines changed: 7 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,19 @@
11
package com.sofakingforever.analytics.version
22

3-
import android.util.Log
4-
import com.sofakingforever.analytics.exceptions.IllegalVersionFormatException
53
import com.sofakingforever.library.BuildConfig
6-
import okhttp3.*
7-
import java.io.IOException
4+
import com.sofakingforever.repoverse.Version
5+
import com.sofakingforever.repoverse.resolvers.BintrayVersionResolver
86

97
object VersionChecker {
108

11-
fun onCheckVersion() {
9+
private val currentVersion = Version(BuildConfig.VERSION_NAME)
1210

13-
val currentVersion = Version(BuildConfig.VERSION_NAME)
11+
private const val packagePath: String = "sofakingforever/analytics/kotlin-analytics"
1412

15-
val client = OkHttpClient.Builder()
16-
.followRedirects(true)
17-
.build()
13+
fun invoke() {
14+
BintrayVersionResolver(packagePath)
15+
.resolve(VersionResolverCallback(currentVersion))
1816

19-
val request = Request.Builder()
20-
.url("https://bintray.com/sofakingforever/analytics/kotlin-analytics/_latestVersion")
21-
.get()
22-
.build()
23-
24-
client.newCall(request).enqueue(object : Callback {
25-
26-
override fun onFailure(call: Call?, e: IOException?) {
27-
// ignore failure, no need to fill logcat with bullshit
28-
}
29-
30-
override fun onResponse(call: Call?, response: Response?) {
31-
// try to finish up
32-
response?.url().also { url ->
33-
34-
try {
35-
val latestVersion = Version(extractVersion(url))
36-
37-
if (currentVersion < latestVersion) {
38-
// user should update
39-
Log.w("Analytics", "Latest kotlin-analytics version is $latestVersion > $currentVersion")
40-
}
41-
} catch (e: IllegalVersionFormatException) {
42-
// ignore failure, no need to fill logcat with bullshit
43-
}
44-
45-
46-
}
47-
}
48-
49-
})
50-
}
51-
52-
fun extractVersion(it: HttpUrl?) : String = it?.encodedPathSegments()?.last() ?: ""
53-
54-
private fun Response?.url(): HttpUrl? {
55-
return this?.networkResponse()?.request()?.url()
5617
}
5718

5819
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.sofakingforever.analytics.version
2+
3+
import android.util.Log
4+
import com.sofakingforever.repoverse.Version
5+
import com.sofakingforever.repoverse.resolvers.RemoteVersionResolver
6+
7+
class VersionResolverCallback(private val currentVersion: Version) : RemoteVersionResolver.Callback {
8+
9+
override fun onVersionResolved(latestVersion: Version) {
10+
if (currentVersion < latestVersion) {
11+
// user should update
12+
Log.w("kotlin-analytics", "Latest library version $latestVersion > $currentVersion (current)")
13+
}
14+
}
15+
}

analytics/src/test/java/com/sofakingforever/library/AnalyticsUnitTest.kt

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@ package com.sofakingforever.library
22

33
import android.content.Context
44
import com.sofakingforever.analytics.Analytics
5+
import com.sofakingforever.analytics.AnalyticsSettings
56
import com.sofakingforever.analytics.exceptions.EventNotTrackedException
67
import com.sofakingforever.analytics.exceptions.UnsupportedEventException
78
import com.sofakingforever.library.dispatcher.TestKit
89
import com.sofakingforever.library.dispatcher.TestableDispatcher
9-
import com.sofakingforever.library.events.InitDispatcherEvent
10-
import com.sofakingforever.library.events.TestContentViewEvent
11-
import com.sofakingforever.library.events.TestCustomEvent
12-
import com.sofakingforever.library.events.UnsupportedEvent
10+
import com.sofakingforever.library.events.*
1311
import org.junit.Test
1412
import org.mockito.Mockito
1513
import org.mockito.Mockito.mock
@@ -30,9 +28,9 @@ class AnalyticsUnitTest {
3028
@Test
3129
fun testAnalytics() {
3230

33-
analytics = Analytics(contextMock, dispatcher).apply {
31+
analytics = Analytics(AnalyticsSettings(contextMock), dispatcher).apply {
3432

35-
this.settings.exceptionHandler = object : Analytics.ExceptionHandler {
33+
this.exceptionHandler = object : Analytics.ExceptionHandler {
3634
override fun onException(e: Exception) {
3735
raisedException = e
3836
}
@@ -80,7 +78,9 @@ class AnalyticsUnitTest {
8078

8179
analytics.track(TestCustomEvent(5))
8280

83-
analytics.track(TestContentViewEvent(1))
81+
analytics.track(TestContentViewEvent(6))
82+
83+
analytics.track(TestUserProperties(7))
8484

8585
}
8686

@@ -91,11 +91,15 @@ class AnalyticsUnitTest {
9191
val eventList = dispatcher.eventList
9292

9393
// expect to find 3 custom events , 1 contentview and 1 init event
94-
assert(eventList.size == 5)
94+
assert(eventList.size == 6)
9595
assert(eventList[0] is InitDispatcherEvent)
9696
assert((eventList[1] as TestCustomEvent).number == 1)
9797
assert((eventList[2] as TestCustomEvent).number == 3)
9898
assert((eventList[3] as TestCustomEvent).number == 5)
99-
assert((eventList[4] as TestContentViewEvent).number == 1)
99+
assert((eventList[4] as TestContentViewEvent).number == 6)
100+
assert((eventList[5] as TestUserProperties).number == 7)
101+
val mapValues = (eventList[5] as TestUserProperties).getUserProperties(TestKit.instance).toString()
102+
103+
100104
}
101105
}

analytics/src/test/java/com/sofakingforever/library/dispatcher/TestableDispatcher.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,13 @@ package com.sofakingforever.library.dispatcher
33
import android.content.Context
44
import com.sofakingforever.analytics.AnalyticsDispatcher
55
import com.sofakingforever.analytics.AnalyticsKit
6-
import com.sofakingforever.analytics.events.ContentViewEvent
7-
import com.sofakingforever.analytics.events.CustomEvent
8-
import com.sofakingforever.analytics.events.InviteEvent
9-
import com.sofakingforever.analytics.events.SetUserProperty
6+
import com.sofakingforever.analytics.events.*
107
import com.sofakingforever.analytics.events.base.Event
118
import com.sofakingforever.library.events.InitDispatcherEvent
129

1310
class TestableDispatcher : AnalyticsDispatcher {
1411

12+
1513
override val init: Boolean = true
1614

1715
override val kit: AnalyticsKit = TestKit.instance
@@ -40,6 +38,10 @@ class TestableDispatcher : AnalyticsDispatcher {
4038
eventList.add(property)
4139
}
4240

41+
override fun setUserProperties(properties: SetUserProperties) {
42+
eventList.add(properties)
43+
}
44+
4345
override fun track(event: Event) {
4446
if (event is InitDispatcherEvent) {
4547
eventList.add(event)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.sofakingforever.library.events
2+
3+
import com.sofakingforever.analytics.AnalyticsKit
4+
import com.sofakingforever.analytics.events.SetUserProperties
5+
6+
class TestUserProperties(val number: Int) : SetUserProperties {
7+
override fun getUserProperties(kit: AnalyticsKit): MutableMap<String, Any> {
8+
val parameters = super.getUserProperties(kit)
9+
parameters["int"] = -2
10+
parameters["long"] = +2L
11+
parameters["boolean"] = true
12+
parameters["string"] = "fun #$number"
13+
return parameters
14+
}
15+
}

0 commit comments

Comments
 (0)