package org.ecomap.android.app.utils;
import android.content.Context;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.PolygonOptions;
import com.google.maps.android.clustering.Cluster;
import com.google.maps.android.clustering.ClusterManager;
import com.google.maps.android.clustering.algo.NonHierarchicalDistanceBasedAlgorithm;
import org.ecomap.android.app.MyIconRendered;
import org.ecomap.android.app.Problem;
import org.ecomap.android.app.R;
import org.ecomap.android.app.fragments.EcoMapFragment;
import java.util.ArrayList;
public class MapClustering {
private CameraPosition cameraPosition;
private final GoogleMap mMap;
private final Context mContext;
private ArrayList<Problem> values;
private Marker marker;
private EcoMapFragment ecoMapFragment;
private ArrayList<LatLng> points;
private ArrayList<Marker> markers;
private ClusterManager<Problem> mClusterManager;
public MapClustering(CameraPosition cameraPosition, GoogleMap mMap, Context mContext, EcoMapFragment ecoMapFragment){
points = new ArrayList<>();
markers = new ArrayList<>();
this.cameraPosition = cameraPosition;
this.mMap = mMap;
this.mContext = mContext;
this.ecoMapFragment = ecoMapFragment;
//Initialize the manager with the mContext and the map.
mClusterManager = new ClusterManager<>(mContext, mMap);
}
public MapClustering (GoogleMap mMap, Context mContext) {
this.mMap = mMap;
this.mContext = mContext;
}
public void setUpClusterer() {
if(cameraPosition != null){
mMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}
else {
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(50.461166, 30.417397), 5));
}
//Point the map's listeners at the listeners implemented by the cluster.
mMap.setOnCameraChangeListener(mClusterManager);
mMap.setOnMarkerClickListener(mClusterManager);
mMap.setMyLocationEnabled(true);
mMap.setOnMarkerClickListener(mClusterManager);
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
if (EcoMapFragment.getMarkerClickType() == 1) {
Marker m = mMap.addMarker(new MarkerOptions().position(latLng));
m.setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE));
markers.add(m);
points.add(latLng);
mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
if (EcoMapFragment.getMarkerClickType() == 1) {
if (points.get(0).equals(marker.getPosition())) {
countPolygonPoints();
for (Marker m : markers) {
m.remove();
}
}
return false;
}
return false;
}
});
//ADDING PROBLEM VIA FLOATING ACTION BUTTON
} else if (EcoMapFragment.getMarkerClickType() == 2) {
addMarkerToMap(latLng);
}
}
});
//Add cluster items to the cluster manager.
mClusterManager.addItems(values);
mClusterManager.setOnClusterClickListener
(new ClusterManager.OnClusterClickListener<Problem>() {
@Override
public boolean onClusterClick(Cluster cluster) {
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(cluster.getPosition(),
mMap.getCameraPosition().zoom + 2));
return false;
}
});
//Set render for markers rendering
mClusterManager.setRenderer(new MyIconRendered(mContext, mMap, mClusterManager));
mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<Problem>() {
@Override
public boolean onClusterItemClick(final Problem problem) {
ecoMapFragment.fillSlidingPanel(problem);
//Set part of sliding layer visible
ecoMapFragment.mSlidingLayer.openPreview(true);
//save last open Problem for rotating screen
EcoMapFragment.lastOpenProblem = problem;
return false;
}
});
mClusterManager.setAlgorithm(new NonHierarchicalDistanceBasedAlgorithm<Problem>());
}
private void countPolygonPoints() {
if (points.size() >= 3) {
PolygonOptions polygonOptions = new PolygonOptions();
polygonOptions.addAll(points);
polygonOptions.strokeColor(mContext.getResources().getColor(R.color.polygonEdges));
polygonOptions.strokeWidth(7);
polygonOptions.fillColor(mContext.getResources().getColor(R.color.polygon));
mMap.addPolygon(polygonOptions);
points.clear();
EcoMapFragment.setMarkerClickType(0);
mMap.setOnMarkerClickListener(mClusterManager);
}
}
public void deleteMarker(){
if (marker != null) {
marker.remove();
marker = null;
EcoMapFragment.setMarkerPosition(null);
}
}
public Marker getMarker() {
return marker;
}
public void addMarkerToMap(LatLng position){
if (marker != null) {
marker.remove();
}
marker = mMap.addMarker(new MarkerOptions().draggable(true).position(position));
marker.setTitle(mContext.getString(R.string.have_problem));
marker.setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE));
EcoMapFragment.setMarkerPosition(marker.getPosition());
}
public void updateEntryParameters(ArrayList<Problem> values){
this.values = values;
mClusterManager.clearItems();
mClusterManager.addItems(values);
}
}