package expo.modules.battery
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.BatteryManager
import expo.modules.kotlin.exception.Exceptions
import expo.modules.kotlin.modules.Module
import expo.modules.kotlin.modules.ModuleDefinition
class BatteryModule : Module() {
private val context: Context
get() = appContext.reactContext ?: throw Exceptions.ReactContextLost()
private val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
sendEvent("onLevelChange", mapOf("level" to levelOf(intent)))
}
}
override fun definition() = ModuleDefinition {
Name("Battery")
Events("onLevelChange")
AsyncFunction("getLevelAsync") {
val intent = context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
intent?.let { levelOf(it) } ?: -1f
}
OnStartObserving {
context.registerReceiver(receiver, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
}
OnStopObserving {
context.unregisterReceiver(receiver)
}
}
private fun levelOf(intent: Intent): Float {
val level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
val scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
return if (level < 0 || scale <= 0) -1f else level / scale.toFloat()
}
}