Skip to content

Commit 7b5a1ad

Browse files
authored
[WearOS] Fix edge case during exporting logs from watch (#5065)
1 parent 6d03c29 commit 7b5a1ad

File tree

1 file changed

+22
-11
lines changed

1 file changed

+22
-11
lines changed

modules/features/shared/src/main/java/au/com/shiftyjelly/pocketcasts/shared/WatchPhoneCommunication.kt

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package au.com.shiftyjelly.pocketcasts.shared
22

33
import android.content.Context
44
import android.content.Intent
5+
import android.net.Uri
6+
import au.com.shiftyjelly.pocketcasts.coroutines.di.ApplicationScope
57
import au.com.shiftyjelly.pocketcasts.repositories.support.Support
68
import au.com.shiftyjelly.pocketcasts.shared.WatchPhoneCommunication.Companion.Paths.EMIL_LOGS_TO_SUPPORT
79
import au.com.shiftyjelly.pocketcasts.utils.log.LogBuffer
@@ -12,6 +14,7 @@ import com.google.android.gms.wearable.Node
1214
import com.google.android.gms.wearable.Wearable
1315
import dagger.hilt.android.qualifiers.ApplicationContext
1416
import javax.inject.Inject
17+
import javax.inject.Singleton
1518
import kotlinx.coroutines.CoroutineScope
1619
import kotlinx.coroutines.Dispatchers
1720
import kotlinx.coroutines.Job
@@ -35,12 +38,13 @@ class WatchPhoneCommunication {
3538
private const val CAPABILITY_NAME = "pocket_casts_wear_listener"
3639
}
3740

41+
@Singleton
3842
class Watch @Inject constructor(
3943
@ApplicationContext private val appContext: Context,
4044
private val support: Support,
45+
@ApplicationScope private val coroutineScope: CoroutineScope,
4146
) {
4247

43-
private val coroutineScope = CoroutineScope(Dispatchers.IO + Job())
4448
private val capabilityInfoFlow = MutableStateFlow<CapabilityInfo?>(null)
4549
private val availableNodeFlow = capabilityInfoFlow
4650
.map { it?.nodes?.firstOrNull() } // just using the first available node
@@ -53,24 +57,31 @@ class WatchPhoneCommunication {
5357
}
5458
}.stateIn(coroutineScope, SharingStarted.Lazily, WatchPhoneCommunicationState.NOT_CONNECTED)
5559

56-
private val onCapabilityChangedListener = CapabilityClient.OnCapabilityChangedListener {
57-
capabilityInfoFlow.value = it
60+
private val onCapabilityChangedListener = CapabilityClient.OnCapabilityChangedListener { capabilityInfo ->
61+
Timber.d("Capability changed: nodes=${capabilityInfo.nodes.map { "${it.displayName}(${it.id})" }}")
62+
capabilityInfoFlow.value = capabilityInfo
5863
}
5964

6065
init {
6166

6267
coroutineScope.launch {
63-
val capabilityInfo =
64-
Wearable.getCapabilityClient(appContext)
65-
.getCapability(CAPABILITY_NAME, CapabilityClient.FILTER_REACHABLE)
66-
.await()
67-
onCapabilityChangedListener.onCapabilityChanged(capabilityInfo)
68+
try {
69+
val capabilityInfo =
70+
Wearable.getCapabilityClient(appContext)
71+
.getCapability(CAPABILITY_NAME, CapabilityClient.FILTER_REACHABLE)
72+
.await()
73+
onCapabilityChangedListener.onCapabilityChanged(capabilityInfo)
74+
} catch (e: Exception) {
75+
Timber.e(e, "Failed to query initial capability")
76+
}
6877
}
6978

7079
Wearable.getCapabilityClient(appContext)
71-
.addListener({
72-
onCapabilityChangedListener.onCapabilityChanged(it)
73-
}, CAPABILITY_NAME)
80+
.addListener(
81+
{ onCapabilityChangedListener.onCapabilityChanged(it) },
82+
Uri.parse("wear://*/$CAPABILITY_NAME"),
83+
CapabilityClient.FILTER_REACHABLE,
84+
)
7485
}
7586

7687
suspend fun emailLogsToSupportMessage(): WatchMessageSendState {

0 commit comments

Comments
 (0)