diff --git a/app/app.iml b/app/app.iml
index 5299c48..067f8ef 100644
--- a/app/app.iml
+++ b/app/app.iml
@@ -98,6 +98,7 @@
+
@@ -146,6 +147,7 @@
+
diff --git a/app/build.gradle b/app/build.gradle
index 70714d4..e25a6a0 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -46,4 +46,5 @@ dependencies {
transitive = true;
}
compile 'com.beardedhen:androidbootstrap:2.0.0'
+ compile 'com.google.maps.android:android-maps-utils:0.3+'
}
diff --git a/app/src/main/java/org/deke/risk/riskahead/MapsActivity.java b/app/src/main/java/org/deke/risk/riskahead/MapsActivity.java
index 88ba8a8..9f7a384 100644
--- a/app/src/main/java/org/deke/risk/riskahead/MapsActivity.java
+++ b/app/src/main/java/org/deke/risk/riskahead/MapsActivity.java
@@ -5,9 +5,6 @@ import android.app.SearchableInfo;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
-import android.graphics.Color;
-import android.location.Address;
-import android.location.Geocoder;
import android.os.Bundle;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
@@ -26,40 +23,52 @@ 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.SupportMapFragment;
-import com.google.android.gms.maps.model.BitmapDescriptorFactory;
-import com.google.android.gms.maps.model.Circle;
-import com.google.android.gms.maps.model.CircleOptions;
+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.TileOverlay;
+import com.google.android.gms.maps.model.TileOverlayOptions;
+import com.google.maps.android.clustering.ClusterManager;
+import com.google.maps.android.heatmaps.HeatmapTileProvider;
+import org.deke.risk.riskahead.helper.AppClusterItem;
import org.deke.risk.riskahead.helper.AppConfig;
import org.deke.risk.riskahead.helper.AppController;
import org.deke.risk.riskahead.helper.BaseActivity;
+import org.deke.risk.riskahead.helper.OwnIconRendered;
import org.deke.risk.riskahead.helper.PlaceProvider;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
-import java.io.IOException;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
-import java.util.Locale;
import java.util.Map;
-public class MapsActivity extends BaseActivity implements LoaderManager.LoaderCallbacks, GoogleMap.OnInfoWindowClickListener {
+public class MapsActivity extends BaseActivity implements LoaderManager.LoaderCallbacks, ClusterManager.OnClusterItemInfoWindowClickListener{
private final static String mActivityTitle = "Risk Map";
private static final String TAG = MapsActivity.class.getSimpleName();
private static GoogleMap mMap;
Marker mMarker;
- HashMap markerIDs = new HashMap<>();
+ ArrayList myMarkers = new ArrayList();
+ private float previousZoomLevel = -1.0f;
+ private boolean isZooming = false;
private LatLng myLocation;
private LatLng markedLocation;
+ private List mPositionList = new ArrayList<>();
+
+ ClusterManager mClusterManager;
+
+ private static final int DEFAULT_ZOOM_LEVEL = 14;
+ private static final int THRESHOLD_ZOOM_LEVEL = 6;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -67,11 +76,11 @@ public class MapsActivity extends BaseActivity implements LoaderManager.LoaderCa
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.frag_maps_map)).getMap();
mMap.getUiSettings().setZoomControlsEnabled(true);
+ mMap.setMyLocationEnabled(true);
handleIntent(getIntent());
findViewById(R.id.btn_maps_confirm_position).setVisibility(View.GONE);
- mMap.setOnInfoWindowClickListener(this);
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
@@ -81,7 +90,7 @@ public class MapsActivity extends BaseActivity implements LoaderManager.LoaderCa
}
markedLocation = point;
mMarker = mMap.addMarker(new MarkerOptions().position(point));
- mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(point, 12.0f));
+ mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(point, DEFAULT_ZOOM_LEVEL));
findViewById(R.id.btn_maps_confirm_position).setVisibility(View.VISIBLE);
findViewById(R.id.btn_maps_confirm_position).setOnClickListener(new View.OnClickListener() {
@@ -93,13 +102,62 @@ public class MapsActivity extends BaseActivity implements LoaderManager.LoaderCa
}
});
- //setUpMap();
+ setUpClustering();
+ }
+
+ public GoogleMap.OnCameraChangeListener getCameraChangeListener()
+ {
+ return new GoogleMap.OnCameraChangeListener()
+ {
+ @Override
+ public void onCameraChange(CameraPosition position)
+ {
+ mClusterManager.onCameraChange(position);
+ Log.d("Zoom", "Zoom: " + position.zoom);
+
+ if(previousZoomLevel != position.zoom)
+ {
+ if(previousZoomLevel < THRESHOLD_ZOOM_LEVEL && position.zoom >= THRESHOLD_ZOOM_LEVEL){
+ mClusterManager.addItems(myMarkers);
+ }else if(previousZoomLevel > THRESHOLD_ZOOM_LEVEL && position.zoom <= THRESHOLD_ZOOM_LEVEL){
+ mClusterManager.clearItems();
+ }
+ }
+
+ previousZoomLevel = position.zoom;
+ }
+ };
+ }
+
+ private void setUpClustering() {
+
+ mClusterManager = new ClusterManager(this, mMap);
+
+ //mMap.setOnCameraChangeListener(mClusterManager);
+ mMap.setOnCameraChangeListener(getCameraChangeListener());
+ mMap.setOnMarkerClickListener(mClusterManager);
+ mClusterManager.setRenderer(new OwnIconRendered(this, mMap, mClusterManager));
+ mMap.setOnInfoWindowClickListener(mClusterManager);
+ mClusterManager.setOnClusterItemInfoWindowClickListener(this);
+ addClusterMarkers(mClusterManager);
+ }
+
+ private void addClusterMarkers(ClusterManager mClusterManager) {
String tag_string_req = "getincidentswithposition";
StringRequest strReq = getStringRequestGetAllIncidentsWithPosition();
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}
+ private void addHeatMap() {
+ HeatmapTileProvider mProvider = new HeatmapTileProvider.Builder()
+ .data(mPositionList)
+ .radius(50)
+ .build();
+
+ TileOverlay mOverlay = mMap.addTileOverlay(new TileOverlayOptions().tileProvider(mProvider));
+ }
+
private void handleIntent(Intent intent){
if(Intent.ACTION_SEARCH.equals(intent.getAction()))
{
@@ -150,7 +208,7 @@ public class MapsActivity extends BaseActivity implements LoaderManager.LoaderCa
position = new LatLng(Double.parseDouble(c.getString(1)),Double.parseDouble(c.getString(2)));
markerOptions.position(position);
markerOptions.title(c.getString(0));
- mMarker = mMap.addMarker(markerOptions);
+ //mMarker = mMap.addMarker(markerOptions);
}
if(position!=null){
CameraUpdate cameraPosition = CameraUpdateFactory.newLatLng(position);
@@ -196,18 +254,6 @@ public class MapsActivity extends BaseActivity implements LoaderManager.LoaderCa
return true;
}
- private void setUpMap() {
- // For showing a move to my loction button
- mMap.setMyLocationEnabled(true);
- mMap.getUiSettings().setZoomControlsEnabled(true);
- // For dropping a marker at a point on the Map
-
- mMap.addMarker(new MarkerOptions().position(myLocation).title("My Home").snippet("Home Address"));
-
- // For zooming automatically to the Dropped PIN Location
- mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(myLocation, 12.0f));
- }
-
@Override
public void onDestroy() {
super.onDestroy();
@@ -239,52 +285,38 @@ public class MapsActivity extends BaseActivity implements LoaderManager.LoaderCa
JSONObject jObj = new JSONObject(response);
boolean error = jObj.getBoolean("error");
- // Check for error node in json
if (!error) {
JSONArray incidents = jObj.getJSONArray("message");
for(int i=0;i mAdapter;
private ShareActionProvider mShareActionProvider;
- private DrawerItemCustomAdapter adapter;
- private String[] mNavigationDrawerItemTitles;
+ private DrawerItemCustomAdapter mCustomDrawerAdapter;
public SessionManager session;
public HashMap user;
@@ -92,7 +75,7 @@ public abstract class BaseActivity extends AppCompatActivity {
drawerItem[5] = new ObjectDrawerItem(R.drawable.ic_action_important, "Subscriptions");
drawerItem[6] = new ObjectDrawerItem(R.drawable.ic_action_back, "Logout");
- adapter = new DrawerItemCustomAdapter(this, R.layout.listview_item_row, drawerItem);
+ mCustomDrawerAdapter = new DrawerItemCustomAdapter(this, R.layout.listview_item_row, drawerItem);
mDrawerList = (ListView)findViewById(R.id.navList);
mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
@@ -112,7 +95,6 @@ public abstract class BaseActivity extends AppCompatActivity {
public void logout() {
session.setLogin(false);
- // Launching the login activity
Intent intent = new Intent(this, LoginActivity.class);
intent.putExtra(EXTRA_MESSAGE, "login");
startActivity(intent);
@@ -124,17 +106,14 @@ public abstract class BaseActivity extends AppCompatActivity {
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_common, menu);
- // Access the Share Item defined in menu XML
+ /*
MenuItem shareItem = menu.findItem(R.id.menu_item_share);
-
- // Access the object responsible for
- // putting together the sharing submenu
if (shareItem != null) {
mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
}
-
- // Create an Intent to share your content
setShareIntent();
+ */
+
getMenuInflater().inflate(R.menu.menu_login, menu);
return true;
@@ -163,9 +142,7 @@ public abstract class BaseActivity extends AppCompatActivity {
}
private void addDrawerItems() {
- String[] osArray = { "Start", "Report", "Incident Map", "User Statistics", "Account Settings", "Subscriptions", "Logout" };
- mAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, osArray);
- mDrawerList.setAdapter(adapter);
+ mDrawerList.setAdapter(mCustomDrawerAdapter);
mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
diff --git a/app/src/main/java/org/deke/risk/riskahead/helper/DrawerItemCustomAdapter.java b/app/src/main/java/org/deke/risk/riskahead/helper/DrawerItemCustomAdapter.java
index 6fdd70d..25e96d2 100644
--- a/app/src/main/java/org/deke/risk/riskahead/helper/DrawerItemCustomAdapter.java
+++ b/app/src/main/java/org/deke/risk/riskahead/helper/DrawerItemCustomAdapter.java
@@ -30,7 +30,6 @@ public class DrawerItemCustomAdapter extends ArrayAdapter {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
-
View listItem = convertView;
LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
diff --git a/app/src/main/java/org/deke/risk/riskahead/helper/ObjectDrawerItem.java b/app/src/main/java/org/deke/risk/riskahead/helper/ObjectDrawerItem.java
index d0b4553..dc3c4bb 100644
--- a/app/src/main/java/org/deke/risk/riskahead/helper/ObjectDrawerItem.java
+++ b/app/src/main/java/org/deke/risk/riskahead/helper/ObjectDrawerItem.java
@@ -7,9 +7,7 @@ public class ObjectDrawerItem {
public int icon;
public String name;
- // Constructor.
public ObjectDrawerItem(int icon, String name) {
-
this.icon = icon;
this.name = name;
}
diff --git a/app/src/main/java/org/deke/risk/riskahead/helper/OwnIconRendered.java b/app/src/main/java/org/deke/risk/riskahead/helper/OwnIconRendered.java
new file mode 100644
index 0000000..fd9a521
--- /dev/null
+++ b/app/src/main/java/org/deke/risk/riskahead/helper/OwnIconRendered.java
@@ -0,0 +1,29 @@
+package org.deke.risk.riskahead.helper;
+
+import android.content.Context;
+
+import com.google.android.gms.maps.GoogleMap;
+import com.google.android.gms.maps.model.MarkerOptions;
+import com.google.maps.android.clustering.ClusterManager;
+import com.google.maps.android.clustering.view.ClusterRenderer;
+import com.google.maps.android.clustering.view.DefaultClusterRenderer;
+
+import org.deke.risk.riskahead.MapsActivity;
+
+/**
+ * Created by Dennis on 12.11.2015.
+ */
+public class OwnIconRendered extends DefaultClusterRenderer {
+
+ public OwnIconRendered(Context context, GoogleMap map,ClusterManager clusterManager) {
+ super(context, map, clusterManager);
+ }
+
+ @Override
+ protected void onBeforeClusterItemRendered(AppClusterItem item, MarkerOptions markerOptions) {
+ markerOptions.icon(item.getIcon());
+ markerOptions.snippet(item.getSnippet());
+ markerOptions.title(item.getTitle());
+ super.onBeforeClusterItemRendered(item, markerOptions);
+ }
+}
diff --git a/app/src/main/res/menu/menu_common.xml b/app/src/main/res/menu/menu_common.xml
index 3ac4210..e5b3a95 100644
--- a/app/src/main/res/menu/menu_common.xml
+++ b/app/src/main/res/menu/menu_common.xml
@@ -1,10 +1,10 @@
diff --git a/build.gradle b/build.gradle
index 4e12a9a..cf8da81 100644
--- a/build.gradle
+++ b/build.gradle
@@ -11,4 +11,3 @@ buildscript {
classpath 'io.fabric.tools:gradle:1.+'
}
}
-