package it.fdev.unisaconnect; import it.fdev.unisaconnect.map.GoogleMapOverlayMapTileProvider; import it.fdev.unisaconnect.map.MapFocusPoint; import it.fdev.utils.MyMapFragment; import android.os.Bundle; import android.view.View; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap.OnCameraChangeListener; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLngBounds; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.gms.maps.model.TileOverlayOptions; import com.google.android.gms.maps.model.TileProvider; public class FragmentMap extends MyMapFragment implements OnCameraChangeListener { public static final String MAP_FOCUS_POINT_ARG = "mapFocusPoint"; public static final int MIN_ZOOM = 15; public static final int MAX_ZOOM = 19; public static final int MID_ZOOM = (MIN_ZOOM + MAX_ZOOM) / 2; private static final int CUSTOM_ANIM_DURATION = 175; private static final String OVERLAY_TILES_FOLDER = "map/google_map_overlay"; private static final LatLng UNISA_CENTER = new LatLng(40.7721671, 14.7904956); private static final LatLngBounds UNISA_BOUNDS = new LatLngBounds(new LatLng(40.766, 14.786), new LatLng(40.777, 14.798)); private LatLng lastValidPosition; private GoogleMap googleMap; public static FragmentMap newInstance() { return new FragmentMap(); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); googleMap = getMap(); if (googleMap != null) { initializeMap(getArguments()); } } @Override public void onCameraChange(CameraPosition position) { if (UNISA_BOUNDS.contains(position.target)) { lastValidPosition = position.target; } else { googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(lastValidPosition, position.zoom), CUSTOM_ANIM_DURATION, null); } float zoom = position.zoom; if (zoom > MAX_ZOOM) { googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(lastValidPosition, MAX_ZOOM)); } else if (zoom < MIN_ZOOM) { googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(lastValidPosition, MIN_ZOOM)); } } @Override public int getTitleResId() { return R.string.map; } private void initializeMap(Bundle fragmentArguments) { googleMap.setMyLocationEnabled(true); googleMap.setOnCameraChangeListener(this); googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(UNISA_CENTER, MIN_ZOOM)); TileProvider tileProvider = new GoogleMapOverlayMapTileProvider(getActivity().getAssets(), OVERLAY_TILES_FOLDER); googleMap.addTileOverlay(new TileOverlayOptions().tileProvider(tileProvider)); if (fragmentArguments != null) { MapFocusPoint focusPoint = (MapFocusPoint) fragmentArguments.getSerializable(MAP_FOCUS_POINT_ARG); if (focusPoint != null) focusMapWithMapFocusPoint(focusPoint); } else { focusMap(UNISA_CENTER, MIN_ZOOM); } } private void focusMap(LatLng focusCenter, int zoom) { googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(focusCenter, zoom)); lastValidPosition = focusCenter; } private void focusMapWithMapFocusPoint(MapFocusPoint focusPoint) { LatLng focusCenter = new LatLng(focusPoint.getLatitude(), focusPoint.getLongitude()); focusMap(focusCenter, MID_ZOOM); MarkerOptions markerOptions = new MarkerOptions().title(focusPoint.getTitle()) .snippet(focusPoint.getSubtitle()).position(focusCenter); Marker marker = googleMap.addMarker(markerOptions); marker.showInfoWindow(); } }