using GMCabsDriverAssistant.Messages;
|
|
using GMCabsDriverAssistant.Models;
|
|
using GMCabsDriverAssistant.Utils;
|
|
using System;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using Microsoft.Maui;
|
|
using Microsoft.Maui.Controls;
|
|
|
|
namespace GMCabsDriverAssistant.Services
|
|
{
|
|
|
|
public class LocationService
|
|
{
|
|
private const double LOCATION_DISTANCE = 0.015; // 15 meters
|
|
readonly bool stopping = false;
|
|
private double lastLatitude = 0;
|
|
private double lastLongitude = 0;
|
|
|
|
public LocationService()
|
|
{
|
|
}
|
|
|
|
public async Task Run(CancellationToken token)
|
|
{
|
|
await Task.Run(async () =>
|
|
{
|
|
while (!stopping)
|
|
{
|
|
token.ThrowIfCancellationRequested();
|
|
try
|
|
{
|
|
await Task.Delay(10000);
|
|
|
|
var request = new GeolocationRequest(GeolocationAccuracy.Best);
|
|
var location = await Geolocation.GetLocationAsync(request);
|
|
if (location != null)
|
|
{
|
|
var message = new LocationMessage
|
|
{
|
|
Latitude = location.Latitude,
|
|
Longitude = location.Longitude
|
|
};
|
|
await UpdateLocationOnServer(location.Latitude, location.Longitude);
|
|
|
|
Device.BeginInvokeOnMainThread(() =>
|
|
{
|
|
MessagingCenter.Send<LocationMessage>(message, "Location");
|
|
});
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Device.BeginInvokeOnMainThread(() =>
|
|
{
|
|
var errormessage = new LocationErrorMessage();
|
|
MessagingCenter.Send<LocationErrorMessage>(errormessage, "LocationError");
|
|
});
|
|
}
|
|
}
|
|
return;
|
|
}, token);
|
|
}
|
|
private async Task UpdateLocationOnServer(double currentLatitude, double currentLongitude)
|
|
{
|
|
var token = Preferences.Get(SecureStorageData.Token,"");
|
|
if (token != null)
|
|
{
|
|
GMCabsDriverService gmCabsDriverService = new GMCabsDriverService();
|
|
LocationUpdateRequestDto locationUpdateRequestDto = new LocationUpdateRequestDto();
|
|
if (lastLatitude == 0.00 && lastLongitude == 0.00)
|
|
{
|
|
lastLatitude = currentLatitude;
|
|
lastLongitude = currentLongitude;
|
|
locationUpdateRequestDto.Latitude = currentLatitude;
|
|
locationUpdateRequestDto.Longitude = currentLongitude;
|
|
locationUpdateRequestDto.Imei = Preferences.Get("imeiNumber", null);
|
|
if (!string.IsNullOrEmpty(locationUpdateRequestDto.Imei))
|
|
{
|
|
await gmCabsDriverService.SendDriverLocationTablet(locationUpdateRequestDto);
|
|
}
|
|
else
|
|
{
|
|
await gmCabsDriverService.SendDriverLocation(token, locationUpdateRequestDto);
|
|
}
|
|
|
|
|
|
Preferences.Set("lastLat", currentLatitude);
|
|
Preferences.Set("lastLng", currentLongitude);
|
|
}
|
|
else
|
|
{
|
|
Location lastLocation = new Location(lastLatitude, lastLongitude);
|
|
Location currentLocation = new Location(currentLatitude, currentLongitude);
|
|
double kilometers = Location.CalculateDistance(lastLocation, currentLocation, DistanceUnits.Kilometers);
|
|
if (kilometers > LOCATION_DISTANCE)
|
|
{
|
|
|
|
lastLatitude = currentLatitude;
|
|
lastLongitude = currentLongitude;
|
|
locationUpdateRequestDto.Latitude = currentLatitude;
|
|
locationUpdateRequestDto.Longitude = currentLongitude;
|
|
locationUpdateRequestDto.Imei = Preferences.Get("imeiNumber", null);
|
|
if (!string.IsNullOrEmpty(locationUpdateRequestDto.Imei))
|
|
{
|
|
await gmCabsDriverService.SendDriverLocationTablet(locationUpdateRequestDto);
|
|
}
|
|
else
|
|
{
|
|
await gmCabsDriverService.SendDriverLocation(token, locationUpdateRequestDto);
|
|
}
|
|
|
|
Preferences.Set("lastLat", currentLatitude);
|
|
Preferences.Set("lastLng", currentLongitude);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|