package com.margelo.nitro.battery
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.BatteryManager
import androidx.annotation.Keep
import com.facebook.proguard.annotations.DoNotStrip
import com.margelo.nitro.NitroModules
import com.margelo.nitro.core.Promise
@Keep
@DoNotStrip
class HybridBattery : HybridBatterySpec() {
private val context: Context
get() = NitroModules.applicationContext ?: throw IllegalStateException("React Native is not ready")
override fun getLevel(): Promise<Double> = Promise.async {
val intent = context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
intent?.let { levelOf(it) } ?: -1.0
}
override fun addListener(onChange: (level: Double) -> Unit): () -> Unit {
val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
onChange(levelOf(intent))
}
}
context.registerReceiver(receiver, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
return { context.unregisterReceiver(receiver) }
}
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()
}
}