package com.nativebattery
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.BatteryManager
import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.Promise
import com.facebook.react.bridge.ReactApplicationContext
class NativeBatteryModule(reactContext: ReactApplicationContext) : NativeBatterySpec(reactContext) {
private val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
emitOnLevelChange(Arguments.createMap().apply { putDouble("level", levelOf(intent)) })
}
}
override fun getName() = NAME
override fun initialize() {
super.initialize()
reactApplicationContext.registerReceiver(receiver, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
}
override fun invalidate() {
reactApplicationContext.unregisterReceiver(receiver)
super.invalidate()
}
override fun getLevel(promise: Promise) {
val intent = reactApplicationContext.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
promise.resolve(intent?.let { levelOf(it) } ?: -1.0)
}
private fun levelOf(intent: Intent): Double {
val level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
val scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
return if (level < 0 || scale <= 0) -1.0 else level / scale.toDouble()
}
companion object {
const val NAME = "NativeBattery"
}
}