void Finish(Android.Locations.Location location)
            {
                var position = location.ToGeoPosition();

                OnFinished?.Invoke();
                CompletionSource.TrySetResult(position);
            }
            public void OnLocationChanged(Android.Locations.Location location)
            {
                if (location.Provider != ActiveProvider)
                {
                    if (ActiveProvider != null && Manager.IsProviderEnabled(ActiveProvider))
                    {
                        var lapsed = ToTime(location.Time) - ToTime(LatestLocation.Time);

                        if (Manager.GetProvider(location.Provider).Accuracy > Manager.GetProvider(ActiveProvider).Accuracy &&
                            lapsed < ReportIntervals.Add(ReportIntervals))
                        {
                            location.Dispose();
                            return;
                        }
                    }

                    ActiveProvider = location.Provider;
                }

                Interlocked.Exchange(ref LatestLocation, location)?.Dispose();

                var position = location.ToGeoPosition();

                PositionChanged.RaiseOn(Zebble.Thread.Pool, position);
            }