using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
//using Android.Content.PM;
|
|
using GMCabsDriverAssistant;
|
|
using GMCabsDriverAssistant.Messages;
|
|
using GMCabsDriverAssistant.Models;
|
|
using GMCabsDriverAssistant.Services;
|
|
using GMCabsDriverAssistant.Utils;
|
|
using GMCabsDriverAssistantSolution.Models.Rydo;
|
|
using GMCabsDriverAssistantSolution.Views;
|
|
using Microsoft.Maui;
|
|
using Microsoft.Maui.Controls;
|
|
using Sentry;
|
|
|
|
namespace GMCabsDriverAssistantSolution.ViewModels
|
|
{
|
|
public class HomeViewModel : BaseViewModel
|
|
{
|
|
#region Constants
|
|
|
|
private const int LOCATION_CHECK_TIME_INTERVAL = 10;
|
|
private const int LOCATION_READ_TIMEOUT = 10;
|
|
private const double LOCATION_DISTANCE = 0.01;
|
|
|
|
private double lastLatitude = 0.00, lastLongitude = 0.00;
|
|
|
|
#endregion Constants
|
|
|
|
#region Fields
|
|
public int seconds = 180;
|
|
public string timerSeconds = "3:00";
|
|
public string pickUpAddress = "";
|
|
public string dropUpAddress = "";
|
|
private bool isVisibleAcceptBookingView = false;
|
|
private readonly LoginResponseDto loginResponseDto = new LoginResponseDto();
|
|
private bool hasUnreadNotifications;
|
|
private bool isBookingAvailable;
|
|
private CancellationTokenSource cts;
|
|
private List<Guid> receivedBookingIDs;
|
|
public List<Guid> availableBookingIDs = new List<Guid>();
|
|
public bool isLocationPermitted;
|
|
#endregion
|
|
|
|
#region Properties
|
|
public bool IsVisibleAcceptBookingView
|
|
{
|
|
get => isVisibleAcceptBookingView;
|
|
set
|
|
{
|
|
SetProperty(ref isVisibleAcceptBookingView, value);
|
|
CustomTimer();
|
|
}
|
|
}
|
|
public string PickUpAddress
|
|
{
|
|
get => pickUpAddress;
|
|
set
|
|
{
|
|
SetProperty(ref pickUpAddress, value);
|
|
}
|
|
}
|
|
public string DropUpAddress
|
|
{
|
|
get => dropUpAddress;
|
|
set
|
|
{
|
|
SetProperty(ref dropUpAddress, value);
|
|
}
|
|
}
|
|
public bool HasUnreadNotifications
|
|
{
|
|
get => hasUnreadNotifications;
|
|
set => SetProperty(ref hasUnreadNotifications, value);
|
|
}
|
|
public bool IsBookingAvailable
|
|
{
|
|
get => isBookingAvailable;
|
|
set => SetProperty(ref isBookingAvailable, value);
|
|
}
|
|
public string TimerSeconds
|
|
{
|
|
get => timerSeconds;
|
|
set => SetProperty(ref timerSeconds, value);
|
|
}
|
|
public Location CurrentLocation { get; set; }
|
|
readonly ILocationConsent locationConsent;
|
|
#endregion
|
|
|
|
#region Constructor
|
|
|
|
public HomeViewModel()
|
|
{
|
|
Title = "Home";
|
|
GetToken();
|
|
locationConsent = DependencyService.Get<ILocationConsent>();
|
|
//HandleReceivedMessages();
|
|
//locationConsent.GetLocationConsent();
|
|
|
|
}
|
|
#endregion
|
|
|
|
#region Methods
|
|
[Obsolete]
|
|
public async Task OnAppearing()
|
|
{
|
|
isLocationPermitted = Preferences.Get(SecureStorageData.IsLocationPermitted, false);
|
|
//SendForegroundAlarmManager();
|
|
if (Device.RuntimePlatform != Device.iOS)
|
|
{
|
|
if (isLocationPermitted)
|
|
{
|
|
if (!DependencyService.Resolve<IForegroundService>().IsForeGroundServiceRunning())
|
|
{
|
|
Preferences.Set("isForeground", "YES");
|
|
DependencyService.Resolve<IForegroundService>().StartMyForegroundService();
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
var message = new StartServiceMessage();
|
|
MessagingCenter.Send(message, "ServiceStarted");
|
|
}
|
|
UpdateDriverAppSelectedPermissions();
|
|
GetUnreadNotificationCount();
|
|
await GetCurrentLocation();
|
|
await GetBookingAvailable();
|
|
CheckBookingAndNotificationAvailibility();
|
|
}
|
|
|
|
public async void GetToken()
|
|
{
|
|
var token = Preferences.Get(SecureStorageData.Token, "");
|
|
loginResponseDto.Token = Guid.Parse(token);
|
|
}
|
|
|
|
[Obsolete]
|
|
public async void GetUnreadNotificationCount()
|
|
{
|
|
var token = Preferences.Get(SecureStorageData.Token, "");
|
|
GMCabsDriverService gmCabsDriverService = new GMCabsDriverService();
|
|
var unreadNotification = await gmCabsDriverService.GetUnreadNotificationCount(token);
|
|
if (unreadNotification != null)
|
|
{
|
|
if (unreadNotification.StatusCode == Constant.UNAUTHORIZED_CODE)
|
|
{
|
|
GoToLoginPage();
|
|
}
|
|
else
|
|
{
|
|
if (unreadNotification.UnreadNotificationCount > 0)
|
|
{
|
|
HasUnreadNotifications = true;
|
|
}
|
|
else
|
|
{
|
|
HasUnreadNotifications = false;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
[Obsolete]
|
|
private void GoToLoginPage()
|
|
{
|
|
Device.BeginInvokeOnMainThread(async () =>
|
|
{
|
|
|
|
if (Device.RuntimePlatform != Device.iOS)
|
|
{
|
|
Preferences.Set("isForeground", "NO");
|
|
DependencyService.Resolve<IForegroundService>().StopMyForegroundService();
|
|
}
|
|
else if (Device.RuntimePlatform == Device.iOS)
|
|
{
|
|
var message = new StopServiceMessage();
|
|
MessagingCenter.Send(message, "ServiceStopped");
|
|
}
|
|
var token = Preferences.Get(SecureStorageData.Token, "");
|
|
Debug.WriteLine("TOKEN-------------", token);
|
|
var lastLatitude = Convert.ToDouble(Preferences.Get("lastLat", "0"));
|
|
var lastLongitude = Convert.ToDouble(Preferences.Get("lastLng", "0"));
|
|
GMCabsDriverService gmCabsDriverService = new GMCabsDriverService();
|
|
await gmCabsDriverService.LogoutDriverApp(token, lastLatitude, lastLongitude);
|
|
SecureStorage.RemoveAll();
|
|
Preferences.Clear();
|
|
SentrySdk.ConfigureScope(scope =>
|
|
{
|
|
scope.User = null;
|
|
});
|
|
await Shell.Current.GoToAsync($"//{nameof(LoginPage)}");
|
|
});
|
|
}
|
|
|
|
|
|
private async Task GetBookingAvailable()
|
|
{
|
|
var canAcceptBookings = Preferences.Get(SecureStorageData.CanAcceptBookings, false);
|
|
|
|
if (!canAcceptBookings || CurrentLocation == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var accessToken = Preferences.Get(EftposLoginResponse.RYDO_ACCESS_TOKEN, "");
|
|
var driverId = Preferences.Get(LoginResponseDto.USER_CODE, "");
|
|
GMCabsDriverService gmCabsDriverService = new GMCabsDriverService();
|
|
|
|
availableBookingIDs = await gmCabsDriverService.GetBookingAvailableCount(accessToken, driverId, CurrentLocation.Latitude, CurrentLocation.Longitude);
|
|
var cachedeBookingIds = await App.Database.GetBookingIdsAsync();
|
|
|
|
if (availableBookingIDs != null && availableBookingIDs.Count > 0)
|
|
{
|
|
bool areNewBookings = false;
|
|
//IEnumerable<Guid> newBookings = null;
|
|
List<Guid> cachedBookings = new List<Guid>();
|
|
|
|
if (cachedeBookingIds.Count == 0)
|
|
{
|
|
await App.Database.SaveBookingIdsAsync(availableBookingIDs.Select(g => g.ToString()));
|
|
areNewBookings = true;
|
|
}
|
|
else
|
|
{
|
|
foreach (var availableBooking in cachedeBookingIds)
|
|
{
|
|
cachedBookings.Add(Guid.Parse(availableBooking.BookingID));
|
|
}
|
|
int cachedBookingsCount = cachedBookings.Count();
|
|
var newBookings = availableBookingIDs.Except(cachedBookings);
|
|
if (newBookings.Count() > 0)
|
|
{
|
|
Console.WriteLine($"New Bookings Count: {newBookings.Count()}");
|
|
await App.Database.SaveBookingIdsAsync(newBookings.Select(g => g.ToString()));
|
|
areNewBookings = true;
|
|
}
|
|
}
|
|
|
|
IsBookingAvailable = true;
|
|
//if (Device.RuntimePlatform == Device.iOS)
|
|
//{
|
|
// if (areNewBookings)
|
|
// {
|
|
// var player = CrossSimpleAudioPlayer.Current;
|
|
// player.Load("newbooking.wav");
|
|
// player.Play();
|
|
// }
|
|
//}
|
|
}
|
|
else
|
|
{
|
|
IsBookingAvailable = false;
|
|
if (cachedeBookingIds.Count != 0)
|
|
{
|
|
foreach (var availableBooking in cachedeBookingIds)
|
|
{
|
|
await App.Database.DeleteBookingIdsAsync(availableBooking);
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
async Task GetCurrentLocation()
|
|
{
|
|
try
|
|
{
|
|
if (isLocationPermitted)
|
|
{
|
|
CurrentLocation = await Geolocation.GetLastKnownLocationAsync();
|
|
|
|
if (CurrentLocation == null)
|
|
{
|
|
var request = new GeolocationRequest(GeolocationAccuracy.Medium, TimeSpan.FromSeconds(LOCATION_READ_TIMEOUT));
|
|
cts = new CancellationTokenSource();
|
|
// CurrentLocation = await Geolocation.GetLocationAsync(request, cts.Token);
|
|
CurrentLocation = await Geolocation.GetLocationAsync(new GeolocationRequest
|
|
{
|
|
Timeout = TimeSpan.FromSeconds(50),
|
|
DesiredAccuracy = GeolocationAccuracy.Medium
|
|
});
|
|
|
|
}
|
|
}
|
|
}
|
|
catch (FeatureNotSupportedException fnsEx)
|
|
{
|
|
// Handle not supported on device exception
|
|
}
|
|
catch (FeatureNotEnabledException fneEx)
|
|
{
|
|
// Handle not enabled on device exception
|
|
}
|
|
catch (PermissionException pEx)
|
|
{
|
|
// Handle permission exception
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
// Unable to get location
|
|
}
|
|
}
|
|
|
|
public void OnDisappearing()
|
|
{
|
|
if (cts != null && !cts.IsCancellationRequested)
|
|
cts.Cancel();
|
|
}
|
|
|
|
[Obsolete]
|
|
private void CustomTimer()
|
|
{
|
|
Device.StartTimer(TimeSpan.FromSeconds(1), () =>
|
|
{
|
|
if (!isVisibleAcceptBookingView)
|
|
{
|
|
return false;
|
|
}
|
|
if (seconds > 0)
|
|
{
|
|
--seconds;
|
|
TimerSeconds = seconds / 60 + ":" + (seconds % 60 <= 9 ? "0" + seconds % 60 : "" + seconds % 60);
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
IsVisibleAcceptBookingView = false;
|
|
return false;
|
|
}
|
|
|
|
});
|
|
}
|
|
|
|
void HandleReceivedMessages()
|
|
{
|
|
//MessagingCenter.Subscribe<LocationMessage>(this, "Location", message =>
|
|
//{
|
|
// Device.BeginInvokeOnMainThread(async () =>
|
|
// {
|
|
// Console.WriteLine(message.Latitude);
|
|
// Console.WriteLine(message.Longitude);
|
|
|
|
// 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 = message.Latitude;
|
|
// lastLongitude = message.Longitude;
|
|
// locationUpdateRequestDto.Latitude = message.Latitude;
|
|
// locationUpdateRequestDto.Longitude = message.Longitude;
|
|
// await gmCabsDriverService.SendDriverLocation(token, locationUpdateRequestDto);
|
|
// }
|
|
// else
|
|
// {
|
|
// Location lastLocation = new Location(lastLatitude, lastLongitude);
|
|
// Location currentLocation = new Location(message.Latitude, message.Longitude);
|
|
// double kilometers = Location.CalculateDistance(lastLocation, currentLocation, DistanceUnits.Kilometers);
|
|
// if (kilometers > LOCATION_DISTANCE)
|
|
// {
|
|
// lastLatitude = message.Latitude;
|
|
// lastLongitude = message.Longitude;
|
|
// locationUpdateRequestDto.Latitude = message.Latitude;
|
|
// locationUpdateRequestDto.Longitude = message.Longitude;
|
|
// await gmCabsDriverService.SendDriverLocation(token, locationUpdateRequestDto);
|
|
// }
|
|
// }
|
|
// Preferences.Set("lastLat", message.Latitude);
|
|
// Preferences.Set("lastLng", message.Longitude);
|
|
// }
|
|
// });
|
|
//});
|
|
MessagingCenter.Subscribe<StopServiceMessage>(this, "ServiceStopped", message =>
|
|
{
|
|
Device.BeginInvokeOnMainThread(() =>
|
|
{
|
|
// UserMessage = "Location Service has been stopped!";
|
|
Console.WriteLine("Location Service has been stopped!");
|
|
});
|
|
});
|
|
MessagingCenter.Subscribe<LocationErrorMessage>(this, "LocationError", message =>
|
|
{
|
|
Device.BeginInvokeOnMainThread(() =>
|
|
{
|
|
// UserMessage = "There was an error updating location!";
|
|
Console.WriteLine("There was an error updating location!");
|
|
});
|
|
});
|
|
}
|
|
private async Task GetBookingsWithOutNotificationSound()
|
|
{
|
|
var accessToken = Preferences.Get(EftposLoginResponse.RYDO_ACCESS_TOKEN, "");
|
|
var driverId = Preferences.Get(LoginResponseDto.USER_CODE, "");
|
|
GMCabsDriverService gmCabsDriverService = new GMCabsDriverService();
|
|
availableBookingIDs = await gmCabsDriverService.GetBookingAvailableCount(accessToken, driverId, CurrentLocation.Latitude, CurrentLocation.Longitude);
|
|
if (availableBookingIDs.Count == 0)
|
|
{
|
|
IsBookingAvailable = false;
|
|
}
|
|
}
|
|
|
|
[Obsolete]
|
|
private void CheckBookingAndNotificationAvailibility()
|
|
{
|
|
Device.StartTimer(TimeSpan.FromSeconds(LOCATION_CHECK_TIME_INTERVAL), () =>
|
|
{
|
|
var isForeground = ShareConstant.IsInForeground;
|
|
Task.Run(async () =>
|
|
{
|
|
//GetUnreadNotificationCount(); //For avoiding duplicate call of UnreadCount API
|
|
await GetBookingsWithOutNotificationSound();
|
|
});
|
|
return isForeground;
|
|
});
|
|
}
|
|
|
|
[Obsolete]
|
|
private void SendForegroundAlarmManager()
|
|
{
|
|
Device.StartTimer(TimeSpan.FromMinutes(Constant.TIMER_MINUTES), () =>
|
|
{
|
|
var serviceRunningStatus = DependencyService.Resolve<IForegroundService>().IsForeGroundServiceRunning();
|
|
if (serviceRunningStatus)
|
|
{
|
|
DependencyService.Resolve<IAlarmService>().StartMyAlarmService();
|
|
}
|
|
return serviceRunningStatus;
|
|
});
|
|
}
|
|
|
|
[Obsolete]
|
|
public async Task UpdateLocation()
|
|
{
|
|
await GetCurrentLocation();
|
|
if (CurrentLocation != null)
|
|
{
|
|
var response = await UpdateLocationOnServer(CurrentLocation.Latitude, CurrentLocation.Longitude);
|
|
if (response == Constant.SUCCESS_CODE)
|
|
{
|
|
await GetBookingAvailable();
|
|
}
|
|
else if (response == Constant.UNAUTHORIZED_CODE)
|
|
{
|
|
GoToLoginPage();
|
|
}
|
|
}
|
|
}
|
|
|
|
private async Task<int> UpdateLocationOnServer(double currentLatitude, double currentLongitude)
|
|
{
|
|
var token = Preferences.Get(SecureStorageData.Token, "");
|
|
GMCabsDriverService gmCabsDriverService = new GMCabsDriverService();
|
|
LocationUpdateRequestDto locationUpdateRequestDto = new LocationUpdateRequestDto();
|
|
locationUpdateRequestDto.Latitude = currentLatitude;
|
|
locationUpdateRequestDto.Longitude = currentLongitude;
|
|
var responce = await gmCabsDriverService.SendDriverLocation(token, locationUpdateRequestDto);
|
|
Preferences.Set("lastLat", currentLatitude);
|
|
Preferences.Set("lastLng", currentLongitude);
|
|
return responce;
|
|
}
|
|
|
|
private async void UpdateDriverAppSelectedPermissions()
|
|
{
|
|
var token = Preferences.Get(SecureStorageData.Token, "");
|
|
var isLocationPermitted = Preferences.Get(SecureStorageData.IsLocationPermitted, false);
|
|
var isBatteryOptimizationDisabled = Preferences.Get(SecureStorageData.IsBatteryOptimizationDisabled, false);
|
|
var driverAppSelectedPermissionsDto = new DriverAppSelectedPermissionsDto();
|
|
GMCabsDriverService gmCabsDriverService = new GMCabsDriverService();
|
|
driverAppSelectedPermissionsDto.LocationSetToAlways = isLocationPermitted;
|
|
driverAppSelectedPermissionsDto.BatteryOptimisationDisabled = isBatteryOptimizationDisabled;
|
|
await gmCabsDriverService.DriverAppSelectedPermissions(token, driverAppSelectedPermissionsDto);
|
|
}
|
|
#endregion
|
|
}
|
|
|
|
}
|