149 lines
4.7 KiB
Dart
149 lines
4.7 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:get/get.dart';
|
|
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
|
import 'package:location/location.dart';
|
|
import 'package:Tripz/constant/box_name.dart';
|
|
import 'package:Tripz/constant/links.dart';
|
|
import 'package:Tripz/controller/functions/crud.dart';
|
|
import 'package:Tripz/controller/home/payment/captain_wallet_controller.dart';
|
|
import 'package:Tripz/main.dart';
|
|
|
|
// LocationController.dart
|
|
class LocationController extends GetxController {
|
|
LocationData? _currentLocation;
|
|
late Location location;
|
|
bool isLoading = false;
|
|
late double heading = 0;
|
|
late double accuracy = 0;
|
|
late double previousTime = 0;
|
|
late double latitude;
|
|
late double totalDistance = 0;
|
|
late double longitude;
|
|
late DateTime time;
|
|
late double speed = 0;
|
|
late double speedAccuracy = 0;
|
|
late double headingAccuracy = 0;
|
|
bool isActive = false;
|
|
late LatLng myLocation;
|
|
String totalPoints = '0';
|
|
LocationData? get currentLocation => _currentLocation;
|
|
Timer? _locationTimer;
|
|
|
|
@override
|
|
void onInit() async {
|
|
super.onInit();
|
|
location = Location();
|
|
getLocation();
|
|
// startLocationUpdates();
|
|
|
|
totalPoints = Get.put(CaptainWalletController()).totalPoints;
|
|
}
|
|
|
|
Future<void> startLocationUpdates() async {
|
|
if (box.read(BoxName.driverID) != null) {
|
|
_locationTimer =
|
|
Timer.periodic(const Duration(seconds: 5), (timer) async {
|
|
try {
|
|
totalPoints = Get.find<CaptainWalletController>().totalPoints;
|
|
|
|
// if (isActive) {
|
|
if (double.parse(totalPoints) > -300) {
|
|
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 * 3.6).toStringAsFixed(1),
|
|
'distance': totalDistance == 0
|
|
? '0'
|
|
: totalDistance < 1
|
|
? totalDistance.toStringAsFixed(3)
|
|
: totalDistance.toStringAsFixed(1),
|
|
'status': box.read(BoxName.statusDriverLocation).toString()
|
|
});
|
|
}
|
|
|
|
// }
|
|
} catch (e) {
|
|
// Handle the error gracefully
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
void stopLocationUpdates() {
|
|
_locationTimer?.cancel();
|
|
}
|
|
|
|
Future<void> 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)!;
|
|
speed = _locationData.speed!;
|
|
heading = _locationData.heading!;
|
|
// Calculate the distance between the current location and the previous location
|
|
// if (Get.find<HomeCaptainController>().rideId == 'rideId') {
|
|
// if (previousTime > 0) {
|
|
// double distance = calculateDistanceInKmPerHour(
|
|
// previousTime, _locationData.time, speed);
|
|
// totalDistance += distance;
|
|
// }
|
|
|
|
// previousTime = _locationData.time!;
|
|
// }
|
|
// Print location details
|
|
// isLoading = false;
|
|
update();
|
|
}
|
|
|
|
double calculateDistanceInKmPerHour(
|
|
double? startTime, double? endTime, double speedInMetersPerSecond) {
|
|
// Calculate the time difference in hours
|
|
double timeDifferenceInHours = (endTime! - startTime!) / 1000 / 3600;
|
|
|
|
// Convert speed to kilometers per hour
|
|
double speedInKmPerHour = speedInMetersPerSecond * 3.6;
|
|
|
|
// Calculate the distance in kilometers
|
|
double distanceInKilometers = speedInKmPerHour * timeDifferenceInHours;
|
|
|
|
return distanceInKilometers;
|
|
}
|
|
}
|