public IObservable <IGpsLocation> Connect(GeolocationRequirements requirements) { var interval = requirements.UpdateInterval; var requiredAccuracy = requirements.Accuracy; _analyticsService.TraceVerbose(this, $"New GpsLocation connection requested with accuracy {requiredAccuracy} and interval {interval}"); return(Observable.Create <IGpsLocation>(async observer => { var permissions = await _devicePermissionsService.EnsurePermissionGrantedAsync(DevicePermission.LocationWhenInUse); if (permissions.IsFailure) { _analyticsService.TraceWarning(this, "Failed to access GpsLocation due to permissions failure"); observer.OnError(new ErrorException(permissions.Error)); } var geolocationRequest = requiredAccuracy.ToGeoLocationRequest(); await PublishLastKnownLocationAsync(observer); await PublishCurrentLocationAsync(geolocationRequest, observer, "Current"); var disposable = new CompositeDisposable(); var sub = Observable.Interval(interval, _schedulers.ThreadPool) .Subscribe(async tick => { await PublishCurrentLocationAsync(geolocationRequest, observer, "Updated"); }); disposable.Add(sub); return disposable; })); }
public override void Setup() { base.Setup(); _testScheduler = MockReactiveSchedulers.With_Test_ThreadPoolScheduler(); _requirements = new GeolocationRequirements(TimeSpan.FromTicks(1000), LocationAccuracy.High); MockDevicePermissionsService.Mock.Setup(x => x.EnsurePermissionGrantedAsync(DevicePermission.LocationWhenInUse)) .ReturnsAsync(Response.Success); }
public async Task SHOULD_Trace_connection() { //Arrange _requirements = new GeolocationRequirements(TimeSpan.FromMinutes(1), LocationAccuracy.Low); //Act Sut.Connect(_requirements).Subscribe(next => { }); //Assert MockAnalyticsService.VerifyTrace("New GpsLocation connection requested with accuracy Low and interval 00:01:00"); }