package edu.vanderbilt.vm.guide.ui; import java.util.List; import android.location.Location; import com.google.android.gms.maps.CameraUpdate; 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.GoogleMap.OnInfoWindowClickListener; import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener; import com.google.android.gms.maps.SupportMapFragment; 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; public class ListMapFragment extends SupportMapFragment implements OnMarkerClickListener, OnInfoWindowClickListener { public static ListMapFragment newInstance(List<Mappable> list) { ListMapFragment frag = new ListMapFragment(); frag.mList = list; frag.mDetailer = null; frag.setRetainInstance(true); return frag; } public static ListMapFragment newInstance(List<Mappable> list, MappableDetailer detailer) { ListMapFragment frag = new ListMapFragment(); frag.mList = list; frag.mDetailer = detailer; frag.setRetainInstance(true); return frag; } public interface Mappable { double getMapLatitude(); double getMapLongitude(); } public interface MappableDetailer { void getDetail(Mappable mapitem); void fillMarker(Mappable mapitem, MarkerOptions options); } private List<Mappable> mList; private MappableDetailer mDetailer; @Override public void onResume() { super.onResume(); MarkerOptions options; GoogleMap map = getMap(); map.setOnMarkerClickListener(this); map.setMyLocationEnabled(true); map.setOnInfoWindowClickListener(this); for (Mappable item : mList) { options = new MarkerOptions(); if (mDetailer != null) { mDetailer.fillMarker(item, options); } else { options.position(toLatLng(item)) .title(Double.toString(item.getMapLatitude()) + ", " + Double.toString(item.getMapLongitude())) .draggable(false); } //options.icon(BitmapDescriptorFactory.fromResource(R.drawable.map_pin_large)); map.addMarker(options); } if (mList.size() == 0) { throw new IllegalStateException("Has no point to view"); } else if (mList.size() == 1) { CameraUpdate update = CameraUpdateFactory.newLatLngZoom(toLatLng(mList.get(0)), 16); // MAGIC map.moveCamera(update); } else { map.setOnCameraChangeListener(new OnCameraChangeListener() { @Override public void onCameraChange(CameraPosition arg0) { GoogleMap map = getMap(); LatLngBounds.Builder builder = LatLngBounds.builder(); for (Mappable point : mList) { builder.include(toLatLng(point)); } CameraUpdate update = CameraUpdateFactory.newLatLngBounds(builder.build(), 20); map.moveCamera(update); map.setOnCameraChangeListener(null); } }); } } @Override public boolean onMarkerClick(Marker marker) { return false; } public static LatLng toLatLng(Mappable mappable) { return new LatLng(mappable.getMapLatitude(), mappable.getMapLongitude()); } @Override public void onInfoWindowClick(Marker marker) { if (mDetailer != null) { for (Mappable point : mList) { LatLng ll = marker.getPosition(); Location loc1 = new Location(""); loc1.setLatitude(ll.latitude); loc1.setLongitude(ll.longitude); Location loc2 = new Location(""); loc2.setLatitude(point.getMapLatitude()); loc2.setLongitude(point.getMapLongitude()); if (loc2.distanceTo(loc1) < 10) { // EPSILON mDetailer.getDetail(point); return; } } } else { // Log.i("ListMapFragment", "mDetailer is null"); } } }