Skip to content

Commit 92b2c31

Browse files
committed
Adds Wearable API check
1 parent aae3e1e commit 92b2c31

File tree

3 files changed

+79
-21
lines changed

3 files changed

+79
-21
lines changed

watchface/src/main/java/com/android/developers/androidify/watchface/transfer/WearAssetTransmitter.kt

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -82,20 +82,30 @@ class WearAssetTransmitterImpl @Inject constructor(
8282
*/
8383
override val watchFaceInstallationUpdates = callbackFlow {
8484
trySend(WatchFaceInstallationStatus.NotStarted)
85-
val listener = MessageClient.OnMessageReceivedListener { event ->
86-
if (event.path.contains(transferId)) {
87-
val response =
88-
ProtoBuf.decodeFromByteArray<WatchFaceInstallationStatus.Complete>(event.data)
89-
if (response.transferId == transferId) {
90-
trySend(response)
85+
86+
var listener : MessageClient.OnMessageReceivedListener? = null
87+
88+
/**
89+
* Some devices don't have access to Wearable API via Play Services, so it is necessary to
90+
* check for this scenario first before trying to use the API.
91+
*/
92+
val apiAvailable = WearableApiAvailability.isAvailable(messageClient)
93+
if (apiAvailable) {
94+
listener = MessageClient.OnMessageReceivedListener { event ->
95+
if (event.path.contains(transferId)) {
96+
val response =
97+
ProtoBuf.decodeFromByteArray<WatchFaceInstallationStatus.Complete>(event.data)
98+
if (response.transferId == transferId) {
99+
trySend(response)
100+
}
91101
}
92102
}
103+
messageClient.addListener(listener).await()
93104
}
94-
95-
messageClient.addListener(listener).await()
96-
97105
awaitClose {
98-
messageClient.removeListener(listener).addOnSuccessListener { }
106+
listener?.let {
107+
messageClient.removeListener(it).addOnSuccessListener { }
108+
}
99109
}
100110
}
101111

watchface/src/main/java/com/android/developers/androidify/watchface/transfer/WearDeviceRepository.kt

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,23 +45,39 @@ class WearDeviceRepositoryImpl @Inject constructor(
4545
private val capabilityClient: CapabilityClient by lazy { Wearable.getCapabilityClient(context) }
4646

4747
override val connectedWatch = callbackFlow {
48-
val allDevices = nodeClient.connectedNodes.await().toSet()
49-
val reachableCapability =
50-
capabilityClient.getCapability(ANDROIDIFY_INSTALLED, CapabilityClient.FILTER_REACHABLE)
51-
.await()
48+
var capabilityListener: CapabilityClient.OnCapabilityChangedListener? = null
5249

53-
val installedDevices = reachableCapability.nodes.toSet()
50+
/**
51+
* Some devices don't have access to Wearable API via Play Services, so it is necessary to
52+
* check for this scenario first before trying to use the API.
53+
*/
54+
val apiAvailable = WearableApiAvailability.isAvailable(nodeClient)
55+
if (apiAvailable) {
56+
val allDevices = nodeClient.connectedNodes.await().toSet()
57+
val reachableCapability =
58+
capabilityClient.getCapability(
59+
ANDROIDIFY_INSTALLED,
60+
CapabilityClient.FILTER_REACHABLE
61+
)
62+
.await()
5463

55-
trySend(selectConnectedDevice(installedDevices, allDevices))
64+
val installedDevices = reachableCapability.nodes.toSet()
65+
trySend(selectConnectedDevice(installedDevices, allDevices))
5666

57-
val capabilityListener = CapabilityClient.OnCapabilityChangedListener { capabilityInfo ->
58-
val installedDevicesUpdated = capabilityInfo.nodes.toSet()
67+
capabilityListener =
68+
CapabilityClient.OnCapabilityChangedListener { capabilityInfo ->
69+
val installedDevicesUpdated = capabilityInfo.nodes.toSet()
5970

60-
trySend(selectConnectedDevice(installedDevicesUpdated, allDevices))
71+
trySend(selectConnectedDevice(installedDevicesUpdated, allDevices))
72+
}
73+
capabilityClient.addListener(capabilityListener, ANDROIDIFY_INSTALLED)
74+
} else {
75+
trySend(null)
6176
}
62-
capabilityClient.addListener(capabilityListener, ANDROIDIFY_INSTALLED)
6377
awaitClose {
64-
capabilityClient.removeListener(capabilityListener)
78+
capabilityListener?.let {
79+
capabilityClient.removeListener(it)
80+
}
6581
}
6682
}
6783

@@ -89,4 +105,6 @@ class WearDeviceRepositoryImpl @Inject constructor(
89105
null
90106
}
91107
}
108+
109+
private val TAG = "WearDeviceRepository"
92110
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.android.developers.androidify.watchface.transfer
2+
3+
import android.util.Log
4+
import com.google.android.gms.common.GoogleApiAvailability
5+
import com.google.android.gms.common.api.AvailabilityException
6+
import com.google.android.gms.common.api.GoogleApi
7+
import kotlinx.coroutines.tasks.await
8+
9+
/**
10+
* Checks whether a given Wearable Data Layer API is available on this device.
11+
*/
12+
object WearableApiAvailability {
13+
suspend fun isAvailable(api: GoogleApi<*>): Boolean {
14+
return try {
15+
GoogleApiAvailability.getInstance()
16+
.checkApiAvailability(api)
17+
.await()
18+
19+
true
20+
} catch (e: AvailabilityException) {
21+
Log.d(
22+
TAG,
23+
"${api.javaClass.simpleName} API is not available in this device.",
24+
)
25+
false
26+
}
27+
}
28+
29+
val TAG = "WearableApiAvailability"
30+
}

0 commit comments

Comments
 (0)