From 4ee10218a91e410b507818eac4b2521e7c010533 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Tue, 6 Feb 2024 10:43:14 +0300 Subject: [PATCH] 2/6/3 --- lib/controller/functions/tts.dart | 25 +++++++++++++++ .../home/map_passenger_controller.dart | 30 +++++++++++++++++ .../form_search_places_destenation.dart | 18 ++++++++--- .../map_widget.dart/left_main_menu_icons.dart | 32 +++++++++++++++---- macos/Flutter/GeneratedPluginRegistrant.swift | 2 ++ pubspec.lock | 8 +++++ pubspec.yaml | 1 + .../flutter/generated_plugin_registrant.cc | 3 ++ windows/flutter/generated_plugins.cmake | 1 + 9 files changed, 110 insertions(+), 10 deletions(-) create mode 100644 lib/controller/functions/tts.dart diff --git a/lib/controller/functions/tts.dart b/lib/controller/functions/tts.dart new file mode 100644 index 0000000..bdcf7cd --- /dev/null +++ b/lib/controller/functions/tts.dart @@ -0,0 +1,25 @@ +import 'package:flutter_tts/flutter_tts.dart'; + +class TextToSpeech { + final FlutterTts tts = FlutterTts(); + + // Initialize the TTS engine with desired settings + Future initTts() async { + await tts.setLanguage('en-US'); // Set language + await tts.setSpeechRate(0.8); // Adjust speech rate + await tts.setVolume(1.0); // Set volume + } + + // Speak the given text + Future speakText(String text) async { + await tts.speak(text); + } + + // Stop speaking + Future stopSpeaking() async { + await tts.stop(); + } + + // Check if TTS is currently speaking + // bool isSpeaking() => tts.isSpeaking; +} diff --git a/lib/controller/home/map_passenger_controller.dart b/lib/controller/home/map_passenger_controller.dart index cac2eb0..49d60d0 100644 --- a/lib/controller/home/map_passenger_controller.dart +++ b/lib/controller/home/map_passenger_controller.dart @@ -1,6 +1,8 @@ import 'dart:async'; import 'dart:convert'; import 'dart:math' show cos; +import 'dart:math' as math; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; @@ -1461,6 +1463,8 @@ class MapPassengerController extends GetxController { //print(nearestCar!.id); } + List headingAngles = []; + late LatLngBounds boundsData; getMap(String origin, destination) async { await getCarsLocationByPassenger(); @@ -1510,7 +1514,23 @@ class MapPassengerController extends GetxController { double distanceOfTrip = (data[0]['distance']['value']) / 1000; distance = distanceOfTrip; // updateCameraForDistanceAfterGetMap(); + for (var step in data[0]['steps']) { + var startLat = step['start_location']['lat']; + var startLng = step['start_location']['lng']; + var endLat = step['end_location']['lat']; + var endLng = step['end_location']['lng']; + + // Calculate heading + var y = math.sin(endLng - startLng) * math.cos(endLat); + var x = math.cos(startLat) * math.sin(endLat) - + math.sin(startLat) * math.cos(endLat) * math.cos(endLng - startLng); + var theta = math.atan2(y, x); + + // Add to list + headingAngles.add(theta); + } + print(headingAngles); if (polyLines.isNotEmpty) { clearPolyline(); } else { @@ -1851,6 +1871,15 @@ class MapPassengerController extends GetxController { update(); } + initilizeGetStorage() { + if (box.read(BoxName.addWork).toString() == '') { + box.write(BoxName.addWork, 'addWork'); + } + if (box.read(BoxName.addHome).toString() == '') { + box.write(BoxName.addHome, 'addHome'); + } + } + @override void onInit() async { mapAPIKEY = await storage.read(key: BoxName.mapAPIKEY); @@ -1865,6 +1894,7 @@ class MapPassengerController extends GetxController { addCustomStartIcon(); addCustomEndIcon(); startMarkerReloading(); + initilizeGetStorage(); cardNumber = await SecureStorage().readData(BoxName.cardNumber); super.onInit(); diff --git a/lib/views/home/map_widget.dart/form_search_places_destenation.dart b/lib/views/home/map_widget.dart/form_search_places_destenation.dart index 29d9949..7f59057 100644 --- a/lib/views/home/map_widget.dart/form_search_places_destenation.dart +++ b/lib/views/home/map_widget.dart/form_search_places_destenation.dart @@ -207,8 +207,13 @@ GetBuilder formSearchPlacesDestenation() { controller.changePickerShown(); })); }, - child: Text( - 'Work : ${box.read(BoxName.addWork) == 'addWork' ? 'Add Work' : box.read(BoxName.addWork).toString().split(',')[0] + box.read(BoxName.addWork).toString().split(',')[1]} '), + child: Container( + decoration: BoxDecoration( + color: AppColor.greenColor.withOpacity(.4), + border: Border.all()), + child: Text( + 'Work : ${box.read(BoxName.addWork) == 'addWork' ? 'Add Work' : box.read(BoxName.addWork).toString().split(',')[0] + box.read(BoxName.addWork).toString().split(',')[1]} '), + ), ), InkWell( onLongPress: () { @@ -243,8 +248,13 @@ GetBuilder formSearchPlacesDestenation() { controller.update(); } }, - child: Text( - 'Home : ${box.read(BoxName.addHome) == 'addHome' ? 'Add Home' : box.read(BoxName.addHome)} '), + child: Container( + decoration: BoxDecoration( + color: AppColor.yellowColor.withOpacity(.4), + border: Border.all()), + child: Text( + 'Home : ${box.read(BoxName.addHome) == 'addHome' ? 'Add Home' : box.read(BoxName.addHome)} '), + ), ), ], ), diff --git a/lib/views/home/map_widget.dart/left_main_menu_icons.dart b/lib/views/home/map_widget.dart/left_main_menu_icons.dart index 3219caf..b9f13d8 100644 --- a/lib/views/home/map_widget.dart/left_main_menu_icons.dart +++ b/lib/views/home/map_widget.dart/left_main_menu_icons.dart @@ -5,6 +5,7 @@ import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import '../../../constant/colors.dart'; +import '../../../controller/functions/tts.dart'; import '../../../controller/home/map_passenger_controller.dart'; GetBuilder leftMainMenuIcons() { @@ -56,7 +57,27 @@ GetBuilder leftMainMenuIcons() { const SizedBox( height: 5, ), - // if (Platform.isIOS) + if (Platform.isIOS) + AnimatedContainer( + duration: const Duration(microseconds: 200), + width: controller.widthMapTypeAndTraffic, + decoration: BoxDecoration( + color: AppColor.secondaryColor, + border: Border.all(), + borderRadius: BorderRadius.circular(15)), + child: IconButton( + onPressed: () { + controller.mapController?.animateCamera( + CameraUpdate.newLatLng(LatLng( + controller.passengerLocation.latitude, + controller.passengerLocation.longitude))); + }, + icon: const Icon( + Icons.location_on, + size: 29, + ), + ), + ), AnimatedContainer( duration: const Duration(microseconds: 200), width: controller.widthMapTypeAndTraffic, @@ -66,13 +87,12 @@ GetBuilder leftMainMenuIcons() { borderRadius: BorderRadius.circular(15)), child: IconButton( onPressed: () { - controller.mapController?.animateCamera( - CameraUpdate.newLatLng(LatLng( - controller.passengerLocation.latitude, - controller.passengerLocation.longitude))); + final _textToSpeech = TextToSpeech(); + _textToSpeech.initTts(); + _textToSpeech.speakText("Hello, world!"); }, icon: const Icon( - Icons.location_on, + Icons.voice_chat, size: 29, ), ), diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 9363f46..adfd44e 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -13,6 +13,7 @@ import firebase_core import firebase_messaging import flutter_local_notifications import flutter_secure_storage_macos +import flutter_tts import geolocator_apple import iris_method_channel import just_audio @@ -33,6 +34,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) + FlutterTtsPlugin.register(with: registry.registrar(forPlugin: "FlutterTtsPlugin")) GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) IrisMethodChannelPlugin.register(with: registry.registrar(forPlugin: "IrisMethodChannelPlugin")) JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) diff --git a/pubspec.lock b/pubspec.lock index cc2715c..acb84fe 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -659,6 +659,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_tts: + dependency: "direct main" + description: + name: flutter_tts + sha256: cbb3fd43b946e62398560235469e6113e4fe26c40eab1b7cb5e7c417503fb3a8 + url: "https://pub.dev" + source: hosted + version: "3.8.5" flutter_web_plugins: dependency: transitive description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 0ca1f44..21eca52 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -51,6 +51,7 @@ dependencies: calendar_builder: ^0.0.6 fl_chart: ^0.66.0 agora_rtc_engine: ^6.2.6 + flutter_tts: ^3.8.5 diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 31ab587..5d16203 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -24,6 +25,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); FlutterSecureStorageWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); + FlutterTtsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterTtsPlugin")); GeolocatorWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("GeolocatorWindows")); IrisMethodChannelPluginCApiRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index b5e6b77..9326b89 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -7,6 +7,7 @@ list(APPEND FLUTTER_PLUGIN_LIST file_selector_windows firebase_core flutter_secure_storage_windows + flutter_tts geolocator_windows iris_method_channel local_auth_windows