/// <inheritdoc/>
        public Task <bool> StopListeningAsync()
        {
            if (_Listener == null)
            {
                return(Task.FromResult(true));
            }

            var providers = Providers;

            _Listener.PositionChanged -= OnListenerPositionChanged;
            _Listener.PositionError   -= OnListenerPositionError;

            for (var i = 0; i < providers.Length; ++i)
            {
                Manager.RemoveUpdates(_Listener);
            }

            _Listener = null;
            return(Task.FromResult(true));
        }
        /// <inheritdoc/>
        public async Task <bool> StartListeningAsync(TimeSpan minTime, double minDistance, bool includeHeading = false, ListenerSettings settings = null)
        {
            var hasPermission = await CheckPermissions();

            if (!hasPermission)
            {
                return(false);
            }

            var minTimeMilliseconds = minTime.TotalMilliseconds;

            if (minTimeMilliseconds < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(minTime));
            }

            if (minDistance < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(minDistance));
            }

            if (IsListening)
            {
                throw new InvalidOperationException("This Geolocator is already listening");
            }

            var providers = Providers;

            _Listener = new GeolocationContinuousListener(Manager, minTime, providers);
            _Listener.PositionChanged += OnListenerPositionChanged;
            _Listener.PositionError   += OnListenerPositionError;

            var looper = Looper.MyLooper() ?? Looper.MainLooper;

            foreach (var provider in providers)
            {
                Manager.RequestLocationUpdates(provider, (long)minTimeMilliseconds, (float)minDistance, _Listener, looper);
            }

            return(true);
        }