11package xyz.junerver.compose.hooks.usedeviceinfo
22
3+ import android.content.BroadcastReceiver
4+ import android.content.Context
35import android.content.Intent
46import android.content.IntentFilter
57import android.os.BatteryManager
68import androidx.compose.runtime.Composable
7- import androidx.compose.runtime.getValue
9+ import androidx.compose.runtime.Stable
10+ import androidx.compose.runtime.State
11+ import androidx.compose.runtime.produceState
812import androidx.compose.ui.platform.LocalContext
9- import xyz.junerver.compose.hooks.useState
1013
1114/*
1215 Description:
@@ -16,24 +19,29 @@ import xyz.junerver.compose.hooks.useState
1619 Version: v1.0
1720*/
1821@Composable
19- fun useBatteryInfo (): BatteryInfo {
20- val batteryStatus = LocalContext .current.registerReceiver(
21- null ,
22- IntentFilter (Intent .ACTION_BATTERY_CHANGED )
23- )
24- val level by useState {
25- val level = batteryStatus?.getIntExtra(BatteryManager .EXTRA_LEVEL , 0 ) ? : 0
26- val scale = batteryStatus?.getIntExtra(BatteryManager .EXTRA_SCALE , 0 ) ? : 0
27- (level / scale.toFloat() * 100 ).toInt()
28- }
29- val isCharging by useState {
30- val status = batteryStatus?.getIntExtra(BatteryManager .EXTRA_STATUS , - 1 ) ? : - 1
31- status == BatteryManager .BATTERY_STATUS_CHARGING || status == BatteryManager .BATTERY_STATUS_FULL
22+ fun useBatteryInfo (): State <BatteryInfo > {
23+ val context = LocalContext .current
24+ return produceState(initialValue = BatteryInfo ()) {
25+ val receiver = object : BroadcastReceiver () {
26+ override fun onReceive (context : Context ? , intent : Intent ? ) {
27+ val status = intent?.getIntExtra(BatteryManager .EXTRA_STATUS , - 1 ) ? : - 1
28+ val isCharging = status == BatteryManager .BATTERY_STATUS_CHARGING || status == BatteryManager .BATTERY_STATUS_FULL
29+ val originLevel = intent?.getIntExtra(BatteryManager .EXTRA_LEVEL , 0 ) ? : 0
30+ val scale = intent?.getIntExtra(BatteryManager .EXTRA_SCALE , 0 ) ? : 0
31+ val level = (originLevel / scale.toFloat() * 100 ).toInt()
32+ value = BatteryInfo (level, isCharging)
33+ }
34+ }
35+ context.registerReceiver(receiver, IntentFilter (Intent .ACTION_BATTERY_CHANGED ))
36+
37+ awaitDispose {
38+ context.unregisterReceiver(receiver)
39+ }
3240 }
33- return BatteryInfo (level, isCharging)
3441}
3542
43+ @Stable
3644data class BatteryInfo (
37- val level : Int ,
38- val isCharging : Boolean ,
45+ val level : Int = - 1 ,
46+ val isCharging : Boolean = false ,
3947)
0 commit comments