Merge "InteractiveWatchFaceClientImpl.isConnectionAlive to be false after close" into androidx-main
diff --git a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
index 144992a..435cb4e 100644
--- a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
+++ b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
@@ -1251,6 +1251,28 @@
interactiveInstance.close()
}
}
+
+ @Test
+ fun isConnectionAlive_false_after_close() {
+ val deferredInteractiveInstance = handlerCoroutineScope.async {
+ service.getOrCreateInteractiveWatchFaceClient(
+ "testId",
+ deviceConfig,
+ systemState,
+ null,
+ complications
+ )
+ }
+
+ // Create the engine which triggers creation of InteractiveWatchFaceClient.
+ createEngine()
+
+ val interactiveInstance = awaitWithTimeout(deferredInteractiveInstance)
+ assertThat(interactiveInstance.isConnectionAlive()).isTrue()
+
+ interactiveInstance.close()
+ assertThat(interactiveInstance.isConnectionAlive()).isFalse()
+ }
}
internal class TestExampleCanvasAnalogWatchFaceService(
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt
index 3f7b551..1a3a85a 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt
@@ -257,6 +257,7 @@
private val readyListeners =
HashMap<InteractiveWatchFaceClient.OnWatchFaceReadyListener, Executor>()
private var watchfaceReadyListenerRegistered = false
+ private var closed = false
init {
iInteractiveWatchFace.asBinder().linkToDeath(
@@ -347,6 +348,9 @@
override fun close() = TraceEvent("InteractiveWatchFaceClientImpl.close").use {
iInteractiveWatchFace.release()
+ synchronized(lock) {
+ closed = true
+ }
}
override fun sendTouchEvent(
@@ -405,7 +409,8 @@
}
}
- override fun isConnectionAlive() = iInteractiveWatchFace.asBinder().isBinderAlive
+ override fun isConnectionAlive() =
+ iInteractiveWatchFace.asBinder().isBinderAlive && synchronized(lock) { !closed }
private fun registerWatchfaceReadyListener() {
if (watchfaceReadyListenerRegistered) {