2022-08-30 15:42:25 +02:00
|
|
|
|
using System;
|
2021-08-28 10:04:10 +02:00
|
|
|
|
using System.Threading;
|
2021-05-13 20:03:07 +02:00
|
|
|
|
using System.Threading.Tasks;
|
2022-08-30 15:42:25 +02:00
|
|
|
|
using Serilog;
|
2021-05-13 20:03:07 +02:00
|
|
|
|
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-09-06 16:08:19 +02:00
|
|
|
|
public class LastKnownGeolocationService : IGeolocation
|
|
|
|
|
{
|
|
|
|
|
private IGeolodationDependent Dependent { get; }
|
2021-05-13 20:03:07 +02:00
|
|
|
|
|
2022-09-06 16:08:19 +02:00
|
|
|
|
public LastKnownGeolocationService(IGeolodationDependent dependent)
|
|
|
|
|
{
|
|
|
|
|
Dependent = dependent;
|
|
|
|
|
}
|
2021-08-28 10:04:10 +02:00
|
|
|
|
|
2022-09-06 16:08:19 +02:00
|
|
|
|
/// <summary> Gets the current location.</summary>
|
|
|
|
|
/// <param name="cancelationToken">Token to cancel request for geolocation.</param>
|
|
|
|
|
/// <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? cancelationToken = null, DateTime? timeStamp = null)
|
|
|
|
|
{
|
|
|
|
|
Location location;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
location = await Xamarin.Essentials.Geolocation.GetLastKnownLocationAsync();
|
|
|
|
|
}
|
|
|
|
|
catch (FeatureNotSupportedException fnsEx)
|
|
|
|
|
{
|
|
|
|
|
// Handle not supported on device exception
|
|
|
|
|
Log.ForContext<LastKnownGeolocationService>().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<LastKnownGeolocationService>().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<LastKnownGeolocationService>().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<LastKnownGeolocationService>().Error("Retrieving Geolocation failed. {Exception}", ex);
|
|
|
|
|
throw new Exception("Abfrage Standort fehlgeschlagen.", ex);
|
|
|
|
|
}
|
2021-05-13 20:03:07 +02:00
|
|
|
|
|
2022-09-06 16:08:19 +02:00
|
|
|
|
if (location != null // Cached location is available.
|
|
|
|
|
&& (timeStamp == null || timeStamp.Value.Subtract(location.Timestamp.DateTime) < MaxAge))
|
|
|
|
|
{
|
|
|
|
|
// No time stamp available or location not too old.
|
|
|
|
|
return location;
|
|
|
|
|
}
|
2021-05-13 20:03:07 +02:00
|
|
|
|
|
2022-09-06 16:08:19 +02:00
|
|
|
|
return await new GeolocationAccuracyMediumService(Dependent).GetAsync(cancelationToken, timeStamp);
|
|
|
|
|
}
|
2021-05-13 20:03:07 +02:00
|
|
|
|
|
2022-09-06 16:08:19 +02:00
|
|
|
|
/// <summary> If true location data returned is simulated.</summary>
|
|
|
|
|
public bool IsSimulation { get => false; }
|
2021-05-13 20:03:07 +02:00
|
|
|
|
|
2022-09-06 16:08:19 +02:00
|
|
|
|
/// <summary> Maximum age allowed for location info. </summary>
|
|
|
|
|
public TimeSpan MaxAge => new TimeSpan(0, 3 /*minutes*/, 0);
|
2021-05-13 20:03:07 +02:00
|
|
|
|
|
2022-09-06 16:08:19 +02:00
|
|
|
|
public bool IsGeolcationEnabled => Dependent.IsGeolcationEnabled;
|
|
|
|
|
}
|
2021-05-13 20:03:07 +02:00
|
|
|
|
}
|