I want to display the current watch battery level in my watch face. While the value is determined exactly once and then displayed in my watch face correctly, that value is then never updated. The only way to get a new value displayed is either reinstalling the APK through Android Studio or selecting another watch face first.
I think I followed the tutorial code closely. Here's the relevant parts of my CanvasWatchFaceService.Engine
class:
inner class Engine : CanvasWatchFaceService.Engine() {
private lateinit var batteryBroadcastReceiver: BroadcastReceiver
private lateinit var batteryStatus: Intent
private var watchBatteryLevel: Int = -1
override fun onCreate(holder: SurfaceHolder) {
super.onCreate(holder)
setWatchFaceStyle(WatchFaceStyle.Builder(this@MyWatchFaceService)
.setAcceptsTapEvents(true)
.build())
val intentFilter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
batteryBroadcastReceiver = object: BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
watchBatteryLevel = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
invalidate()
}
}
batteryStatus = registerReceiver(batteryBroadcastReceiver, intentFilter)
}
override fun onDestroy() {
mUpdateTimeHandler.removeMessages(MSG_UPDATE_TIME)
unregisterReceiver(batteryBroadcastReceiver)
super.onDestroy()
}
override fun onDraw(canvas: Canvas, bounds: Rect) {
val batteryText = String.format("%d %%", watchBatteryLevel)
canvas.drawText(batteryText, width * 0.5f, width * 0.15f, mBatteryPaint)
}
}
The battery level is taken from batteryStatus
which is only set once. Take it from the intent
parameter of onReceive
instead.