From 0f79b2d86b6bce58c4cd8c8b4e225b81eec65eb9 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Mon, 25 Mar 2024 17:15:13 +0300 Subject: [PATCH] 3/25/1 --- assets/images/car.png | Bin 7263 -> 8937 bytes lib/controller/firebase/firbase_messge.dart | 4 +- .../location_background_controller.dart | 66 ++++++++++ .../functions/location_controller.dart | 121 +++++++++++------- .../home/captin/home_captain_controller.dart | 3 + .../home/captin/map_driver_controller.dart | 17 ++- .../home/map_passenger_controller.dart | 108 +++++++++------- lib/controller/local/translations.dart | 1 + .../payment/payment_controller.dart | 31 ++--- lib/controller/rate/rate_conroller.dart | 1 + lib/main.dart | 15 ++- lib/models/db_sql.dart | 2 +- lib/models/model/locations.dart | 14 +- lib/views/Rate/rate_passenger.dart | 59 ++++----- .../google_driver_map_page.dart | 10 +- .../orderCaptin/order_request_page.dart | 5 +- .../orderCaptin/order_speed_request.dart | 8 +- .../map_widget.dart/apply_order_widget.dart | 3 +- .../google_map_passenger_widget.dart | 36 +++--- .../map_widget.dart/left_main_menu_icons.dart | 2 +- 20 files changed, 327 insertions(+), 179 deletions(-) create mode 100644 lib/controller/functions/location_background_controller.dart diff --git a/assets/images/car.png b/assets/images/car.png index a37a93e54aeac66f1893438baf752975c2e32e08..b5beb73faf5febbf81b0c44c80ac10acf86aebc4 100644 GIT binary patch literal 8937 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 literal 7263 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 XyyeqIQQSWJd+v^!u4=LJ{YU=+_M1QS diff --git a/lib/controller/firebase/firbase_messge.dart b/lib/controller/firebase/firbase_messge.dart index 6b1e5a2..6a74b7e 100644 --- a/lib/controller/firebase/firbase_messge.dart +++ b/lib/controller/firebase/firbase_messge.dart @@ -223,8 +223,8 @@ class FirebaseMessagesController extends GetxController { Get.offAll(const MapPagePassenger()); } else if (message.notification!.title! == 'Order Applied') { Get.snackbar( - "The order has been accepted by another driver.", // Corrected grammar - "Be more mindful next time to avoid dropping orders.", // Improved sentence structure + "The order has been accepted by another driver.".tr, // Corrected grammar + "Be more mindful next time to avoid dropping orders.".tr, // Improved sentence structure backgroundColor: AppColor.yellowColor, snackPosition: SnackPosition.BOTTOM, ); diff --git a/lib/controller/functions/location_background_controller.dart b/lib/controller/functions/location_background_controller.dart new file mode 100644 index 0000000..048c783 --- /dev/null +++ b/lib/controller/functions/location_background_controller.dart @@ -0,0 +1,66 @@ +// import 'dart:async'; +// import 'package:background_location/background_location.dart'; +// import 'package:get/get.dart'; +// import 'package:permission_handler/permission_handler.dart'; +// +// class LocationBackgroundController extends GetxController { +// @override +// void onInit() { +// super.onInit(); +// requestLocationPermission(); +// configureBackgroundLocation(); +// } +// +// Future requestLocationPermission() async { +// var status = await Permission.locationAlways.status; +// if (!status.isGranted) { +// await Permission.locationAlways.request(); +// } +// } +// +// Future configureBackgroundLocation() async { +// await BackgroundLocation.setAndroidNotification( +// title: "Background Location", +// message: "Tracking location...", +// icon: "@mipmap/ic_launcher", +// ); +// +// BackgroundLocation.setAndroidConfiguration(1000); +// BackgroundLocation.startLocationService(); +// BackgroundLocation.getLocationUpdates((location) { +// // Handle location updates here +// print("New location: ${location.latitude}, ${location.longitude}"); +// }); +// } +// +// startBackLocation() async { +// Timer.periodic(const Duration(seconds: 5), (timer) { +// getBackgroundLocation(); +// }); +// } +// +// getBackgroundLocation() async { +// var status = await Permission.locationAlways.status; +// if (status.isGranted) { +// await BackgroundLocation.startLocationService( +// distanceFilter: 20, forceAndroidLocationManager: true); +// BackgroundLocation.setAndroidConfiguration( +// Duration.microsecondsPerSecond); // Set interval to 5 seconds +// +// BackgroundLocation.getLocationUpdates((location1) { +// print('''\n +// Latitude: ${location1.latitude.toString()} +// Longitude: ${location1.longitude.toString()} +// Altitude: ${location1.altitude.toString()} +// Accuracy: ${location1.accuracy.toString()} +// Bearing: ${location1.bearing.toString()} +// Speed: ${location1.speed.toString()} +// +// +// '''); +// }); +// } else { +// print('Location permission not granted'); +// } +// } +// } diff --git a/lib/controller/functions/location_controller.dart b/lib/controller/functions/location_controller.dart index c7fe620..8ec283e 100644 --- a/lib/controller/functions/location_controller.dart +++ b/lib/controller/functions/location_controller.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:SEFER/constant/table_names.dart'; +import 'package:SEFER/controller/home/captin/map_driver_controller.dart'; import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:location/location.dart'; @@ -9,6 +10,7 @@ import 'package:SEFER/constant/links.dart'; import 'package:SEFER/controller/functions/crud.dart'; import 'package:SEFER/controller/home/payment/captain_wallet_controller.dart'; import 'package:SEFER/main.dart'; +import 'package:permission_handler/permission_handler.dart'; // LocationController.dart class LocationController extends GetxController { @@ -17,6 +19,14 @@ class LocationController extends GetxController { bool isLoading = false; bool isActive = false; late LatLng myLocation; + late double heading; + late double accuracy; + late double latitude; + late double longitude; + late DateTime time; + late double speed; + late double speedAccuracy; + late double headingAccuracy; String totalPoints = '0'; LocationData? get currentLocation => _currentLocation; Timer? _locationTimer; @@ -24,6 +34,9 @@ class LocationController extends GetxController { @override void onInit() async { super.onInit(); + + requestLocationPermission(); + location = Location(); getLocation(); // startLocationUpdates(); @@ -31,6 +44,20 @@ class LocationController extends GetxController { totalPoints = Get.put(CaptainWalletController()).totalPoints; } + Future requestLocationPermission() async { + if (box.read(BoxName.driverID) != null) { + var status = await Permission.locationAlways.status; + if (!status.isGranted) { + await Permission.locationAlways.request(); + } else { + var status = await Permission.locationWhenInUse.status; + if (!status.isGranted) { + await Permission.locationWhenInUse.request(); + } + } + } + } + Future startLocationUpdates() async { if (box.read(BoxName.driverID) != null) { _locationTimer = @@ -41,21 +68,35 @@ class LocationController extends GetxController { // if (isActive) { if (double.parse(totalPoints) > -300) { print('total point is $totalPoints'); - await getLocation(); - await CRUD() - .post(link: AppLink.addCarsLocationByPassenger, payload: { - 'driver_id': box.read(BoxName.driverID).toString(), - 'latitude': myLocation.latitude.toString(), - 'longitude': myLocation.longitude.toString(), - 'status': box.read(BoxName.statusDriverLocation).toString() - }); - await sql.insertData({ - 'driver_id': box.read(BoxName.driverID), - 'latitude': myLocation.latitude.toString(), - 'longitude': myLocation.longitude.toString(), - 'created_at': DateTime.now().toString(), - }, TableName.carLocations); + await getLocation(); + if (box.read(BoxName.driverID) != null) { + await CRUD() + .post(link: AppLink.addCarsLocationByPassenger, payload: { + 'driver_id': box.read(BoxName.driverID).toString(), + 'latitude': myLocation.latitude.toString(), + 'longitude': myLocation.longitude.toString(), + 'heading': heading.toString(), + 'speed': speed.toString(), + 'status': box.read(BoxName.statusDriverLocation).toString() + }); + if (Get.find().rideId == null) { + await sql.insertData({ + 'driver_id': box.read(BoxName.driverID), + 'latitude': myLocation.latitude.toString(), + 'longitude': myLocation.longitude.toString(), + 'created_at': DateTime.now().toString(), + }, TableName.carLocations); + } else { + await sql.insertData({ + 'order_id': Get.find().rideId, + 'created_at': DateTime.now().toString(), + 'lat': myLocation.latitude.toString(), + 'lng': myLocation.longitude.toString(), + }, TableName.rideLocation); + } + } + // } @@ -75,45 +116,29 @@ class LocationController extends GetxController { Future getLocation() async { isLoading = true; update(); - bool serviceEnabled; - PermissionStatus permissionGranted; - - // Check if location services are enabled - serviceEnabled = await location.serviceEnabled(); - if (!serviceEnabled) { - serviceEnabled = await location.requestService(); - if (!serviceEnabled) { - // Location services are still not enabled, handle the error - return; - } - } - - // Check if the app has permission to access location - permissionGranted = await location.hasPermission(); - if (permissionGranted == PermissionStatus.denied) { - permissionGranted = await location.requestPermission(); - if (permissionGranted != PermissionStatus.granted) { - // Location permission is still not granted, handle the error - return; - } - } - - // Configure location accuracy - // LocationAccuracy desiredAccuracy = LocationAccuracy.high; // Get the current location LocationData _locationData = await location.getLocation(); - myLocation = - (_locationData.latitude != null && _locationData.longitude != null - ? LatLng(_locationData.latitude!, _locationData.longitude!) - : null)!; + myLocation = LatLng(_locationData.latitude!, _locationData.longitude!); + + accuracy = _locationData.accuracy!; + latitude = _locationData.latitude!; + longitude = _locationData.longitude!; + heading = _locationData.heading!; + speed = _locationData.speed!; + speedAccuracy = _locationData.speedAccuracy!; + headingAccuracy = _locationData.headingAccuracy!; // Print location details - // print('myLocation: ${myLocation}'); - // print('Accuracy: ${_locationData.accuracy}'); - // print('Latitude: ${_locationData.latitude}'); - // print('Longitude: ${_locationData.longitude}'); - // print('Time: ${_locationData.time}'); + // print('myLocation: $myLocation'); + // print('Accuracy: $accuracy'); + // print('Latitude: $latitude'); + // print('Longitude: $longitude'); + // print('heading: $heading'); + // print('speed: $speed'); + // print('speedAccuracy: $speedAccuracy'); + // print('headingAccuracy: $headingAccuracy'); + isLoading = false; update(); } diff --git a/lib/controller/home/captin/home_captain_controller.dart b/lib/controller/home/captin/home_captain_controller.dart index ae2a31a..62376bf 100644 --- a/lib/controller/home/captin/home_captain_controller.dart +++ b/lib/controller/home/captin/home_captain_controller.dart @@ -14,6 +14,7 @@ import '../../../main.dart'; import '../../../views/home/my_wallet/walet_captain.dart'; import '../../../views/widgets/elevated_btn.dart'; import '../../functions/crud.dart'; +import '../../functions/location_background_controller.dart'; import '../../functions/location_controller.dart'; import '../payment/captain_wallet_controller.dart'; @@ -39,6 +40,7 @@ class HomeCaptainController extends GetxController { double widthMapTypeAndTraffic = 50; // Inject the LocationController class final locationController = Get.put(LocationController()); + // final locationBackController = Get.put(LocationBackgroundController()); String formatDuration(Duration duration) { String twoDigits(int n) => n.toString().padLeft(2, "0"); String twoDigitMinutes = twoDigits(duration.inMinutes.remainder(60)); @@ -60,6 +62,7 @@ class HomeCaptainController extends GetxController { if (isActive) { if (double.parse(totalPoints) > -300) { locationController.startLocationUpdates(); + // locationBackController.startBackLocation(); activeStartTime = DateTime.now(); activeTimer = Timer.periodic(const Duration(seconds: 1), (timer) { activeDuration = DateTime.now().difference(activeStartTime!); diff --git a/lib/controller/home/captin/map_driver_controller.dart b/lib/controller/home/captin/map_driver_controller.dart index d429aa2..9d88362 100644 --- a/lib/controller/home/captin/map_driver_controller.dart +++ b/lib/controller/home/captin/map_driver_controller.dart @@ -546,7 +546,10 @@ update ui for totla results // })); // } // add wallet from passenger from driver - Get.to(() => RatePassenger()); + Get.to(() => RatePassenger(), arguments: { + 'passengerId': passengerId, + 'rideId': rideId, + }); // Get.back(); } @@ -653,22 +656,24 @@ update ui for totla results final previousLocationOfDrivers = await sql.getCustomQuery('''SELECT * FROM - ${TableName.carLocations} + ${TableName.rideLocation} WHERE order_id = $rideId ORDER BY created_at DESC LIMIT 1'''); - + print(previousLocationOfDrivers); //get from sql if (previousLocationOfDrivers.isNotEmpty) { var lat = double.parse(previousLocationOfDrivers[0]['lat']); var lng = double.parse(previousLocationOfDrivers[0]['lng']); LatLng prev = LatLng(lat, lng); - recentAngelToMarker = calculateAngleBetweenLocations(prev, myLocation); + recentDistanceToDash = calculateDistanceBetweenLocations(prev, myLocation); + print('recentAngelToMarker $recentAngelToMarker'); + print('recentDistanceToDash $recentDistanceToDash'); } sql.insertData({ 'order_id': rideId, @@ -683,7 +688,7 @@ LIMIT position: locationController.myLocation, draggable: true, icon: carIcon, - rotation: recentAngelToMarker, + rotation: locationController.heading, // infoWindow: const InfoWindow( // title: 'Time', // ), @@ -724,7 +729,7 @@ LIMIT void addCustomEndIcon() { ImageConfiguration config = ImageConfiguration( - size: const Size(30, 30), devicePixelRatio: Get.pixelRatio); + size: const Size(25, 25), devicePixelRatio: Get.pixelRatio); BitmapDescriptor.fromAssetImage(config, 'assets/images/b.png', mipmaps: false) .then((value) { diff --git a/lib/controller/home/map_passenger_controller.dart b/lib/controller/home/map_passenger_controller.dart index 50b9f1b..c71a180 100644 --- a/lib/controller/home/map_passenger_controller.dart +++ b/lib/controller/home/map_passenger_controller.dart @@ -87,7 +87,7 @@ class MapPassengerController extends GetxController { List polylineCoordinates3 = []; List polylineCoordinates4 = []; List> polylineCoordinatesPointsAll = []; - List carsLocationByPassenger = []; + List carsLocationByPassenger = []; List driverCarsLocationToPassengerAfterApplied = []; BitmapDescriptor markerIcon = BitmapDescriptor.defaultMarker; BitmapDescriptor tripIcon = BitmapDescriptor.defaultMarker; @@ -144,7 +144,7 @@ class MapPassengerController extends GetxController { double paymentPageShown = Get.height * .6; late LatLng southwest; late LatLng northeast; - List carLocations = []; + List carLocationsModels = []; var dataCarsLocationByPassenger; var datadriverCarsLocationToPassengerAfterApplied; CarLocation? nearestCar; @@ -840,6 +840,7 @@ class MapPassengerController extends GetxController { : '0', box.read(BoxName.email).toString(), ]; + print(body); FirebaseMessagesController().sendNotificationToDriverMapPolyline( 'Order', jsonDecode(value)['message'].toString(), @@ -847,7 +848,7 @@ class MapPassengerController extends GetxController { .toString(), body, polylineCoordinates.toString()); - // //print(dataCarsLocationByPassenger); + print(dataCarsLocationByPassenger); // //print(dataCarsLocationByPassenger['message'][0]['token'].toString()); }); delayAndFetchRideStatus(rideId); @@ -923,13 +924,46 @@ class MapPassengerController extends GetxController { polylineCoordinates.toString()); } - delayAndFetchRideStatus(rideId); + delayAndFetchRideStatusForAllDriverAvailable(rideId); update(); } String statusRide = 'wait'; void delayAndFetchRideStatus(String rideId) { + Timer(const Duration(milliseconds: 200), () async { + if (shouldFetch) { + // //print('shouldFetch is =$shouldFetch'); + var res = await CRUD() + .get(link: AppLink.getRideStatus, payload: {'id': rideId}); + print(res); + var decod = jsonDecode(res); + print(' 0000000000000000000000000000000000000000000000000'); + print(decod['data']); + if (decod['data'].toString() == 'Apply') { + // getUpdatedRideForDriverApply(rideId); + shouldFetch = false; // Stop further fetches + statusRide = 'Apply'; + rideConfirm = false; + isSearchingWindow = false; + update(); + startTimer(); + } else if (decod['data'].toString() == 'Refused') { + // isDriversTokensSend = false; + if (isDriversTokensSend == false) { + confirmRideForAllDriverAvailable(); + isDriversTokensSend = true; + } + } else if (isDriversTokensSend == false) { + delayAndFetchRideStatus( + rideId); // Repeat the delay and fetch operation + update(); + } + } + }); + } + + void delayAndFetchRideStatusForAllDriverAvailable(String rideId) { Timer(const Duration(milliseconds: 200), () async { if (shouldFetch) { // //print('shouldFetch is =$shouldFetch'); @@ -947,18 +981,7 @@ class MapPassengerController extends GetxController { isSearchingWindow = false; update(); startTimer(); - } else if (decod['data'].toString() == 'Refused') { - // isDriversTokensSend = false; - if (isDriversTokensSend == false) { - confirmRideForAllDriverAvailable(); - isDriversTokensSend = true; - } } - // else if (isDriversTokensSend == false) { - // delayAndFetchRideStatus( - // rideId); // Repeat the delay and fetch operation - // update(); - // } } }); } @@ -1025,6 +1048,8 @@ class MapPassengerController extends GetxController { } late LatLng currentDriverLocation; + late double headingList; + Future getCarsLocationByPassenger() async { // if (rideConfirm == false) { carsLocationByPassenger = []; @@ -1057,28 +1082,28 @@ class MapPassengerController extends GetxController { carsLocationByPassenger.clear(); // Clear existing markers - late LatLng lastDriverLocation; // Initialize a variable for last location + // late LatLng lastDriverLocation; // Initialize a variable for last location for (var i = 0; i < dataCarsLocationByPassenger['message'].length; i++) { - currentDriverLocation = LatLng( - double.parse(dataCarsLocationByPassenger['message'][i]['latitude']), - double.parse(dataCarsLocationByPassenger['message'][i]['longitude']), - ); + var json = dataCarsLocationByPassenger['message'][i]; + print(json); + CarLocationModel model = CarLocationModel.fromJson(json); + carLocationsModels.add(model); - // Update lastDriverLocation on each iteration - previousLocationOfDrivers = currentDriverLocation; + // currentDriverLocation = LatLng( + // double.parse(json['latitude']), + // double.parse(json['longitude']), + // ); + // // headingList = double.parse(json['heading']); - carsLocationByPassenger.add(currentDriverLocation); - driversToken.add(dataCarsLocationByPassenger['message'][i]['token']); + // // Update lastDriverLocation on each iteration + // previousLocationOfDrivers = currentDriverLocation; + // carsLocationByPassenger.add(currentDriverLocation); + // // carsLocationByPassenger.add(headingList); + + driversToken.add(json['token']); } - // // Calculate rotation angle here (explained below) - // if (previousLocationOfDrivers != null) { - // angleDegrees = calculateAngleBetweenLocations( - // previousLocationOfDrivers, currentDriverLocation); - // // Use rotationAngle for marker rotation logic - // } - update(); } } @@ -1126,11 +1151,7 @@ class MapPassengerController extends GetxController { for (var i = 0; i < driverCarsLocationToPassengerAfterApplied.length; i++) { // } // for (var item in driverCarsLocationToPassengerAfterApplied) { - double rotationCar = calculateAngleBetweenLocations( - LatLng(driverCarsLocationToPassengerAfterApplied[i - 1].latitude, - driverCarsLocationToPassengerAfterApplied[i - 1].longitude), - LatLng(driverCarsLocationToPassengerAfterApplied[i].latitude, - driverCarsLocationToPassengerAfterApplied[i].longitude)); + final driverAcceptedMarker = Marker( onTap: () => print('marker pressed'), infoWindow: InfoWindow( @@ -1141,7 +1162,8 @@ class MapPassengerController extends GetxController { .toString()), position: LatLng(driverCarsLocationToPassengerAfterApplied[i].latitude, driverCarsLocationToPassengerAfterApplied[i].longitude), - rotation: rotationCar, + rotation: datadriverCarsLocationToPassengerAfterApplied['message'][0] + ['heading'], ); markers.add(driverAcceptedMarker); update(); @@ -1624,12 +1646,12 @@ class MapPassengerController extends GetxController { // print('currentLocationOfDrivers $currentLocationOfDrivers'); // } final marker = Marker( - infoWindow: InfoWindow(title: '${item.latitude} minutes'), - markerId: MarkerId(durationToPassenger.toString()), - position: LatLng(item.latitude, item.longitude), - rotation: math.Random().nextDouble() * 360, - // Other properties for the marker, such as icon, info window, etc. - ); + infoWindow: InfoWindow(title: '${item.latitude} minutes'), + markerId: MarkerId(durationToPassenger.toString()), + position: LatLng(item.latitude, item.longitude), + rotation: item.headingList + // Other properties for the marker, such as icon, info window, etc. + ); markers.add(marker); update(); } diff --git a/lib/controller/local/translations.dart b/lib/controller/local/translations.dart index 46ba298..1a2fab1 100644 --- a/lib/controller/local/translations.dart +++ b/lib/controller/local/translations.dart @@ -386,6 +386,7 @@ class MyTranslation extends Translations { 'Total price from ': 'المبلغ المطلوب من ', 'Order Details Speed': 'طلب سريع', 'Order Applied': "نفذ الطلب", + 'accepted your order': 'قبل طلبك', 'We regret to inform you that another driver has accepted this order.': 'نأسف لإبلاغك بأن سائقًا آخر قد قبل هذا الطلب', "The order has been accepted by another driver.": diff --git a/lib/controller/payment/payment_controller.dart b/lib/controller/payment/payment_controller.dart index 0499f26..4e5c64c 100644 --- a/lib/controller/payment/payment_controller.dart +++ b/lib/controller/payment/payment_controller.dart @@ -176,13 +176,14 @@ class PaymentController extends GetxController { phone: box.read(BoxName.phoneDriver) == null ? box.read(BoxName.phone).toString() : box.read(BoxName.phoneDriver).toString(), - address: const Address( + address: Address( city: 'city', - country: 'Jordan', //'United States' + country: box.read(BoxName.countryCode), //'United States' line1: '', line2: '', postalCode: '12345', - state: 'Boston')), + state: box.read(BoxName.countryCode) // 'Boston' + )), allowsDelayedPaymentMethods: true, customerEphemeralKeySecret: Stripe.merchantIdentifier, appearance: const PaymentSheetAppearance( @@ -193,9 +194,9 @@ class PaymentController extends GetxController { ), billingDetailsCollectionConfiguration: const BillingDetailsCollectionConfiguration( - name: CollectionMode.always, - phone: CollectionMode.always, - email: CollectionMode.always, + name: CollectionMode.automatic, + phone: CollectionMode.automatic, + email: CollectionMode.automatic, ), ), ); @@ -352,36 +353,36 @@ class PaymentController extends GetxController { "business_profile[name]": box.read(BoxName.nameDriver), "business_profile[product_description]": "Captain", "business_profile[support_address][city]": "San Francisco", - "business_profile[support_address][country]": "US", + "business_profile[support_address][country]": 'US', "business_profile[support_address][line1]": licenseDetailsMap['message'][0]['address'].toString().trim()[0], "business_profile[support_address][postal_code]": licenseDetailsMap['message'][0]['postalCode'], "business_profile[support_address][state]": "MA", - "business_profile[support_email]": "support@mobile-app.store", + "business_profile[support_email]": "support@sefer.live", "business_profile[support_phone]": "555-123-4567", - "business_profile[url]": "https://mobile-app.store", + "business_profile[url]": "https://sefer.live", "business_type": "individual", "capabilities[card_payments][requested]": "true", "capabilities[transfers][requested]": "true", - "company[address][city]": "San Francisco", + "company[address][city]": "ATTLEBORO", "company[address][country]": "US", - "company[address][line1]": "122 Main St", - "company[address][postal_code]": "94111", + "company[address][line1]": "1249 NEWPORT AVE", + "company[address][postal_code]": "02703 ", "company[address][state]": "MA", "company[name]": AppInformation.companyName, "country": "us", "default_currency": "usd", - "email": "support@mobile.store", + "email": "support@sefer.live", // "individual[ssn]": "123-45-6789", // "individual[id_number]": licenseDetailsMap['message'][0]['documentNo'], // "individual[id_type]": "drivers_license", // - "individual[address][city]": "San Francisco", + "individual[address][city]": "ATTLEBORO", "individual[address][country]": "US", "individual[address][line1]": licenseDetailsMap['message'][0]['address'], // "individual[address][postal_code]": licenseDetailsMap['message'][0] // ['postalCode'], - "individual[address][state]": "CA", + "individual[address][state]": "MA", // "individual[ssn_last_4]": '1111', //////// "individual[dob][day]": day.toString(), "individual[dob][month]": month.toString(), diff --git a/lib/controller/rate/rate_conroller.dart b/lib/controller/rate/rate_conroller.dart index fab0d67..d564f91 100644 --- a/lib/controller/rate/rate_conroller.dart +++ b/lib/controller/rate/rate_conroller.dart @@ -1,4 +1,5 @@ import 'package:SEFER/controller/home/captin/map_driver_controller.dart'; +import 'package:SEFER/views/home/home_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:SEFER/constant/box_name.dart'; diff --git a/lib/main.dart b/lib/main.dart index bf69988..d660a43 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,7 @@ import 'dart:io'; +import 'package:SEFER/constant/box_name.dart'; +import 'package:background_location/background_location.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; @@ -14,6 +16,7 @@ import 'constant/credential.dart'; import 'constant/info.dart'; import 'controller/firebase/firbase_messge.dart'; import 'controller/firebase/local_notification.dart'; +import 'controller/functions/location_background_controller.dart'; import 'controller/local/local_controller.dart'; import 'controller/local/translations.dart'; import 'firebase_options.dart'; @@ -31,9 +34,17 @@ Future backgroundMessageHandler(RemoteMessage message) async { FirebaseMessagesController().fireBaseTitles(message); } +// @pragma('vm:entry-point') +// Future backgroundLocation() async { +// await LocationBackgroundController().startBackLocation().then((location) { +// print('This is current Location ${location.toMap()}'); +// }); +// } + void main() async { WidgetsFlutterBinding.ensureInitialized(); WakelockPlus.enable(); + await BackgroundLocation.startLocationService(); if (Platform.isAndroid) { await NotificationController().initNotifications(); } @@ -46,7 +57,9 @@ void main() async { print(Get.deviceLocale!.countryCode); Stripe.publishableKey = AK.publishableKey; - + // if (box.read(BoxName.driverID) != null) { + // Get.put(LocationBackgroundController()); + // } if (Platform.isAndroid || Platform.isIOS) { await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, diff --git a/lib/models/db_sql.dart b/lib/models/db_sql.dart index 0fafa4a..e941f5b 100644 --- a/lib/models/db_sql.dart +++ b/lib/models/db_sql.dart @@ -60,7 +60,7 @@ class DbSql { await db.execute(''' CREATE TABLE IF NOT EXISTS ${TableName.rideLocation}( id INTEGER PRIMARY KEY AUTOINCREMENT, - order_id TEXT UNIQUE, + order_id TEXT , created_at TEXT, lat TEXT, lng TEXT diff --git a/lib/models/model/locations.dart b/lib/models/model/locations.dart index b88264d..3b18b60 100644 --- a/lib/models/model/locations.dart +++ b/lib/models/model/locations.dart @@ -1,7 +1,9 @@ class CarLocationModel { - int id; - int driverId; + String id; + String driverId; double latitude; + double heading; + double speed; double longitude; DateTime createdAt; DateTime updatedAt; @@ -11,6 +13,8 @@ class CarLocationModel { required this.driverId, required this.latitude, required this.longitude, + required this.heading, + required this.speed, required this.createdAt, required this.updatedAt, }); @@ -19,8 +23,10 @@ class CarLocationModel { return CarLocationModel( id: json['id'], driverId: json['driver_id'], - latitude: json['latitude'], - longitude: json['longitude'], + latitude: double.parse(json['latitude'].toString()), + longitude: double.parse(json['longitude'].toString()), + heading: double.parse(json['heading'].toString()), + speed: double.parse(json['speed'].toString()), createdAt: DateTime.parse(json['created_at']), updatedAt: DateTime.parse(json['updated_at']), ); diff --git a/lib/views/Rate/rate_passenger.dart b/lib/views/Rate/rate_passenger.dart index cb69276..32bb3ce 100644 --- a/lib/views/Rate/rate_passenger.dart +++ b/lib/views/Rate/rate_passenger.dart @@ -27,35 +27,36 @@ class RatePassenger extends StatelessWidget { decoration: AppStyle.boxDecoration, child: Column( children: [ - // Padding( - // padding: const EdgeInsets.all(4), - // child: Container( - // height: Get.height * .25, - // decoration: AppStyle.boxDecoration1, - // child: Column( - // children: [ - // Text( - // '${'Total price from '.tr}${Get.find().passengerName}', - // style: AppStyle.title, - // ), - // Container( - // decoration: BoxDecoration( - // border: Border.all( - // width: 2, - // color: AppColor.greenColor, - // )), - // child: Padding( - // padding: const EdgeInsets.all(4), - // child: Text( - // Get.find() - // .totalPassenger, - // style: AppStyle.number, - // ), - // ), - // ), - // ], - // )), - // ), + Padding( + padding: const EdgeInsets.all(4), + child: Container( + height: Get.height * .25, + decoration: AppStyle.boxDecoration1, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + '${'Total price from '.tr}${Get.find().passengerName}', + style: AppStyle.title, + ), + Container( + decoration: BoxDecoration( + border: Border.all( + width: 2, + color: AppColor.greenColor, + )), + child: Padding( + padding: const EdgeInsets.all(4), + child: Text( + Get.find() + .totalPassenger, + style: AppStyle.number, + ), + ), + ), + ], + )), + ), Center( child: RatingBar.builder( initialRating: 0, diff --git a/lib/views/home/Captin/mapDriverWidgets/google_driver_map_page.dart b/lib/views/home/Captin/mapDriverWidgets/google_driver_map_page.dart index 63c9067..eb46346 100644 --- a/lib/views/home/Captin/mapDriverWidgets/google_driver_map_page.dart +++ b/lib/views/home/Captin/mapDriverWidgets/google_driver_map_page.dart @@ -71,11 +71,11 @@ class GoogleDriverMap extends StatelessWidget { }, markers: { Marker( - markerId: MarkerId('MyLocation'.tr), - position: locationController.myLocation, - draggable: true, - icon: controller.carIcon, - ), + markerId: MarkerId('MyLocation'.tr), + position: locationController.myLocation, + draggable: true, + icon: controller.carIcon, + rotation: locationController.heading), Marker( markerId: MarkerId('start'.tr), position: controller.latLngpassengerLocation, diff --git a/lib/views/home/Captin/orderCaptin/order_request_page.dart b/lib/views/home/Captin/orderCaptin/order_request_page.dart index 5d0cc82..ab2a236 100644 --- a/lib/views/home/Captin/orderCaptin/order_request_page.dart +++ b/lib/views/home/Captin/orderCaptin/order_request_page.dart @@ -1,5 +1,6 @@ import 'package:SEFER/controller/home/captin/home_captain_controller.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:get/get.dart'; import 'package:SEFER/constant/box_name.dart'; import 'package:SEFER/controller/firebase/firbase_messge.dart'; @@ -61,8 +62,8 @@ class OrderRequestPage extends StatelessWidget { return MyScafolld( title: 'Order Details'.tr, body: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, + ListView( + // crossAxisAlignment: CrossAxisAlignment.start, children: [ // SizedBox(height: 200, child: Text(pointsList.toString())), // Text(message.notification!.body.toString()), diff --git a/lib/views/home/Captin/orderCaptin/order_speed_request.dart b/lib/views/home/Captin/orderCaptin/order_speed_request.dart index 3eb7695..9117016 100644 --- a/lib/views/home/Captin/orderCaptin/order_speed_request.dart +++ b/lib/views/home/Captin/orderCaptin/order_speed_request.dart @@ -296,7 +296,7 @@ class OrderSpeedRequest extends StatelessWidget { FirebaseMessagesController() .sendNotificationToPassengerToken( 'Apply Ride', - arguments['DriverList'][9].toString(), + 'The ${box.read(BoxName.nameDriver)} ${'accepted your order'.tr}', arguments['DriverList'][9].toString(), // box.read(BoxName.tokenDriver).toString(), bodyToPassenger, @@ -338,17 +338,13 @@ class OrderSpeedRequest extends StatelessWidget { ), GetBuilder( builder: (timerController) { - final isNearEnd = - timerController.remainingTimeSpeed <= - 5; // Define a threshold for "near end" - return Stack( alignment: Alignment.center, children: [ CircularProgressIndicator( value: timerController.progressSpeed, // Set the color based on the "isNearEnd" condition - color: isNearEnd ? Colors.red : Colors.blue, + color: Colors.blue, ), Text( '${timerController.remainingTimeSpeed}', diff --git a/lib/views/home/map_widget.dart/apply_order_widget.dart b/lib/views/home/map_widget.dart/apply_order_widget.dart index abb17b9..3b1597f 100644 --- a/lib/views/home/map_widget.dart/apply_order_widget.dart +++ b/lib/views/home/map_widget.dart/apply_order_widget.dart @@ -14,7 +14,8 @@ class ApplyOrderWidget extends StatelessWidget { @override Widget build(BuildContext context) { return GetBuilder(builder: (controller) { - if (controller.statusRide == 'Apply') { + if (controller.statusRide == 'Apply' && + controller.isSearchingWindow == false) { double _height = 250; return Positioned( bottom: 0, diff --git a/lib/views/home/map_widget.dart/google_map_passenger_widget.dart b/lib/views/home/map_widget.dart/google_map_passenger_widget.dart index f89bf14..8833eaf 100644 --- a/lib/views/home/map_widget.dart/google_map_passenger_widget.dart +++ b/lib/views/home/map_widget.dart/google_map_passenger_widget.dart @@ -144,23 +144,29 @@ class GoogleMapPassengerWidget extends StatelessWidget { zoom: 15, ), markers: { - // controller.carMarkerAplied, - for (var carLocation in controller.carsLocationByPassenger) - Marker( - // anchor: const Offset(4, 4), - position: carLocation, - icon: controller.carIcon, - markerId: MarkerId(carLocation.toString()), - rotation: controller.angleDegrees, - ), /////////////////// - // controller.carMarrkerAplied, - for (var carLocation - in controller.driverCarsLocationToPassengerAfterApplied) - Marker( + if (controller.statusRide != 'Apply' || + !controller.rideTimerBegin) + for (var carLocation in controller.carLocationsModels) + Marker( // anchor: const Offset(4, 4), - position: carLocation, + position: LatLng( + carLocation.latitude, + carLocation.longitude, + ), icon: controller.carIcon, - markerId: MarkerId(carLocation.toString())), + markerId: MarkerId(carLocation.toString()), + rotation: carLocation.heading, + ), /////////////////// + // controller.carMarrkerAplied, + if (controller.statusRide == 'Apply') + for (var carLocation + in controller.driverCarsLocationToPassengerAfterApplied) + Marker( + // anchor: const Offset(4, 4), + position: carLocation, + icon: controller.carIcon, + rotation: controller.headingList, + markerId: MarkerId(carLocation.toString())), for (int i = 1; i < controller.coordinatesWithoutEmpty.length - 1; i++) 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 75bc513..3e4e2d8 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 @@ -115,7 +115,7 @@ GetBuilder leftMainMenuIcons() { // NotificationController() // .showNotification('Order', 'hi this is', 'tone1'); // Get.to(() => DriverCallPage()); - print(controller.polylineCoordinates.toString()); + print(controller.carLocationsModels); // PassengerCallPage( // channelName: '', // token: '',