356 lines
13 KiB
Dart
356 lines
13 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:get/get.dart';
|
|
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
|
import 'package:google_polyline_algorithm/google_polyline_algorithm.dart';
|
|
|
|
import '../../../constant/api_key.dart';
|
|
import '../../../constant/box_name.dart';
|
|
import '../../../constant/colors.dart';
|
|
import '../../../constant/links.dart';
|
|
import '../../../main.dart';
|
|
import '../../functions/crud.dart';
|
|
import '../../functions/location_controller.dart';
|
|
import 'home_captain_controller.dart';
|
|
|
|
class SpeedMapController extends GetxController {
|
|
bool isLoading = true;
|
|
final formKey1 = GlobalKey<FormState>();
|
|
final sosEmergincyNumberCotroller = TextEditingController();
|
|
List data = [];
|
|
List dataDestination = [];
|
|
LatLngBounds? boundsData;
|
|
double mpg = 0;
|
|
BitmapDescriptor carIcon = BitmapDescriptor.defaultMarker;
|
|
BitmapDescriptor passengerIcon = BitmapDescriptor.defaultMarker;
|
|
BitmapDescriptor startIcon = BitmapDescriptor.defaultMarker;
|
|
BitmapDescriptor endIcon = BitmapDescriptor.defaultMarker;
|
|
final List<LatLng> polylineCoordinates = [];
|
|
final List<LatLng> polylineCoordinatesDestination = [];
|
|
List<Polyline> polyLines = [];
|
|
List<Polyline> polyLinesDestination = [];
|
|
Set<Marker> markers = {};
|
|
late String passengerLocation;
|
|
late String passengerDestination;
|
|
late String step0;
|
|
late String step1;
|
|
late String step2;
|
|
late String step3;
|
|
late String step4;
|
|
late String passengerWalletBurc;
|
|
late String timeOfOrder;
|
|
late String duration;
|
|
late String totalCost;
|
|
late String distance;
|
|
late String passengerName;
|
|
late String passengerEmail;
|
|
late String totalPassenger;
|
|
late String passengerPhone;
|
|
late String rideId;
|
|
late String isHaveSteps;
|
|
late String paymentAmount;
|
|
late String paymentMethod;
|
|
late String passengerId;
|
|
late String driverId;
|
|
late String tokenPassenger;
|
|
late String durationToPassenger;
|
|
late String walletChecked;
|
|
late String direction;
|
|
late String carType;
|
|
late String kazan;
|
|
late String startNameLocation;
|
|
late String endNameLocation;
|
|
late String durationOfRideValue;
|
|
late String status;
|
|
String stringRemainingTimeToPassenger = '';
|
|
|
|
String stringRemainingTimeWaitingPassenger = '';
|
|
late Duration durationToAdd;
|
|
int hours = 0;
|
|
int minutes = 0;
|
|
int timeWaitingPassenger = 5; //5 miniute
|
|
bool isPassengerInfoWindow = false;
|
|
bool isBtnRideBegin = false;
|
|
bool isArrivedSend = true;
|
|
bool isdriverWaitTimeEnd = false;
|
|
bool isRideFinished = false;
|
|
bool isRideStarted = false;
|
|
bool isPriceWindow = false;
|
|
double passengerInfoWindowHeight = Get.height * .38;
|
|
double driverEndPage = 100;
|
|
double progress = 0;
|
|
double progressToPassenger = 0;
|
|
double progressInPassengerLocationFromDriver = 0;
|
|
bool isRideBegin = false;
|
|
int progressTimerToShowPassengerInfoWindowFromDriver = 25;
|
|
int remainingTimeToShowPassengerInfoWindowFromDriver = 25;
|
|
int remainingTimeToPassenger = 60;
|
|
int remainingTimeInPassengerLocatioWait = 60;
|
|
bool isDriverNearPassengerStart = false;
|
|
GoogleMapController? mapController;
|
|
late LatLng myLocation;
|
|
int remainingTimeTimerRideBegin = 60;
|
|
String stringRemainingTimeRideBegin = '';
|
|
String stringRemainingTimeRideBegin1 = '';
|
|
double progressTimerRideBegin = 0;
|
|
late Timer timer;
|
|
String? mapAPIKEY;
|
|
final zones = <Zone>[];
|
|
String canelString = 'yet';
|
|
late LatLng latLngPassengerLocation;
|
|
late LatLng latLngPassengerDestination;
|
|
void clearPolyline() {
|
|
polyLines = [];
|
|
polyLinesDestination = [];
|
|
polylineCoordinates.clear();
|
|
polylineCoordinatesDestination.clear();
|
|
update();
|
|
}
|
|
|
|
argumentLoading() async {
|
|
passengerLocation = Get.arguments['passengerLocation'];
|
|
print(passengerLocation);
|
|
passengerDestination = Get.arguments['passengerDestination'];
|
|
print(passengerDestination);
|
|
duration = Get.arguments['Duration'];
|
|
totalCost = Get.arguments['totalCost'];
|
|
passengerId = Get.arguments['passengerId'];
|
|
driverId = Get.arguments['driverId'];
|
|
distance = Get.arguments['Distance'];
|
|
passengerName = Get.arguments['name'];
|
|
passengerEmail = Get.arguments['email'];
|
|
totalPassenger = Get.arguments['totalPassenger'];
|
|
passengerPhone = Get.arguments['phone'];
|
|
walletChecked = Get.arguments['WalletChecked'];
|
|
tokenPassenger = Get.arguments['tokenPassenger'];
|
|
direction = Get.arguments['direction'];
|
|
durationToPassenger = Get.arguments['DurationToPassenger'];
|
|
rideId = Get.arguments['rideId'];
|
|
durationOfRideValue = Get.arguments['durationOfRideValue'];
|
|
paymentAmount = Get.arguments['paymentAmount'];
|
|
paymentMethod = Get.arguments['paymentMethod'];
|
|
isHaveSteps = Get.arguments['isHaveSteps'];
|
|
step0 = Get.arguments['step0'];
|
|
step1 = Get.arguments['step1'];
|
|
step2 = Get.arguments['step2'];
|
|
step3 = Get.arguments['step3'];
|
|
step4 = Get.arguments['step4'];
|
|
passengerWalletBurc = Get.arguments['passengerWalletBurc'];
|
|
timeOfOrder = Get.arguments['timeOfOrder'];
|
|
carType = Get.arguments['carType'];
|
|
kazan = Get.arguments['kazan'];
|
|
startNameLocation = Get.arguments['startNameLocation'];
|
|
endNameLocation = Get.arguments['endNameLocation'];
|
|
|
|
// var coords = passengerLocation.toString().split(',');
|
|
// var coordDestination = passengerDestination.toString().split(',');
|
|
|
|
// Parse to double
|
|
double latPassengerLocation =
|
|
double.parse(passengerLocation.toString().split(',')[0]);
|
|
double lngPassengerLocation =
|
|
double.parse(passengerLocation.toString().split(',')[1]);
|
|
double latPassengerDestination =
|
|
double.parse(passengerDestination.toString().split(',')[0]);
|
|
double lngPassengerDestination =
|
|
double.parse(passengerDestination.toString().split(',')[1]);
|
|
latLngPassengerLocation =
|
|
LatLng(latPassengerLocation, lngPassengerLocation);
|
|
latLngPassengerDestination =
|
|
LatLng(latPassengerDestination, lngPassengerDestination);
|
|
String lat = Get.find<LocationController>().myLocation.latitude.toString();
|
|
String lng = Get.find<LocationController>().myLocation.longitude.toString();
|
|
String origin = '$lat,$lng';
|
|
print('latLngpassengerLocation $latLngPassengerLocation');
|
|
print('latLngPassengerDestination $latLngPassengerDestination');
|
|
// Set the origin and destination coordinates for the Google Maps directions request.
|
|
Future.delayed(const Duration(seconds: 1));
|
|
getMap(origin, passengerLocation);
|
|
isHaveSteps == 'haveSteps'
|
|
? (
|
|
await getMapDestination(step0, step1),
|
|
await getMapDestination(step1, step2),
|
|
step3 == '' ? await getMapDestination(step2, step3) : () {},
|
|
step4 == '' ? await getMapDestination(step3, step4) : () {},
|
|
)
|
|
: await getMapDestination(passengerLocation, passengerDestination);
|
|
update();
|
|
}
|
|
|
|
double distanceBetweenDriverAndPassengerWhenConfirm = 0;
|
|
getMap(String origin, destination) async {
|
|
isLoading = false;
|
|
|
|
update();
|
|
|
|
var url =
|
|
('${AppLink.googleMapsLink}directions/json?&language=${box.read(BoxName.lang)}&avoid=tolls|ferries&destination=$destination&origin=$origin&key=${AK.mapAPIKEY}');
|
|
|
|
var response = await CRUD().getGoogleApi(link: url, payload: {});
|
|
data = response['routes'][0]['legs'];
|
|
print(data);
|
|
distanceBetweenDriverAndPassengerWhenConfirm =
|
|
(data[0]['distance']['value']) / 1000;
|
|
final points =
|
|
decodePolyline(response["routes"][0]["overview_polyline"]["points"]);
|
|
for (int i = 0; i < points.length; i++) {
|
|
double lat = points[i][0].toDouble();
|
|
double lng = points[i][1].toDouble();
|
|
polylineCoordinates.add(LatLng(lat, lng));
|
|
}
|
|
if (polyLines.isNotEmpty) {
|
|
clearPolyline();
|
|
var polyline = Polyline(
|
|
polylineId: PolylineId(response["routes"][0]["summary"]),
|
|
points: polylineCoordinates,
|
|
width: 10,
|
|
color: AppColor.blueColor,
|
|
);
|
|
polyLines.add(polyline);
|
|
// rideConfirm = false;
|
|
update();
|
|
} else {
|
|
var polyline = Polyline(
|
|
polylineId: PolylineId(response["routes"][0]["summary"]),
|
|
points: polylineCoordinates,
|
|
width: 10,
|
|
color: AppColor.blueColor,
|
|
);
|
|
// final dataBounds = response["routes"][0]["bounds"];
|
|
|
|
// updateCameraFromBoundsAfterGetMap(dataBounds);
|
|
|
|
// Fit the camera to the bounds
|
|
|
|
polyLines.add(polyline);
|
|
// rideConfirm = false;
|
|
// Define the northeast and southwest coordinates
|
|
final bounds = response["routes"][0]["bounds"];
|
|
LatLng northeast =
|
|
LatLng(bounds['northeast']['lat'], bounds['northeast']['lng']);
|
|
LatLng southwest =
|
|
LatLng(bounds['southwest']['lat'], bounds['southwest']['lng']);
|
|
|
|
// Create the LatLngBounds object
|
|
LatLngBounds boundsData =
|
|
LatLngBounds(northeast: northeast, southwest: southwest);
|
|
|
|
// Fit the camera to the bounds
|
|
var cameraUpdate = CameraUpdate.newLatLngBounds(boundsData, 140);
|
|
mapController!.animateCamera(cameraUpdate);
|
|
update();
|
|
}
|
|
}
|
|
|
|
getMapDestination(String origin, destination) async {
|
|
var url =
|
|
('${AppLink.googleMapsLink}directions/json?&language=${box.read(BoxName.lang)}&avoid=tolls|ferries&destination=$destination&origin=$origin&key=${AK.mapAPIKEY}');
|
|
|
|
var response = await CRUD().getGoogleApi(link: url, payload: {});
|
|
dataDestination = response['routes'][0]['legs'];
|
|
// print(data);
|
|
final points =
|
|
decodePolyline(response["routes"][0]["overview_polyline"]["points"]);
|
|
for (int i = 0; i < points.length; i++) {
|
|
double lat = points[i][0].toDouble();
|
|
double lng = points[i][1].toDouble();
|
|
polylineCoordinatesDestination.add(LatLng(lat, lng));
|
|
}
|
|
if (polyLinesDestination.isNotEmpty) {
|
|
// clearPolyline();
|
|
var polyline = Polyline(
|
|
polylineId: PolylineId(response["routes"][0]["summary"]),
|
|
points: polylineCoordinatesDestination,
|
|
width: 10,
|
|
color: AppColor.redColor,
|
|
);
|
|
polyLinesDestination.add(polyline);
|
|
// rideConfirm = false;
|
|
update();
|
|
} else {
|
|
var polyline = Polyline(
|
|
polylineId: PolylineId(response["routes"][0]["summary"]),
|
|
points: polylineCoordinatesDestination,
|
|
width: 10,
|
|
color: AppColor.redColor,
|
|
);
|
|
// final dataBounds = response["routes"][0]["bounds"];
|
|
|
|
// updateCameraFromBoundsAfterGetMap(dataBounds);
|
|
// polyLinesDestination.add(polyline);
|
|
// rideConfirm = false;
|
|
// Define the northeast and southwest coordinates
|
|
|
|
update();
|
|
}
|
|
}
|
|
|
|
void startTimerToShowPassengerInfoWindowFromDriver() async {
|
|
isPassengerInfoWindow = true;
|
|
for (int i = 0; i <= int.parse(durationToPassenger); i++) {
|
|
await Future.delayed(const Duration(seconds: 1));
|
|
progressToPassenger = i / int.parse(durationToPassenger);
|
|
remainingTimeToPassenger = int.parse(durationToPassenger) - i;
|
|
if (remainingTimeToPassenger == 0) {
|
|
isBtnRideBegin = true;
|
|
print(isBtnRideBegin);
|
|
update();
|
|
}
|
|
print(isBtnRideBegin);
|
|
print(remainingTimeToPassenger);
|
|
|
|
int minutes = (remainingTimeToPassenger / 60).floor();
|
|
int seconds = remainingTimeToPassenger % 60;
|
|
stringRemainingTimeToPassenger =
|
|
'$minutes:${seconds.toString().padLeft(2, '0')}';
|
|
|
|
update();
|
|
}
|
|
// update();
|
|
// startTimerToShowDriverToPassengerDuration();
|
|
}
|
|
|
|
void onMapCreated(GoogleMapController controller) async {
|
|
myLocation = Get.find<LocationController>().location as LatLng;
|
|
myLocation = myLocation;
|
|
mapController = controller;
|
|
controller.getVisibleRegion();
|
|
controller.animateCamera(
|
|
CameraUpdate.newLatLng(Get.find<LocationController>().myLocation),
|
|
);
|
|
update();
|
|
// Set up a timer or interval to trigger the marker update every 3 seconds.
|
|
timer = Timer.periodic(const Duration(seconds: 1), (_) {
|
|
// updateMarker();
|
|
});
|
|
}
|
|
|
|
@override
|
|
void onInit() async {
|
|
mapAPIKEY = await storage.read(key: BoxName.mapAPIKEY);
|
|
// Get the passenger location from the arguments.
|
|
await argumentLoading();
|
|
// addCustomCarIcon();
|
|
// addCustomPassengerIcon();
|
|
// addCustomStartIcon();
|
|
// addCustomEndIcon();
|
|
// updateMarker();
|
|
// updateLocation();
|
|
startTimerToShowPassengerInfoWindowFromDriver();
|
|
durationToAdd = Duration(seconds: int.parse(duration));
|
|
hours = durationToAdd.inHours;
|
|
minutes = (durationToAdd.inMinutes % 60).round();
|
|
calculateConsumptionFuel();
|
|
// cancelCheckRidefromPassenger();
|
|
// checkIsDriverNearPassenger();
|
|
super.onInit();
|
|
}
|
|
|
|
calculateConsumptionFuel() {
|
|
mpg = Get.find<HomeCaptainController>().fuelPrice /
|
|
12; //todo in register car add mpg in box
|
|
update();
|
|
}
|
|
}
|