diff --git a/collect_app/src/main/java/org/odk/collect/android/activities/GeoPointActivity.java b/collect_app/src/main/java/org/odk/collect/android/activities/GeoPointActivity.java index 5c05800c7b1..0a8ec6c90a5 100644 --- a/collect_app/src/main/java/org/odk/collect/android/activities/GeoPointActivity.java +++ b/collect_app/src/main/java/org/odk/collect/android/activities/GeoPointActivity.java @@ -30,6 +30,7 @@ import org.odk.collect.android.R; import org.odk.collect.android.application.Collect; import org.odk.collect.android.utilities.InfoLogger; +import org.odk.collect.android.utilities.PlayServicesUtil; import org.odk.collect.android.widgets.GeoPointWidget; import java.text.DecimalFormat; @@ -47,7 +48,6 @@ public class GeoPointActivity extends Activity implements LocationListener { private double mLocationAccuracy; private int mLocationCount = 0; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -69,56 +69,61 @@ protected void onCreate(Bundle savedInstanceState) { setTitle(getString(R.string.get_location)); - mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); + if (PlayServicesUtil.checkPlayServices(GeoPointActivity.this)) { + mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); - // make sure we have a good location provider before continuing - List providers = mLocationManager.getProviders(true); - for (String provider : providers) { - if (provider.equalsIgnoreCase(LocationManager.GPS_PROVIDER)) { - mGPSOn = true; + // make sure we have a good location provider before continuing + List providers = mLocationManager.getProviders(true); + for (String provider : providers) { + if (provider.equalsIgnoreCase(LocationManager.GPS_PROVIDER)) { + mGPSOn = true; + } + if (provider.equalsIgnoreCase(LocationManager.NETWORK_PROVIDER)) { + mNetworkOn = true; + } } - if (provider.equalsIgnoreCase(LocationManager.NETWORK_PROVIDER)) { - mNetworkOn = true; + if (!mGPSOn && !mNetworkOn) { + Toast.makeText(getBaseContext(), getString(R.string.provider_disabled_error), + Toast.LENGTH_SHORT).show(); + finish(); } - } - if (!mGPSOn && !mNetworkOn) { - Toast.makeText(getBaseContext(), getString(R.string.provider_disabled_error), - Toast.LENGTH_SHORT).show(); - finish(); - } - if (mGPSOn) { - Location loc = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); - if (loc != null) { - InfoLogger.geolog("GeoPointActivity: " + System.currentTimeMillis() + - " lastKnownLocation(GPS) lat: " + - loc.getLatitude() + " long: " + - loc.getLongitude() + " acc: " + - loc.getAccuracy()); - } else { - InfoLogger.geolog("GeoPointActivity: " + System.currentTimeMillis() + - " lastKnownLocation(GPS) null location"); + if (mGPSOn) { + Location loc = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); + if (loc != null) { + InfoLogger.geolog("GeoPointActivity: " + System.currentTimeMillis() + + " lastKnownLocation(GPS) lat: " + + loc.getLatitude() + " long: " + + loc.getLongitude() + " acc: " + + loc.getAccuracy()); + } else { + InfoLogger.geolog("GeoPointActivity: " + System.currentTimeMillis() + + " lastKnownLocation(GPS) null location"); + } } - } - if (mNetworkOn) { - Location loc = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); - if (loc != null) { - InfoLogger.geolog("GeoPointActivity: " + System.currentTimeMillis() + - " lastKnownLocation(Network) lat: " + - loc.getLatitude() + " long: " + - loc.getLongitude() + " acc: " + - loc.getAccuracy()); - } else { - InfoLogger.geolog("GeoPointActivity: " + System.currentTimeMillis() + - " lastKnownLocation(Network) null location"); + if (mNetworkOn) { + Location loc = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); + if (loc != null) { + InfoLogger.geolog("GeoPointActivity: " + System.currentTimeMillis() + + " lastKnownLocation(Network) lat: " + + loc.getLatitude() + " long: " + + loc.getLongitude() + " acc: " + + loc.getAccuracy()); + } else { + InfoLogger.geolog("GeoPointActivity: " + System.currentTimeMillis() + + " lastKnownLocation(Network) null location"); + } } - } - setupLocationDialog(); + setupLocationDialog(); + } else { + PlayServicesUtil.requestPlayServicesErrorDialog(GeoPointActivity.this); + } } + @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); @@ -253,6 +258,13 @@ public void onLocationChanged(Location location) { } } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == PlayServicesUtil.PLAY_SERVICE_ERROR_REQUEST_CODE) { + finish(); + } + super.onActivityResult(requestCode, resultCode, data); + } private String truncateDouble(float number) { DecimalFormat df = new DecimalFormat("#.##"); diff --git a/collect_app/src/main/java/org/odk/collect/android/activities/GeoPointMapActivity.java b/collect_app/src/main/java/org/odk/collect/android/activities/GeoPointMapActivity.java index f0de66c6af2..baf71713c71 100644 --- a/collect_app/src/main/java/org/odk/collect/android/activities/GeoPointMapActivity.java +++ b/collect_app/src/main/java/org/odk/collect/android/activities/GeoPointMapActivity.java @@ -47,6 +47,7 @@ import org.odk.collect.android.application.Collect; import org.odk.collect.android.spatial.MapHelper; import org.odk.collect.android.utilities.InfoLogger; +import org.odk.collect.android.utilities.PlayServicesUtil; import org.odk.collect.android.widgets.GeoPointWidget; import java.text.DecimalFormat; @@ -129,12 +130,16 @@ public void onCreate(Bundle savedInstanceState) { return; } - ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMapAsync(new OnMapReadyCallback() { - @Override - public void onMapReady(GoogleMap googleMap) { - setupMap(googleMap); - } - }); + if (PlayServicesUtil.checkPlayServices(GeoPointMapActivity.this)) { + ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMapAsync(new OnMapReadyCallback() { + @Override + public void onMapReady(GoogleMap googleMap) { + setupMap(googleMap); + } + }); + } else { + PlayServicesUtil.requestPlayServicesErrorDialog(GeoPointMapActivity.this); + } } @Override @@ -574,4 +579,12 @@ public void onClick(DialogInterface dialog, int id) { alert.show(); } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == PlayServicesUtil.PLAY_SERVICE_ERROR_REQUEST_CODE) { + finish(); + } + super.onActivityResult(requestCode, resultCode, data); + } + } \ No newline at end of file diff --git a/collect_app/src/main/java/org/odk/collect/android/activities/GeoPointOsmMapActivity.java b/collect_app/src/main/java/org/odk/collect/android/activities/GeoPointOsmMapActivity.java index 96c5d16793c..6549ff2dc9e 100644 --- a/collect_app/src/main/java/org/odk/collect/android/activities/GeoPointOsmMapActivity.java +++ b/collect_app/src/main/java/org/odk/collect/android/activities/GeoPointOsmMapActivity.java @@ -38,6 +38,7 @@ import org.odk.collect.android.application.Collect; import org.odk.collect.android.spatial.MapHelper; import org.odk.collect.android.utilities.InfoLogger; +import org.odk.collect.android.utilities.PlayServicesUtil; import org.odk.collect.android.widgets.GeoPointWidget; import org.osmdroid.bonuspack.overlays.MapEventsOverlay; import org.osmdroid.bonuspack.overlays.MapEventsReceiver; @@ -134,175 +135,180 @@ protected void onCreate(Bundle savedInstanceState) { return; } - mMap = (MapView) findViewById(R.id.omap); - mHelper = new MapHelper(this, mMap, GeoPointOsmMapActivity.this); - mMap.setMultiTouchControls(true); - mMap.setBuiltInZoomControls(true); - mMarker = new Marker(mMap); - mMarker.setIcon(getResources().getDrawable(R.drawable.ic_place_black_36dp)); - mMyLocationOverlay = new MyLocationNewOverlay(this, mMap); + if (PlayServicesUtil.checkPlayServices(GeoPointOsmMapActivity.this)) { - handler.postDelayed(new Runnable() { - public void run() { - GeoPoint point = new GeoPoint(34.08145, -39.85007); - mMap.getController().setZoom(4); - mMap.getController().setCenter(point); - } - }, 100); + mMap = (MapView) findViewById(R.id.omap); + mHelper = new MapHelper(this, mMap, GeoPointOsmMapActivity.this); + mMap.setMultiTouchControls(true); + mMap.setBuiltInZoomControls(true); + mMarker = new Marker(mMap); + mMarker.setIcon(getResources().getDrawable(R.drawable.ic_place_black_36dp)); + mMyLocationOverlay = new MyLocationNewOverlay(this, mMap); - mLocationAccuracy = GeoPointWidget.DEFAULT_LOCATION_ACCURACY; - mLocationStatus = (TextView) findViewById(R.id.location_status); - mlocationInfo = (TextView) findViewById(R.id.location_info); + handler.postDelayed(new Runnable() { + public void run() { + GeoPoint point = new GeoPoint(34.08145, -39.85007); + mMap.getController().setZoom(4); + mMap.getController().setCenter(point); + } + }, 100); + mLocationAccuracy = GeoPointWidget.DEFAULT_LOCATION_ACCURACY; + mLocationStatus = (TextView) findViewById(R.id.location_status); + mlocationInfo = (TextView) findViewById(R.id.location_info); - mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); - mSaveLocationButton = (Button) findViewById(R.id.accept_location); - mSaveLocationButton.setOnClickListener(new View.OnClickListener() { + mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); - @Override - public void onClick(View v) { - Collect.getInstance().getActivityLogger().logInstanceAction(this, "acceptLocation", - "OK"); - returnLocation(); - } - }); + mSaveLocationButton = (Button) findViewById(R.id.accept_location); + mSaveLocationButton.setOnClickListener(new View.OnClickListener() { - mReloadLocationButton = (Button) findViewById(R.id.reload_location); - mReloadLocationButton.setEnabled(false); - mReloadLocationButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mMap.getOverlays().add(mMarker); - setClear = false; - mLatLng = new GeoPoint(mLocation.getLatitude(), mLocation.getLongitude()); - mMarker.setPosition(mLatLng); - mCaptureLocation = true; - mIsDragged = false; - zoomToPoint(); - } + @Override + public void onClick(View v) { + Collect.getInstance().getActivityLogger().logInstanceAction(this, "acceptLocation", + "OK"); + returnLocation(); + } + }); - }); - - // Focuses on marked location - mShowLocationButton = ((Button) findViewById(R.id.show_location)); - mShowLocationButton.setVisibility(View.VISIBLE); - mShowLocationButton.setEnabled(false); - mShowLocationButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Collect.getInstance().getActivityLogger() - .logInstanceAction(this, "showLocation", "onClick"); - showZoomDialog(); - } - }); + mReloadLocationButton = (Button) findViewById(R.id.reload_location); + mReloadLocationButton.setEnabled(false); + mReloadLocationButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mMap.getOverlays().add(mMarker); + setClear = false; + mLatLng = new GeoPoint(mLocation.getLatitude(), mLocation.getLongitude()); + mMarker.setPosition(mLatLng); + mCaptureLocation = true; + mIsDragged = false; + zoomToPoint(); + } - // not clickable until we have a marker set.... - mShowLocationButton.setClickable(false); + }); + + // Focuses on marked location + mShowLocationButton = ((Button) findViewById(R.id.show_location)); + mShowLocationButton.setVisibility(View.VISIBLE); + mShowLocationButton.setEnabled(false); + mShowLocationButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Collect.getInstance().getActivityLogger() + .logInstanceAction(this, "showLocation", "onClick"); + showZoomDialog(); + } + }); - // Menu Layer Toggle - mLayersButton = ((Button) findViewById(R.id.layer_menu)); - mLayersButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mHelper.showLayersDialog(GeoPointOsmMapActivity.this); + // not clickable until we have a marker set.... + mShowLocationButton.setClickable(false); - } - }); + // Menu Layer Toggle + mLayersButton = ((Button) findViewById(R.id.layer_menu)); + mLayersButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mHelper.showLayersDialog(GeoPointOsmMapActivity.this); + } + }); - zoomDialogView = getLayoutInflater().inflate(R.layout.geopoint_zoom_dialog, null); - zoomLocationButton = (Button) zoomDialogView.findViewById(R.id.zoom_location); - zoomLocationButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - zoomToLocation(); - mMap.invalidate(); - zoomDialog.dismiss(); - } - }); + zoomDialogView = getLayoutInflater().inflate(R.layout.geopoint_zoom_dialog, null); - zoomPointButton = (Button) zoomDialogView.findViewById(R.id.zoom_point); - zoomPointButton.setOnClickListener(new View.OnClickListener() { + zoomLocationButton = (Button) zoomDialogView.findViewById(R.id.zoom_location); + zoomLocationButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + zoomToLocation(); + mMap.invalidate(); + zoomDialog.dismiss(); + } + }); - @Override - public void onClick(View v) { - zoomToPoint(); - mMap.invalidate(); - zoomDialog.dismiss(); - } - }); - - clearPointButton = (Button) findViewById(R.id.clear); - clearPointButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mMap.getOverlays().remove(mMarker); - mMarker.remove(mMap); - if (mLocation != null) { - mReloadLocationButton.setEnabled(true); + zoomPointButton = (Button) zoomDialogView.findViewById(R.id.zoom_point); + zoomPointButton.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + zoomToPoint(); + mMap.invalidate(); + zoomDialog.dismiss(); + } + }); + + clearPointButton = (Button) findViewById(R.id.clear); + clearPointButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mMap.getOverlays().remove(mMarker); + mMarker.remove(mMap); + if (mLocation != null) { + mReloadLocationButton.setEnabled(true); // mLocationStatus.setVisibility(View.VISIBLE); + } + mLocationStatus.setVisibility(View.VISIBLE); + mMap.getOverlays().remove(mMarker); + mMarker.remove(mMap); + setClear = true; + mIsDragged = false; + mCaptureLocation = false; + draggable = intent_draggable; + location_from_intent = false; + overlayMyLocationLayers(); + mMap.invalidate(); } - mLocationStatus.setVisibility(View.VISIBLE); - mMap.getOverlays().remove(mMarker); - mMarker.remove(mMap); - setClear = true; - mIsDragged = false; - mCaptureLocation = false; - draggable = intent_draggable; - location_from_intent = false; - overlayMyLocationLayers(); - mMap.invalidate(); - } - }); + }); - Intent intent = getIntent(); - if (intent != null && intent.getExtras() != null) { + Intent intent = getIntent(); + if (intent != null && intent.getExtras() != null) { - if (intent.hasExtra(GeoPointWidget.DRAGGABLE_ONLY)) { - draggable = intent.getBooleanExtra(GeoPointWidget.DRAGGABLE_ONLY, false); - intent_draggable = draggable; - if (!intent_draggable) { - // Not Draggable, set text for Map else leave as placement-map text - mlocationInfo.setText(getString(R.string.geopoint_no_draggable_instruction)); + if (intent.hasExtra(GeoPointWidget.DRAGGABLE_ONLY)) { + draggable = intent.getBooleanExtra(GeoPointWidget.DRAGGABLE_ONLY, false); + intent_draggable = draggable; + if (!intent_draggable) { + // Not Draggable, set text for Map else leave as placement-map text + mlocationInfo.setText(getString(R.string.geopoint_no_draggable_instruction)); + } } - } - if (intent.hasExtra(GeoPointWidget.READ_ONLY)) { - read_only = intent.getBooleanExtra(GeoPointWidget.READ_ONLY, false); - if (read_only) { - mCaptureLocation = true; - clearPointButton.setEnabled(false); + if (intent.hasExtra(GeoPointWidget.READ_ONLY)) { + read_only = intent.getBooleanExtra(GeoPointWidget.READ_ONLY, false); + if (read_only) { + mCaptureLocation = true; + clearPointButton.setEnabled(false); + } } - } - if (intent.hasExtra(GeoPointWidget.LOCATION)) { - double[] location = intent.getDoubleArrayExtra(GeoPointWidget.LOCATION); - mLatLng = new GeoPoint(location[0], location[1]); - mReloadLocationButton.setEnabled(false); - mCaptureLocation = true; - mIsDragged = true; - draggable = false; // If data loaded, must clear first - location_from_intent = true; + if (intent.hasExtra(GeoPointWidget.LOCATION)) { + double[] location = intent.getDoubleArrayExtra(GeoPointWidget.LOCATION); + mLatLng = new GeoPoint(location[0], location[1]); + mReloadLocationButton.setEnabled(false); + mCaptureLocation = true; + mIsDragged = true; + draggable = false; // If data loaded, must clear first + location_from_intent = true; - } - if (intent.hasExtra(GeoPointWidget.ACCURACY_THRESHOLD)) { - mLocationAccuracy = intent.getDoubleExtra(GeoPointWidget.ACCURACY_THRESHOLD, - GeoPointWidget.DEFAULT_LOCATION_ACCURACY); - } + } + if (intent.hasExtra(GeoPointWidget.ACCURACY_THRESHOLD)) { + mLocationAccuracy = intent.getDoubleExtra(GeoPointWidget.ACCURACY_THRESHOLD, + GeoPointWidget.DEFAULT_LOCATION_ACCURACY); + } - } + } - if (mLatLng != null) { - mMarker.setPosition(mLatLng); - mMap.getOverlays().add(mMarker); - mMap.invalidate(); - mCaptureLocation = true; - foundFirstLocation = true; - mZoomed = true; - zoomToPoint(); + if (mLatLng != null) { + mMarker.setPosition(mLatLng); + mMap.getOverlays().add(mMarker); + mMap.invalidate(); + mCaptureLocation = true; + foundFirstLocation = true; + mZoomed = true; + zoomToPoint(); + } + } else { + PlayServicesUtil.requestPlayServicesErrorDialog(GeoPointOsmMapActivity.this); } } @@ -623,4 +629,12 @@ public void onClick(DialogInterface dialog, int id) { alert.show(); } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == PlayServicesUtil.PLAY_SERVICE_ERROR_REQUEST_CODE) { + finish(); + } + super.onActivityResult(requestCode, resultCode, data); + } + } diff --git a/collect_app/src/main/java/org/odk/collect/android/activities/GeoShapeGoogleMapActivity.java b/collect_app/src/main/java/org/odk/collect/android/activities/GeoShapeGoogleMapActivity.java index 570f19fee05..454255bc700 100644 --- a/collect_app/src/main/java/org/odk/collect/android/activities/GeoShapeGoogleMapActivity.java +++ b/collect_app/src/main/java/org/odk/collect/android/activities/GeoShapeGoogleMapActivity.java @@ -50,6 +50,7 @@ import org.odk.collect.android.R; import org.odk.collect.android.application.Collect; import org.odk.collect.android.spatial.MapHelper; +import org.odk.collect.android.utilities.PlayServicesUtil; import org.odk.collect.android.widgets.GeoShapeWidget; import java.util.ArrayList; @@ -104,13 +105,18 @@ public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.geoshape_google_layout); - mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); - ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.gmap)).getMapAsync(new OnMapReadyCallback() { - @Override - public void onMapReady(GoogleMap googleMap) { - setupMap(googleMap); - } - }); + if (PlayServicesUtil.checkPlayServices(GeoShapeGoogleMapActivity.this)) { + + mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); + ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.gmap)).getMapAsync(new OnMapReadyCallback() { + @Override + public void onMapReady(GoogleMap googleMap) { + setupMap(googleMap); + } + }); + } else { + PlayServicesUtil.requestPlayServicesErrorDialog(GeoShapeGoogleMapActivity.this); + } } @@ -512,4 +518,12 @@ public void onClick(DialogInterface dialog, int id) { AlertDialog alert = alertDialogBuilder.create(); alert.show(); } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == PlayServicesUtil.PLAY_SERVICE_ERROR_REQUEST_CODE) { + finish(); + } + super.onActivityResult(requestCode, resultCode, data); + } } diff --git a/collect_app/src/main/java/org/odk/collect/android/activities/GeoShapeOsmMapActivity.java b/collect_app/src/main/java/org/odk/collect/android/activities/GeoShapeOsmMapActivity.java index 7e6b4b2f8ea..9fbaab533ac 100644 --- a/collect_app/src/main/java/org/odk/collect/android/activities/GeoShapeOsmMapActivity.java +++ b/collect_app/src/main/java/org/odk/collect/android/activities/GeoShapeOsmMapActivity.java @@ -32,6 +32,7 @@ import org.odk.collect.android.R; import org.odk.collect.android.spatial.MapHelper; +import org.odk.collect.android.utilities.PlayServicesUtil; import org.odk.collect.android.widgets.GeoShapeWidget; import org.osmdroid.DefaultResourceProxyImpl; import org.osmdroid.bonuspack.overlays.MapEventsOverlay; @@ -98,103 +99,108 @@ protected void onCreate(Bundle savedInstanceState) { setTitle(getString(R.string.geoshape_title)); // Setting title of the action mSaveButton = (Button) findViewById(R.id.save); mClearButton = (Button) findViewById(R.id.clear); - resource_proxy = new DefaultResourceProxyImpl(getApplicationContext()); - mMap = (MapView) findViewById(R.id.geoshape_mapview); - mHelper = new MapHelper(this, mMap, GeoShapeOsmMapActivity.this); - mMap.setMultiTouchControls(true); - mMap.setBuiltInZoomControls(true); - mMap.setMapListener(mapViewListner); - overlayPointPathListner(); - mSaveButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - returnLocation(); - } - }); - mClearButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (map_markers.size() != 0) { - showClearDialog(); + if (PlayServicesUtil.checkPlayServices(GeoShapeOsmMapActivity.this)) { + + resource_proxy = new DefaultResourceProxyImpl(getApplicationContext()); + mMap = (MapView) findViewById(R.id.geoshape_mapview); + mHelper = new MapHelper(this, mMap, GeoShapeOsmMapActivity.this); + mMap.setMultiTouchControls(true); + mMap.setBuiltInZoomControls(true); + mMap.setMapListener(mapViewListner); + overlayPointPathListner(); + mSaveButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + returnLocation(); } - } - }); - mLayersButton = (Button) findViewById(R.id.layers); - mLayersButton.setOnClickListener(new View.OnClickListener() { + }); + mClearButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (map_markers.size() != 0) { + showClearDialog(); + } + } + }); + mLayersButton = (Button) findViewById(R.id.layers); + mLayersButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mHelper.showLayersDialog(GeoShapeOsmMapActivity.this); + @Override + public void onClick(View v) { + mHelper.showLayersDialog(GeoShapeOsmMapActivity.this); - } - }); - mLocationButton = (Button) findViewById(R.id.gps); - mLocationButton.setEnabled(false); - mLocationButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(final View v) { - showZoomDialog(); - } - }); + } + }); + mLocationButton = (Button) findViewById(R.id.gps); + mLocationButton.setEnabled(false); + mLocationButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(final View v) { + showZoomDialog(); + } + }); - GpsMyLocationProvider imlp = new GpsMyLocationProvider(this.getBaseContext()); - imlp.setLocationUpdateMinDistance(1000); - imlp.setLocationUpdateMinTime(60000); - mMyLocationOverlay = new MyLocationNewOverlay(this, mMap); + GpsMyLocationProvider imlp = new GpsMyLocationProvider(this.getBaseContext()); + imlp.setLocationUpdateMinDistance(1000); + imlp.setLocationUpdateMinTime(60000); + mMyLocationOverlay = new MyLocationNewOverlay(this, mMap); - Intent intent = getIntent(); - if (intent != null && intent.getExtras() != null) { - if (intent.hasExtra(GeoShapeWidget.SHAPE_LOCATION)) { - mClearButton.setEnabled(true); - data_loaded = true; - String s = intent.getStringExtra(GeoShapeWidget.SHAPE_LOCATION); - overlayIntentPolygon(s); - //zoomToCentroid(); - mLocationButton.setEnabled(true); - zoomtoBounds(); - } - } else { - mMyLocationOverlay.runOnFirstFix(centerAroundFix); - mClearButton.setEnabled(false); - final Handler handler = new Handler(); - handler.postDelayed(new Runnable() { - public void run() { - GeoPoint point = new GeoPoint(34.08145, -39.85007); - mMap.getController().setZoom(3); - mMap.getController().setCenter(point); + Intent intent = getIntent(); + if (intent != null && intent.getExtras() != null) { + if (intent.hasExtra(GeoShapeWidget.SHAPE_LOCATION)) { + mClearButton.setEnabled(true); + data_loaded = true; + String s = intent.getStringExtra(GeoShapeWidget.SHAPE_LOCATION); + overlayIntentPolygon(s); + //zoomToCentroid(); + mLocationButton.setEnabled(true); + zoomtoBounds(); } - }, 100); + } else { + mMyLocationOverlay.runOnFirstFix(centerAroundFix); + mClearButton.setEnabled(false); + final Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + public void run() { + GeoPoint point = new GeoPoint(34.08145, -39.85007); + mMap.getController().setZoom(3); + mMap.getController().setCenter(point); + } + }, 100); - } + } - mMap.invalidate(); + mMap.invalidate(); - zoomDialogView = getLayoutInflater().inflate(R.layout.geoshape_zoom_dialog, null); + zoomDialogView = getLayoutInflater().inflate(R.layout.geoshape_zoom_dialog, null); - zoomLocationButton = (Button) zoomDialogView.findViewById(R.id.zoom_location); - zoomLocationButton.setOnClickListener(new View.OnClickListener() { + zoomLocationButton = (Button) zoomDialogView.findViewById(R.id.zoom_location); + zoomLocationButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - zoomToMyLocation(); - mMap.invalidate(); - zoomDialog.dismiss(); - } - }); + @Override + public void onClick(View v) { + zoomToMyLocation(); + mMap.invalidate(); + zoomDialog.dismiss(); + } + }); - zoomPointButton = (Button) zoomDialogView.findViewById(R.id.zoom_shape); - zoomPointButton.setOnClickListener(new View.OnClickListener() { + zoomPointButton = (Button) zoomDialogView.findViewById(R.id.zoom_shape); + zoomPointButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - //zoomToCentroid(); - zoomtoBounds(); - mMap.invalidate(); - zoomDialog.dismiss(); - } - }); + @Override + public void onClick(View v) { + //zoomToCentroid(); + zoomtoBounds(); + mMap.invalidate(); + zoomDialog.dismiss(); + } + }); + } else { + PlayServicesUtil.requestPlayServicesErrorDialog(GeoShapeOsmMapActivity.this); + } } @Override @@ -571,4 +577,12 @@ public void onCancel(DialogInterface dialog) { zoomDialog.show(); } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == PlayServicesUtil.PLAY_SERVICE_ERROR_REQUEST_CODE) { + finish(); + } + super.onActivityResult(requestCode, resultCode, data); + } + } diff --git a/collect_app/src/main/java/org/odk/collect/android/activities/GeoTraceGoogleMapActivity.java b/collect_app/src/main/java/org/odk/collect/android/activities/GeoTraceGoogleMapActivity.java index bbdc7c0cb09..8c241bf825e 100644 --- a/collect_app/src/main/java/org/odk/collect/android/activities/GeoTraceGoogleMapActivity.java +++ b/collect_app/src/main/java/org/odk/collect/android/activities/GeoTraceGoogleMapActivity.java @@ -55,6 +55,7 @@ import org.odk.collect.android.R; import org.odk.collect.android.application.Collect; import org.odk.collect.android.spatial.MapHelper; +import org.odk.collect.android.utilities.PlayServicesUtil; import org.odk.collect.android.widgets.GeoTraceWidget; import org.osmdroid.DefaultResourceProxyImpl; @@ -139,13 +140,18 @@ public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.geotrace_google_layout); - mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); - ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.gmap)).getMapAsync(new OnMapReadyCallback() { - @Override - public void onMapReady(GoogleMap googleMap) { - setupMap(googleMap); - } - }); + if (PlayServicesUtil.checkPlayServices(GeoTraceGoogleMapActivity.this)) { + + mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); + ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.gmap)).getMapAsync(new OnMapReadyCallback() { + @Override + public void onMapReady(GoogleMap googleMap) { + setupMap(googleMap); + } + }); + } else { + PlayServicesUtil.requestPlayServicesErrorDialog(GeoTraceGoogleMapActivity.this); + } } private void setupMap(GoogleMap googleMap) { @@ -839,5 +845,13 @@ public void onCancel(DialogInterface dialog) { zoomDialog.show(); } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == PlayServicesUtil.PLAY_SERVICE_ERROR_REQUEST_CODE) { + finish(); + } + super.onActivityResult(requestCode, resultCode, data); + } + } diff --git a/collect_app/src/main/java/org/odk/collect/android/activities/GeoTraceOsmMapActivity.java b/collect_app/src/main/java/org/odk/collect/android/activities/GeoTraceOsmMapActivity.java index a84a2acebbd..ee2d4d617bc 100644 --- a/collect_app/src/main/java/org/odk/collect/android/activities/GeoTraceOsmMapActivity.java +++ b/collect_app/src/main/java/org/odk/collect/android/activities/GeoTraceOsmMapActivity.java @@ -42,6 +42,7 @@ import org.odk.collect.android.R; import org.odk.collect.android.spatial.MapHelper; +import org.odk.collect.android.utilities.PlayServicesUtil; import org.odk.collect.android.widgets.GeoTraceWidget; import org.osmdroid.DefaultResourceProxyImpl; import org.osmdroid.bonuspack.overlays.Marker; @@ -116,224 +117,229 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.geotrace_osm_layout); setTitle(getString(R.string.geotrace_title)); // Setting title of the action sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); - resource_proxy = new DefaultResourceProxyImpl(getApplicationContext()); - mapView = (MapView) findViewById(R.id.geotrace_mapview); - mHelper = new MapHelper(this, mapView, GeoTraceOsmMapActivity.this); - mapView.setMultiTouchControls(true); - mapView.setBuiltInZoomControls(true); - mapView.getController().setZoom(zoom_level); - mMyLocationOverlay = new MyLocationNewOverlay(this, mapView); - - inflater = this.getLayoutInflater(); - traceSettingsView = inflater.inflate(R.layout.geotrace_dialog, null); - polygonPolylineView = inflater.inflate(R.layout.polygon_polyline_dialog, null); - time_delay = (Spinner) traceSettingsView.findViewById(R.id.trace_delay); - time_delay.setSelection(3); - time_units = (Spinner) traceSettingsView.findViewById(R.id.trace_scale); - mLayersButton = (Button) findViewById(R.id.layers); - mLayersButton.setOnClickListener(new View.OnClickListener() { + if (PlayServicesUtil.checkPlayServices(GeoTraceOsmMapActivity.this)) { - @Override - public void onClick(View v) { - mHelper.showLayersDialog(GeoTraceOsmMapActivity.this); + resource_proxy = new DefaultResourceProxyImpl(getApplicationContext()); + mapView = (MapView) findViewById(R.id.geotrace_mapview); + mHelper = new MapHelper(this, mapView, GeoTraceOsmMapActivity.this); + mapView.setMultiTouchControls(true); + mapView.setBuiltInZoomControls(true); + mapView.getController().setZoom(zoom_level); + mMyLocationOverlay = new MyLocationNewOverlay(this, mapView); - } - }); + inflater = this.getLayoutInflater(); + traceSettingsView = inflater.inflate(R.layout.geotrace_dialog, null); + polygonPolylineView = inflater.inflate(R.layout.polygon_polyline_dialog, null); + time_delay = (Spinner) traceSettingsView.findViewById(R.id.trace_delay); + time_delay.setSelection(3); + time_units = (Spinner) traceSettingsView.findViewById(R.id.trace_scale); + mLayersButton = (Button) findViewById(R.id.layers); + mLayersButton.setOnClickListener(new View.OnClickListener() { - mLocationButton = (Button) findViewById(R.id.show_location); - mLocationButton.setEnabled(false); - mLocationButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mHelper.showLayersDialog(GeoTraceOsmMapActivity.this); - @Override - public void onClick(View v) { - reset_trace_settings(); - showZoomDialog(); - } + } + }); - }); + mLocationButton = (Button) findViewById(R.id.show_location); + mLocationButton.setEnabled(false); + mLocationButton.setOnClickListener(new View.OnClickListener() { - mClearButton = (Button) findViewById(R.id.clear); - mClearButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + reset_trace_settings(); + showZoomDialog(); + } - @Override - public void onClick(View v) { - showClearDialog(); + }); - } + mClearButton = (Button) findViewById(R.id.clear); + mClearButton.setOnClickListener(new View.OnClickListener() { - }); + @Override + public void onClick(View v) { + showClearDialog(); - mSaveButton = (Button) findViewById(R.id.geotrace_save); - mSaveButton.setOnClickListener(new View.OnClickListener() { + } - @Override - public void onClick(View v) { + }); - if (map_markers.size() != 0) { - p_alert.show(); - } else { - saveGeoTrace(); - } - } - }); - if (map_markers == null || map_markers.size() == 0) { - mClearButton.setEnabled(false); - } - mManualCaptureButton = (Button) findViewById(R.id.manual_button); - mManualCaptureButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - addLocationMarker(); - } - }); - mPauseButton = (Button) findViewById(R.id.pause); - mPlayButton = (Button) findViewById(R.id.play); - mPlayButton.setEnabled(false); - beenPaused = false; - TRACE_MODE = 1; + mSaveButton = (Button) findViewById(R.id.geotrace_save); + mSaveButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { - mPlayButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(final View v) { - if (!play_check) { - if (!beenPaused) { - alert.show(); + if (map_markers.size() != 0) { + p_alert.show(); } else { - RadioGroup rb = (RadioGroup) traceSettingsView.findViewById( - R.id.radio_group); - int radioButtonID = rb.getCheckedRadioButtonId(); - View radioButton = rb.findViewById(radioButtonID); - int idx = rb.indexOfChild(radioButton); - TRACE_MODE = idx; - if (TRACE_MODE == 0) { - setupManualMode(); - } else if (TRACE_MODE == 1) { - setupAutomaticMode(); + saveGeoTrace(); + } + } + }); + if (map_markers == null || map_markers.size() == 0) { + mClearButton.setEnabled(false); + } + mManualCaptureButton = (Button) findViewById(R.id.manual_button); + mManualCaptureButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + addLocationMarker(); + } + }); + mPauseButton = (Button) findViewById(R.id.pause); + mPlayButton = (Button) findViewById(R.id.play); + mPlayButton.setEnabled(false); + beenPaused = false; + TRACE_MODE = 1; + + + mPlayButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(final View v) { + if (!play_check) { + if (!beenPaused) { + alert.show(); } else { - reset_trace_settings(); + RadioGroup rb = (RadioGroup) traceSettingsView.findViewById( + R.id.radio_group); + int radioButtonID = rb.getCheckedRadioButtonId(); + View radioButton = rb.findViewById(radioButtonID); + int idx = rb.indexOfChild(radioButton); + TRACE_MODE = idx; + if (TRACE_MODE == 0) { + setupManualMode(); + } else if (TRACE_MODE == 1) { + setupAutomaticMode(); + } else { + reset_trace_settings(); + } } + play_check = true; + } else { + play_check = false; + startGeoTrace(); + } + } + }); + + mPauseButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(final View v) { + mPlayButton.setVisibility(View.VISIBLE); + if (map_markers != null && map_markers.size() > 0) { + mClearButton.setEnabled(true); } + mPauseButton.setVisibility(View.GONE); + mManualCaptureButton.setVisibility(View.GONE); play_check = true; - } else { - play_check = false; - startGeoTrace(); + mode_active = false; + mMyLocationOverlay.disableFollowLocation(); + + try { + schedulerHandler.cancel(true); + } catch (Exception e) { + // Do nothing + } } - } - }); + }); - mPauseButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(final View v) { - mPlayButton.setVisibility(View.VISIBLE); - if (map_markers != null && map_markers.size() > 0) { + overlayMapLayerListner(); + buildDialogs(); + Intent intent = getIntent(); + if (intent != null && intent.getExtras() != null) { + if (intent.hasExtra(GeoTraceWidget.TRACE_LOCATION)) { + String s = intent.getStringExtra(GeoTraceWidget.TRACE_LOCATION); + mPlayButton.setEnabled(false); mClearButton.setEnabled(true); + overlayIntentTrace(s); + mLocationButton.setEnabled(true); + //zoomToCentroid(); + zoomtoBounds(); + } - mPauseButton.setVisibility(View.GONE); - mManualCaptureButton.setVisibility(View.GONE); - play_check = true; - mode_active = false; - mMyLocationOverlay.disableFollowLocation(); - - try { - schedulerHandler.cancel(true); - } catch (Exception e) { - // Do nothing - } + } else { + mMyLocationOverlay.runOnFirstFix(centerAroundFix); } - }); - overlayMapLayerListner(); - buildDialogs(); - Intent intent = getIntent(); - if (intent != null && intent.getExtras() != null) { - if (intent.hasExtra(GeoTraceWidget.TRACE_LOCATION)) { - String s = intent.getStringExtra(GeoTraceWidget.TRACE_LOCATION); - mPlayButton.setEnabled(false); - mClearButton.setEnabled(true); - overlayIntentTrace(s); - mLocationButton.setEnabled(true); - //zoomToCentroid(); - zoomtoBounds(); - } - } else { - mMyLocationOverlay.runOnFirstFix(centerAroundFix); - } + mPolygonSaveButton = (Button) polygonPolylineView.findViewById(R.id.polygon_save); + mPolygonSaveButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (map_markers.size() > 2) { + createPolygon(); + p_alert.dismiss(); + saveGeoTrace(); + } else { + p_alert.dismiss(); + showPolyonErrorDialog(); + } - mPolygonSaveButton = (Button) polygonPolylineView.findViewById(R.id.polygon_save); - mPolygonSaveButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (map_markers.size() > 2) { - createPolygon(); - p_alert.dismiss(); - saveGeoTrace(); - } else { - p_alert.dismiss(); - showPolyonErrorDialog(); } + }); + mPolylineSaveButton = (Button) polygonPolylineView.findViewById(R.id.polyline_save); + mPolylineSaveButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + p_alert.dismiss(); + saveGeoTrace(); - } - }); - mPolylineSaveButton = (Button) polygonPolylineView.findViewById(R.id.polyline_save); - mPolylineSaveButton.setOnClickListener(new View.OnClickListener() { + } + }); - @Override - public void onClick(View v) { - p_alert.dismiss(); - saveGeoTrace(); + zoomDialogView = getLayoutInflater().inflate(R.layout.geoshape_zoom_dialog, null); - } - }); + zoomLocationButton = (Button) zoomDialogView.findViewById(R.id.zoom_location); + zoomLocationButton.setOnClickListener(new View.OnClickListener() { - zoomDialogView = getLayoutInflater().inflate(R.layout.geoshape_zoom_dialog, null); + @Override + public void onClick(View v) { + zoomToMyLocation(); + mapView.invalidate(); + zoomDialog.dismiss(); + } + }); - zoomLocationButton = (Button) zoomDialogView.findViewById(R.id.zoom_location); - zoomLocationButton.setOnClickListener(new View.OnClickListener() { + zoomPointButton = (Button) zoomDialogView.findViewById(R.id.zoom_shape); + zoomPointButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - zoomToMyLocation(); - mapView.invalidate(); - zoomDialog.dismiss(); - } - }); + @Override + public void onClick(View v) { + //zoomToCentroid(); + zoomtoBounds(); + mapView.invalidate(); + zoomDialog.dismiss(); + } + }); - zoomPointButton = (Button) zoomDialogView.findViewById(R.id.zoom_shape); - zoomPointButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - //zoomToCentroid(); - zoomtoBounds(); - mapView.invalidate(); - zoomDialog.dismiss(); + mapView.invalidate(); + mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); + List providers = mLocationManager.getProviders(true); + for (String provider : providers) { + if (provider.equalsIgnoreCase(LocationManager.GPS_PROVIDER)) { + mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); + mGPSOn = true; + } + if (provider.equalsIgnoreCase(LocationManager.NETWORK_PROVIDER)) { + mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); + mNetworkOn = true; + } } - }); - - - mapView.invalidate(); - mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); - List providers = mLocationManager.getProviders(true); - for (String provider : providers) { - if (provider.equalsIgnoreCase(LocationManager.GPS_PROVIDER)) { - mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); - mGPSOn = true; + if (mGPSOn) { + mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); } - if (provider.equalsIgnoreCase(LocationManager.NETWORK_PROVIDER)) { - mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); - mNetworkOn = true; + if (mNetworkOn) { + mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); } - } - if (mGPSOn) { - mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); - } - if (mNetworkOn) { - mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); + } else { + PlayServicesUtil.requestPlayServicesErrorDialog(GeoTraceOsmMapActivity.this); } } @@ -897,4 +903,12 @@ public void onProviderEnabled(String provider) { public void onProviderDisabled(String provider) { } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == PlayServicesUtil.PLAY_SERVICE_ERROR_REQUEST_CODE) { + finish(); + } + super.onActivityResult(requestCode, resultCode, data); + } } \ No newline at end of file diff --git a/collect_app/src/main/java/org/odk/collect/android/utilities/PlayServicesUtil.java b/collect_app/src/main/java/org/odk/collect/android/utilities/PlayServicesUtil.java new file mode 100644 index 00000000000..d40c774ad7b --- /dev/null +++ b/collect_app/src/main/java/org/odk/collect/android/utilities/PlayServicesUtil.java @@ -0,0 +1,34 @@ +package org.odk.collect.android.utilities; + +import android.app.Activity; +import android.content.Context; + +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.GoogleApiAvailability; + +/** + * Created by Divya on 3/2/2017. + */ + +public class PlayServicesUtil { + + public static int PLAY_SERVICE_ERROR_REQUEST_CODE = 1001; + + private static GoogleApiAvailability googleApiAvailability; + private static int resultCode; + + public static boolean checkPlayServices(Context context) { + googleApiAvailability = GoogleApiAvailability.getInstance(); + resultCode = googleApiAvailability.isGooglePlayServicesAvailable(context); + return resultCode == ConnectionResult.SUCCESS; + } + + public static void requestPlayServicesErrorDialog(Context context) { + if (googleApiAvailability.isUserResolvableError(resultCode)) { + googleApiAvailability.getErrorDialog((Activity) context, resultCode, PLAY_SERVICE_ERROR_REQUEST_CODE) + .show(); + } else { + ((Activity) context).finish(); + } + } +}