mirror of
				https://github.com/commons-app/apps-android-commons.git
				synced 2025-10-30 22:34:02 +01:00 
			
		
		
		
	Merge remote-tracking branch 'refs/remotes/commons-app/upload-overhaul' into upload-overhaul-fork
This commit is contained in:
		
						commit
						cd2a3b345d
					
				
					 31 changed files with 344 additions and 50 deletions
				
			
		|  | @ -1,6 +1,7 @@ | |||
| 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; | ||||
|  | @ -10,9 +11,10 @@ import android.location.LocationManager; | |||
| import android.os.Bundle; | ||||
| import android.support.v4.app.ActivityCompat; | ||||
| import android.support.v4.content.ContextCompat; | ||||
| import android.util.Log; | ||||
| 
 | ||||
| import java.util.HashSet; | ||||
| import java.util.List; | ||||
| import java.util.Set; | ||||
| import java.util.concurrent.CopyOnWriteArrayList; | ||||
| 
 | ||||
| import timber.log.Timber; | ||||
|  | @ -29,6 +31,7 @@ public class LocationServiceManager implements LocationListener { | |||
|     private Location lastLocation; | ||||
|     private final List<LocationUpdateListener> locationListeners = new CopyOnWriteArrayList<>(); | ||||
|     private boolean isLocationManagerRegistered = false; | ||||
|     private Set<Activity> locationExplanationDisplayed = new HashSet<>(); | ||||
| 
 | ||||
|     /** | ||||
|      * Constructs a new instance of LocationServiceManager. | ||||
|  | @ -51,7 +54,6 @@ public class LocationServiceManager implements LocationListener { | |||
| 
 | ||||
|     /** | ||||
|      * Returns whether the location permission is granted. | ||||
|      * | ||||
|      * @return true if the location permission is granted | ||||
|      */ | ||||
|     public boolean isLocationPermissionGranted() { | ||||
|  | @ -73,10 +75,23 @@ public class LocationServiceManager implements LocationListener { | |||
|                 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) { | ||||
|         return !activity.isFinishing() && | ||||
|                 ActivityCompat.shouldShowRequestPermissionRationale(activity, | ||||
|                         Manifest.permission.ACCESS_FINE_LOCATION); | ||||
|         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; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | @ -84,8 +99,9 @@ public class LocationServiceManager implements LocationListener { | |||
|      * (e.g. when Location permission just granted) | ||||
|      * @return last known LatLng | ||||
|      */ | ||||
|     @SuppressLint("MissingPermission") | ||||
|     public LatLng getLKL() { | ||||
|         if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { | ||||
|         if (isLocationPermissionGranted()) { | ||||
|             Location lastKL = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); | ||||
|             if (lastKL == null) { | ||||
|                 lastKL = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); | ||||
|  | @ -107,9 +123,10 @@ public class LocationServiceManager implements LocationListener { | |||
|      * Registers a LocationManager to listen for current location. | ||||
|      */ | ||||
|     public void registerLocationManager() { | ||||
|         if (!isLocationManagerRegistered) | ||||
|         if (!isLocationManagerRegistered) { | ||||
|             isLocationManagerRegistered = requestLocationUpdatesFromProvider(LocationManager.NETWORK_PROVIDER) | ||||
|                     && requestLocationUpdatesFromProvider(LocationManager.GPS_PROVIDER); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | @ -142,7 +159,7 @@ public class LocationServiceManager implements LocationListener { | |||
|      * @return LOCATION_SIGNIFICANTLY_CHANGED if location changed significantly | ||||
|      * LOCATION_SLIGHTLY_CHANGED if location changed slightly | ||||
|      */ | ||||
|     protected LocationChangeType isBetterLocation(Location location, Location currentBestLocation) { | ||||
|     private LocationChangeType isBetterLocation(Location location, Location currentBestLocation) { | ||||
| 
 | ||||
|         if (currentBestLocation == null) { | ||||
|             // A new location is always better than no location | ||||
|  |  | |||
|  | @ -16,6 +16,7 @@ import android.support.design.widget.BottomSheetBehavior; | |||
| import android.support.v4.app.FragmentTransaction; | ||||
| import android.support.v7.app.AlertDialog; | ||||
| 
 | ||||
| import android.text.TextUtils; | ||||
| import android.view.Menu; | ||||
| import android.view.MenuInflater; | ||||
| import android.view.MenuItem; | ||||
|  | @ -23,9 +24,14 @@ import android.view.View; | |||
| import android.widget.LinearLayout; | ||||
| import android.widget.ProgressBar; | ||||
| 
 | ||||
| import android.widget.Toast; | ||||
| import com.google.gson.Gson; | ||||
| import com.google.gson.GsonBuilder; | ||||
| 
 | ||||
| import io.reactivex.functions.Consumer; | ||||
| import java.io.IOException; | ||||
| import java.net.ConnectException; | ||||
| import java.net.UnknownHostException; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import javax.inject.Inject; | ||||
|  | @ -316,7 +322,7 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp | |||
|     protected void onStart() { | ||||
|         super.onStart(); | ||||
|         locationManager.addLocationListener(this); | ||||
|         locationManager.registerLocationManager(); | ||||
|         registerLocationUpdates(); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|  | @ -394,7 +400,7 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp | |||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         locationManager.registerLocationManager(); | ||||
|         registerLocationUpdates(); | ||||
|         LatLng lastLocation = locationManager.getLastLocation(); | ||||
| 
 | ||||
|         if (curLatLng != null && curLatLng.equals(lastLocation)) { //refresh view only if location has changed | ||||
|  | @ -427,8 +433,14 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp | |||
|                     .loadAttractionsFromLocation(curLatLng)) | ||||
|                     .subscribeOn(Schedulers.io()) | ||||
|                     .observeOn(AndroidSchedulers.mainThread()) | ||||
|                     .subscribe(this::populatePlaces); | ||||
|         } else if (locationChangeType.equals(LocationServiceManager.LocationChangeType.LOCATION_SLIGHTLY_CHANGED)) { | ||||
|                     .subscribe(this::populatePlaces, | ||||
|                             throwable -> { | ||||
|                                 Timber.d(throwable); | ||||
|                                 showErrorMessage(getString(R.string.error_fetching_nearby_places)); | ||||
|                                 progressBar.setVisibility(View.GONE); | ||||
|                             }); | ||||
|         } else if (locationChangeType | ||||
|                 .equals(LocationServiceManager.LocationChangeType.LOCATION_SLIGHTLY_CHANGED)) { | ||||
|             Gson gson = new GsonBuilder() | ||||
|                     .registerTypeAdapter(Uri.class, new UriSerializer()) | ||||
|                     .create(); | ||||
|  | @ -438,6 +450,39 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This method first checks if the location permissions has been granted and then register the location manager for updates. | ||||
|      */ | ||||
|     private void registerLocationUpdates() { | ||||
|         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | ||||
|             if (locationManager.isLocationPermissionGranted()) { | ||||
|                 locationManager.registerLocationManager(); | ||||
|             } else { | ||||
|                 // Should we show an explanation? | ||||
|                 if (locationManager.isPermissionExplanationRequired(this)) { | ||||
|                     new AlertDialog.Builder(this) | ||||
|                             .setMessage(getString(R.string.location_permission_rationale_nearby)) | ||||
|                             .setPositiveButton("OK", (dialog, which) -> { | ||||
|                                 requestLocationPermissions(); | ||||
|                                 dialog.dismiss(); | ||||
|                             }) | ||||
|                             .setNegativeButton("Cancel", (dialog, id) -> { | ||||
|                                 showLocationPermissionDeniedErrorDialog(); | ||||
|                                 dialog.cancel(); | ||||
|                             }) | ||||
|                             .create() | ||||
|                             .show(); | ||||
| 
 | ||||
|                 } else { | ||||
|                     // No explanation needed, we can request the permission. | ||||
|                     requestLocationPermissions(); | ||||
|                 } | ||||
|             } | ||||
|         } else { | ||||
|             locationManager.registerLocationManager(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private void populatePlaces(NearbyController.NearbyPlacesInfo nearbyPlacesInfo) { | ||||
|         List<Place> placeList = nearbyPlacesInfo.placeList; | ||||
|         LatLng[] boundaryCoordinates = nearbyPlacesInfo.boundaryCoordinates; | ||||
|  | @ -451,7 +496,7 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp | |||
|         if (placeList.size() == 0) { | ||||
|             ViewUtil.showSnackbar(findViewById(R.id.container), R.string.no_nearby); | ||||
|         } | ||||
|          | ||||
| 
 | ||||
|         bundle.putString("PlaceList", gsonPlaceList); | ||||
|         //bundle.putString("CurLatLng", gsonCurLatLng); | ||||
|         bundle.putString("BoundaryCoord", gsonBoundaryCoordinates); | ||||
|  | @ -518,7 +563,7 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp | |||
|             locationManager.removeLocationListener(this); | ||||
|         } else { | ||||
|             lockNearbyView = false; | ||||
|             locationManager.registerLocationManager(); | ||||
|             registerLocationUpdates(); | ||||
|             locationManager.addLocationListener(this); | ||||
|         } | ||||
|     } | ||||
|  | @ -580,7 +625,12 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp | |||
|                         .loadAttractionsFromLocation(curLatLng)) | ||||
|                         .subscribeOn(Schedulers.io()) | ||||
|                         .observeOn(AndroidSchedulers.mainThread()) | ||||
|                         .subscribe(this::populatePlaces); | ||||
|                         .subscribe(this::populatePlaces, | ||||
|                                 throwable -> { | ||||
|                                     Timber.d(throwable); | ||||
|                                     showErrorMessage(getString(R.string.error_fetching_nearby_places)); | ||||
|                                     progressBar.setVisibility(View.GONE); | ||||
|                                 }); | ||||
|                 nearbyMapFragment.setBundleForUpdtes(bundle); | ||||
|                 nearbyMapFragment.updateMapSignificantly(); | ||||
|                 updateListFragment(); | ||||
|  | @ -646,4 +696,8 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp | |||
|     public void prepareViewsForSheetPosition(int bottomSheetState) { | ||||
|         // TODO | ||||
|     } | ||||
| 
 | ||||
|     private void showErrorMessage(String message) { | ||||
|         ViewUtil.showLongToast(NearbyActivity.this, message); | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -7,6 +7,7 @@ import android.support.graphics.drawable.VectorDrawableCompat; | |||
| 
 | ||||
| import com.mapbox.mapboxsdk.annotations.IconFactory; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collections; | ||||
| import java.util.HashMap; | ||||
|  | @ -44,7 +45,7 @@ public class NearbyController { | |||
|      * @return NearbyPlacesInfo a variable holds Place list without distance information | ||||
|      * and boundary coordinates of current Place List | ||||
|      */ | ||||
|     public NearbyPlacesInfo loadAttractionsFromLocation(LatLng curLatLng) { | ||||
|     public NearbyPlacesInfo loadAttractionsFromLocation(LatLng curLatLng) throws IOException { | ||||
| 
 | ||||
|         Timber.d("Loading attractions near %s", curLatLng); | ||||
|         NearbyPlacesInfo nearbyPlacesInfo = new NearbyPlacesInfo(); | ||||
|  |  | |||
|  | @ -40,10 +40,9 @@ public class NearbyPlaces { | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     List<Place> getFromWikidataQuery(LatLng curLatLng, String lang) { | ||||
|     List<Place> getFromWikidataQuery(LatLng curLatLng, String lang) throws IOException { | ||||
|         List<Place> places = Collections.emptyList(); | ||||
| 
 | ||||
|         try { | ||||
|             // increase the radius gradually to find a satisfactory number of nearby places | ||||
|             while (radius <= MAX_RADIUS) { | ||||
|                 places = getFromWikidataQuery(curLatLng, lang, radius); | ||||
|  | @ -54,13 +53,6 @@ public class NearbyPlaces { | |||
|                     radius *= RADIUS_MULTIPLIER; | ||||
|                 } | ||||
|             } | ||||
|         } catch (IOException e) { | ||||
|             Timber.d(e.toString()); | ||||
|             // errors tend to be caused by too many results (and time out) | ||||
|             // try a small radius next time | ||||
|             Timber.d("back to initial radius: %f", radius); | ||||
|             radius = INITIAL_RADIUS; | ||||
|         } | ||||
|         // make sure we will be able to send at least one request next time | ||||
|         if (radius > MAX_RADIUS) { | ||||
|             radius = MAX_RADIUS; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 misaochan
						misaochan