public void showMyLocationButton() {
   if (googleMap != null) {
     UiSettings uiSettings = googleMap.getUiSettings();
     googleMap.setMyLocationEnabled(true);
     uiSettings.setMyLocationButtonEnabled(true);
   }
 }
  @Override
  public void onMapReady(GoogleMap map) {
    //        LatLng sydney = new LatLng(-33.867, 151.206);
    //
    this.map = map;
    map.setMyLocationEnabled(true);
    map.moveCamera(
        CameraUpdateFactory.newLatLngZoom(new LatLng(START_LATITUDE, START_LONGITUDE), 13));
    //        map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13));
    //
    //        map.addMarker(new MarkerOptions()
    //                .title("Sydney")
    //                .snippet("The most populous city in Australia.")
    //                .position(sydney));
    scheduleTaskExecutor = Executors.newScheduledThreadPool(1);

    scheduleTaskExecutor.scheduleAtFixedRate(
        new Runnable() {
          public void run() {
            LatLong nextLocation = getNextLocation();
            Log.d(LOG_TAG, "Pushing location: " + nextLocation);
            mock.pushLocation(nextLocation);
            // Log.d(LOG_TAG, getMap().addMarker(new MarkerOptions().position(new
            // LatLng(nextLocation.lat, nextLocation.lng))).toString());
          }
        },
        0,
        1,
        TimeUnit.SECONDS);
  }
  @Override
  public void updateLocationMarker(Location location) {
    if (locationChangedListener != null) {
      currentUserLocation = location;
      locationChangedListener.onLocationChanged(location);
    }

    // Update clickable area
    LatLng userPosition = getUserLocation(location);
    if (userPositionClickArea == null) {
      MarkerOptions markerOptions = new MarkerOptions();
      markerOptions.position(userPosition);
      markerOptions.anchor(0.4f, 0.4f); // strange google maps bug
      markerOptions.icon(BitmapDescriptorFactory.fromBitmap(clickableBitmap));
      userPositionClickArea = googleMap.addMarker(markerOptions);
    } else {
      userPositionClickArea.setPosition(userPosition);
    }
    if (userPositionClickArea2 == null) {
      MarkerOptions markerOptions = new MarkerOptions();
      markerOptions.position(userPosition);
      markerOptions.anchor(0.6f, 0.6f); // strange google maps bug
      markerOptions.icon(BitmapDescriptorFactory.fromBitmap(clickableBitmap));
      userPositionClickArea2 = googleMap.addMarker(markerOptions);
    } else {
      userPositionClickArea2.setPosition(userPosition);
    }
  }
  public void addHeatMap(List<GridPoint> gridPointList) {
    clearMap();
    List<LatLng> list = new ArrayList<LatLng>();
    LatLngBounds.Builder builder = new LatLngBounds.Builder();
    LatLng latLng = null;

    for (GridPoint gridPoint : gridPointList) {
      latLng =
          new LatLng(
              gridPoint.getLocation().getLatitude().doubleValue(),
              gridPoint.getLocation().getLongitude().doubleValue());
      list.add(latLng);
      builder.include(latLng);
    }

    if (list.size() < 1) {
      return;
    }

    mProvider = new HeatmapTileProvider.Builder().data(list).build();
    mOverlay = googleMap.addTileOverlay(new TileOverlayOptions().tileProvider(mProvider));

    if (gridPointList.size() > 1) {
      LatLngBounds bounds = builder.build();
      CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, 0);
      googleMap.animateCamera(cu);
    } else if (gridPointList.size() > 0) {
      CameraPosition cameraPosition =
          new CameraPosition.Builder().target(latLng).zoom(zoomLevel).bearing(0).tilt(45).build();
      googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
    }
    markersDisplayed = false;
    heatmapDisplayed = true;
    clusterDisplayed = false;
  }
  @Override
  public void onMapReady(final GoogleMap googleMap) {
    this.googleMap = googleMap;
    googleMap.setMyLocationEnabled(true);
    if (callback != null) {
      callback.onMapReady(googleMap);
    }
    if (cameraChangeListener != null) {
      googleMap.setOnCameraChangeListener(cameraChangeListener);
    }
    googleMap.setOnMarkerDragListener(
        new GoogleMap.OnMarkerDragListener() {
          @Override
          public void onMarkerDragStart(Marker arg0) {}

          @SuppressWarnings("unchecked")
          @Override
          public void onMarkerDragEnd(Marker arg0) {
            googleMap.animateCamera(CameraUpdateFactory.newLatLng(arg0.getPosition()));
          }

          @Override
          public void onMarkerDrag(Marker arg0) {}
        });
  }
  @Override
  public void onMapReady(GoogleMap map) {
    Double latitude = Double.valueOf(data.getLatitude());
    Double longitude = Double.valueOf(data.getLongitude());

    LatLng CurrentLocation = new LatLng(latitude, longitude);

    map.setMyLocationEnabled(true);
    map.moveCamera(CameraUpdateFactory.newLatLngZoom(CurrentLocation, 13));

    map.addMarker(
        new MarkerOptions()
            .title("Current Location")
            .snippet("Most Recent Location")
            .position(CurrentLocation));
  }
  public void updateMarkerLocation(double lat, double lng) {
    LatLng location = new LatLng(lat, lng);

    if (marker == null) {
      markerOptions = new MarkerOptions();
      markerOptions.visible(true);
      markerOptions.position(location);
      markerOptions.draggable(draggable);
      marker = googleMap.addMarker(markerOptions);
    }

    CameraPosition cameraPosition =
        new CameraPosition.Builder().target(location).zoom(zoomLevel).bearing(0).tilt(45).build();
    googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
    marker.setPosition(location);
  }
  private Boolean updateMarkers(ReadableArray markerArray) {
    try {
      // First clear all markers from the map
      for (Marker marker : mapMarkers) {
        marker.remove();
      }
      mapMarkers.clear();
      markerLookup.clear();

      // All markers to map
      for (int i = 0; i < markerArray.size(); i++) {
        ReadableMap markerJson = markerArray.getMap(i);
        if (markerJson.hasKey("coordinates")) {
          Marker marker = map.addMarker(createMarker(markerJson));

          if (markerJson.hasKey("id")) {
            // As we have to lookup it either way, switch it around
            markerLookup.put(marker.getId(), markerJson.getString("id"));
            markerLookup.put(markerJson.getString("id"), marker.getId().replace("m", ""));
          }

          mapMarkers.add(marker);

        } else break;
      }

      return true;
    } catch (Exception e) {
      e.printStackTrace();
      return false;
    }
  }
 public void setZoomLevel(int zoomLevel) {
   this.zoomLevel = zoomLevel;
   if (googleMap != null) {
     CameraUpdate zoom = CameraUpdateFactory.zoomTo(this.zoomLevel);
     googleMap.animateCamera(zoom);
   }
 }
  @Override
  public void setupMyLocationLayer() {
    googleMap.setMyLocationEnabled(true);
    googleMap.setLocationSource(
        new LocationSource() {

          @Override
          public void activate(OnLocationChangedListener onLocationChangedListener) {
            locationChangedListener = onLocationChangedListener;
          }

          @Override
          public void deactivate() {
            locationChangedListener = null;
          }
        });
  }
  public GoogleMapWrapper(Context context, GoogleMap map) {
    this.context = context;
    googleMap = map;
    googleMap.getUiSettings().setMyLocationButtonEnabled(true);
    googleMap.getUiSettings().setRotateGesturesEnabled(false);
    googleMap.getUiSettings().setTiltGesturesEnabled(false);
    googleMap.getUiSettings().setZoomControlsEnabled(true);

    // clickableBitmap.eraseColor(Color.RED);

    map.setOnMarkerClickListener(
        new GoogleMap.OnMarkerClickListener() {
          @Override
          public boolean onMarkerClick(Marker marker) {
            return onLocationMarkerTap(marker) || onMarkerTap(marker);
          }
        });
  }
 public Boolean centreMapAt(double lat, double lng) {
   if (googleMap != null) {
     LatLng location = new LatLng(lat, lng);
     CameraPosition cameraPosition =
         new CameraPosition.Builder().target(location).zoom(zoomLevel).bearing(0).tilt(45).build();
     googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
     return true;
   }
   return false;
 }
 public void addMarker(ReadableMap config) {
   MarkerOptions options = createMarker(config);
   Marker marker = map.addMarker(options);
   mapMarkers.add(marker);
   if (config.hasKey("id")) {
     // As we have to lookup it either way, switch it around
     markerLookup.put(marker.getId(), config.getString("id"));
     markerLookup.put(config.getString("id"), marker.getId().replace("m", ""));
   }
 }
 @Override
 public void setViewPortChangeListener(final ViewPortChangeListener listener) {
   googleMap.setOnCameraChangeListener(
       new OnCameraChangeListener() {
         @Override
         public void onCameraChange(CameraPosition cameraPosition) {
           GoogleMapWrapper.this.onCameraChange(cameraPosition, listener);
         }
       });
 }
 public void disableGestures() {
   UiSettings uiSettings = googleMap.getUiSettings();
   uiSettings.setMyLocationButtonEnabled(false);
   uiSettings.setTiltGesturesEnabled(false);
   uiSettings.setZoomGesturesEnabled(false);
   uiSettings.setZoomControlsEnabled(false);
   uiSettings.setRotateGesturesEnabled(false);
   uiSettings.setMyLocationButtonEnabled(false);
   uiSettings.setScrollGesturesEnabled(false);
   uiSettings.setCompassEnabled(false);
 }
  @Override
  public void updateMapLayer() {
    MapType mapType = Controller.getInstance().getPreferencesManager().getMapType();
    if (mapType == currentMapType) return;
    currentMapType = mapType;

    if (customTileOverlay != null) customTileOverlay.remove();
    customTileOverlay = null;

    switch (mapType) {
      case GoogleNormal:
        googleMap.setMapType(MAP_TYPE_NORMAL);
        return;
      case GoogleSatellite:
        googleMap.setMapType(MAP_TYPE_SATELLITE);
        return;
      case GoogleTerrain:
        googleMap.setMapType(MAP_TYPE_TERRAIN);
        return;
      case GoogleHybrid:
        googleMap.setMapType(MAP_TYPE_HYBRID);
        return;
    }

    googleMap.setMapType(MAP_TYPE_NONE); // Don't display any google layer

    UrlTileProvider provider = getTileProvider(mapType);
    if (provider != null) {
      customTileOverlay = googleMap.addTileOverlay(new TileOverlayOptions().tileProvider(provider));
      customTileOverlay.setZIndex(-100);
    }
  }
  public void addCluster(List<GridPoint> complaintDtos) {
    clearMap();
    GoogleMapCluster googleMapCluster;
    LatLngBounds.Builder builder = new LatLngBounds.Builder();
    ClusterManager<GoogleMapCluster> mClusterManager;
    mClusterManager = new ClusterManager<GoogleMapCluster>(getActivity(), googleMap);
    googleMap.setOnCameraChangeListener(mClusterManager);
    googleMap.setOnMarkerClickListener(mClusterManager);
    for (GridPoint complaintDto : complaintDtos) {
      googleMapCluster =
          new GoogleMapCluster(
              complaintDto.getLocation().getLatitude().doubleValue(),
              complaintDto.getLocation().getLongitude().doubleValue());
      mClusterManager.addItem(googleMapCluster);
      builder.include(googleMapCluster.getPosition());
    }

    if (complaintDtos.size() > 1) {
      LatLngBounds bounds = builder.build();
      CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, 0);
      googleMap.animateCamera(cu);
    } else if (complaintDtos.size() > 0) {
      CameraPosition cameraPosition =
          new CameraPosition.Builder()
              .target(
                  new LatLng(
                      complaintDtos.get(0).getLocation().getLatitude().doubleValue(),
                      complaintDtos.get(0).getLocation().getLongitude().doubleValue()))
              .zoom(zoomLevel)
              .bearing(0)
              .tilt(45)
              .build();
      googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
    }
    markersDisplayed = false;
    heatmapDisplayed = false;
    clusterDisplayed = true;
  }
 protected void onCameraChange(CameraPosition cameraPosition, ViewPortChangeListener listener) {
   // If custom tile overlay is enabled, use rounded zoom to avoid
   // tiles blurring
   if (customTileOverlay != null) {
     int roundZoom = Math.round(cameraPosition.zoom);
     if (Math.abs(cameraPosition.zoom - roundZoom) > 0.01) {
       CameraUpdate cameraUpdate = CameraUpdateFactory.zoomTo(roundZoom);
       googleMap.animateCamera(cameraUpdate);
       return;
     }
   }
   GeoRect viewPort = getViewPortGeoRect();
   listener.onViewPortChanged(viewPort);
 }
  private Boolean zoomOnMarkers() {
    try {
      int padding = 150;

      LatLngBounds.Builder builder = new LatLngBounds.Builder();
      for (Marker marker : mapMarkers) {
        builder.include(marker.getPosition());
      }
      LatLngBounds bounds = builder.build();

      CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
      map.animateCamera(cu);
      return true;
    } catch (Exception e) {
      e.printStackTrace();
      return false;
    }
  }
  private Boolean updateCenter() {
    WritableMap properties = getProperties();
    if (properties.hasKey(PROP_CENTER)) {
      try {
        CameraUpdate cameraUpdate;

        Double lng = properties.getMap(PROP_CENTER).getDouble("lng");
        Double lat = properties.getMap(PROP_CENTER).getDouble("lat");

        if (properties.hasKey(PROP_ZOOM_LEVEL)) {
          int zoomLevel = properties.getInt(PROP_ZOOM_LEVEL);
          mlastZoom = zoomLevel;
          Log.i(REACT_CLASS, "Zoom: " + Integer.toString(properties.getInt(PROP_ZOOM_LEVEL)));
          cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), zoomLevel);
        } else {
          Log.i(REACT_CLASS, "Default Zoom.");
          /*
           * Changed from cameraUpdate = CameraUpdateFactory.newLatLng(new LatLng(lat, lng));
           * as it gave me "zoom" Bugs (defaulted to zoom factor 2) as soon as I put in
           * "real" LNG and LAT values...
           */
          cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), mlastZoom);
        }

        map.animateCamera(cameraUpdate);

        return true;
      } catch (Exception e) {
        // ERROR!
        e.printStackTrace();
        return false;
      }
    } else {
      return false;
    }
  }
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.position);
    GoogleMap map =
        ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
    final Geocoder geocoder = new Geocoder(this, Locale.getDefault());
    final Button submit = (Button) findViewById(R.id.position_submit_button);
    submit.setEnabled(false);
    userProfile = ProfileManager.getInstance();

    Toast.makeText(getApplicationContext(), "Press and Hold Pin to Move", Toast.LENGTH_LONG).show();

    LatLng pgh = new LatLng(40.441814, -80.012794);
    map.moveCamera(CameraUpdateFactory.newLatLngZoom(pgh, 13));
    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

    if (locationManager != null) {
      boolean gpsIsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
      boolean networkIsEnabled =
          locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
      if (gpsIsEnabled) {
        Log.d("GPS Enabled", "GPS Enabled");
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000L, 10F, this);
        Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (location != null) {
          pgh = new LatLng(location.getLatitude(), location.getLongitude());
        }
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(pgh, 16));
        myIncident.setLat(Double.toString(pgh.latitude));
        myIncident.setLon(Double.toString(pgh.longitude));
        List<Address> addresses = null;
        try {
          addresses = geocoder.getFromLocation(pgh.latitude, pgh.longitude, 1);
          myIncident.setAddress(addresses.get(0).getAddressLine(0));
          city = addresses.get(0).getAddressLine(1);
          if (!city.contains("Pittsburgh")) {
            submit.setEnabled(false);
          } else {
            submit.setEnabled(true);
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
      } else {
        if (networkIsEnabled) {
          Log.d("Network Position Enabled", "Network Position");
          locationManager.requestLocationUpdates(
              LocationManager.NETWORK_PROVIDER, 5000L, 10F, this);
          Location location =
              locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
          if (location != null) {
            pgh = new LatLng(location.getLatitude(), location.getLongitude());
          }
          map.moveCamera(CameraUpdateFactory.newLatLngZoom(pgh, 15));
          myIncident.setLat(Double.toString(pgh.latitude));
          myIncident.setLon(Double.toString(pgh.longitude));
          List<Address> addresses = null;
          try {
            addresses = geocoder.getFromLocation(pgh.latitude, pgh.longitude, 1);
            myIncident.setAddress(addresses.get(0).getAddressLine(0));
            city = addresses.get(0).getAddressLine(1);
            if (!city.contains("Pittsburgh")) {
              submit.setEnabled(false);
            } else {
              submit.setEnabled(true);
            }
          } catch (Exception e) {
            e.printStackTrace();
          }
        }
      }

    } else {

    }

    Marker issueLoc =
        map.addMarker(
            new MarkerOptions()
                .title("Issue Location")
                .snippet("Drag to Problem Location")
                .position(pgh)
                .draggable(true));

    map.setOnMarkerDragListener(
        new GoogleMap.OnMarkerDragListener() {
          @Override
          public void onMarkerDragStart(Marker marker) {}

          @Override
          public void onMarkerDrag(Marker marker) {}

          @Override
          public void onMarkerDragEnd(Marker marker) {
            double latitude = marker.getPosition().latitude;
            double longitude = marker.getPosition().longitude;
            myIncident.setLat(Double.toString(latitude));
            myIncident.setLon(Double.toString(longitude));
            List<Address> addresses = null;
            try {
              addresses = geocoder.getFromLocation(latitude, longitude, 1);
              myIncident.setAddress(addresses.get(0).getAddressLine(0));
              city = addresses.get(0).getAddressLine(1);
              if (!city.contains("Pittsburgh")) {
                submit.setEnabled(false);
              } else {
                submit.setEnabled(true);
              }
            } catch (Exception e) {
              e.printStackTrace();
            }
          }
        });
    submit.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            new uploadReport().execute();
          }
        });
  }
 @Override
 public void animateToGeoPoint(LatLng geoPoint) {
   LatLng center = new LatLng(geoPoint.latitude, geoPoint.longitude);
   googleMap.animateCamera(CameraUpdateFactory.newLatLng(center));
 }
 @Override
 public void animateToLocation(Location location) {
   LatLng center = new LatLng(location.getLongitude(), location.getLongitude());
   googleMap.animateCamera(CameraUpdateFactory.newLatLng(center));
 }
 @Override
 public MapInfo getMapState() {
   CameraPosition cameraPosition = googleMap.getCameraPosition();
   return new MapInfo(
       cameraPosition.target.latitude, cameraPosition.target.longitude, cameraPosition.zoom);
 }
 public void removeCluster() {
   googleMap.clear();
   googleMap.setOnCameraChangeListener(null);
   googleMap.setOnMarkerClickListener(null);
 }
 @Override
 public void restoreMapState(MapInfo lastMapInfo) {
   LatLng center = new LatLng(lastMapInfo.getCenterX(), lastMapInfo.getCenterY());
   CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(center, lastMapInfo.getZoom());
   googleMap.moveCamera(cameraUpdate);
 }
 public void removeMarkers() {
   googleMap.clear();
   gridMap.clear();
 }
  public void addMarkers(List<GridPoint> gridPointList, List<PointEntity> pointEntityList) {
    clearMap();
    Marker m;
    LatLngBounds.Builder builder = new LatLngBounds.Builder();

    for (GridPoint gridPoint : gridPointList) {
      Bitmap icon =
          gridPoint.getScore() > 10
              ? gridPoint.getScore() > 20
                  ? BitmapFactory.decodeResource(getResources(), R.drawable.red_dot)
                  : BitmapFactory.decodeResource(getResources(), R.drawable.yellow_dot)
              : BitmapFactory.decodeResource(getResources(), R.drawable.green_dot);
      float hue =
          gridPoint.getScore() > 10
              ? gridPoint.getScore() > 20
                  ? BitmapDescriptorFactory.HUE_RED
                  : BitmapDescriptorFactory.HUE_YELLOW
              : BitmapDescriptorFactory.HUE_GREEN;

      markerOptions = new MarkerOptions();
      markerOptions.visible(true);
      markerOptions.position(
          new LatLng(
              gridPoint.getLocation().getLatitude().doubleValue(),
              gridPoint.getLocation().getLongitude().doubleValue()));
      markerOptions.draggable(false);
      markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
      // markerOptions.icon(BitmapDescriptorFactory.defaultMarker(hue));

      m = googleMap.addMarker(markerOptions);
      gridMap.put(m.getId(), gridPoint);
      builder.include(m.getPosition());
    }

    for (PointEntity pointEntity : pointEntityList) {
      Bitmap icon =
          pointEntity.getPointType().equals(PointType.PERSON)
              ? BitmapFactory.decodeResource(getResources(), R.drawable.man)
              : pointEntity.getPointType().equals(PointType.POLICE_STATION)
                  ? BitmapFactory.decodeResource(getResources(), R.drawable.police)
                  : BitmapFactory.decodeResource(getResources(), R.drawable.hospital);
      markerOptions = new MarkerOptions();
      markerOptions.visible(true);
      markerOptions.position(
          new LatLng(
              pointEntity.getLocation().getLatitude().doubleValue(),
              pointEntity.getLocation().getLongitude().doubleValue()));
      markerOptions.draggable(false);
      markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));

      m = googleMap.addMarker(markerOptions);
      pointMap.put(m.getId(), pointEntity);
      builder.include(m.getPosition());
    }

    if (gridPointList.size() > 1) {
      LatLngBounds bounds = builder.build();
      CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, 0);
      googleMap.animateCamera(cu);
    } else if (gridPointList.size() > 0) {
      CameraPosition cameraPosition =
          new CameraPosition.Builder()
              .target(
                  new LatLng(
                      gridPointList.get(0).getLocation().getLatitude().doubleValue(),
                      gridPointList.get(0).getLocation().getLongitude().doubleValue()))
              .zoom(zoomLevel)
              .bearing(0)
              .tilt(45)
              .build();
      googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
    }

    markersDisplayed = true;
    heatmapDisplayed = false;
    clusterDisplayed = false;
  }
 @Override
 public void setZoomControlsEnabled(boolean zoomControlEnabled) {
   googleMap.getUiSettings().setZoomControlsEnabled(zoomControlEnabled);
 }
 public double getMarkedLongitude() {
   return googleMap.getCameraPosition().target.longitude;
 }