1+ package listener
2+
3+ import android.content.BroadcastReceiver
4+ import android.content.Context
5+ import android.content.Intent
6+ import android.content.Intent.ACTION_BATTERY_CHANGED
7+ import android.content.IntentFilter
8+ import android.os.BatteryManager
9+ import android.os.BatteryManager.BATTERY_STATUS_CHARGING
10+ import android.os.BatteryManager.BATTERY_STATUS_DISCHARGING
11+ import android.os.BatteryManager.BATTERY_STATUS_FULL
12+ import android.os.BatteryManager.BATTERY_STATUS_NOT_CHARGING
13+ import android.os.Build
14+ import android.os.PowerManager
15+ import androidx.annotation.RequiresApi
16+ import io.flutter.plugin.common.EventChannel
17+ import sncf.connect.tech.flutter_eco_mode.BatteryState.CHARGING
18+ import sncf.connect.tech.flutter_eco_mode.BatteryState.DISCHARGING
19+ import sncf.connect.tech.flutter_eco_mode.BatteryState.FULL
20+ import sncf.connect.tech.flutter_eco_mode.BatteryState.UNKNOWN
21+
22+ class PowerModeStreamHandler (private val context : Context ) : EventChannel.StreamHandler {
23+
24+ private var lowPowerModeEventSink: EventChannel .EventSink ? = null
25+ private var powerSavingReceiver: BroadcastReceiver ? = null
26+
27+ override fun onListen (arguments : Any? , events : EventChannel .EventSink ? ) {
28+ lowPowerModeEventSink = events
29+
30+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .LOLLIPOP ) {
31+ setupPowerSavingReceiver()
32+ }
33+ }
34+
35+ override fun onCancel (p0 : Any? ) {
36+ context.unregisterReceiver(powerSavingReceiver)
37+ }
38+
39+ @RequiresApi(Build .VERSION_CODES .LOLLIPOP )
40+ private fun setupPowerSavingReceiver () {
41+ powerSavingReceiver = object : BroadcastReceiver () {
42+ override fun onReceive (context : Context , intent : Intent ? ) {
43+ val powerManager = context.getSystemService(Context .POWER_SERVICE ) as PowerManager
44+ lowPowerModeEventSink?.success(powerManager.isPowerSaveMode)
45+ }
46+ }
47+ val filter = IntentFilter (PowerManager .ACTION_POWER_SAVE_MODE_CHANGED )
48+ context.registerReceiver(powerSavingReceiver, filter)
49+ }
50+
51+ }
52+
53+ class BatteryStateStreamHandler (private val context : Context ) : EventChannel.StreamHandler {
54+
55+ private var batteryStateEventSink: EventChannel .EventSink ? = null
56+ private var batteryStateReceiver: BroadcastReceiver ? = null
57+
58+ override fun onListen (arguments : Any? , events : EventChannel .EventSink ? ) {
59+ batteryStateEventSink = events
60+
61+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .M ) {
62+ setupBatteryStateReceiver()
63+ }
64+ }
65+
66+ override fun onCancel (p0 : Any? ) {
67+ context.unregisterReceiver(batteryStateReceiver)
68+ }
69+
70+ @RequiresApi(Build .VERSION_CODES .M )
71+ private fun setupBatteryStateReceiver () {
72+ batteryStateReceiver = object : BroadcastReceiver () {
73+ override fun onReceive (context : Context , intent : Intent ? ) {
74+ val event = when (intent?.action) {
75+ ACTION_BATTERY_CHANGED ->
76+ when (intent.getIntExtra(BatteryManager .EXTRA_STATUS , - 1 )) {
77+ BATTERY_STATUS_CHARGING -> CHARGING .name
78+ BATTERY_STATUS_FULL -> FULL .name
79+ BATTERY_STATUS_DISCHARGING , BATTERY_STATUS_NOT_CHARGING -> DISCHARGING .name
80+ else -> UNKNOWN .name
81+ }
82+
83+ else -> DISCHARGING .name
84+ }
85+ batteryStateEventSink?.success(event)
86+ }
87+ }
88+ val filterBatteryState = IntentFilter ()
89+ filterBatteryState.addAction(ACTION_BATTERY_CHANGED )
90+ context.registerReceiver(batteryStateReceiver, filterBatteryState)
91+ }
92+
93+ }
94+
95+ class BatteryLevelStreamHandler (private val context : Context ) : EventChannel.StreamHandler {
96+
97+ private var batteryLevelEventSink: EventChannel .EventSink ? = null
98+ private var batteryLevelReceiver: BroadcastReceiver ? = null
99+
100+ override fun onListen (arguments : Any? , events : EventChannel .EventSink ? ) {
101+ batteryLevelEventSink = events
102+
103+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .LOLLIPOP ) {
104+ setupBatteryLevelReceiver()
105+ }
106+ }
107+
108+ override fun onCancel (p0 : Any? ) {
109+ context.unregisterReceiver(batteryLevelReceiver)
110+ }
111+
112+
113+ @RequiresApi(Build .VERSION_CODES .LOLLIPOP )
114+ private fun setupBatteryLevelReceiver () {
115+
116+ batteryLevelReceiver = object : BroadcastReceiver () {
117+
118+ override fun onReceive (context : Context , intent : Intent ? ) {
119+ val batteryPct = intent?.let { i ->
120+ val level: Int = i.getIntExtra(BatteryManager .EXTRA_LEVEL , - 1 )
121+ val scale: Int = i.getIntExtra(BatteryManager .EXTRA_SCALE , - 1 )
122+ level * 100 / scale.toFloat()
123+ }
124+ batteryLevelEventSink?.success(batteryPct?.toDouble())
125+ }
126+ }
127+ val filter = IntentFilter (ACTION_BATTERY_CHANGED )
128+ context.registerReceiver(batteryLevelReceiver, filter)
129+
130+ }
131+
132+ }
0 commit comments