androidkotlinwear-osbatterylevel

Battery level is never updated


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

Solution

  • The battery level is taken from batteryStatus which is only set once. Take it from the intent parameter of onReceive instead.