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))
+ }
}