Esempio n. 1
0
        private void AddSubscribers()
        {
            var cameraPositionIdle = Observable
                                     .FromEventPattern <EventHandler <GMSCameraEventArgs>, GMSCameraEventArgs>(
                e => _mapView.CameraPositionIdle += e,
                e => _mapView.CameraPositionIdle -= e);

            ViewModel.CameraPositionChanged = cameraPositionIdle
                                              .Select(e => e.EventArgs.Position.Target.ToLocation());

            ViewModel.VisibleRegionChanged = cameraPositionIdle
                                             .Select(_ => new CoordinateBounds(_mapView.Projection.VisibleRegion))
                                             .Select(bounds => _visibleRegionProvider.GetVisibleRegion(bounds.NorthEast.ToLocation(), bounds.SouthWest.ToLocation()));

            ViewModel.CameraStartMoving = Observable
                                          .FromEventPattern <EventHandler <GMSWillMoveEventArgs>, GMSWillMoveEventArgs>(
                e => _mapView.WillMove += e,
                e => _mapView.WillMove -= e)
                                          .Select(e => e.EventArgs.Gesture);

            ViewModel.CameraStartMoving
            .Subscribe(CameraWillMove);

            ViewModel.CameraPositionChanged
            .Subscribe(CamerPostionIdle);
        }
Esempio n. 2
0
        private async System.Threading.Tasks.Task SetupBindings()
        {
            var cameraPositionIdle = Observable
                                     .FromEventPattern <EventHandler, EventArgs>(
                e => _googleMap.CameraIdle += e,
                e => _googleMap.CameraIdle -= e);

            ViewModel.CameraPositionChanged = cameraPositionIdle
                                              .Do(CamerPositionIdle)
                                              .Select(_ => _googleMap.CameraPosition.Target)
                                              .Select(target => new Location(target.Latitude, target.Longitude));

            ViewModel.VisibleRegionChanged = cameraPositionIdle
                                             .Select(_ => _googleMap.Projection.VisibleRegion.LatLngBounds)
                                             .Select(bounds => _visibleRegionProvider.GetVisibleRegion(bounds.Northeast.ToLocation(), bounds.Southwest.ToLocation()));

            ViewModel.CameraStartMoving = Observable
                                          .FromEventPattern <EventHandler <GoogleMap.CameraMoveStartedEventArgs>, GoogleMap.CameraMoveStartedEventArgs>(
                e => _googleMap.CameraMoveStarted += e,
                e => _googleMap.CameraMoveStarted -= e)
                                          .Do(CameraStarted)
                                          .Select(e => true);

            ViewModel.Changed(() => ViewModel.OnlineDrivers)
            .Where(od => _googleMap != null && od.Any())
            .SubscribeOn(_schedulerProvider.SynchronizationContextScheduler)
            .Subscribe(async od =>
            {
                var zoomLevel = _googleMap.CameraPosition.Zoom;
                var width     = _markerSizeProvider.GetWidth(zoomLevel);
                var height    = _markerSizeProvider.GetHeight(zoomLevel);

                var bitmapSource = await BitmapFactory.DecodeResourceAsync(Resources, Resource.Drawable.car);
                var bitmap       = Bitmap.CreateScaledBitmap(bitmapSource, width, height, false);
                var icon         = BitmapDescriptorFactory.FromBitmap(bitmap);
                _googleMap.Clear();
                foreach (var onlineDriver in ViewModel.OnlineDrivers)
                {
                    _googleMap.AddMarker(_markerAdapter.GetMarkerOptions(onlineDriver).SetIcon(icon));
                }
            });

            this.SetBinding(() => ViewModel.CameraTarget)
            .WhenSourceChanges(() =>
            {
                var camera = CameraUpdateFactory.NewLatLngZoom(new LatLng(ViewModel.CameraTarget.Latitude, ViewModel.CameraTarget.Longitude), 17);
                _googleMap?.MoveCamera(camera);
            });

            this.SetBinding(() => ViewModel.TripLocationViewModel.PickupAddress.Loading)
            .WhenSourceChanges(() =>
            {
                _pickupAddressLoading.Visibility =
                    ViewModel.TripLocationViewModel.PickupAddress.Loading ? ViewStates.Visible : ViewStates.Gone;
            });

            this.SetBinding(
                () => ViewModel.TripLocationViewModel.PickupAddress.FormattedAddress,
                () => _pickupAddressEditText.Text);

            this.SetBinding(() => ViewModel.TripLocationViewModel.CanRequest)
            .WhenSourceChanges(() =>
            {
                if (ViewModel.TripLocationViewModel.CanRequest)
                {
                    SlideUp(_requestView);
                    _whereToGoButton.Visibility = ViewStates.Gone;
                }
                else
                {
                    SlideDown(_requestView);
                    _whereToGoButton.Visibility = ViewStates.Visible;
                }
            });


            await ViewModel.Load();
        }