11package io .pslab ;
22
3+ import android .content .Context ;
4+ import android .hardware .Sensor ;
5+ import android .hardware .SensorEvent ;
6+ import android .hardware .SensorEventListener ;
7+ import android .hardware .SensorManager ;
8+ import android .os .Bundle ;
9+ import android .util .Log ;
10+
11+ import androidx .annotation .NonNull ;
12+
313import io .flutter .embedding .android .FlutterActivity ;
14+ import io .flutter .embedding .engine .FlutterEngine ;
15+ import io .flutter .plugin .common .EventChannel ;
16+ import io .flutter .plugin .common .MethodCall ;
17+ import io .flutter .plugin .common .MethodChannel ;
18+
19+ public class MainActivity extends FlutterActivity implements SensorEventListener {
20+ private static final String TEMPERATURE_CHANNEL = "io.pslab/temperature" ;
21+ private static final String TEMPERATURE_STREAM = "io.pslab/temperature_stream" ;
22+ private static final String TAG = "MainActivity" ;
23+ private SensorManager sensorManager ;
24+ private Sensor temperatureSensor ;
25+ private EventChannel .EventSink temperatureEventSink ;
26+ private boolean isListening = false ;
27+ private float currentTemperature = 0.0f ;
28+
29+ @ Override
30+ public void configureFlutterEngine (@ NonNull FlutterEngine flutterEngine ) {
31+ super .configureFlutterEngine (flutterEngine );
32+
33+ sensorManager = (SensorManager ) getSystemService (Context .SENSOR_SERVICE );
34+ if (sensorManager != null ) {
35+ temperatureSensor = sensorManager .getDefaultSensor (Sensor .TYPE_AMBIENT_TEMPERATURE );
36+ }
37+
38+ MethodChannel temperatureChannel = new MethodChannel (flutterEngine .getDartExecutor ().getBinaryMessenger (), TEMPERATURE_CHANNEL );
39+ temperatureChannel .setMethodCallHandler (this ::handleMethodCall );
40+
41+ EventChannel temperatureEventChannel = new EventChannel (flutterEngine .getDartExecutor ().getBinaryMessenger (), TEMPERATURE_STREAM );
42+ temperatureEventChannel .setStreamHandler (new EventChannel .StreamHandler () {
43+ @ Override
44+ public void onListen (Object arguments , EventChannel .EventSink events ) {
45+ temperatureEventSink = events ;
46+ startTemperatureUpdates ();
47+ }
48+
49+ @ Override
50+ public void onCancel (Object arguments ) {
51+ temperatureEventSink = null ;
52+ stopTemperatureUpdates ();
53+ }
54+ });
55+ }
56+
57+ private void handleMethodCall (MethodCall call , MethodChannel .Result result ) {
58+ switch (call .method ) {
59+ case "isTemperatureSensorAvailable" :
60+ result .success (temperatureSensor != null );
61+ break ;
62+ case "getCurrentTemperature" :
63+ result .success ((double ) currentTemperature );
64+ break ;
65+ case "startTemperatureUpdates" :
66+ if (startTemperatureUpdates ()) {
67+ result .success (true );
68+ } else {
69+ result .error ("SENSOR_ERROR" , "Failed to start temperature updates" , null );
70+ }
71+ break ;
72+ case "stopTemperatureUpdates" :
73+ stopTemperatureUpdates ();
74+ result .success (true );
75+ break ;
76+ default :
77+ result .notImplemented ();
78+ break ;
79+ }
80+ }
81+
82+ private boolean startTemperatureUpdates () {
83+ if (temperatureSensor == null || sensorManager == null ) {
84+ Log .e (TAG , "Temperature sensor not available" );
85+ return false ;
86+ }
87+
88+ if (!isListening ) {
89+ boolean registered = sensorManager .registerListener (this , temperatureSensor , SensorManager .SENSOR_DELAY_NORMAL );
90+ if (registered ) {
91+ isListening = true ;
92+ Log .d (TAG , "Temperature sensor listener registered" );
93+
94+ if (currentTemperature != 0.0f && temperatureEventSink != null ) {
95+ Log .d (TAG , "Sending initial temperature to Flutter: " + currentTemperature );
96+ temperatureEventSink .success ((double ) currentTemperature );
97+ }
98+
99+ return true ;
100+ } else {
101+ Log .e (TAG , "Failed to register temperature sensor listener" );
102+ return false ;
103+ }
104+ }
105+ return true ;
106+ }
107+
108+ private void stopTemperatureUpdates () {
109+ if (isListening && sensorManager != null ) {
110+ sensorManager .unregisterListener (this , temperatureSensor );
111+ isListening = false ;
112+ Log .d (TAG , "Temperature sensor listener unregistered" );
113+ }
114+ }
115+
116+ @ Override
117+ public void onSensorChanged (SensorEvent event ) {
118+ if (event .sensor .getType () == Sensor .TYPE_AMBIENT_TEMPERATURE ) {
119+ float temperature = event .values [0 ];
120+
121+ if (isValidTemperature (temperature )) {
122+ currentTemperature = temperature ;
123+ Log .d (TAG , "Temperature updated: " + currentTemperature + "°C" );
124+
125+ if (temperatureEventSink != null ) {
126+ Log .d (TAG , "Sending temperature to Flutter: " + currentTemperature );
127+ temperatureEventSink .success ((double ) currentTemperature );
128+ }
129+ } else {
130+ Log .w (TAG , "Invalid temperature reading: " + temperature + " - ignoring" );
131+ }
132+ }
133+ }
134+
135+ private boolean isValidTemperature (float temperature ) {
136+ if (Float .isNaN (temperature ) || Float .isInfinite (temperature )) return false ;
137+ return temperature >= -273.15f && temperature <= 200f && Math .abs (temperature ) <= 1e10f ;
138+ }
139+
140+ @ Override
141+ public void onAccuracyChanged (Sensor sensor , int accuracy ) {
142+ Log .d (TAG , "Sensor accuracy changed: " + accuracy );
143+ }
144+
145+ @ Override
146+ protected void onDestroy () {
147+ super .onDestroy ();
148+ stopTemperatureUpdates ();
149+ }
150+
151+ @ Override
152+ protected void onPause () {
153+ super .onPause ();
154+ if (isListening && sensorManager != null ) {
155+ sensorManager .unregisterListener (this );
156+ }
157+ }
4158
5- public class MainActivity extends FlutterActivity {
6- }
159+ @ Override
160+ protected void onResume () {
161+ super .onResume ();
162+ if (isListening && temperatureSensor != null && sensorManager != null ) {
163+ sensorManager .registerListener (this , temperatureSensor , SensorManager .SENSOR_DELAY_NORMAL );
164+ }
165+ }
166+ }
0 commit comments