diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index db77bb4..d3ed40c 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 17987b7..1b2052d 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 09d4391..23e60c3 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d..b7ad063 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372e..a8183ef 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/build.gradle b/android/build.gradle index 3b267d3..749aa70 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -29,6 +29,6 @@ subprojects { project.evaluationDependsOn(':app') } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 38bf611..b07d84c 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,30 +1,30 @@ PODS: - audio_session (0.0.1): - Flutter - - Firebase/CoreOnly (10.7.0): - - FirebaseCore (= 10.7.0) - - Firebase/Messaging (10.7.0): + - Firebase/CoreOnly (10.12.0): + - FirebaseCore (= 10.12.0) + - Firebase/Messaging (10.12.0): - Firebase/CoreOnly - - FirebaseMessaging (~> 10.7.0) - - firebase_core (2.9.0): - - Firebase/CoreOnly (= 10.7.0) + - FirebaseMessaging (~> 10.12.0) + - firebase_core (2.15.1): + - Firebase/CoreOnly (= 10.12.0) - Flutter - - firebase_messaging (14.4.0): - - Firebase/Messaging (= 10.7.0) + - firebase_messaging (14.6.6): + - Firebase/Messaging (= 10.12.0) - firebase_core - Flutter - - FirebaseCore (10.7.0): + - FirebaseCore (10.12.0): - FirebaseCoreInternal (~> 10.0) - GoogleUtilities/Environment (~> 7.8) - GoogleUtilities/Logger (~> 7.8) - - FirebaseCoreInternal (10.13.0): + - FirebaseCoreInternal (10.14.0): - "GoogleUtilities/NSData+zlib (~> 7.8)" - - FirebaseInstallations (10.13.0): + - FirebaseInstallations (10.14.0): - FirebaseCore (~> 10.0) - GoogleUtilities/Environment (~> 7.8) - GoogleUtilities/UserDefaults (~> 7.8) - PromisesObjC (~> 2.1) - - FirebaseMessaging (10.7.0): + - FirebaseMessaging (10.12.0): - FirebaseCore (~> 10.0) - FirebaseInstallations (~> 10.0) - GoogleDataTransport (~> 9.2) @@ -117,20 +117,20 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: audio_session: 4f3e461722055d21515cf3261b64c973c062f345 - Firebase: 0219acf760880eeec8ce479895bd7767466d9f81 - firebase_core: d85432877e814811e040e7659f9c82faeab66e04 - firebase_messaging: 45c0514ca78426630338a42fb7b55af962c7ccd2 - FirebaseCore: e317665b9d744727a97e623edbbed009320afdd7 - FirebaseCoreInternal: b342e37cd4f5b4454ec34308f073420e7920858e - FirebaseInstallations: b28af1b9f997f1a799efe818c94695a3728c352f - FirebaseMessaging: ac9062bcc35ed56e15a0241d8fd317022499baf8 + Firebase: 07150e75d142fb9399f6777fa56a187b17f833a0 + firebase_core: 4a3246a02f828a01c74a2c26427037786d90f17f + firebase_messaging: 13b378c8449cae7ec96c79570170943dd73d4738 + FirebaseCore: f86a1394906b97ac445ae49c92552a9425831bed + FirebaseCoreInternal: d558159ee6cc4b823c2296ecc193de9f6d9a5bb3 + FirebaseInstallations: f672b1eda64e6381c21d424a2f680a943fd83f3b + FirebaseMessaging: bb2c4f6422a753038fe137d90ae7c1af57251316 Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 flutter_webrtc: 1944895d4e908c4bc722929dc4b9f8620d8e1b2f GoogleDataTransport: 54dee9d48d14580407f8f5fbf2f496e92437a2f2 GoogleUtilities: 13e2c67ede716b8741c7989e26893d151b2b2084 nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431 - path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9 + path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4 WebRTC-SDK: dd913fd31cfbf1d43b9a22d83f4c6354c960c623 diff --git a/lib/blocs/call_view_bloc.dart b/lib/blocs/call_view_bloc.dart index d9819cc..fcc37d9 100644 --- a/lib/blocs/call_view_bloc.dart +++ b/lib/blocs/call_view_bloc.dart @@ -13,6 +13,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart'; import 'package:mqtt/mqtt.dart'; +import 'package:mqtt_client/mqtt_client.dart' as mqtt; import 'package:uuid/uuid.dart'; import 'package:path/path.dart' as path; @@ -51,10 +52,15 @@ class CallViewBloc extends Bloc { emit(CallInitatedState()); final MqttClient client = MqttClient(home.uri); - await client.connect( - username: home.username ?? "", - password: home.password ?? "", - ); + try { + await client.connect( + username: home.username ?? "", + password: home.password ?? "", + ); + } on mqtt.NoConnectionException catch (exception) { + emit(CallCancelState(exception.toString())); + return; + } String uuid = const Uuid().v4(); @@ -118,12 +124,14 @@ class CallViewBloc extends Bloc { String answerChannel = const Uuid().v4(); final operation = CancelableOperation.fromFuture( - client.once( - path.normalize( - "./${home.uri.path}/rtc/connections/create/$uuid/$answerChannel", - ), - timeout: const Duration(seconds: 15), - ), + client + .once( + path.normalize( + "./${home.uri.path}/rtc/connections/create/$uuid/$answerChannel", + ), + timeout: const Duration(seconds: 15), + ) + .catchError((error) => ""), ); client.publish( path.normalize("./${home.uri.path}/rtc/connections/create/$uuid"), @@ -135,9 +143,15 @@ class CallViewBloc extends Bloc { _requestOperation = operation; await operation.value.then((value) async { + if (value.isEmpty) { + emit(CallCancelState("the doorunit did not send a repsonse")); + return; + } + Response response = Response.fromMap(jsonDecode(value)); if (response.statusCode != 201) { add(CallHangup()); + return; } final Map answer = jsonDecode(response.body); @@ -166,7 +180,7 @@ class CallViewBloc extends Bloc { ); }).onError((exception, stackTrace) async { emit(CallCancelState( - "could not connect to the given doorunit", + "the doorunit did not respond to the message", )); rtcclient?.ressource.close(); await rtcclient?.dispose(); diff --git a/lib/blocs/home_add_view_bloc.dart b/lib/blocs/home_add_view_bloc.dart index abff743..f44a731 100644 --- a/lib/blocs/home_add_view_bloc.dart +++ b/lib/blocs/home_add_view_bloc.dart @@ -72,32 +72,43 @@ class HomeAddViewBloc extends Bloc { home.username = event.username; home.password = event.password; + emit(HomeAddLoadingState()); + final client = MqttClient(home.uri); + try { + await client.connect( + username: home.username ?? "", + password: home.password ?? "", + ); + } catch (e) { + emit( + HomeAddErrorState( + "Could not conenct the the server ${uri.scheme}://${uri.host}:${uri.port} because ${e.toString()}", + ), + ); + return; + } + await homeRepository.add(home); + await homeRepository.select(home); + emit(HomeAddSuccessfulState()); Box settingsBox = Hive.box("settings"); String? token = settingsBox.get("token"); if (token == null) { - emit(HomeAddSuccessfulState()); return; } - final client = MqttClient(home.uri); - await client.connect( - username: home.username ?? "", - password: home.password ?? "", - ); - - client.publish( + await client.publish( path.normalize("./${home.uri.path}/devices/save"), - Request.fromMap( + Request.withJsonBody( + "GET", Device( token, signs: [home.uri.fragment], ).toMap(), ).toJsonString(), ); - - emit(HomeAddSuccessfulState()); + client.disconnect(); } } diff --git a/lib/handlers/notification_handler.dart b/lib/handlers/notification_handler.dart index a9197da..9880b21 100644 --- a/lib/handlers/notification_handler.dart +++ b/lib/handlers/notification_handler.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:math'; +import 'package:http/http.dart' as http; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; @@ -11,6 +12,7 @@ Future onBackgroundNotificationReceived(RemoteMessage message) async { Future _notification(RemoteMessage message) async { String? title = message.data["title"] ?? message.notification?.title; String? body = message.data["body"] ?? message.notification?.body; + int id = int.tryParse(message.data["id"] ?? "") ?? Random().nextInt(100); if (null == title || null == body) return; @@ -21,14 +23,32 @@ Future _notification(RemoteMessage message) async { android: AndroidInitializationSettings("@mipmap/ic_launcher"), ), ); - int id = Random().nextInt(100); + + StyleInformation? styleInformation; + + if (message.data["image"] != null) { + final http.Response response = await http.get( + Uri.parse(message.data["imageUrl"]), + ); + + styleInformation = BigPictureStyleInformation( + ByteArrayAndroidBitmap(response.bodyBytes), + ); + } + await plugin.show( id, title, body, - const NotificationDetails( - iOS: DarwinNotificationDetails(), - android: AndroidNotificationDetails("dieklingel", "dieklingle"), + NotificationDetails( + iOS: const DarwinNotificationDetails( + sound: "ringtone.wav", + ), + android: AndroidNotificationDetails( + "dieklingel", + "dieklingle", + styleInformation: styleInformation, + ), ), ); } diff --git a/lib/main.dart b/lib/main.dart index 52e42da..dc9dcf1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -95,10 +95,14 @@ class _App extends State { provisional: false, sound: true, ); - print('User granted permission: ${settings.authorizationStatus}'); + + if (settings.authorizationStatus != AuthorizationStatus.authorized) { + return; + } String? token = await FirebaseMessaging.instance.getToken(); - if (null == token) return; - print("Token: $token"); + if (null == token) { + return; + } Box settingsBox = Hive.box("settings"); settingsBox.put("token", token); @@ -110,9 +114,10 @@ class _App extends State { username: home.username ?? "", password: home.password ?? "", ); - client.publish( + await client.publish( path.normalize("./${home.uri.path}/devices/save"), - Request.fromMap( + Request.withJsonBody( + "GET", Device( token, signs: [home.uri.fragment], diff --git a/lib/states/home_add_state.dart b/lib/states/home_add_state.dart index 54ec777..3d28aaa 100644 --- a/lib/states/home_add_state.dart +++ b/lib/states/home_add_state.dart @@ -20,6 +20,14 @@ class HomeAddInitialState extends HomeAddState { }); } +class HomeAddErrorState extends HomeAddState { + final String errorMessage; + + HomeAddErrorState(this.errorMessage); +} + +class HomeAddLoadingState extends HomeAddState {} + class HomeAddFormErrorState extends HomeAddState { final String? nameError; final String? serverError; diff --git a/lib/utils/rtc_client_wrapper.dart b/lib/utils/rtc_client_wrapper.dart index 7d90f8f..e1dee12 100644 --- a/lib/utils/rtc_client_wrapper.dart +++ b/lib/utils/rtc_client_wrapper.dart @@ -173,7 +173,7 @@ class RtcClientWrapper { } _applyMicrophoneSettings(); - _applySpeakerSettings(); + _applySpeakerSettings(media: event.streams); renderer.srcObject = event.streams.first; } @@ -193,8 +193,8 @@ class RtcClientWrapper { } } - void _applySpeakerSettings() async { - final streams = connection.getRemoteStreams(); + void _applySpeakerSettings({List media = const []}) async { + final streams = [...connection.getRemoteStreams(), ...media]; for (final stream in streams) { if (stream == null) { continue; diff --git a/lib/views/home_add_view.dart b/lib/views/home_add_view.dart index 32c59d2..3a75a26 100644 --- a/lib/views/home_add_view.dart +++ b/lib/views/home_add_view.dart @@ -37,6 +37,25 @@ class _HomeAddView extends State { if (state is HomeAddSuccessfulState) { Navigator.of(context).pop(); } + if (state is HomeAddErrorState) { + showCupertinoDialog( + context: context, + builder: (BuildContext context) { + return CupertinoAlertDialog( + title: const Text("Error"), + content: Text(state.errorMessage), + actions: [ + CupertinoButton( + child: const Text("Ok"), + onPressed: () { + Navigator.of(context).pop(); + }, + ) + ], + ); + }, + ); + } }, builder: (context, state) { return CupertinoPageScaffold( @@ -48,23 +67,25 @@ class _HomeAddView extends State { Navigator.of(context).pop(); }), middle: const Text("Home"), - trailing: CupertinoButton( - padding: EdgeInsets.zero, - onPressed: () { - context.read().add( - HomeAddSubmit( - home: widget.home, - name: _name.text, - server: _server.text, - username: _username.text, - password: _password.text, - channel: _channel.text, - sign: _sign.text, - ), - ); - }, - child: const Text("Save"), - ), + trailing: state is HomeAddLoadingState + ? const CupertinoActivityIndicator() + : CupertinoButton( + padding: EdgeInsets.zero, + onPressed: () { + context.read().add( + HomeAddSubmit( + home: widget.home, + name: _name.text, + server: _server.text, + username: _username.text, + password: _password.text, + channel: _channel.text, + sign: _sign.text, + ), + ); + }, + child: const Text("Save"), + ), ), backgroundColor: CupertinoColors.systemGroupedBackground, child: SafeArea( @@ -101,6 +122,7 @@ class _HomeAddView extends State { ), CupertinoTextFormFieldRow( prefix: const Text("Password"), + obscureText: true, controller: _password, ), ], diff --git a/packages/mqtt/lib/src/factories/client_factory_server.dart b/packages/mqtt/lib/src/factories/client_factory_server.dart index 4b8e68f..4c9ad9e 100644 --- a/packages/mqtt/lib/src/factories/client_factory_server.dart +++ b/packages/mqtt/lib/src/factories/client_factory_server.dart @@ -2,15 +2,19 @@ import 'package:mqtt_client/mqtt_client.dart' as mqtt; import 'package:mqtt_client/mqtt_server_client.dart'; mqtt.MqttClient factory( - String hostname, + Uri host, String identifier, { int maxConnectionAttempts = 3, }) { - mqtt.MqttClient client = MqttServerClient( - hostname, + final client = MqttServerClient( + host.host, identifier, maxConnectionAttempts: maxConnectionAttempts, ); + if (host.scheme == "mqtts") { + client.secure = true; + } + return client; } diff --git a/packages/mqtt/lib/src/factories/client_factory_web.dart b/packages/mqtt/lib/src/factories/client_factory_web.dart index 26ea716..556418c 100644 --- a/packages/mqtt/lib/src/factories/client_factory_web.dart +++ b/packages/mqtt/lib/src/factories/client_factory_web.dart @@ -3,10 +3,14 @@ import 'package:mqtt_client/mqtt_browser_client.dart'; import 'package:mqtt_client/mqtt_client.dart' as mqtt; mqtt.MqttClient factory( - String hostname, + Uri host, String identifier, { int maxConnectionAttempts = 3, }) { + String hostname = host.scheme == "wss" || host.scheme == "ws" + ? "${host.scheme}://${host.host}" + : host.host; + mqtt.MqttClient client = MqttBrowserClient( hostname, identifier, diff --git a/packages/mqtt/lib/src/factories/mqtt_client_factory.dart b/packages/mqtt/lib/src/factories/mqtt_client_factory.dart index a28662a..b871e21 100644 --- a/packages/mqtt/lib/src/factories/mqtt_client_factory.dart +++ b/packages/mqtt/lib/src/factories/mqtt_client_factory.dart @@ -7,7 +7,7 @@ class MqttClientFactory { const MqttClientFactory(); MqttClient create( - String hostname, + Uri hostname, String identifier, { int maxConnectionAttempts = 3, }) { diff --git a/packages/mqtt/lib/src/mqtt_client.dart b/packages/mqtt/lib/src/mqtt_client.dart index 7797a90..317da26 100644 --- a/packages/mqtt/lib/src/mqtt_client.dart +++ b/packages/mqtt/lib/src/mqtt_client.dart @@ -20,12 +20,8 @@ class MqttClient { } factory MqttClient(Uri uri, {String? identifier}) { - String host = uri.scheme == "wss" || uri.scheme == "ws" - ? "${uri.scheme}://${uri.host}" - : uri.host; - final client = const MqttClientFactory().create( - host, + uri, identifier ?? const Uuid().v4(), ); @@ -86,16 +82,18 @@ class MqttClient { } } - void publish( + Future publish( String topic, String message, { mqtt.MqttQos qosLevel = mqtt.MqttQos.exactlyOnce, - }) { + }) async { _client.publishMessage( topic, qosLevel, mqtt.MqttClientPayloadBuilder().addUTF8String(message).payload!, ); + // wait until message is published + await Future.delayed(const Duration(seconds: 5)); } Future once(String topic, {Duration? timeout}) async { diff --git a/pubspec.lock b/pubspec.lock index 0360c53..aab356e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,34 +5,34 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: a36ec4843dc30ea6bf652bf25e3448db6c5e8bcf4aa55f063a5d1dad216d8214 + sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a url: "https://pub.dev" source: hosted - version: "58.0.0" + version: "61.0.0" _flutterfire_internals: dependency: transitive description: name: _flutterfire_internals - sha256: f175bc1414e4edf8c5b83372c98eeabecf8353f39c9da423c2cfdf1f1f508788 + sha256: "1a5e13736d59235ce0139621b4bbe29bc89839e202409081bc667eb3cd20674c" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.3.5" analyzer: dependency: transitive description: name: analyzer - sha256: cc4242565347e98424ce9945c819c192ec0838cb9d1f6aa4a97cc96becbc5b27 + sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562 url: "https://pub.dev" source: hosted - version: "5.10.0" + version: "5.13.0" args: dependency: transitive description: name: args - sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.2" async: dependency: "direct main" description: @@ -45,18 +45,18 @@ packages: dependency: "direct main" description: name: audio_session - sha256: e4acc4e9eaa32436dfc5d7aed7f0a370f2d7bb27ee27de30d6c4f220c2a05c73 + sha256: "8a2bc5e30520e18f3fb0e366793d78057fb64cd5287862c76af0c8771f2a52ad" url: "https://pub.dev" source: hosted - version: "0.1.13" + version: "0.1.16" bloc: dependency: transitive description: name: bloc - sha256: "658a5ae59edcf1e58aac98b000a71c762ad8f46f1394c34a52050cafb3e11a80" + sha256: "3820f15f502372d979121de1f6b97bfcf1630ebff8fe1d52fb2b0bfa49be5b49" url: "https://pub.dev" source: hosted - version: "8.1.1" + version: "8.1.2" boolean_selector: dependency: transitive description: @@ -157,10 +157,10 @@ packages: dependency: transitive description: name: ffi - sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 + sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.0" file: dependency: transitive description: @@ -173,50 +173,50 @@ packages: dependency: "direct main" description: name: firebase_core - sha256: ed611fb8e67e43ecc7956f242cecca383d87cf71aace27287aa5dd4bdba4ac07 + sha256: c78132175edda4bc532a71e01a32964e4b4fcf53de7853a422d96dac3725f389 url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.15.1" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface - sha256: "0df0a064ab0cad7f8836291ca6f3272edd7b83ad5b3540478ee46a0849d8022b" + sha256: b63e3be6c96ef5c33bdec1aab23c91eb00696f6452f0519401d640938c94cba2 url: "https://pub.dev" source: hosted - version: "4.6.0" + version: "4.8.0" firebase_core_web: dependency: transitive description: name: firebase_core_web - sha256: "347351a8f0518f3343d79a9a0690fa67ad232fc32e2ea270677791949eac792b" + sha256: "4cf4d2161530332ddc3c562f19823fb897ff37a9a774090d28df99f47370e973" url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.7.0" firebase_messaging: dependency: "direct main" description: name: firebase_messaging - sha256: e4a5eb079aa9e7bd6b5fb2681f2bb8a6c78f87aacbf1c732c6ce91ad71e595ba + sha256: db4a38be54fd84849c21be1ae1b44f0d4637eec1069bf5c49ea95e81f582bbc0 url: "https://pub.dev" source: hosted - version: "14.4.0" + version: "14.6.6" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface - sha256: "3a007c888e3414c9e4f7c35ea6fa59eafc623c62ee36155710563a1ebc160063" + sha256: "164119eed47ff19284e28bea9165a03da110c56ea09dd996622cfccad14d0efd" url: "https://pub.dev" source: hosted - version: "4.3.0" + version: "4.5.5" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web - sha256: a3239662b91b652cea4ce3b3ecac6cccbaebc1b4ac3101224bef805de4195fbf + sha256: "6196d20731733834d7afb175c4345be57ddbd5daebca83cd52a430d62c2279fe" url: "https://pub.dev" source: hosted - version: "3.3.0" + version: "3.5.5" flutter: dependency: "direct main" description: flutter @@ -226,18 +226,18 @@ packages: dependency: "direct main" description: name: flutter_bloc - sha256: "434951eea948dbe87f737b674281465f610b8259c16c097b8163ce138749a775" + sha256: e74efb89ee6945bcbce74a5b3a5a3376b088e5f21f55c263fc38cbdc6237faae url: "https://pub.dev" source: hosted - version: "8.1.2" + version: "8.1.3" flutter_lints: dependency: "direct dev" description: name: flutter_lints - sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c + sha256: "2118df84ef0c3ca93f96123a616ae8540879991b8b57af2f81b76a7ada49b2a4" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.2" flutter_local_notifications: dependency: "direct main" description: @@ -276,10 +276,10 @@ packages: dependency: "direct main" description: name: flutter_webrtc - sha256: b795e79c2c053b0559756450427c4ad4679707e50b8540b5d7921c92a3989bc9 + sha256: "770c6f8babfdc4907539dc57bf9e98b89132eaa4486bac774c537dd25c2d5362" url: "https://pub.dev" source: hosted - version: "0.9.39" + version: "0.9.40" frontend_server_client: dependency: transitive description: @@ -292,10 +292,10 @@ packages: dependency: transitive description: name: glob - sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" hive: dependency: transitive description: @@ -364,18 +364,18 @@ packages: dependency: transitive description: name: lints - sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" + sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.1" logging: dependency: transitive description: name: logging - sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" matcher: dependency: transitive description: @@ -416,7 +416,7 @@ packages: source: path version: "0.0.1" mqtt_client: - dependency: transitive + dependency: "direct main" description: name: mqtt_client sha256: "873c124f6485c17b5ca085047880068f3c5acc9db54317995d752a3253f95a72" @@ -459,66 +459,66 @@ packages: dependency: transitive description: name: path_provider - sha256: c7edf82217d4b2952b2129a61d3ad60f1075b9299e629e149a8d2e39c2e6aad4 + sha256: "909b84830485dbcd0308edf6f7368bc8fd76afa26a270420f34cabea2a6467a0" url: "https://pub.dev" source: hosted - version: "2.0.14" + version: "2.1.0" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: da97262be945a72270513700a92b39dd2f4a54dad55d061687e2e37a6390366a + sha256: "5d44fc3314d969b84816b569070d7ace0f1dea04bd94a83f74c4829615d22ad8" url: "https://pub.dev" source: hosted - version: "2.0.25" + version: "2.1.0" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: ad4c4d011830462633f03eb34445a45345673dfd4faf1ab0b4735fbd93b19183 + sha256: "1b744d3d774e5a879bb76d6cd1ecee2ba2c6960c03b1020cd35212f6aa267ac5" url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.3.0" path_provider_linux: dependency: transitive description: name: path_provider_linux - sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1" + sha256: ba2b77f0c52a33db09fc8caf85b12df691bf28d983e84cf87ff6d693cfa007b3 url: "https://pub.dev" source: hosted - version: "2.1.10" + version: "2.2.0" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec" + sha256: bced5679c7df11190e1ddc35f3222c858f328fff85c3942e46e7f5589bf9eb84 url: "https://pub.dev" source: hosted - version: "2.0.6" + version: "2.1.0" path_provider_windows: dependency: transitive description: name: path_provider_windows - sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130 + sha256: ee0e0d164516b90ae1f970bdf29f726f1aa730d7cfc449ecc74c495378b705da url: "https://pub.dev" source: hosted - version: "2.1.5" + version: "2.2.0" petitparser: dependency: transitive description: name: petitparser - sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4" + sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750 url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "5.4.0" platform: dependency: transitive description: name: platform - sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" + sha256: "57c07bf82207aee366dfaa3867b3164e4f03a238a461a11b0e8a3a510d51203d" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.1" platform_detect: dependency: transitive description: @@ -531,10 +531,10 @@ packages: dependency: transitive description: name: plugin_platform_interface - sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc" + sha256: "43798d895c929056255600343db8f049921cbec94d31ec87f1dc5c16c01935dd" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.5" pool: dependency: transitive description: @@ -563,18 +563,18 @@ packages: dependency: transitive description: name: pub_semver - sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" pull_down_button: dependency: "direct main" description: name: pull_down_button - sha256: "28c74afd3047371cc41a5a387726dc6f7354bc3adda8c729fe62b8abc2de13f0" + sha256: "7b19903d04c1768e15e19b31e90921c16ad26daac9512b8a215699d0774b6104" url: "https://pub.dev" source: hosted - version: "0.8.2" + version: "0.8.3" rxdart: dependency: transitive description: @@ -595,10 +595,10 @@ packages: dependency: transitive description: name: shelf_packages_handler - sha256: aef74dc9195746a384843102142ab65b6a4735bb3beea791e63527b88cc83306 + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" shelf_router: dependency: "direct main" description: @@ -611,18 +611,18 @@ packages: dependency: transitive description: name: shelf_static - sha256: e792b76b96a36d4a41b819da593aff4bdd413576b3ba6150df5d8d9996d2e74c + sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" sky_engine: dependency: transitive description: flutter @@ -712,10 +712,10 @@ packages: dependency: transitive description: name: timezone - sha256: "24c8fcdd49a805d95777a39064862133ff816ebfffe0ceff110fb5960e557964" + sha256: "1cfd8ddc2d1cfd836bc93e67b9be88c3adaeca6f40a00ca999104c30693cdca0" url: "https://pub.dev" source: hosted - version: "0.9.1" + version: "0.9.2" typed_data: dependency: transitive description: @@ -728,18 +728,18 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: "75f2846facd11168d007529d6cd8fcb2b750186bea046af9711f10b907e1587e" + sha256: "781bd58a1eb16069412365c98597726cd8810ae27435f04b3b4d3a470bacd61e" url: "https://pub.dev" source: hosted - version: "6.1.10" + version: "6.1.12" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: a52628068d282d01a07cd86e6ba99e497aa45ce8c91159015b2416907d78e411 + sha256: "3dd2388cc0c42912eee04434531a26a82512b9cb1827e0214430c9bcbddfe025" url: "https://pub.dev" source: hosted - version: "6.0.27" + version: "6.0.38" url_launcher_ios: dependency: transitive description: @@ -752,42 +752,42 @@ packages: dependency: transitive description: name: url_launcher_linux - sha256: "206fb8334a700ef7754d6a9ed119e7349bc830448098f21a69bf1b4ed038cabc" + sha256: "207f4ddda99b95b4d4868320a352d374b0b7e05eefad95a4a26f57da413443f5" url: "https://pub.dev" source: hosted - version: "3.0.4" + version: "3.0.5" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "91ee3e75ea9dadf38036200c5d3743518f4a5eb77a8d13fda1ee5764373f185e" + sha256: "1c4fdc0bfea61a70792ce97157e5cc17260f61abbe4f39354513f39ec6fd73b1" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.6" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370" + sha256: bfdfa402f1f3298637d71ca8ecfe840b4696698213d5346e9d12d4ab647ee2ea url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "81fe91b6c4f84f222d186a9d23c73157dc4c8e1c71489c4d08be1ad3b228f1aa" + sha256: cc26720eefe98c1b71d85f9dc7ef0cada5132617046369d9dc296b3ecaa5cbb4 url: "https://pub.dev" source: hosted - version: "2.0.16" + version: "2.0.18" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: a83ba3607a507758669cfafb03f9de09bf6e6280c14d9b9cb18f013e406dcacd + sha256: "7967065dd2b5fccc18c653b97958fdf839c5478c28e767c61ee879f4e7882422" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.7" uuid: dependency: "direct main" description: @@ -808,18 +808,18 @@ packages: dependency: transitive description: name: vm_service - sha256: e7fb6c2282f7631712b69c19d1bff82f3767eea33a2321c14fa59ad67ea391c7 + sha256: "0fae432c85c4ea880b33b497d32824b97795b04cdaa74d270219572a1f50268d" url: "https://pub.dev" source: hosted - version: "9.4.0" + version: "11.9.0" watcher: dependency: transitive description: name: watcher - sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.0" web_socket_channel: dependency: transitive description: @@ -848,10 +848,10 @@ packages: dependency: transitive description: name: win32 - sha256: a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4 + sha256: f2add6fa510d3ae152903412227bda57d0d5a8da61d2c39c1fb022c9429a41c0 url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "5.0.6" xdg_directories: dependency: transitive description: @@ -864,18 +864,18 @@ packages: dependency: transitive description: name: xml - sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5" + sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84" url: "https://pub.dev" source: hosted - version: "6.2.2" + version: "6.3.0" yaml: dependency: transitive description: name: yaml - sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" sdks: dart: ">=3.0.6 <3.7.11" - flutter: ">=3.3.0" + flutter: ">=3.10.0" diff --git a/pubspec.yaml b/pubspec.yaml index 3f12f7e..c2cf443 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.2.0+2 +version: 1.2.2+1 environment: sdk: ">=2.18.6 <3.7.11" @@ -53,6 +53,7 @@ dependencies: http: ^0.13.6 async: ^2.11.0 path: ^1.8.3 + mqtt_client: ^10.0.0 dev_dependencies: flutter_test: