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 @@ - + omgandroid:actionProviderClass= "android.support.v7.widget.ShareActionProvider" />--> 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.+' } } -