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); }
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(); }