diff --git a/README.md b/README.md index 980bc7c570..6a913c1d42 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ package, such as CFBundleVersion on iOS or versionCode on Android. > [![sensors_plus][sensors_plus_badge_pub]][sensors_plus] [![pub points][sensors_plus_badge_pub_points]][sensors_plus_pub_points] -Flutter plugin for accessing accelerometer, gyroscope, and magnetometer sensors. +Flutter plugin for accessing accelerometer, gyroscope, magnetometer and barometer sensors. [[View Source][sensors_plus_code]] diff --git a/packages/sensors_plus/sensors_plus/README.md b/packages/sensors_plus/sensors_plus/README.md index 41696c0ef2..f8bc215980 100644 --- a/packages/sensors_plus/sensors_plus/README.md +++ b/packages/sensors_plus/sensors_plus/README.md @@ -6,8 +6,8 @@ [](https://flutter.dev/docs/development/packages-and-plugins/favorites) -A Flutter plugin to access the accelerometer, gyroscope, and magnetometer -sensors. +A Flutter plugin to access the accelerometer, gyroscope, magnetometer and +barometer sensors. ## Platform Support @@ -54,9 +54,11 @@ This will expose such classes of sensor events through a set of streams: - `GyroscopeEvent` describes the rotation of the device. - `MagnetometerEvent` describes the ambient magnetic field surrounding the device. A compass is an example usage of this data. +- `BarometerEvent` describes the atmospheric pressure surrounding the device. + An altimeter is an example usage of this data. Not supported on web browsers. These events are exposed through a `BroadcastStream`: `accelerometerEvents`, -`userAccelerometerEvents`, `gyroscopeEvents`, and `magnetometerEvents`, +`userAccelerometerEvents`, `gyroscopeEvents`, `magnetometerEvents`, and `barometerEvents`, respectively. > [!NOTE] @@ -116,6 +118,18 @@ magnetometerEvents.listen( cancelOnError: true, ); // [MagnetometerEvent (x: -23.6, y: 6.2, z: -34.9)] + +barometerEvents.listen( + (BarometerEvent event) { + print(event); + }, + onError: (error) { + // Logic to handle error + // Needed for Android in case sensor is not available + }, + cancelOnError: true, +); +// [BarometerEvent (pressure: 1000.0)] ``` Alternatively, every stream allows to specify the sampling rate for its sensor using one of predefined constants or using a custom value diff --git a/packages/sensors_plus/sensors_plus/android/src/main/kotlin/dev/fluttercommunity/plus/sensors/SensorsPlugin.kt b/packages/sensors_plus/sensors_plus/android/src/main/kotlin/dev/fluttercommunity/plus/sensors/SensorsPlugin.kt index 52c4da1890..3436670795 100644 --- a/packages/sensors_plus/sensors_plus/android/src/main/kotlin/dev/fluttercommunity/plus/sensors/SensorsPlugin.kt +++ b/packages/sensors_plus/sensors_plus/android/src/main/kotlin/dev/fluttercommunity/plus/sensors/SensorsPlugin.kt @@ -17,11 +17,13 @@ class SensorsPlugin : FlutterPlugin { private lateinit var userAccelChannel: EventChannel private lateinit var gyroscopeChannel: EventChannel private lateinit var magnetometerChannel: EventChannel + private lateinit var barometerChannel: EventChannel private lateinit var accelerometerStreamHandler: StreamHandlerImpl private lateinit var userAccelStreamHandler: StreamHandlerImpl private lateinit var gyroscopeStreamHandler: StreamHandlerImpl private lateinit var magnetometerStreamHandler: StreamHandlerImpl + private lateinit var barometerStreamHandler: StreamHandlerImpl override fun onAttachedToEngine(binding: FlutterPluginBinding) { setupMethodChannel(binding.binaryMessenger) @@ -41,6 +43,7 @@ class SensorsPlugin : FlutterPlugin { "setUserAccelerometerSamplingPeriod" -> userAccelStreamHandler "setGyroscopeSamplingPeriod" -> gyroscopeStreamHandler "setMagnetometerSamplingPeriod" -> magnetometerStreamHandler + "setBarometerSamplingPeriod" -> barometerStreamHandler else -> null } streamHandler?.samplingPeriod = call.arguments as Int @@ -86,6 +89,13 @@ class SensorsPlugin : FlutterPlugin { Sensor.TYPE_MAGNETIC_FIELD ) magnetometerChannel.setStreamHandler(magnetometerStreamHandler) + + barometerChannel = EventChannel(messenger, BAROMETER_CHANNEL_NAME) + barometerStreamHandler = StreamHandlerImpl( + sensorsManager, + Sensor.TYPE_PRESSURE + ) + barometerChannel.setStreamHandler(barometerStreamHandler) } private fun teardownEventChannels() { @@ -93,11 +103,13 @@ class SensorsPlugin : FlutterPlugin { userAccelChannel.setStreamHandler(null) gyroscopeChannel.setStreamHandler(null) magnetometerChannel.setStreamHandler(null) + barometerChannel.setStreamHandler(null) accelerometerStreamHandler.onCancel(null) userAccelStreamHandler.onCancel(null) gyroscopeStreamHandler.onCancel(null) magnetometerStreamHandler.onCancel(null) + barometerStreamHandler.onCancel(null) } companion object { @@ -111,5 +123,7 @@ class SensorsPlugin : FlutterPlugin { "dev.fluttercommunity.plus/sensors/user_accel" private const val MAGNETOMETER_CHANNEL_NAME = "dev.fluttercommunity.plus/sensors/magnetometer" + private const val BAROMETER_CHANNEL_NAME = + "dev.fluttercommunity.plus/sensors/barometer" } } diff --git a/packages/sensors_plus/sensors_plus/android/src/main/kotlin/dev/fluttercommunity/plus/sensors/StreamHandlerImpl.kt b/packages/sensors_plus/sensors_plus/android/src/main/kotlin/dev/fluttercommunity/plus/sensors/StreamHandlerImpl.kt index 54669e2b39..ffbfefee1f 100644 --- a/packages/sensors_plus/sensors_plus/android/src/main/kotlin/dev/fluttercommunity/plus/sensors/StreamHandlerImpl.kt +++ b/packages/sensors_plus/sensors_plus/android/src/main/kotlin/dev/fluttercommunity/plus/sensors/StreamHandlerImpl.kt @@ -55,6 +55,7 @@ internal class StreamHandlerImpl( Sensor.TYPE_LINEAR_ACCELERATION -> "User Accelerometer" Sensor.TYPE_GYROSCOPE -> "Gyroscope" Sensor.TYPE_MAGNETIC_FIELD -> "Magnetometer" + Sensor.TYPE_PRESSURE -> "Barometer" else -> "Undefined" } } diff --git a/packages/sensors_plus/sensors_plus/example/ios/Runner/Info.plist b/packages/sensors_plus/sensors_plus/example/ios/Runner/Info.plist index 59163fe712..72a51b61b5 100644 --- a/packages/sensors_plus/sensors_plus/example/ios/Runner/Info.plist +++ b/packages/sensors_plus/sensors_plus/example/ios/Runner/Info.plist @@ -24,6 +24,10 @@ $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS + NSMotionUsageDescription + This app requires access to motion data as an example for the sensors plugin. + UIApplicationSupportsIndirectInputEvents + UILaunchStoryboardName LaunchScreen UIMainStoryboardFile diff --git a/packages/sensors_plus/sensors_plus/example/lib/main.dart b/packages/sensors_plus/sensors_plus/example/lib/main.dart index 67ab098cd9..f3334a3840 100644 --- a/packages/sensors_plus/sensors_plus/example/lib/main.dart +++ b/packages/sensors_plus/sensors_plus/example/lib/main.dart @@ -60,16 +60,19 @@ class _MyHomePageState extends State { AccelerometerEvent? _accelerometerEvent; GyroscopeEvent? _gyroscopeEvent; MagnetometerEvent? _magnetometerEvent; + BarometerEvent? _barometerEvent; DateTime? _userAccelerometerUpdateTime; DateTime? _accelerometerUpdateTime; DateTime? _gyroscopeUpdateTime; DateTime? _magnetometerUpdateTime; + DateTime? _barometerUpdateTime; int? _userAccelerometerLastInterval; int? _accelerometerLastInterval; int? _gyroscopeLastInterval; int? _magnetometerLastInterval; + int? _barometerLastInterval; final _streamSubscriptions = >[]; Duration sensorInterval = SensorInterval.normalInterval; @@ -101,7 +104,7 @@ class _MyHomePageState extends State { ), ), Padding( - padding: const EdgeInsets.all(20.0), + padding: const EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 0.0), child: Table( columnWidths: const { 0: FlexColumnWidth(4), @@ -169,6 +172,35 @@ class _MyHomePageState extends State { ], ), ), + Padding( + padding: const EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 20.0), + child: Table( + columnWidths: const { + 0: FlexColumnWidth(4), + 1: FlexColumnWidth(3), + 2: FlexColumnWidth(2), + }, + children: [ + const TableRow( + children: [ + SizedBox.shrink(), + Text('Pressure'), + Text('Interval'), + ], + ), + TableRow( + children: [ + const Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Text('Barometer'), + ), + Text(_barometerEvent?.pressure.toStringAsFixed(1) ?? '?'), + Text('${_barometerLastInterval?.toString() ?? '?'} ms'), + ], + ), + ], + ), + ), Column( mainAxisSize: MainAxisSize.min, children: [ @@ -209,6 +241,7 @@ class _MyHomePageState extends State { accelerometerEventStream(samplingPeriod: sensorInterval); gyroscopeEventStream(samplingPeriod: sensorInterval); magnetometerEventStream(samplingPeriod: sensorInterval); + barometerEventStream(samplingPeriod: sensorInterval); }); }, ), @@ -346,5 +379,34 @@ class _MyHomePageState extends State { cancelOnError: true, ), ); + _streamSubscriptions.add( + barometerEventStream(samplingPeriod: sensorInterval).listen( + (BarometerEvent event) { + final now = DateTime.now(); + setState(() { + _barometerEvent = event; + if (_barometerUpdateTime != null) { + final interval = now.difference(_barometerUpdateTime!); + if (interval > _ignoreDuration) { + _barometerLastInterval = interval.inMilliseconds; + } + } + }); + _barometerUpdateTime = now; + }, + onError: (e) { + showDialog( + context: context, + builder: (context) { + return const AlertDialog( + title: Text("Sensor Not Found"), + content: Text( + "It seems that your device doesn't support Barometer Sensor"), + ); + }); + }, + cancelOnError: true, + ), + ); } } diff --git a/packages/sensors_plus/sensors_plus/ios/Classes/FPPSensorsPlusPlugin.swift b/packages/sensors_plus/sensors_plus/ios/Classes/FPPSensorsPlusPlugin.swift index a31e1ec9f3..2b2695ff08 100644 --- a/packages/sensors_plus/sensors_plus/ios/Classes/FPPSensorsPlusPlugin.swift +++ b/packages/sensors_plus/sensors_plus/ios/Classes/FPPSensorsPlusPlugin.swift @@ -51,6 +51,16 @@ public class FPPSensorsPlusPlugin: NSObject, FlutterPlugin { _eventChannels[magnetometerStreamHandlerName] = magnetometerChannel _streamHandlers[magnetometerStreamHandlerName] = magnetometerStreamHandler + let barometerStreamHandler = FPPBarometerStreamHandlerPlus() + let barometerStreamHandlerName = "dev.fluttercommunity.plus/sensors/barometer" + let barometerChannel = FlutterEventChannel( + name: barometerStreamHandlerName, + binaryMessenger: registrar.messenger() + ) + barometerChannel.setStreamHandler(barometerStreamHandler) + _eventChannels[barometerStreamHandlerName] = barometerChannel + _streamHandlers[barometerStreamHandlerName] = barometerStreamHandler + let methodChannel = FlutterMethodChannel( name: "dev.fluttercommunity.plus/sensors/method", binaryMessenger: registrar.messenger() @@ -66,6 +76,8 @@ public class FPPSensorsPlusPlugin: NSObject, FlutterPlugin { streamHandler = _streamHandlers[gyroscopeStreamHandlerName] case "setMagnetometerSamplingPeriod": streamHandler = _streamHandlers[magnetometerStreamHandlerName] + case "setBarometerSamplingPeriod": + streamHandler = _streamHandlers[barometerStreamHandlerName] default: return result(FlutterMethodNotImplemented) } diff --git a/packages/sensors_plus/sensors_plus/ios/Classes/FPPStreamHandlerPlus.swift b/packages/sensors_plus/sensors_plus/ios/Classes/FPPStreamHandlerPlus.swift index fa64accc40..e7b335df2d 100644 --- a/packages/sensors_plus/sensors_plus/ios/Classes/FPPStreamHandlerPlus.swift +++ b/packages/sensors_plus/sensors_plus/ios/Classes/FPPStreamHandlerPlus.swift @@ -9,6 +9,7 @@ import CoreMotion let GRAVITY = 9.81 var _motionManager: CMMotionManager! +var _altimeter: CMAltimeter! public protocol MotionStreamHandler: FlutterStreamHandler { var samplingPeriod: Int { get set } @@ -24,6 +25,12 @@ func _initMotionManager() { } } +func _initAltimeter() { + if (_altimeter == nil) { + _altimeter = CMAltimeter() + } +} + func sendTriplet(x: Float64, y: Float64, z: Float64, sink: @escaping FlutterEventSink) { if _isCleanUp { return @@ -219,3 +226,59 @@ class FPPMagnetometerStreamHandlerPlus: NSObject, MotionStreamHandler { FPPSensorsPlusPlugin._cleanUp() } } + +class FPPBarometerStreamHandlerPlus: NSObject, MotionStreamHandler { + + var samplingPeriod = 200000 { + didSet { + _initAltimeter() + // Note: CMAltimeter does not provide a way to set the sampling period directly. + // The sampling period would typically be managed by starting/stopping the updates. + } + } + + func onListen( + withArguments arguments: Any?, + eventSink sink: @escaping FlutterEventSink + ) -> FlutterError? { + _initAltimeter() + if CMAltimeter.isRelativeAltitudeAvailable() { + _altimeter.startRelativeAltitudeUpdates(to: OperationQueue()) { data, error in + if _isCleanUp { + return + } + if (error != nil) { + sink(FlutterError( + code: "UNAVAILABLE", + message: error!.localizedDescription, + details: nil + )) + return + } + let pressure = data!.pressure.doubleValue * 10.0 // kPa to hPa (hectopascals) + DispatchQueue.main.async { + let pressureArray: [Double] = [pressure] + pressureArray.withUnsafeBufferPointer { buffer in + sink(FlutterStandardTypedData.init(float64: Data(buffer: buffer))) + } + } + } + } else { + return FlutterError( + code: "UNAVAILABLE", + message: "Barometer is not available on this device", + details: nil + ) + } + return nil + } + + func onCancel(withArguments arguments: Any?) -> FlutterError? { + _altimeter.stopRelativeAltitudeUpdates() + return nil + } + + func dealloc() { + FPPSensorsPlusPlugin._cleanUp() + } +} diff --git a/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec b/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec index 0bdb8fd494..5665106d70 100644 --- a/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec +++ b/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec @@ -7,7 +7,7 @@ Pod::Spec.new do |s| s.version = '0.0.1' s.summary = 'Flutter Sensors' s.description = <<-DESC -Flutter plugin to access the accelerometer, gyroscope, and magnetometer sensors. +Flutter plugin to access the accelerometer, gyroscope, magnetometer and barometer sensors. DESC s.homepage = 'https://github.com/fluttercommunity/plus_plugins' s.license = { :type => 'BSD', :file => '../LICENSE' } diff --git a/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart b/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart index 5e6d95496a..5739bb8f8b 100644 --- a/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart +++ b/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart @@ -68,3 +68,12 @@ Stream magnetometerEventStream({ }) { return _sensors.magnetometerEventStream(samplingPeriod: samplingPeriod); } + +/// Returns a broadcast stream of events from the device barometer at the +/// given sampling frequency. +@override +Stream barometerEventStream({ + Duration samplingPeriod = SensorInterval.normalInterval, +}) { + return _sensors.barometerEventStream(samplingPeriod: samplingPeriod); +} diff --git a/packages/sensors_plus/sensors_plus/lib/src/sensors.dart b/packages/sensors_plus/sensors_plus/lib/src/sensors.dart index 520d0b4f4f..2caf36b3da 100644 --- a/packages/sensors_plus/sensors_plus/lib/src/sensors.dart +++ b/packages/sensors_plus/sensors_plus/lib/src/sensors.dart @@ -65,4 +65,17 @@ class Sensors extends SensorsPlatform { }) { return _platform.magnetometerEventStream(samplingPeriod: samplingPeriod); } + + /// Returns a broadcast stream of events from the device barometer at the + /// given sampling frequency. + /// + /// This method always returning the same stream. If this method is called + /// again, the sampling period of the stream will be update. All previous + /// listener will also be affected. + @override + Stream barometerEventStream({ + Duration samplingPeriod = SensorInterval.normalInterval, + }) { + return _platform.barometerEventStream(samplingPeriod: samplingPeriod); + } } diff --git a/packages/sensors_plus/sensors_plus/lib/src/sensors_plus_web.dart b/packages/sensors_plus/sensors_plus/lib/src/sensors_plus_web.dart index 6f0b72503b..4dbc8e8723 100644 --- a/packages/sensors_plus/sensors_plus/lib/src/sensors_plus_web.dart +++ b/packages/sensors_plus/sensors_plus/lib/src/sensors_plus_web.dart @@ -67,3 +67,12 @@ Stream magnetometerEventStream({ }) { return _sensors.magnetometerEventStream(samplingPeriod: samplingPeriod); } + +/// Returns a broadcast stream of events from the device barometer at the +/// given sampling frequency. +@override +Stream barometerEventStream({ + Duration samplingPeriod = SensorInterval.normalInterval, +}) { + return _sensors.barometerEventStream(samplingPeriod: samplingPeriod); +} diff --git a/packages/sensors_plus/sensors_plus/lib/src/web_sensors.dart b/packages/sensors_plus/sensors_plus/lib/src/web_sensors.dart index e14b81f91e..d9b9c6badb 100644 --- a/packages/sensors_plus/sensors_plus/lib/src/web_sensors.dart +++ b/packages/sensors_plus/sensors_plus/lib/src/web_sensors.dart @@ -274,6 +274,15 @@ class WebSensorsPlugin extends SensorsPlatform { return _magnetometerResultStream; } + + @override + Stream barometerEventStream({ + Duration samplingPeriod = SensorInterval.normalInterval, + }) { + // The Barometer API does not exist and so is not supported by any modern browser. + // Therefore, we simply return an empty stream. + return const Stream.empty(); + } } extension on Duration { diff --git a/packages/sensors_plus/sensors_plus/test/sensors_test.dart b/packages/sensors_plus/sensors_plus/test/sensors_test.dart index 5700a17aa8..a250c41531 100644 --- a/packages/sensors_plus/sensors_plus/test/sensors_test.dart +++ b/packages/sensors_plus/sensors_plus/test/sensors_test.dart @@ -62,6 +62,17 @@ void main() { expect(event.y, sensorData[1]); expect(event.z, sensorData[2]); }); + + test('barometerEvents are streamed', () async { + const channelName = 'dev.fluttercommunity.plus/sensors/barometer'; + const sensorData = [1000.0]; + _initializeFakeMethodChannel('setBarometerSamplingPeriod'); + _initializeFakeSensorChannel(channelName, sensorData); + + final event = await barometerEventStream().first; + + expect(event.pressure, sensorData[0]); + }); } void _initializeFakeMethodChannel(String methodName) { diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart index ebfd62ef4e..a8ac66824f 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart @@ -13,11 +13,13 @@ import 'src/accelerometer_event.dart'; import 'src/gyroscope_event.dart'; import 'src/magnetometer_event.dart'; import 'src/user_accelerometer_event.dart'; +import 'src/barometer_event.dart'; export 'src/accelerometer_event.dart'; export 'src/gyroscope_event.dart'; export 'src/magnetometer_event.dart'; export 'src/user_accelerometer_event.dart'; +export 'src/barometer_event.dart'; export 'src/sensor_interval.dart'; /// The common platform interface for sensors. @@ -102,4 +104,12 @@ abstract class SensorsPlatform extends PlatformInterface { }) { throw UnimplementedError('magnetometerEvents has not been implemented.'); } + + /// Returns a broadcast stream of events from the device barometer at the + /// given sampling frequency. + Stream barometerEventStream({ + Duration samplingPeriod = SensorInterval.normalInterval, + }) { + throw UnimplementedError('barometerEvents has not been implemented.'); + } } diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/barometer_event.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/barometer_event.dart new file mode 100644 index 0000000000..c87722be2f --- /dev/null +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/barometer_event.dart @@ -0,0 +1,26 @@ +/// A sensor sample from a barometer. +/// +/// Barometers measure the atmospheric pressure surrounding the sensor, +/// returning values in hectopascals ***hPa***. +/// +/// Consider that these samples may be affected by altitude and weather +/// conditions, and can be used to predict short-term weather changes or +/// determine altitude. +/// +/// Note that water-resistant phones or similar sealed devices may experience +/// pressure fluctuations as the device is held or used, due to changes in +/// pressure caused by handling the device. +/// +/// An altimeter is an example of a general utility for barometer data. +class BarometerEvent { + /// Constructs a new instance with the given [pressure] value. + /// + /// See [BarometerEvent] for more information. + BarometerEvent(this.pressure); + + /// The atmospheric pressure surrounding the sensor in hectopascals ***hPa***. + final double pressure; + + @override + String toString() => '[BarometerEvent (pressure: $pressure hPa)]'; +} diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart index 442c5fa151..b454096e1c 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart @@ -25,11 +25,15 @@ class MethodChannelSensors extends SensorsPlatform { static const EventChannel _magnetometerEventChannel = EventChannel('dev.fluttercommunity.plus/sensors/magnetometer'); + static const EventChannel _barometerEventChannel = + EventChannel('dev.fluttercommunity.plus/sensors/barometer'); + final logger = Logger('MethodChannelSensors'); Stream? _accelerometerEvents; Stream? _gyroscopeEvents; Stream? _userAccelerometerEvents; Stream? _magnetometerEvents; + Stream? _barometerEvents; /// Returns a broadcast stream of events from the device accelerometer at the /// given sampling frequency. @@ -133,4 +137,29 @@ class MethodChannelSensors extends SensorsPlatform { }); return _magnetometerEvents!; } + + /// Returns a broadcast stream of events from the device barometer at the + /// given sampling frequency. + @override + Stream barometerEventStream({ + Duration samplingPeriod = SensorInterval.normalInterval, + }) { + var microseconds = samplingPeriod.inMicroseconds; + if (microseconds >= 1 && microseconds <= 3) { + logger.warning('The SamplingPeriod is currently set to $microsecondsμs, ' + 'which is a reserved value in Android. Please consider changing it ' + 'to either 0 or 4μs. See https://developer.android.com/reference/' + 'android/hardware/SensorManager#registerListener(android.hardware.' + 'SensorEventListener,%20android.hardware.Sensor,%20int) for more ' + 'information'); + microseconds = 0; + } + _methodChannel.invokeMethod('setBarometerSamplingPeriod', microseconds); + _barometerEvents ??= + _barometerEventChannel.receiveBroadcastStream().map((dynamic event) { + final list = event.cast(); + return BarometerEvent(list[0]!); + }); + return _barometerEvents!; + } } diff --git a/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart b/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart index f25c7186ef..05bb666499 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart @@ -48,6 +48,15 @@ Stream magnetometerEventStream({ return methodChannel.magnetometerEventStream(samplingPeriod: samplingPeriod); } +/// Returns a broadcast stream of events from the device magnetometer at the +/// given sampling frequency. +@override +Stream barometerEventStream({ + Duration samplingPeriod = SensorInterval.normalInterval, +}) { + return methodChannel.barometerEventStream(samplingPeriod: samplingPeriod); +} + void main() { TestWidgetsFlutterBinding.ensureInitialized(); @@ -102,6 +111,17 @@ void main() { expect(event.y, sensorData[1]); expect(event.z, sensorData[2]); }); + + test('barometerEvents are streamed', () async { + const channelName = 'dev.fluttercommunity.plus/sensors/barometer'; + const sensorData = [1000.0]; + _initializeFakeMethodChannel('setBarometerSamplingPeriod'); + _initializeFakeSensorChannel(channelName, sensorData); + + final event = await barometerEventStream().first; + + expect(event.pressure, sensorData[0]); + }); } void _initializeFakeMethodChannel(String methodName) {