From 4caa8a509b8861296d954c942defdb7675295fa6 Mon Sep 17 00:00:00 2001 From: Ritika Pahwa <83745993+RitikaPahwa4444@users.noreply.github.com> Date: Sun, 24 Sep 2023 06:01:57 +0530 Subject: [PATCH] 5195: Fix crash on setting location for pictures with no EXIF location (#5205) * LocationPickerActivity: fix crash on setting location for pictures with no EXIF location * strings.xml: remove extra string introduced * optimise constants * LocationPickerActivity: request for permission only on tapping target icon * remove newline * handle location permissions using LocationPermissionsHelper --- .../LocationPickerActivity.java | 42 +++++++++++++++++-- .../contributions/ContributionController.java | 7 +++- .../location/LocationPermissionsHelper.java | 20 +++------ .../commons/settings/SettingsFragment.java | 2 +- app/src/main/res/values/strings.xml | 2 + 5 files changed, 53 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/LocationPicker/LocationPickerActivity.java b/app/src/main/java/fr/free/nrw/commons/LocationPicker/LocationPickerActivity.java index c99c94f75..f796126a3 100644 --- a/app/src/main/java/fr/free/nrw/commons/LocationPicker/LocationPickerActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/LocationPicker/LocationPickerActivity.java @@ -57,6 +57,10 @@ import fr.free.nrw.commons.MapStyle; import fr.free.nrw.commons.R; import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.kvstore.JsonKvStore; +import fr.free.nrw.commons.location.LocationPermissionsHelper; +import fr.free.nrw.commons.location.LocationPermissionsHelper.Dialog; +import fr.free.nrw.commons.location.LocationPermissionsHelper.LocationPermissionCallback; +import fr.free.nrw.commons.location.LocationServiceManager; import fr.free.nrw.commons.theme.BaseActivity; import fr.free.nrw.commons.utils.SystemThemeUtils; import javax.inject.Inject; @@ -148,6 +152,9 @@ public class LocationPickerActivity extends BaseActivity implements OnMapReadyCa SystemThemeUtils systemThemeUtils; private boolean isDarkTheme; + @Inject + LocationServiceManager locationManager; + @Override protected void onCreate(@Nullable final Bundle savedInstanceState) { getWindow().requestFeature(Window.FEATURE_ACTION_BAR); @@ -452,11 +459,40 @@ public class LocationPickerActivity extends BaseActivity implements OnMapReadyCa fabCenterOnLocation = findViewById(R.id.center_on_gps); fabCenterOnLocation.setOnClickListener(view -> getCenter()); } + /** - * Animate map to move to desired Latitude and Longitude + * Center the map at user's current location */ - void getCenter() { - mapboxMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(),location.getLongitude()),15.0)); + private void getCenter() { + LocationPermissionsHelper.Dialog locationAccessDialog = new Dialog( + R.string.location_permission_title, + R.string.upload_map_location_access + ); + + LocationPermissionsHelper.Dialog locationOffDialog = new Dialog( + R.string.ask_to_turn_location_on, + R.string.upload_map_location_access + ); + LocationPermissionsHelper locationPermissionsHelper = new LocationPermissionsHelper( + this, locationManager, new LocationPermissionCallback() { + @Override + public void onLocationPermissionDenied(String toastMessage) { + // Do nothing + } + + @Override + public void onLocationPermissionGranted() { + fr.free.nrw.commons.location.LatLng currLocation = locationManager.getLastLocation(); + final CameraPosition position; + position = new CameraPosition.Builder() + .target(new com.mapbox.mapboxsdk.geometry.LatLng(currLocation.getLatitude(), currLocation.getLongitude(), 0)) // Sets the new camera position + .zoom(mapboxMap.getCameraPosition().zoom) // Same zoom level + .build(); + + mapboxMap.animateCamera(CameraUpdateFactory.newCameraPosition(position), 1000); + } + }); + locationPermissionsHelper.handleLocationPermissions(locationAccessDialog, locationOffDialog); } @Override diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.java index f23a148ca..567293b81 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionController.java @@ -90,7 +90,12 @@ public class ContributionController { activity, locationManager, new LocationPermissionCallback() { @Override - public void onLocationPermissionDenied() { + public void onLocationPermissionDenied(String toastMessage) { + Toast.makeText( + activity, + toastMessage, + Toast.LENGTH_LONG + ).show(); initiateCameraUpload(activity); } diff --git a/app/src/main/java/fr/free/nrw/commons/location/LocationPermissionsHelper.java b/app/src/main/java/fr/free/nrw/commons/location/LocationPermissionsHelper.java index a2055c286..9760f5d41 100644 --- a/app/src/main/java/fr/free/nrw/commons/location/LocationPermissionsHelper.java +++ b/app/src/main/java/fr/free/nrw/commons/location/LocationPermissionsHelper.java @@ -68,12 +68,8 @@ public class LocationPermissionsHelper { }, () -> { if (callback != null) { - Toast.makeText( - activity, - R.string.in_app_camera_location_permission_denied, - Toast.LENGTH_LONG - ).show(); - callback.onLocationPermissionDenied(); + callback.onLocationPermissionDenied(activity.getString( + R.string.in_app_camera_location_permission_denied)); } }, locationAccessDialog.dialogTitleResource, @@ -102,14 +98,8 @@ public class LocationPermissionsHelper { activity.getString(R.string.title_app_shortcut_setting), activity.getString(R.string.cancel), () -> openLocationSettings(), - () -> { - Toast.makeText( - activity, - R.string.in_app_camera_location_unavailable, - Toast.LENGTH_LONG - ).show(); - callback.onLocationPermissionDenied(); - }); + () -> callback.onLocationPermissionDenied(activity.getString( + R.string.in_app_camera_location_unavailable))); } /** @@ -131,7 +121,7 @@ public class LocationPermissionsHelper { * Handle onPermissionDenied within individual classes based on the requirements */ public interface LocationPermissionCallback { - void onLocationPermissionDenied(); + void onLocationPermissionDenied(String toastMessage); void onLocationPermissionGranted(); } } diff --git a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java index 2efedbd0c..a67054541 100644 --- a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java @@ -218,7 +218,7 @@ public class SettingsFragment extends PreferenceFragmentCompat { LocationPermissionsHelper locationPermissionsHelper = new LocationPermissionsHelper( activity, locationManager, new LocationPermissionCallback() { @Override - public void onLocationPermissionDenied() { + public void onLocationPermissionDenied(String toastMessage) { // dismiss the dialog } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9cef1c77d..9432c788c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -280,6 +280,7 @@ Copy the wikitext to the clipboard The wikitext was copied to the clipboard Nearby might not work properly, Location not available. + Location access denied. Please set your location manually to use this feature. Permission required to display a list of nearby places Directions @@ -621,6 +622,7 @@ Upload your first media by tapping on the add button. For best results, choose the High Accuracy mode. Turn on location? Nearby needs location enabled to work properly + You need to give access to your current location to set location automatically. Did you shoot these two pictures at the same place? Do you want to use the latitude/longitude of the picture on the right? Load More No places found, try changing your search criteria.