Skip to content

Commit fe141cf

Browse files
authored
Merge pull request #98 from Parsely/issue/prepare_for_parsely_tracker_kotlin_migration
Prepare `ParselyTracker` for Kotlin migration
2 parents 7504512 + 7fdcbbc commit fe141cf

11 files changed

+131
-82
lines changed

parsely/src/main/java/com/parsely/parselyandroid/AdvertisementIdProvider.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.parsely.parselyandroid
33
import android.content.Context
44
import android.provider.Settings
55
import com.google.android.gms.ads.identifier.AdvertisingIdClient
6+
import com.parsely.parselyandroid.Logging.log
67
import kotlinx.coroutines.CoroutineScope
78
import kotlinx.coroutines.launch
89

@@ -18,7 +19,7 @@ internal class AdvertisementIdProvider(
1819
try {
1920
adKey = AdvertisingIdClient.getAdvertisingIdInfo(context).id
2021
} catch (e: Exception) {
21-
ParselyTracker.PLog("No Google play services or error!")
22+
log("No Google play services or error!")
2223
}
2324
}
2425
}
@@ -40,7 +41,7 @@ internal class AndroidIdProvider(private val context: Context) : IdProvider {
4041
} catch (ex: Exception) {
4142
null
4243
}
43-
ParselyTracker.PLog(String.format("Android ID: %s", uuid))
44+
log(String.format("Android ID: %s", uuid))
4445
return uuid
4546
}
4647
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.parsely.parselyandroid
2+
3+
import android.content.Context
4+
import android.net.ConnectivityManager
5+
6+
internal interface ConnectivityStatusProvider {
7+
/**
8+
* @return Whether the network is accessible.
9+
*/
10+
fun isReachable(): Boolean
11+
}
12+
13+
internal class AndroidConnectivityStatusProvider(private val context: Context): ConnectivityStatusProvider {
14+
15+
override fun isReachable(): Boolean {
16+
val cm = context.getSystemService(
17+
Context.CONNECTIVITY_SERVICE
18+
) as ConnectivityManager
19+
val netInfo = cm.activeNetworkInfo
20+
return netInfo != null && netInfo.isConnectedOrConnecting
21+
}
22+
}

parsely/src/main/java/com/parsely/parselyandroid/DeviceInfoRepository.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.parsely.parselyandroid
22

33
import android.os.Build
4+
import com.parsely.parselyandroid.Logging.log
45

56
internal interface DeviceInfoRepository{
67
fun collectDeviceInfo(): Map<String, String>
@@ -34,12 +35,12 @@ internal open class AndroidDeviceInfoRepository(
3435
val adKey = advertisementIdProvider.provide()
3536
val androidId = androidIdProvider.provide()
3637

37-
ParselyTracker.PLog("adkey is: %s, uuid is %s", adKey, androidId)
38+
log("adkey is: %s, uuid is %s", adKey, androidId)
3839

3940
return if (adKey != null) {
4041
adKey
4142
} else {
42-
ParselyTracker.PLog("falling back to device uuid")
43+
log("falling back to device uuid")
4344
androidId .orEmpty()
4445
}
4546
}

parsely/src/main/java/com/parsely/parselyandroid/EngagementManager.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.parsely.parselyandroid
22

3-
import kotlin.time.Duration
3+
import com.parsely.parselyandroid.Logging.log
44
import kotlinx.coroutines.CoroutineScope
55
import kotlinx.coroutines.Job
66
import kotlinx.coroutines.delay
@@ -62,7 +62,7 @@ internal class EngagementManager(
6262
val event: MutableMap<String, Any> = HashMap(
6363
baseEvent
6464
)
65-
ParselyTracker.PLog(String.format("Enqueuing %s event.", event["action"]))
65+
log(String.format("Enqueuing %s event.", event["action"]))
6666

6767
// Update `ts` for the event since it's happening right now.
6868
val baseEventData = (event["data"] as Map<String, Any>?)!!

parsely/src/main/java/com/parsely/parselyandroid/EventsBuilder.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.parsely.parselyandroid;
22

3-
import static com.parsely.parselyandroid.ParselyTracker.PLog;
4-
5-
import android.content.Context;
3+
import static com.parsely.parselyandroid.Logging.log;
64

75
import androidx.annotation.NonNull;
86
import androidx.annotation.Nullable;
@@ -44,7 +42,7 @@ Map<String, Object> buildEvent(
4442
Map<String, Object> extraData,
4543
@Nullable String uuid
4644
) {
47-
PLog("buildEvent called for %s/%s", action, url);
45+
log("buildEvent called for %s/%s", action, url);
4846

4947
Calendar now = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
5048

parsely/src/main/java/com/parsely/parselyandroid/FlushQueue.kt

+14-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.parsely.parselyandroid
22

33
import com.parsely.parselyandroid.JsonSerializer.toParselyEventsPayload
4+
import com.parsely.parselyandroid.Logging.log
45
import kotlinx.coroutines.CoroutineScope
56
import kotlinx.coroutines.launch
67
import kotlinx.coroutines.sync.Mutex
@@ -10,12 +11,17 @@ internal class FlushQueue(
1011
private val flushManager: FlushManager,
1112
private val repository: QueueRepository,
1213
private val restClient: RestClient,
13-
private val scope: CoroutineScope
14+
private val scope: CoroutineScope,
15+
private val connectivityStatusProvider: ConnectivityStatusProvider
1416
) {
1517

1618
private val mutex = Mutex()
1719

1820
operator fun invoke(skipSendingEvents: Boolean) {
21+
if (!connectivityStatusProvider.isReachable()) {
22+
log("Network unreachable. Not flushing.")
23+
return
24+
}
1925
scope.launch {
2026
mutex.withLock {
2127
val eventsToSend = repository.getStoredQueue()
@@ -26,23 +32,23 @@ internal class FlushQueue(
2632
}
2733

2834
if (skipSendingEvents) {
29-
ParselyTracker.PLog("Debug mode on. Not sending to Parse.ly. Otherwise, would sent ${eventsToSend.size} events")
35+
log("Debug mode on. Not sending to Parse.ly. Otherwise, would sent ${eventsToSend.size} events")
3036
repository.remove(eventsToSend)
3137
return@launch
3238
}
33-
ParselyTracker.PLog("Sending request with %d events", eventsToSend.size)
39+
log("Sending request with %d events", eventsToSend.size)
3440
val jsonPayload = toParselyEventsPayload(eventsToSend)
35-
ParselyTracker.PLog("POST Data %s", jsonPayload)
36-
ParselyTracker.PLog("Requested %s", ParselyTracker.ROOT_URL)
41+
log("POST Data %s", jsonPayload)
42+
log("Requested %s", ParselyTracker.ROOT_URL)
3743
restClient.send(jsonPayload)
3844
.fold(
3945
onSuccess = {
40-
ParselyTracker.PLog("Pixel request success")
46+
log("Pixel request success")
4147
repository.remove(eventsToSend)
4248
},
4349
onFailure = {
44-
ParselyTracker.PLog("Pixel request exception")
45-
ParselyTracker.PLog(it.toString())
50+
log("Pixel request exception")
51+
log(it.toString())
4652
}
4753
)
4854
}

parsely/src/main/java/com/parsely/parselyandroid/InMemoryBuffer.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.parsely.parselyandroid
22

3+
import com.parsely.parselyandroid.Logging.log
34
import kotlin.time.Duration.Companion.seconds
45
import kotlinx.coroutines.CoroutineScope
56
import kotlinx.coroutines.delay
@@ -22,7 +23,7 @@ internal class InMemoryBuffer(
2223
while (isActive) {
2324
mutex.withLock {
2425
if (buffer.isNotEmpty()) {
25-
ParselyTracker.PLog("Persisting ${buffer.size} events")
26+
log("Persisting ${buffer.size} events")
2627
localStorageRepository.insertEvents(buffer)
2728
buffer.clear()
2829
}
@@ -35,7 +36,7 @@ internal class InMemoryBuffer(
3536
fun add(event: Map<String, Any>) {
3637
coroutineScope.launch {
3738
mutex.withLock {
38-
ParselyTracker.PLog("Event added to buffer")
39+
log("Event added to buffer")
3940
buffer.add(event)
4041
onEventAddedListener()
4142
}

parsely/src/main/java/com/parsely/parselyandroid/LocalStorageRepository.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.parsely.parselyandroid
22

33
import android.content.Context
4+
import com.parsely.parselyandroid.Logging.log
45
import java.io.EOFException
56
import java.io.FileNotFoundException
67
import java.io.ObjectInputStream
@@ -34,7 +35,7 @@ internal class LocalStorageRepository(private val context: Context) : QueueRepos
3435
oos.close()
3536
fos.close()
3637
} catch (ex: Exception) {
37-
ParselyTracker.PLog("Exception thrown during queue serialization: %s", ex.toString())
38+
log("Exception thrown during queue serialization: %s", ex.toString())
3839
}
3940
}
4041

@@ -52,7 +53,7 @@ internal class LocalStorageRepository(private val context: Context) : QueueRepos
5253
} catch (ex: FileNotFoundException) {
5354
// Nothing to do here. Means there was no saved queue.
5455
} catch (ex: Exception) {
55-
ParselyTracker.PLog(
56+
log(
5657
"Exception thrown during queue deserialization: %s",
5758
ex.toString()
5859
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.parsely.parselyandroid
2+
3+
import java.util.Formatter
4+
5+
object Logging {
6+
7+
/**
8+
* Log a message to the console.
9+
*/
10+
@JvmStatic
11+
fun log(logString: String, vararg objects: Any?) {
12+
if (logString == "") {
13+
return
14+
}
15+
println(Formatter().format("[Parsely] $logString", *objects).toString())
16+
}
17+
}

0 commit comments

Comments
 (0)