[go: nahoru, domu]

Ensure onDestroy properly unregisters watchface instance

Previouly directBoot init was not setting interactiveInstanceId so onDestroy did not unregister, leading to crashes when the watchface was switched.

Test: Manual testsing & presubmit
Change-Id: I31a4eab63ff8fac5e7d19e35b1977fa51d9af5f1
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
index c827555..e9c4b6e 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
@@ -382,8 +382,6 @@
                     )
                     keepSerializedDirectBootParamsUpdated(pendingWallpaperInstance.params)
                 }
-
-                interactiveInstanceId = pendingWallpaperInstance.params.instanceId
             }
         }
 
@@ -898,6 +896,7 @@
 
             val instance = InteractiveWatchFaceImpl(this, params.instanceId, uiThreadHandler)
             InteractiveInstanceManager.addInstance(instance)
+            interactiveInstanceId = params.instanceId
 
             // WatchFace init is async so its possible we have a pending
             // WallpaperInteractiveWatchFaceInstance request.
diff --git a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
index 28a81c3..909adf1 100644
--- a/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
+++ b/wear/wear-watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
@@ -121,4 +121,4 @@
             engine.watchFaceImpl.complicationsManager.bringAttentionToComplication(id)
         }
     }
-}
\ No newline at end of file
+}
diff --git a/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt b/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
index 7785388..6ad5e06 100644
--- a/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
+++ b/wear/wear-watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
@@ -60,6 +60,7 @@
 import com.nhaarman.mockitokotlin2.mock
 import org.junit.After
 import org.junit.Assert.assertFalse
+import org.junit.Assert.assertNull
 import org.junit.Assert.assertTrue
 import org.junit.Before
 import org.junit.Test
@@ -2141,4 +2142,29 @@
         // initialized to false (as opposed to null).
         assertThat(watchState.isAmbient.value).isFalse()
     }
+
+    @Test
+    fun onDestroy_clearsInstanceRecord() {
+        val instanceId = "interactiveInstanceId"
+        initWallpaperInteractiveWatchFaceInstance(
+            WatchFaceType.ANALOG,
+            emptyList(),
+            UserStyleSchema(listOf(colorStyleSetting, watchHandStyleSetting)),
+            WallpaperInteractiveWatchFaceInstanceParams(
+                instanceId,
+                DeviceConfig(
+                    false,
+                    false,
+                    0,
+                    0
+                ),
+                SystemState(false, 0),
+                UserStyle(hashMapOf(colorStyleSetting to blueStyleOption)).toWireFormat(),
+                null
+            )
+        )
+        engineWrapper.onDestroy()
+
+        assertNull(InteractiveInstanceManager.getAndRetainInstance(instanceId))
+    }
 }