public async void getCurrentPosition(
            JObject options,
            ICallback success,
            ICallback error)
        {
            var locationOptions = LocationOptions.FromJson(options);

            var geolocator = new Geolocator
            {
                DesiredAccuracy   = locationOptions.HighAccuracy ? PositionAccuracy.High : PositionAccuracy.Default,
                MovementThreshold = locationOptions.DistanceFilter,
            };

            try
            {
                // TODO: Enable retrieval from position history using `MaximumAge` filter

                var task          = geolocator.GetGeopositionAsync().AsTask();
                var completedTask = await Task.WhenAny(
                    task,
                    Task.Delay(TimeSpan.FromMilliseconds(locationOptions.Timeout))).ConfigureAwait(false);

                if (completedTask == task)
                {
                    var geoposition = await task.ConfigureAwait(false);

                    success.Invoke(ConvertGeoposition(geoposition));
                }
                else
                {
                    error.Invoke("Location request timed out");
                }
            }
            catch (Exception ex)
            {
                error.Invoke($"Location request failed with exception: {ex}");
            }
        }
        public void startObserving(JObject options)
        {
            var locationOptions = LocationOptions.FromJson(options);
            var geolocator      = new Geolocator
            {
                DesiredAccuracy   = locationOptions.HighAccuracy ? PositionAccuracy.High : PositionAccuracy.Default,
                MovementThreshold = locationOptions.DistanceFilter,
            };

            var positionObservable =
                Observable.FromEventPattern <
                    TypedEventHandler <Geolocator, PositionChangedEventArgs>,
                    Geolocator,
                    PositionChangedEventArgs>(
                    h => geolocator.PositionChanged += h,
                    h => geolocator.PositionChanged -= h);

            var positionQuery = from e in positionObservable
                                select e.EventArgs.Position;

            var positionSubscription = positionQuery.Subscribe(position =>
                                                               Context.GetJavaScriptModule <RCTDeviceEventEmitter>()
                                                               .emit("geolocationDidChange", ConvertGeoposition(position)));

            var statusObservable =
                Observable.FromEventPattern <
                    TypedEventHandler <Geolocator, StatusChangedEventArgs>,
                    Geolocator,
                    StatusChangedEventArgs>(
                    h => geolocator.StatusChanged += h,
                    h => geolocator.StatusChanged -= h);

            var statusQuery = from e in statusObservable
                              select e.EventArgs.Status;

            var statusSubscription = statusQuery.Subscribe(status =>
            {
                if (status == PositionStatus.Disabled)
                {
                    Context.GetJavaScriptModule <RCTDeviceEventEmitter>()
                    .emit("geolocationError", "Location settings are turned off.");
                }
                else if (status == PositionStatus.NotAvailable)
                {
                    Context.GetJavaScriptModule <RCTDeviceEventEmitter>()
                    .emit("geolocationError", "Location services is not available.");
                }
                else if (status == PositionStatus.NoData || status == PositionStatus.Initializing)
                {
                    Context.GetJavaScriptModule <RCTDeviceEventEmitter>()
                    .emit("geolocationError", "Location services is temporarily unavailable.");
                }
            });

            _currentSubscription.Disposable =
                new CompositeDisposable(2)
            {
                positionSubscription,
                statusSubscription,
            };
        }