/* * Copyright (c) 2015 Daimler AG / Moovel GmbH * * All rights reserved */ package com.car2go.maps.google.adapter; import android.Manifest; import android.support.annotation.RequiresPermission; import android.view.View; import com.car2go.maps.AnyMap; import com.car2go.maps.CameraUpdate; import com.car2go.maps.Projection; import com.car2go.maps.UiSettings; import com.car2go.maps.model.CameraPosition; import com.car2go.maps.model.Circle; import com.car2go.maps.model.CircleOptions; import com.car2go.maps.model.Marker; import com.car2go.maps.model.MarkerOptions; import com.car2go.maps.model.Polygon; import com.car2go.maps.model.PolygonOptions; import com.car2go.maps.model.Polyline; import com.car2go.maps.model.PolylineOptions; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.model.LatLng; /** * Implementation of {@link AnyMap} which works with {@link com.google.android.gms.maps.GoogleMap} */ public class GoogleMapAdapter implements AnyMap { private final GoogleMap map; private final DrawableComponentFactory drawableComponentFactory; public GoogleMapAdapter(GoogleMap map) { this.map = map; drawableComponentFactory = new DrawableComponentFactory(map); } @Override public void moveCamera(CameraUpdate cameraUpdate) { map.moveCamera( ((CameraUpdateAdapter) cameraUpdate).wrappedCameraUpdate ); } @Override public void animateCamera(CameraUpdate cameraUpdate) { map.animateCamera( ((CameraUpdateAdapter) cameraUpdate).wrappedCameraUpdate ); } @Override public void animateCamera(CameraUpdate cameraUpdate, CancelableCallback callback) { map.animateCamera( ((CameraUpdateAdapter) cameraUpdate).wrappedCameraUpdate, new CancellableCallbackAdapter(callback) ); } @Override public void animateCamera(CameraUpdate cameraUpdate, int duration, final CancelableCallback callback) { map.animateCamera( ((CameraUpdateAdapter) cameraUpdate).wrappedCameraUpdate, duration, new CancellableCallbackAdapter(callback) ); } @Override public CameraPosition getCameraPosition() { return AnyMapAdapter.adapt(map.getCameraPosition()); } @Override public Projection getProjection() { return AnyMapAdapter.adapt(map.getProjection()); } @Override public Marker addMarker(MarkerOptions options) { return drawableComponentFactory.addMarker(options); } @Override public Circle addCircle(CircleOptions options) { return drawableComponentFactory.addCircle(options); } @Override public Polygon addPolygon(PolygonOptions options) { return drawableComponentFactory.addPolygon(options); } @Override public Polyline addPolyline(PolylineOptions options) { return drawableComponentFactory.addPolyline(options); } @Override public UiSettings getUiSettings() { return AnyMapAdapter.adapt(map.getUiSettings()); } @Override public void setOnMapClickListener(final OnMapClickListener listener) { map.setOnMapClickListener(new GoogleMap.OnMapClickListener() { @Override public void onMapClick(LatLng latLng) { com.car2go.maps.model.LatLng anyLatLng = AnyMapAdapter.adapt(latLng); listener.onMapClick(anyLatLng); } }); } @Override public void setOnMapLongClickListener(final OnMapLongClickListener listener) { map.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() { @Override public void onMapLongClick(LatLng latLng) { com.car2go.maps.model.LatLng anyLatLng = AnyMapAdapter.adapt(latLng); listener.onMapLongClick(anyLatLng); } }); } @Override public void setOnCameraChangeListener(final OnCameraChangeListener listener) { map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { @Override public void onCameraChange(com.google.android.gms.maps.model.CameraPosition cameraPosition) { CameraPosition anyCameraPosition = AnyMapAdapter.adapt(cameraPosition); listener.onCameraChange(anyCameraPosition); } }); } @Override public void setOnMarkerClickListener(final OnMarkerClickListener listener) { map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(com.google.android.gms.maps.model.Marker marker) { Marker anyMarker = AnyMapAdapter.adapt(marker); return listener.onMarkerClick(anyMarker); } }); } @Override public void setInfoWindowAdapter(final InfoWindowAdapter adapter) { map.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() { @Override public View getInfoWindow(com.google.android.gms.maps.model.Marker marker) { Marker anyMarker = AnyMapAdapter.adapt(marker); return adapter.getInfoWindow(anyMarker); } @Override public View getInfoContents(com.google.android.gms.maps.model.Marker marker) { Marker anyMarker = AnyMapAdapter.adapt(marker); return adapter.getInfoContents(anyMarker); } }); } @Override public void setTrafficEnabled(boolean enabled) { map.setTrafficEnabled(enabled); } @RequiresPermission(Manifest.permission.ACCESS_FINE_LOCATION) @Override public void setMyLocationEnabled(boolean enabled) { map.setMyLocationEnabled(enabled); } @Override public void setMapType(Type type) { int googleMapType; switch (type) { case SATELLITE: googleMapType = GoogleMap.MAP_TYPE_SATELLITE; break; case NORMAL: default: googleMapType = GoogleMap.MAP_TYPE_NORMAL; break; } map.setMapType(googleMapType); } @Override public void setPadding(int left, int top, int right, int bottom) { map.setPadding(left, top, right, bottom); } @Override public void onUserLocationChanged(com.car2go.maps.model.LatLng location, float accuracy) { //Do nothing } /** * Delegates callbacks from Google map to given AnyMap callback */ private static class CancellableCallbackAdapter implements GoogleMap.CancelableCallback { private final CancelableCallback callback; public CancellableCallbackAdapter(CancelableCallback callback) { this.callback = callback; } @Override public void onFinish() { callback.onFinish(); } @Override public void onCancel() { callback.onCancel(); } } }