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) {