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 receivedBookingIDs; public List availableBookingIDs = new List(); 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(); //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().IsForeGroundServiceRunning()) { Preferences.Set("isForeground", "YES"); DependencyService.Resolve().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().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 newBookings = null; List cachedBookings = new List(); 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(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(this, "ServiceStopped", message => { Device.BeginInvokeOnMainThread(() => { // UserMessage = "Location Service has been stopped!"; Console.WriteLine("Location Service has been stopped!"); }); }); MessagingCenter.Subscribe(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().IsForeGroundServiceRunning(); if (serviceRunningStatus) { DependencyService.Resolve().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 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 } }