From 8222c4a42c7a03acb7291d17c7d727adb969f77f Mon Sep 17 00:00:00 2001 From: Shashwat Kedia <142137555+ShashwatKedia@users.noreply.github.com> Date: Sat, 27 Jan 2024 19:17:36 +0530 Subject: [PATCH] Resolves Issue #5413 Crash when opening Nearby when location permission hasn't been granted yet (#5418) * Resolves Issue #5413 * Added Javadoc and formatted code --- .../fragments/NearbyParentFragment.java | 79 +++++++++++-------- 1 file changed, 44 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java index 014c1fe18..d0c8e119c 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java @@ -304,37 +304,28 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment } }); - private ActivityResultLauncher locationPermissionLauncher = registerForActivityResult( - new ActivityResultContracts.RequestMultiplePermissions(), - new ActivityResultCallback>() { - @Override - public void onActivityResult(Map result) { - boolean areAllGranted = true; - for (final boolean b : result.values()) { - areAllGranted = areAllGranted && b; - } - - if (areAllGranted) { - locationPermissionGranted(); + private ActivityResultLauncher locationPermissionLauncher = registerForActivityResult( + new ActivityResultContracts.RequestPermission(), isGranted -> { + if (isGranted) { + locationPermissionGranted(); + } else { + if (shouldShowRequestPermissionRationale(permission.ACCESS_FINE_LOCATION)) { + DialogUtil.showAlertDialog(getActivity(), + getActivity().getString(R.string.location_permission_title), + getActivity().getString(R.string.location_permission_rationale_nearby), + getActivity().getString(android.R.string.ok), + getActivity().getString(android.R.string.cancel), + () -> { + if (!(locationManager.isNetworkProviderEnabled() + || locationManager.isGPSProviderEnabled())) { + showLocationOffDialog(); + } + }, + () -> isPermissionDenied = true, + null, + false); } else { - if (shouldShowRequestPermissionRationale(permission.ACCESS_FINE_LOCATION)) { - DialogUtil.showAlertDialog(getActivity(), - getActivity().getString(R.string.location_permission_title), - getActivity().getString(R.string.location_permission_rationale_nearby), - getActivity().getString(android.R.string.ok), - getActivity().getString(android.R.string.cancel), - () -> { - if (!(locationManager.isNetworkProviderEnabled() - || locationManager.isGPSProviderEnabled())) { - showLocationOffDialog(); - } - }, - () -> isPermissionDenied = true, - null, - false); - } else { - isPermissionDenied = true; - } + isPermissionDenied = true; } } }); @@ -1037,10 +1028,28 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment return latLng; } + /** + * Computes location where map should be centered + * + * @return returns the last location, if available, else returns default location + */ @Override public fr.free.nrw.commons.location.LatLng getMapCenter() { - fr.free.nrw.commons.location.LatLng latLnge = new fr.free.nrw.commons.location.LatLng( - mapCenter.getLatitude(), mapCenter.getLongitude(), 100); + if (applicationKvStore.getString("LastLocation") != null) { + final String[] locationLatLng + = applicationKvStore.getString("LastLocation").split(","); + lastKnownLocation + = new fr.free.nrw.commons.location.LatLng(Double.parseDouble(locationLatLng[0]), + Double.parseDouble(locationLatLng[1]), 1f); + } else { + lastKnownLocation = new fr.free.nrw.commons.location.LatLng(51.50550, + -0.07520, 1f); + } + fr.free.nrw.commons.location.LatLng latLnge = lastKnownLocation; + if (mapCenter != null) { + latLnge = new fr.free.nrw.commons.location.LatLng( + mapCenter.getLatitude(), mapCenter.getLongitude(), 100); + } return latLnge; } @@ -1320,7 +1329,7 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment @Override public void checkPermissionsAndPerformAction() { Timber.d("Checking permission and perfoming action"); - locationPermissionLauncher.launch(new String[]{permission.ACCESS_FINE_LOCATION}); + locationPermissionLauncher.launch(permission.ACCESS_FINE_LOCATION); } /** @@ -1625,7 +1634,7 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment */ public void updateMarker(final boolean isBookmarked, final Place place, @Nullable final fr.free.nrw.commons.location.LatLng curLatLng) { - addMarkerToMap(place, isBookmarked); + addMarkerToMap(place, isBookmarked); } /** @@ -1770,7 +1779,7 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment mapView.invalidate(); break; } - } + } } }