diff --git a/app/build.gradle b/app/build.gradle index 684ad65df..6d8c90e80 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -44,7 +44,7 @@ dependencies { implementation 'com.mapbox.mapboxsdk:mapbox-android-telemetry:7.0.0' implementation 'com.github.deano2390:MaterialShowcaseView:1.2.0' implementation 'com.dinuscxj:circleprogressbar:1.1.1' - implementation 'com.karumi:dexter:5.0.0' + implementation 'com.karumi:dexter:6.2.3' implementation "com.jakewharton:butterknife:$BUTTERKNIFE_VERSION" implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' diff --git a/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapFragment.java b/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapFragment.java index 83a2d14dd..b2145d59a 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapFragment.java @@ -31,6 +31,7 @@ import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.AppCompatTextView; import butterknife.BindView; import butterknife.ButterKnife; @@ -110,6 +111,7 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment private Marker currentLocationMarker; private Polygon currentLocationPolygon; IntentFilter intentFilter = new IntentFilter(MapUtils.NETWORK_INTENT_ACTION); + private AlertDialog locationDialog; @Inject LiveDataConverter liveDataConverter; @@ -400,9 +402,27 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment @Override public void checkPermissionsAndPerformAction() { Timber.d("Checking permission and perfoming action"); + if (PermissionUtils.hasPermission(getActivity(), + Manifest.permission.ACCESS_FINE_LOCATION)) { + Timber.d("Permission granted"); + getPermissions(); + } else { + if (locationDialog == null) { + locationDialog = new AlertDialog.Builder(requireActivity()) + .setTitle(R.string.location_permission_title) + .setMessage(R.string.location_permission_rationale_nearby) + .setPositiveButton(R.string.ok, (dialog, which) -> { + dialog.dismiss(); + getPermissions(); + }).show(); + } + } + } + + private void getPermissions() { PermissionUtils.checkPermissionsAndPerformAction(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION, - () -> locationPermissionGranted(), + this::locationPermissionGranted, () -> isPermissionDenied = true, R.string.location_permission_title, R.string.location_permission_rationale_nearby); 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 6fd89a989..b30e0f349 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 @@ -241,6 +241,7 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment private PlaceAdapter adapter; private NearbyParentFragmentInstanceReadyCallback nearbyParentFragmentInstanceReadyCallback; private boolean isAdvancedQueryFragmentVisible = false; + private AlertDialog locationDialog; /** * Holds filtered markers that are to be shown @@ -438,8 +439,7 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment private void performMapReadyActions() { if (((MainActivity)getActivity()).activeFragment == ActiveFragment.NEARBY && isMapBoxReady) { - if(!applicationKvStore.getBoolean("doNotAskForLocationPermission", false) || - PermissionUtils.hasPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)){ + if(!applicationKvStore.getBoolean("doNotAskForLocationPermission", false)){ checkPermissionsAndPerformAction(); }else{ isPermissionDenied = true; @@ -1212,12 +1212,30 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment @Override public void checkPermissionsAndPerformAction() { Timber.d("Checking permission and perfoming action"); + if (PermissionUtils.hasPermission(getActivity(), + Manifest.permission.ACCESS_FINE_LOCATION)) { + Timber.d("Permission granted"); + getPermissions(); + } else { + if (locationDialog == null) { + locationDialog = new AlertDialog.Builder(requireActivity()) + .setTitle(R.string.location_permission_title) + .setMessage(R.string.location_permission_rationale_nearby) + .setPositiveButton(R.string.ok, (dialog, which) -> { + dialog.dismiss(); + getPermissions(); + }).show(); + } + } + } + + private void getPermissions() { PermissionUtils.checkPermissionsAndPerformAction(getActivity(), - Manifest.permission.ACCESS_FINE_LOCATION, - () -> locationPermissionGranted(), - () -> isPermissionDenied = true, - R.string.location_permission_title, - R.string.location_permission_rationale_nearby); + Manifest.permission.ACCESS_FINE_LOCATION, + this::locationPermissionGranted, + () -> isPermissionDenied = true, + R.string.location_permission_title, + R.string.location_permission_rationale_nearby); } /** diff --git a/app/src/main/java/fr/free/nrw/commons/utils/PermissionUtils.java b/app/src/main/java/fr/free/nrw/commons/utils/PermissionUtils.java index 1b22fcfc0..8e186cbe0 100644 --- a/app/src/main/java/fr/free/nrw/commons/utils/PermissionUtils.java +++ b/app/src/main/java/fr/free/nrw/commons/utils/PermissionUtils.java @@ -130,18 +130,7 @@ public class PermissionUtils { @Override public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) { - if (rationaleTitle == -1 && rationaleMessage == -1) { - token.continuePermissionRequest(); - return; - } - DialogUtil.showAlertDialog(activity, activity.getString(rationaleTitle), - activity.getString(rationaleMessage), - activity.getString(android.R.string.ok), - activity.getString(android.R.string.cancel), - token::continuePermissionRequest, - token::cancelPermissionRequest, - null, - false); + token.continuePermissionRequest(); } }) .check(); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8b165000d..394d31f23 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -254,7 +254,8 @@ Copy the wikitext to the clipboard The wikitext was copied to the clipboard Nearby might not work properly, Location not available. - Permission required to display a list of nearby places + The Commons app collects location data to + display nearby places that need photos, even when the app is in the background. Directions Wikidata