@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 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");
    }
  }