Fixes #2888: Use Dexter for requesting location permissions (#2925)

* Use dexter to ask for location permissions

* Addressed code review comments
This commit is contained in:
Vivek Maskara 2019-06-08 11:15:30 +05:30 committed by neslihanturan
parent 6f9d69e63c
commit 8971743479
6 changed files with 95 additions and 375 deletions

View file

@ -1,19 +1,12 @@
package fr.free.nrw.commons.location;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@ -44,78 +37,6 @@ public class LocationServiceManager implements LocationListener {
this.locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
}
/**
* Returns the current status of the location provider.
*
* @return true if the location provider is enabled
*/
public boolean isProviderEnabled() {
return (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER));
}
/**
* Returns whether the location permission is granted.
* @return true if the location permission is granted
*/
public boolean isLocationPermissionGranted(@NonNull Context context) {
return ContextCompat.checkSelfPermission(context,
Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
}
/**
* Requests the location permission to be granted.
*
* @param activity the activity
*/
public void requestPermissions(Activity activity) {
if (activity.isFinishing()) {
return;
}
ActivityCompat.requestPermissions(activity,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
LOCATION_REQUEST);
}
/**
* The permission explanation dialog box is now displayed just once for a particular activity. We are subscribing
* to updates from multiple providers so its important to show the dialog just once. Otherwise it will be displayed
* once for every provider, which in our case currently is 2.
* @param activity
* @return
*/
public boolean isPermissionExplanationRequired(Activity activity) {
if (activity.isFinishing()) {
return false;
}
boolean showRequestPermissionRationale = ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.ACCESS_FINE_LOCATION);
if (showRequestPermissionRationale && !locationExplanationDisplayed.contains(activity)) {
locationExplanationDisplayed.add(activity);
return true;
}
return false;
}
/**
* Gets the last known location in cases where there wasn't time to register a listener
* (e.g. when Location permission just granted)
* @return last known LatLng
*/
@SuppressLint("MissingPermission")
public LatLng getLKL(@NonNull Context context) {
if (isLocationPermissionGranted(context)) {
Location lastKL = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (lastKL == null) {
lastKL = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
if (lastKL == null) {
return null;
}
return LatLng.from(lastKL);
} else {
return null;
}
}
public LatLng getLastLocation() {
if (lastLocation == null) {
return null;