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