Skip to content

Commit 9f33e8b

Browse files
committed
🐛: fix: #29
1 parent 2ff38bf commit 9f33e8b

3 files changed

Lines changed: 30 additions & 20 deletions

File tree

app/src/main/java/xyz/junerver/composehooks/example/UseDeviceInfoExample.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import androidx.compose.material3.Surface
1010
import androidx.compose.material3.Switch
1111
import androidx.compose.material3.Text
1212
import androidx.compose.runtime.Composable
13+
import androidx.compose.runtime.getValue
1314
import androidx.compose.ui.Modifier
1415
import androidx.compose.ui.unit.dp
1516
import xyz.junerver.compose.hooks.useDisableScreenshot
@@ -32,7 +33,7 @@ import xyz.junerver.composehooks.ui.component.TButton
3233
*/
3334
@Composable
3435
fun UseDeviceInfoExample() {
35-
val batteryInfo = useBatteryInfo()
36+
val batteryInfo by useBatteryInfo()
3637
val buildInfo = useBuildInfo()
3738
val screenInfo = useScreenInfo()
3839
val (disable, enable, isDisable) = useDisableScreenshot()

hooks/src/main/kotlin/xyz/junerver/compose/hooks/declare.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package xyz.junerver.compose.hooks
55
import android.hardware.Sensor
66
import android.hardware.SensorEvent
77
import androidx.compose.runtime.Composable
8+
import androidx.compose.runtime.State
89
import arrow.core.Either
910
import arrow.core.Tuple4
1011
import arrow.core.Tuple5
@@ -32,7 +33,7 @@ import xyz.junerver.kotlin.Tuple3
3233

3334
//region useDeviceInfo
3435
@Composable
35-
fun rememberBatteryInfo(): BatteryInfo = useBatteryInfo()
36+
fun rememberBatteryInfo(): State<BatteryInfo> = useBatteryInfo()
3637

3738
@Composable
3839
fun rememberBuildInfo(): BuildInfo = useBuildInfo()
Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package xyz.junerver.compose.hooks.usedeviceinfo
22

3+
import android.content.BroadcastReceiver
4+
import android.content.Context
35
import android.content.Intent
46
import android.content.IntentFilter
57
import android.os.BatteryManager
68
import 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
812
import 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
3644
data class BatteryInfo(
37-
val level: Int,
38-
val isCharging: Boolean,
45+
val level: Int = -1,
46+
val isCharging: Boolean = false,
3947
)

0 commit comments

Comments
 (0)