Skip to content

Commit 630c2a5

Browse files
authored
#3732 - Nearby Tab Accessible Without Location Permission (#4259)
* Added ability to access nearby tab without location permissions * added ability to remember user choice if the permission is denied. * fixed the issue with permission dialog box in contribution tab. * changed name for stored variables * minor change Co-authored-by: Pratham2305 <Pratham2305@users.noreply.github.com>
1 parent ba000eb commit 630c2a5

File tree

4 files changed

+90
-36
lines changed

4 files changed

+90
-36
lines changed

app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java

+2
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,7 @@ private void checkPermissionsAndShowNearbyCardView() {
454454
onLocationPermissionGranted();
455455
} else if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)
456456
&& store.getBoolean("displayLocationPermissionForCardView", true)
457+
&& !store.getBoolean("doNotAskForLocationPermission", false)
457458
&& (((MainActivity) getActivity()).activeFragment == ActiveFragment.CONTRIBUTIONS)) {
458459
nearbyNotificationCardView.permissionType = NearbyNotificationCardView.PermissionType.ENABLE_LOCATION_PERMISSION;
459460
showNearbyCardPermissionRationale();
@@ -486,6 +487,7 @@ private void showNearbyCardPermissionRationale() {
486487

487488
private void displayYouWontSeeNearbyMessage() {
488489
ViewUtil.showLongToast(getActivity(), getResources().getString(R.string.unable_to_display_nearest_place));
490+
store.putBoolean("doNotAskForLocationPermission", true);
489491
}
490492

491493

app/src/main/java/fr/free/nrw/commons/nearby/contract/NearbyParentFragmentContract.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ interface View {
2222
void listOptionMenuItemClicked();
2323
void populatePlaces(LatLng curlatLng);
2424
boolean isListBottomSheetExpanded();
25-
void checkPermissionsAndPerformAction(Runnable runnable);
25+
void checkPermissionsAndPerformAction();
2626
void displayLoginSkippedWarning();
2727
void setFABPlusAction(android.view.View.OnClickListener onClickListener);
2828
void setFABRecenterAction(android.view.View.OnClickListener onClickListener);

app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java

+83-34
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
191191
private Animation rotate_forward;
192192

193193
private static final float ZOOM_LEVEL = 14f;
194+
private static final float ZOOM_OUT = 0f;
194195
private final String NETWORK_INTENT_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
195196
private BroadcastReceiver broadcastReceiver;
196197
private boolean isNetworkErrorOccurred;
@@ -206,6 +207,8 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
206207
private final double CAMERA_TARGET_SHIFT_FACTOR_LANDSCAPE = 0.004;
207208

208209
private boolean isMapBoxReady;
210+
private boolean isPermissionDenied;
211+
private boolean recenterToUserLocation;
209212
private MapboxMap mapBox;
210213
IntentFilter intentFilter = new IntentFilter(NETWORK_INTENT_ACTION);
211214
private Marker currentLocationMarker;
@@ -259,6 +262,8 @@ public void onViewCreated(@NonNull final View view, @Nullable final Bundle saved
259262
cameraMoveListener= () -> presenter.onCameraMove(mapBox.getCameraPosition().target);
260263
addCheckBoxCallback();
261264
presenter.attachView(this);
265+
isPermissionDenied = false;
266+
recenterToUserLocation = false;
262267
initRvNearbyList();
263268
initThemePreferences();
264269
mapView.onCreate(savedInstanceState);
@@ -281,7 +286,7 @@ public void onViewCreated(@NonNull final View view, @Nullable final Bundle saved
281286
performMapReadyActions();
282287
final CameraPosition cameraPosition = new CameraPosition.Builder()
283288
.target(new LatLng(51.50550, -0.07520))
284-
.zoom(ZOOM_LEVEL)
289+
.zoom(ZOOM_OUT)
285290
.build();
286291
mapBoxMap.setCameraPosition(cameraPosition);
287292

@@ -342,32 +347,43 @@ private void addCheckBoxCallback() {
342347

343348
private void performMapReadyActions() {
344349
if (((MainActivity)getActivity()).activeFragment == ActiveFragment.NEARBY && isMapBoxReady) {
345-
checkPermissionsAndPerformAction(() -> {
346-
lastKnownLocation = locationManager.getLastLocation();
347-
fr.free.nrw.commons.location.LatLng target=lastFocusLocation;
348-
if(null==lastFocusLocation){
349-
target=lastKnownLocation;
350-
}
351-
if (lastKnownLocation != null) {
352-
final CameraPosition position = new CameraPosition.Builder()
353-
.target(LocationUtils.commonsLatLngToMapBoxLatLng(target)) // Sets the new camera position
354-
.zoom(ZOOM_LEVEL) // Same zoom level
355-
.build();
356-
mapBox.moveCamera(CameraUpdateFactory.newCameraPosition(position));
357-
}
358-
else if(locationManager.isGPSProviderEnabled()||locationManager.isNetworkProviderEnabled()){
359-
locationManager.requestLocationUpdatesFromProvider(LocationManager.NETWORK_PROVIDER);
360-
locationManager.requestLocationUpdatesFromProvider(LocationManager.GPS_PROVIDER);
361-
setProgressBarVisibility(true);
362-
}
363-
else {
364-
Toast.makeText(getContext(), getString(R.string.nearby_location_not_available), Toast.LENGTH_LONG).show();
365-
}
366-
presenter.onMapReady();
367-
registerUnregisterLocationListener(false);
350+
if(!applicationKvStore.getBoolean("doNotAskForLocationPermission", false) ||
351+
PermissionUtils.hasPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)){
352+
checkPermissionsAndPerformAction();
353+
}else{
354+
isPermissionDenied = true;
368355
addOnCameraMoveListener();
369-
});
356+
}
357+
}
358+
}
359+
360+
private void locationPermissionGranted() {
361+
isPermissionDenied = false;
362+
363+
applicationKvStore.putBoolean("doNotAskForLocationPermission", false);
364+
lastKnownLocation = locationManager.getLastLocation();
365+
fr.free.nrw.commons.location.LatLng target=lastFocusLocation;
366+
if(null==lastFocusLocation){
367+
target=lastKnownLocation;
368+
}
369+
if (lastKnownLocation != null) {
370+
final CameraPosition position = new CameraPosition.Builder()
371+
.target(LocationUtils.commonsLatLngToMapBoxLatLng(target)) // Sets the new camera position
372+
.zoom(ZOOM_LEVEL) // Same zoom level
373+
.build();
374+
mapBox.moveCamera(CameraUpdateFactory.newCameraPosition(position));
370375
}
376+
else if(locationManager.isGPSProviderEnabled()||locationManager.isNetworkProviderEnabled()){
377+
locationManager.requestLocationUpdatesFromProvider(LocationManager.NETWORK_PROVIDER);
378+
locationManager.requestLocationUpdatesFromProvider(LocationManager.GPS_PROVIDER);
379+
setProgressBarVisibility(true);
380+
}
381+
else {
382+
Toast.makeText(getContext(), getString(R.string.nearby_location_not_available), Toast.LENGTH_LONG).show();
383+
}
384+
presenter.onMapReady();
385+
registerUnregisterLocationListener(false);
386+
addOnCameraMoveListener();
371387
}
372388

373389
@Override
@@ -377,8 +393,29 @@ public void onResume() {
377393
presenter.attachView(this);
378394
registerNetworkReceiver();
379395
if (isResumed() && ((MainActivity)getActivity()).activeFragment == ActiveFragment.NEARBY) {
380-
startTheMap();
396+
if(!isPermissionDenied && !applicationKvStore.getBoolean("doNotAskForLocationPermission", false)){
397+
startTheMap();
398+
}else{
399+
startMapWithoutPermission();
400+
}
401+
}
402+
}
403+
404+
private void startMapWithoutPermission() {
405+
mapView.onStart();
406+
407+
applicationKvStore.putBoolean("doNotAskForLocationPermission", true);
408+
lastKnownLocation = new fr.free.nrw.commons.location.LatLng(51.50550,-0.07520,1f);
409+
final CameraPosition position = new CameraPosition.Builder()
410+
.target(LocationUtils.commonsLatLngToMapBoxLatLng(lastKnownLocation))
411+
.zoom(ZOOM_OUT)
412+
.build();
413+
if(mapBox != null){
414+
mapBox.moveCamera(CameraUpdateFactory.newCameraPosition(position));
415+
addOnCameraMoveListener();
381416
}
417+
presenter.onMapReady();
418+
removeCurrentLocationMarker();
382419
}
383420

384421
private void registerNetworkReceiver() {
@@ -795,11 +832,14 @@ public void listOptionMenuItemClicked() {
795832

796833
@Override
797834
public void populatePlaces(final fr.free.nrw.commons.location.LatLng curlatLng) {
798-
if (curlatLng.equals(lastFocusLocation)|| lastFocusLocation==null) { // Means we are checking around current location
835+
if (curlatLng.equals(lastFocusLocation) || lastFocusLocation == null || recenterToUserLocation) { // Means we are checking around current location
799836
populatePlacesForCurrentLocation(lastKnownLocation, curlatLng);
800837
} else {
801838
populatePlacesForAnotherLocation(lastKnownLocation, curlatLng);
802839
}
840+
if(recenterToUserLocation) {
841+
recenterToUserLocation = false;
842+
}
803843
}
804844

805845
private void populatePlacesForCurrentLocation(final fr.free.nrw.commons.location.LatLng curlatLng,
@@ -918,12 +958,12 @@ public void setTabItemContributions() {
918958
}
919959

920960
@Override
921-
public void checkPermissionsAndPerformAction(final Runnable runnable) {
961+
public void checkPermissionsAndPerformAction() {
922962
Timber.d("Checking permission and perfoming action");
923963
PermissionUtils.checkPermissionsAndPerformAction(getActivity(),
924964
Manifest.permission.ACCESS_FINE_LOCATION,
925-
runnable,
926-
() -> ((MainActivity) getActivity()).setSelectedItemId(NavTab.CONTRIBUTIONS.code()),
965+
() -> locationPermissionGranted(),
966+
() -> isPermissionDenied = true,
927967
R.string.location_permission_title,
928968
R.string.location_permission_rationale_nearby);
929969
}
@@ -1095,7 +1135,7 @@ public void enableFABRecenter() {
10951135
*/
10961136
@Override
10971137
public void addCurrentLocationMarker(final fr.free.nrw.commons.location.LatLng curLatLng) {
1098-
if (null != curLatLng) {
1138+
if (null != curLatLng && !isPermissionDenied) {
10991139
ExecutorUtils.get().submit(() -> {
11001140
mapView.post(() -> removeCurrentLocationMarker());
11011141
Timber.d("Adds current location marker");
@@ -1141,8 +1181,15 @@ private void removeCurrentLocationMarker() {
11411181
@Override
11421182
public void updateMapToTrackPosition(final fr.free.nrw.commons.location.LatLng curLatLng) {
11431183
Timber.d("Updates map camera to track user position");
1144-
final CameraPosition cameraPosition = new CameraPosition.Builder().target
1184+
final CameraPosition cameraPosition;
1185+
if(isPermissionDenied){
1186+
cameraPosition = new CameraPosition.Builder().target
11451187
(LocationUtils.commonsLatLngToMapBoxLatLng(curLatLng)).build();
1188+
}else{
1189+
cameraPosition = new CameraPosition.Builder().target
1190+
(LocationUtils.commonsLatLngToMapBoxLatLng(curLatLng))
1191+
.zoom(ZOOM_LEVEL).build();
1192+
}
11461193
if(null!=mapBox) {
11471194
mapBox.setCameraPosition(cameraPosition);
11481195
mapBox.animateCamera(CameraUpdateFactory
@@ -1326,8 +1373,10 @@ private void setMapMarkerActions(final Marker selectedMarker) {
13261373

13271374
@Override
13281375
public void recenterMap(final fr.free.nrw.commons.location.LatLng curLatLng) {
1329-
if (curLatLng == null) {
1330-
if (!(locationManager.isNetworkProviderEnabled() || locationManager.isGPSProviderEnabled())) {
1376+
if (isPermissionDenied || curLatLng == null) {
1377+
recenterToUserLocation = true;
1378+
checkPermissionsAndPerformAction();
1379+
if (!isPermissionDenied && !(locationManager.isNetworkProviderEnabled() || locationManager.isGPSProviderEnabled())) {
13311380
showLocationOffDialog();
13321381
}
13331382
return;

app/src/main/java/fr/free/nrw/commons/utils/PermissionUtils.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,10 @@ public void onPermissionRationaleShouldBeShown(PermissionRequest permission,
138138
activity.getString(rationaleMessage),
139139
activity.getString(android.R.string.ok),
140140
activity.getString(android.R.string.cancel),
141-
token::continuePermissionRequest, token::cancelPermissionRequest);
141+
token::continuePermissionRequest,
142+
token::cancelPermissionRequest,
143+
null,
144+
false);
142145
}
143146
})
144147
.check();

0 commit comments

Comments
 (0)