Center map on startup location
This commit is contained in:
1 parent
7933b2e86a
commit
0344227a1b
6 files changed
+155
-19
No files matched your search
@@ -20,6 +20,37 @@ public sealed class PreciseLocationService : IAsyncDisposable
|
||||
return status;
|
||||
}
|
||||
|
||||
public async Task<LocationSnapshot?> GetCurrentLocationAsync(CancellationToken cancellationToken = default)
|
||||
{
|
||||
var permission = await EnsurePermissionAsync();
|
||||
if (permission != PermissionStatus.Granted)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
Location? location = null;
|
||||
try
|
||||
{
|
||||
var request = new GeolocationRequest(GeolocationAccuracy.Best, TimeSpan.FromSeconds(8));
|
||||
location = await Geolocation.Default.GetLocationAsync(request, cancellationToken);
|
||||
}
|
||||
catch (FeatureNotSupportedException)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (location is null)
|
||||
{
|
||||
var lastKnown = await Geolocation.Default.GetLastKnownLocationAsync();
|
||||
if (lastKnown is not null && lastKnown.Timestamp >= DateTimeOffset.UtcNow.AddMinutes(-15))
|
||||
{
|
||||
location = lastKnown;
|
||||
}
|
||||
}
|
||||
|
||||
return location is null ? null : ToSnapshot(location);
|
||||
}
|
||||
|
||||
public async Task StartTrackingAsync(Func<LocationSnapshot, Task> onLocation, Func<string, Task> onError)
|
||||
{
|
||||
if (trackingCancellation is not null)
|
||||
@@ -47,14 +78,7 @@ public sealed class PreciseLocationService : IAsyncDisposable
|
||||
var location = await Geolocation.Default.GetLocationAsync(request, token);
|
||||
if (location is not null)
|
||||
{
|
||||
await onLocation(new LocationSnapshot(
|
||||
location.Latitude,
|
||||
location.Longitude,
|
||||
location.Accuracy,
|
||||
location.Altitude,
|
||||
location.Course,
|
||||
location.Speed,
|
||||
location.Timestamp));
|
||||
await onLocation(ToSnapshot(location));
|
||||
}
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
@@ -84,6 +108,15 @@ public sealed class PreciseLocationService : IAsyncDisposable
|
||||
StopTracking();
|
||||
return ValueTask.CompletedTask;
|
||||
}
|
||||
|
||||
private static LocationSnapshot ToSnapshot(Location location) => new(
|
||||
location.Latitude,
|
||||
location.Longitude,
|
||||
location.Accuracy,
|
||||
location.Altitude,
|
||||
location.Course,
|
||||
location.Speed,
|
||||
location.Timestamp);
|
||||
}
|
||||
|
||||
public sealed record LocationSnapshot(
|
||||
|
||||
Reference in new issue
Block a user