Skip to content
This repository was archived by the owner on Sep 29, 2025. It is now read-only.

Commit 71fc7f5

Browse files
Merge pull request #813 from ably/feature/add-more-logs
Add more logs to the SDKs
2 parents 0fecfcc + 0c143bd commit 71fc7f5

File tree

7 files changed

+165
-51
lines changed

7 files changed

+165
-51
lines changed

common/src/main/java/com/ably/tracking/common/Ably.kt

Lines changed: 78 additions & 40 deletions
Large diffs are not rendered by default.

common/src/main/java/com/ably/tracking/common/CallbackFunctionModels.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,17 @@ typealias ResultCallbackFunction<T> = CallbackFunction<Result<T>>
2020
* Utility function adapts [Continuation] to fit in [ResultCallbackFunction] signature. Callback result is unpacked and
2121
* used to resume the continuation.
2222
*/
23-
fun <T> Continuation<T>.wrapInResultCallback(): ResultCallbackFunction<T> =
23+
fun <T> Continuation<T>.wrapInResultCallback(
24+
onSuccess: () -> Unit = {},
25+
onError: (Exception) -> Unit = {},
26+
): ResultCallbackFunction<T> =
2427
{ result ->
2528
try {
26-
resume(result.getOrThrow())
29+
val resultValue = result.getOrThrow()
30+
onSuccess()
31+
resume(resultValue)
2732
} catch (exception: Exception) {
33+
onError(exception)
2834
resumeWithException(exception)
2935
}
3036
}

publishing-sdk/src/main/java/com/ably/tracking/publisher/DefaultPublisher.kt

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ import com.ably.tracking.LocationUpdate
88
import com.ably.tracking.Resolution
99
import com.ably.tracking.TrackableState
1010
import com.ably.tracking.common.Ably
11+
import com.ably.tracking.common.logging.createLoggingTag
12+
import com.ably.tracking.common.logging.v
13+
import com.ably.tracking.common.logging.w
1114
import com.ably.tracking.common.wrapInResultCallback
1215
import com.ably.tracking.logging.LogHandler
1316
import kotlin.coroutines.suspendCoroutine
@@ -22,13 +25,14 @@ constructor(
2225
mapbox: Mapbox,
2326
resolutionPolicyFactory: ResolutionPolicy.Factory,
2427
routingProfile: RoutingProfile,
25-
logHandler: LogHandler?,
28+
private val logHandler: LogHandler?,
2629
areRawLocationsEnabled: Boolean?,
2730
sendResolutionEnabled: Boolean,
2831
constantLocationEngineResolution: Resolution?,
2932
) :
3033
Publisher {
3134
private val core: CorePublisher
35+
private val TAG = createLoggingTag(this)
3236

3337
override val active: Trackable?
3438
get() = core.active
@@ -53,29 +57,58 @@ constructor(
5357
sendResolutionEnabled,
5458
constantLocationEngineResolution,
5559
)
60+
logHandler?.v("$TAG Created a publisher instance")
5661
}
5762

5863
override suspend fun track(trackable: Trackable): StateFlow<TrackableState> {
64+
logHandler?.v("$TAG Publisher track operation started")
5965
return suspendCoroutine { continuation ->
60-
core.trackTrackable(trackable, continuation.wrapInResultCallback())
66+
core.trackTrackable(
67+
trackable,
68+
continuation.wrapInResultCallback(
69+
onSuccess = { logHandler?.v("$TAG Publisher track operation succeeded") },
70+
onError = { logHandler?.w("$TAG Publisher track operation failed", it) },
71+
),
72+
)
6173
}
6274
}
6375

6476
override suspend fun add(trackable: Trackable): StateFlow<TrackableState> {
77+
logHandler?.v("$TAG Publisher add operation started")
6578
return suspendCoroutine { continuation ->
66-
core.addTrackable(trackable, continuation.wrapInResultCallback())
79+
core.addTrackable(
80+
trackable,
81+
continuation.wrapInResultCallback(
82+
onSuccess = { logHandler?.v("$TAG Publisher add operation succeeded") },
83+
onError = { logHandler?.w("$TAG Publisher add operation failed", it) },
84+
),
85+
)
6786
}
6887
}
6988

7089
override suspend fun remove(trackable: Trackable): Boolean {
90+
logHandler?.v("$TAG Publisher remove operation started")
7191
return suspendCoroutine { continuation ->
72-
core.removeTrackable(trackable, continuation.wrapInResultCallback())
92+
core.removeTrackable(
93+
trackable,
94+
continuation.wrapInResultCallback(
95+
onSuccess = { logHandler?.v("$TAG Publisher remove operation succeeded") },
96+
onError = { logHandler?.w("$TAG Publisher remove operation failed", it) },
97+
),
98+
)
7399
}
74100
}
75101

76102
override suspend fun stop(timeoutInMilliseconds: Long) {
103+
logHandler?.v("$TAG Publisher stop operation started")
77104
suspendCoroutine<Unit> { continuation ->
78-
core.stop(timeoutInMilliseconds, continuation.wrapInResultCallback())
105+
core.stop(
106+
timeoutInMilliseconds,
107+
continuation.wrapInResultCallback(
108+
onSuccess = { logHandler?.v("$TAG Publisher stop operation succeeded") },
109+
onError = { logHandler?.w("$TAG Publisher stop operation failed", it) },
110+
),
111+
)
79112
}
80113
}
81114

publishing-sdk/src/main/java/com/ably/tracking/publisher/PublisherBuilder.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import androidx.annotation.RequiresPermission
77
import com.ably.tracking.BuilderConfigurationIncompleteException
88
import com.ably.tracking.Resolution
99
import com.ably.tracking.common.DefaultAbly
10+
import com.ably.tracking.common.logging.createLoggingTag
11+
import com.ably.tracking.common.logging.v
1012
import com.ably.tracking.connection.ConnectionConfiguration
1113
import com.ably.tracking.logging.LogHandler
1214

@@ -26,6 +28,7 @@ internal data class PublisherBuilder(
2628
val constantLocationEngineResolution: Resolution? = null,
2729
val vehicleProfile: VehicleProfile = VehicleProfile.CAR,
2830
) : Publisher.Builder {
31+
private val TAG = createLoggingTag(this)
2932

3033
override fun connection(configuration: ConnectionConfiguration): Publisher.Builder =
3134
this.copy(connectionConfiguration = configuration)
@@ -72,8 +75,10 @@ internal data class PublisherBuilder(
7275
@RequiresPermission(anyOf = [ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION])
7376
override fun start(): Publisher {
7477
if (isMissingRequiredFields()) {
78+
logHandler?.v("$TAG Creating a publisher instance failed due to missing required fields")
7579
throw BuilderConfigurationIncompleteException()
7680
}
81+
logHandler?.v("$TAG Creating a publisher instance")
7782
// All below fields are required and above code checks if they are nulls, so using !! should be safe from NPE
7883
return DefaultPublisher(
7984
DefaultAbly(connectionConfiguration!!, logHandler),

subscribing-sdk/src/main/java/com/ably/tracking/subscriber/DefaultSubscriber.kt

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ import com.ably.tracking.Resolution
55
import com.ably.tracking.TrackableState
66
import com.ably.tracking.annotations.Experimental
77
import com.ably.tracking.common.Ably
8+
import com.ably.tracking.common.logging.createLoggingTag
9+
import com.ably.tracking.common.logging.v
10+
import com.ably.tracking.common.logging.w
811
import com.ably.tracking.common.wrapInResultCallback
12+
import com.ably.tracking.logging.LogHandler
913
import com.ably.tracking.subscriber.workerqueue.WorkerSpecification
1014
import kotlin.coroutines.suspendCoroutine
1115
import kotlinx.coroutines.flow.SharedFlow
@@ -15,8 +19,10 @@ internal class DefaultSubscriber(
1519
ably: Ably,
1620
resolution: Resolution?,
1721
trackableId: String,
22+
private val logHandler: LogHandler?,
1823
) : Subscriber {
1924
private val core: CoreSubscriber
25+
private val TAG = createLoggingTag(this)
2026

2127
override val locations: SharedFlow<LocationUpdate>
2228
get() = core.enhancedLocations
@@ -39,33 +45,53 @@ internal class DefaultSubscriber(
3945

4046
init {
4147
core = createCoreSubscriber(ably, resolution, trackableId)
48+
logHandler?.v("$TAG Created a subscriber instance")
4249
}
4350

4451
/**
4552
* This method must be run before running any other method from [DefaultSubscriber].
4653
*/
4754
suspend fun start() {
55+
logHandler?.v("$TAG Subscriber start operation started")
4856
suspendCoroutine<Unit> { continuation ->
4957
core.enqueue(
50-
WorkerSpecification.StartConnection(continuation.wrapInResultCallback())
58+
WorkerSpecification.StartConnection(
59+
continuation.wrapInResultCallback(
60+
onSuccess = { logHandler?.v("$TAG Subscriber start operation succeeded") },
61+
onError = { logHandler?.w("$TAG Subscriber start operation failed", it) },
62+
)
63+
)
5164
)
5265
}
5366
}
5467

5568
override suspend fun resolutionPreference(resolution: Resolution?) {
69+
logHandler?.v("$TAG Subscriber resolutionPreference operation started")
5670
// send change request over channel and wait for the result
5771
suspendCoroutine<Unit> { continuation ->
5872
core.enqueue(
59-
WorkerSpecification.ChangeResolution(resolution, continuation.wrapInResultCallback())
73+
WorkerSpecification.ChangeResolution(
74+
resolution,
75+
continuation.wrapInResultCallback(
76+
onSuccess = { logHandler?.v("$TAG Subscriber resolutionPreference operation succeeded") },
77+
onError = { logHandler?.w("$TAG Subscriber resolutionPreference operation failed", it) },
78+
),
79+
)
6080
)
6181
}
6282
}
6383

6484
override suspend fun stop() {
85+
logHandler?.v("$TAG Subscriber stop operation started")
6586
// send stop request over channel and wait for the result
6687
suspendCoroutine<Unit> { continuation ->
6788
core.enqueue(
68-
WorkerSpecification.StopConnection(continuation.wrapInResultCallback())
89+
WorkerSpecification.StopConnection(
90+
continuation.wrapInResultCallback(
91+
onSuccess = { logHandler?.v("$TAG Subscriber stop operation succeeded") },
92+
onError = { logHandler?.w("$TAG Subscriber stop operation failed", it) },
93+
)
94+
)
6995
)
7096
}
7197
}

subscribing-sdk/src/main/java/com/ably/tracking/subscriber/SubscriberBuilder.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package com.ably.tracking.subscriber
33
import com.ably.tracking.BuilderConfigurationIncompleteException
44
import com.ably.tracking.Resolution
55
import com.ably.tracking.common.DefaultAbly
6+
import com.ably.tracking.common.logging.createLoggingTag
7+
import com.ably.tracking.common.logging.v
68
import com.ably.tracking.connection.ConnectionConfiguration
79
import com.ably.tracking.logging.LogHandler
810

@@ -12,6 +14,7 @@ internal data class SubscriberBuilder(
1214
val logHandler: LogHandler? = null,
1315
val trackingId: String? = null,
1416
) : Subscriber.Builder {
17+
private val TAG = createLoggingTag(this)
1518

1619
override fun connection(configuration: ConnectionConfiguration): Subscriber.Builder =
1720
this.copy(connectionConfiguration = configuration)
@@ -27,13 +30,16 @@ internal data class SubscriberBuilder(
2730

2831
override suspend fun start(): Subscriber {
2932
if (isMissingRequiredFields()) {
33+
logHandler?.v("$TAG Creating a subscriber instance failed due to missing required fields")
3034
throw BuilderConfigurationIncompleteException()
3135
}
36+
logHandler?.v("$TAG Creating a subscriber instance")
3237
// All below fields are required and above code checks if they are nulls, so using !! should be safe from NPE
3338
return DefaultSubscriber(
3439
DefaultAbly(connectionConfiguration!!, logHandler),
3540
resolution,
3641
trackingId!!,
42+
logHandler,
3743
).apply {
3844
start()
3945
}

subscribing-sdk/src/test/java/com/ably/tracking/subscriber/DefaultSubscriberTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import java.util.UUID
1515
class DefaultSubscriberTest {
1616
private val ably = mockk<Ably>(relaxed = true)
1717
private val trackableId = UUID.randomUUID().toString()
18-
private val subscriber = DefaultSubscriber(ably, null, trackableId)
18+
private val subscriber = DefaultSubscriber(ably, null, trackableId, null)
1919

2020
@Test(expected = ConnectionException::class)
2121
fun `should return an error when starting the subscriber with subscribing to presence error`() {

0 commit comments

Comments
 (0)