@@ -2,6 +2,8 @@ package au.com.shiftyjelly.pocketcasts.shared
22
33import android.content.Context
44import android.content.Intent
5+ import android.net.Uri
6+ import au.com.shiftyjelly.pocketcasts.coroutines.di.ApplicationScope
57import au.com.shiftyjelly.pocketcasts.repositories.support.Support
68import au.com.shiftyjelly.pocketcasts.shared.WatchPhoneCommunication.Companion.Paths.EMIL_LOGS_TO_SUPPORT
79import au.com.shiftyjelly.pocketcasts.utils.log.LogBuffer
@@ -12,6 +14,7 @@ import com.google.android.gms.wearable.Node
1214import com.google.android.gms.wearable.Wearable
1315import dagger.hilt.android.qualifiers.ApplicationContext
1416import javax.inject.Inject
17+ import javax.inject.Singleton
1518import kotlinx.coroutines.CoroutineScope
1619import kotlinx.coroutines.Dispatchers
1720import 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