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, }; }