sharee.bike-App/TINKLib/Services/Geolocation/GeolocationService.cs

70 lines
3 KiB
C#
Raw Normal View History

2021-05-13 20:03:07 +02:00
using Serilog;
using System;
using System.Threading;
2021-05-13 20:03:07 +02:00
using System.Threading.Tasks;
using TINK.Model.Device;
using Xamarin.Essentials;
2022-04-10 17:38:34 +02:00
namespace TINK.Services.Geolocation
2021-05-13 20:03:07 +02:00
{
2022-04-10 17:38:34 +02:00
public abstract class GeolocationService : IGeolocation
2021-05-13 20:03:07 +02:00
{
/// <summary> Timeout for geolocation request operations.</summary>
private const int GEOLOCATIONREQUEST_TIMEOUT_MS = 5000;
private IGeolodationDependent Dependent { get; }
2022-04-10 17:38:34 +02:00
private GeolocationAccuracy Accuracy { get; }
public GeolocationService(
IGeolodationDependent dependent,
GeolocationAccuracy accuracy = GeolocationAccuracy.Default)
2021-05-13 20:03:07 +02:00
{
Dependent = dependent;
2022-04-10 17:38:34 +02:00
Accuracy = accuracy;
2021-05-13 20:03:07 +02:00
}
public bool IsSimulation => false;
public bool IsGeolcationEnabled => Dependent.IsGeolcationEnabled;
/// <summary> Gets the current location.</summary>
/// <param name="cancellationToken">Token to cancel request for geolocation.</param>
2021-05-13 20:03:07 +02:00
/// <param name="timeStamp">Time when geolocation is of interest. Is used to determine whether cached geoloation can be used or not.</param>
public async Task<Location> GetAsync(CancellationToken? cancellationToken = null, DateTime? timeStamp = null)
2021-05-13 20:03:07 +02:00
{
try
{
2022-04-10 17:38:34 +02:00
var request = new GeolocationRequest(Accuracy, TimeSpan.FromMilliseconds(GEOLOCATIONREQUEST_TIMEOUT_MS));
return cancellationToken.HasValue
? await Xamarin.Essentials.Geolocation.GetLocationAsync(request, cancellationToken.Value)
: await Xamarin.Essentials.Geolocation.GetLocationAsync(request);
2021-05-13 20:03:07 +02:00
}
catch (FeatureNotSupportedException fnsEx)
{
// Handle not supported on device exception
2021-11-07 19:42:59 +01:00
Log.ForContext<GeolocationService>().Error("Retrieving Geolocation not supported on device. {Exception}", fnsEx);
2021-05-13 20:03:07 +02:00
throw new Exception("Abfrage Standort nicht möglich auf Gerät.", fnsEx);
}
catch (FeatureNotEnabledException fneEx)
{
// Handle not enabled on device exception
2021-11-07 19:42:59 +01:00
Log.ForContext<GeolocationService>().Error("Retrieving Geolocation not enabled on device. {Exception}", fneEx);
2021-05-13 20:03:07 +02:00
throw new Exception("Abfrage Standort nicht aktiviert auf Gerät.", fneEx);
}
catch (PermissionException pEx)
{
// Handle permission exception
2021-11-07 19:42:59 +01:00
Log.ForContext<GeolocationService>().Error("Retrieving Geolocation not permitted on device. {Exception}", pEx);
2021-05-13 20:03:07 +02:00
throw new Exception("Berechtiung für Abfrage Standort nicht erteilt für App.", pEx);
}
catch (Exception ex)
{
// Unable to get location
2021-11-07 19:42:59 +01:00
Log.ForContext<GeolocationService>().Error("Retrieving Geolocation failed. {Exception}", ex);
2021-05-13 20:03:07 +02:00
throw new Exception("Abfrage Standort fehlgeschlagen.", ex);
}
}
}
}