package com.example.chan24.smartplanner; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Color; import android.location.Criteria; import android.location.Location; import android.location.LocationManager; import android.location.LocationListener; import android.provider.Settings; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.Snackbar; import android.support.v4.app.ActivityCompat; import android.support.v4.app.FragmentActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.JsonObjectRequest; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GoogleApiAvailability; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import static com.example.chan24.smartplanner.AppConfig.*; public class MapsActivity extends FragmentActivity implements OnMapReadyCallback,LocationListener { private GoogleMap mMap; LocationManager locationManager; CoordinatorLayout mainCoordinateLayout; String shopping; String dining; String supermarket; int distance; double latitude; double longitude; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (!isGooglePlayServicesAvailable()){ return; } setContentView(R.layout.activity_maps); // Obtain the SupportMapFragment and get notified when the map is ready to be used. SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); mainCoordinateLayout = (CoordinatorLayout) findViewById(R.id.mainCoordinatorLayout); locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { showLocationSettings(); } Intent i = getIntent(); shopping =i.getStringExtra("shopping"); dining=i.getStringExtra("dining"); supermarket=i.getStringExtra("supermarket"); distance= Integer.parseInt(i.getStringExtra("distance")); Button sh=(Button)findViewById(R.id.shopping); if (shopping.contentEquals("yes")){ sh.setEnabled(true); } else{ sh.setEnabled(false); } Button s=(Button)findViewById(R.id.supermarket); if (supermarket.contentEquals("yes")){ s.setEnabled(true); } else { s.setEnabled(false); } Button d=(Button)findViewById(R.id.dining); if (dining.contentEquals("yes")){ d.setEnabled(true); } else { d.setEnabled(false); } sh.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { loadNearByPlaces(latitude,longitude,"shopping_mall"); } }); s.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { loadNearByPlaces(latitude,longitude,"department_store"); } }); d.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { loadNearByPlaces(latitude,longitude,"restaurant"); } }); } private void showLocationSettings() { Snackbar snackbar = Snackbar.make(mainCoordinateLayout,"Location Error.GPS Disabled!",Snackbar.LENGTH_LONG).setAction("Enable", new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)); } }); snackbar.setActionTextColor(Color.RED); snackbar.setDuration(Snackbar.LENGTH_INDEFINITE); View sbView = snackbar.getView(); TextView textview =(TextView)sbView.findViewById(R.id.snackbar_text); textview.setTextColor(Color.YELLOW); snackbar.show(); } private boolean isGooglePlayServicesAvailable() { GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); int resultCode = apiAvailability.isGooglePlayServicesAvailable(this); if (resultCode != ConnectionResult.SUCCESS) { if (apiAvailability.isUserResolvableError(resultCode)) { apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST).show(); } else { Log.i(TAG, "This device is not supported."); finish(); } return false; } return true; } @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; } mMap.setMyLocationEnabled(true); mMap.getUiSettings().setCompassEnabled(true); mMap.getUiSettings().setZoomControlsEnabled(true); showCurrentLocation(); } private void showCurrentLocation() { Criteria criteria = new Criteria(); String bestProvider = locationManager.getBestProvider(criteria, true); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; } Location location = locationManager.getLastKnownLocation(bestProvider); if (location != null){ onLocationChanged(location); } locationManager.requestLocationUpdates(bestProvider, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); } @Override public void onLocationChanged(Location location) { latitude = location.getLatitude(); longitude = location.getLongitude(); LatLng latLng = new LatLng(latitude, longitude); mMap.addMarker(new MarkerOptions().position(latLng).title("My Location")); mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); mMap.animateCamera(CameraUpdateFactory.zoomTo(15)); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } private void loadNearByPlaces(double latitude, double longitude, String type) { StringBuilder googlePlacesUrl = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?"); googlePlacesUrl.append("location=").append(latitude).append(",").append(longitude); googlePlacesUrl.append("&radius=").append(distance); googlePlacesUrl.append("&types=").append(type); googlePlacesUrl.append("&sensor=true"); googlePlacesUrl.append("&key=" + GOOGLE_BROWSER_API_KEY); JsonObjectRequest request = new JsonObjectRequest(googlePlacesUrl.toString(), new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject result) { Log.i(TAG, "onResponse: Result= " + result.toString()); parseLocationResult(result); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e(TAG, "onErrorResponse: Error= " + error); Log.e(TAG, "onErrorResponse: Error= " + error.getMessage()); } }); AppController.getInstance().addToRequestQueue(request); } private void parseLocationResult(JSONObject result) { String id, place_id, placeName = null, reference, icon, vicinity = null; double latitude, longitude; try { JSONArray jsonArray = result.getJSONArray("results"); if (result.getString(STATUS).equalsIgnoreCase(OK)) { mMap.clear(); for (int i = 0; i < jsonArray.length(); i++) { JSONObject place = jsonArray.getJSONObject(i); id = place.getString(SUPERMARKET_ID); place_id = place.getString(PLACE_ID); if (!place.isNull(NAME)) { placeName = place.getString(NAME); } if (!place.isNull(VICINITY)) { vicinity = place.getString(VICINITY); } latitude = place.getJSONObject(GEOMETRY).getJSONObject(LOCATION) .getDouble(LATITUDE); longitude = place.getJSONObject(GEOMETRY).getJSONObject(LOCATION) .getDouble(LONGITUDE); reference = place.getString(REFERENCE); icon = place.getString(ICON); String t=place.getString("types"); MarkerOptions markerOptions = new MarkerOptions(); LatLng latLng = new LatLng(latitude, longitude); if (t.contains("restaurant") || t.contains("food")){ markerOptions.position(latLng); markerOptions.title(placeName + " : " + vicinity); markerOptions.icon((BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE))); mMap.addMarker(markerOptions); } else if (t.contains("department_store")){ markerOptions.position(latLng); markerOptions.title(placeName + " : " + vicinity); markerOptions.icon((BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN))); mMap.addMarker(markerOptions); } else { markerOptions.position(latLng); markerOptions.title(placeName + " : " + vicinity); markerOptions.icon((BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))); mMap.addMarker(markerOptions); } } Toast.makeText(getBaseContext(), jsonArray.length() + " places found!",Toast.LENGTH_LONG).show(); } else if (result.getString(STATUS).equalsIgnoreCase(ZERO_RESULTS)) { Toast.makeText(getBaseContext(), "No places found in "+distance+"m radius!!!", Toast.LENGTH_LONG).show(); } } catch (JSONException e) { e.printStackTrace(); Log.e(TAG, "parseLocationResult: Error=" + e.getMessage()); } } }