Example #1
0
        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");
            }