11package fr .free .nrw .commons .location ;
22
33import android .Manifest ;
4+ import android .annotation .SuppressLint ;
45import android .app .Activity ;
56import android .content .Context ;
67import android .content .pm .PackageManager ;
1011import android .os .Bundle ;
1112import android .support .v4 .app .ActivityCompat ;
1213import android .support .v4 .content .ContextCompat ;
13- import android .util .Log ;
1414
15+ import java .util .HashSet ;
1516import java .util .List ;
17+ import java .util .Set ;
1618import java .util .concurrent .CopyOnWriteArrayList ;
1719
1820import timber .log .Timber ;
@@ -29,6 +31,7 @@ public class LocationServiceManager implements LocationListener {
2931 private Location lastLocation ;
3032 private final List <LocationUpdateListener > locationListeners = new CopyOnWriteArrayList <>();
3133 private boolean isLocationManagerRegistered = false ;
34+ private Set <Activity > locationExplanationDisplayed = new HashSet <>();
3235
3336 /**
3437 * Constructs a new instance of LocationServiceManager.
@@ -51,7 +54,6 @@ public boolean isProviderEnabled() {
5154
5255 /**
5356 * Returns whether the location permission is granted.
54- *
5557 * @return true if the location permission is granted
5658 */
5759 public boolean isLocationPermissionGranted () {
@@ -73,19 +75,33 @@ public void requestPermissions(Activity activity) {
7375 LOCATION_REQUEST );
7476 }
7577
78+ /**
79+ * The permission explanation dialog box is now displayed just once for a particular activity. We are subscribing
80+ * to updates from multiple providers so its important to show the dialog just once. Otherwise it will be displayed
81+ * once for every provider, which in our case currently is 2.
82+ * @param activity
83+ * @return
84+ */
7685 public boolean isPermissionExplanationRequired (Activity activity ) {
77- return !activity .isFinishing () &&
78- ActivityCompat .shouldShowRequestPermissionRationale (activity ,
79- Manifest .permission .ACCESS_FINE_LOCATION );
86+ if (activity .isFinishing ()) {
87+ return false ;
88+ }
89+ boolean showRequestPermissionRationale = ActivityCompat .shouldShowRequestPermissionRationale (activity , Manifest .permission .ACCESS_FINE_LOCATION );
90+ if (showRequestPermissionRationale && !locationExplanationDisplayed .contains (activity )) {
91+ locationExplanationDisplayed .add (activity );
92+ return true ;
93+ }
94+ return false ;
8095 }
8196
8297 /**
8398 * Gets the last known location in cases where there wasn't time to register a listener
8499 * (e.g. when Location permission just granted)
85100 * @return last known LatLng
86101 */
102+ @ SuppressLint ("MissingPermission" )
87103 public LatLng getLKL () {
88- if (ContextCompat . checkSelfPermission ( context , Manifest . permission . ACCESS_FINE_LOCATION ) == PackageManager . PERMISSION_GRANTED ) {
104+ if (isLocationPermissionGranted () ) {
89105 Location lastKL = locationManager .getLastKnownLocation (LocationManager .GPS_PROVIDER );
90106 if (lastKL == null ) {
91107 lastKL = locationManager .getLastKnownLocation (LocationManager .NETWORK_PROVIDER );
@@ -107,9 +123,10 @@ public LatLng getLastLocation() {
107123 * Registers a LocationManager to listen for current location.
108124 */
109125 public void registerLocationManager () {
110- if (!isLocationManagerRegistered )
126+ if (!isLocationManagerRegistered ) {
111127 isLocationManagerRegistered = requestLocationUpdatesFromProvider (LocationManager .NETWORK_PROVIDER )
112128 && requestLocationUpdatesFromProvider (LocationManager .GPS_PROVIDER );
129+ }
113130 }
114131
115132 /**
@@ -142,7 +159,7 @@ private boolean requestLocationUpdatesFromProvider(String locationProvider) {
142159 * @return LOCATION_SIGNIFICANTLY_CHANGED if location changed significantly
143160 * LOCATION_SLIGHTLY_CHANGED if location changed slightly
144161 */
145- protected LocationChangeType isBetterLocation (Location location , Location currentBestLocation ) {
162+ private LocationChangeType isBetterLocation (Location location , Location currentBestLocation ) {
146163
147164 if (currentBestLocation == null ) {
148165 // A new location is always better than no location
0 commit comments