diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java new file mode 100644 index 000000000..ebf370ce4 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java @@ -0,0 +1,80 @@ +package fr.free.nrw.commons.nearby; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; + +import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; +import com.mapbox.mapboxsdk.annotations.MarkerOptions; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import fr.free.nrw.commons.location.LatLng; +import timber.log.Timber; + +import static fr.free.nrw.commons.utils.LengthUtils.computeDistanceBetween; +import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween; + + +public class NearbyController { + private static final int MAX_RESULTS = 1000; + private static List loadAttractionsFromLocation(LatLng curLatLng, Context context) { + Timber.d("Loading attractions near %s", curLatLng); + if (curLatLng == null) { + return Collections.emptyList(); + } + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + List places = prefs.getBoolean("useWikidata", true) + ? NearbyPlaces.getInstance().getFromWikidataQuery( + curLatLng, Locale.getDefault().getLanguage()) + : NearbyPlaces.getInstance().getFromWikiNeedsPictures(); + if (curLatLng != null) { + Timber.d("Sorting places by distance..."); + final Map distances = new HashMap<>(); + for (Place place: places) { + distances.put(place, computeDistanceBetween(place.location, curLatLng)); + } + Collections.sort(places, + new Comparator() { + @Override + public int compare(Place lhs, Place rhs) { + double lhsDistance = distances.get(lhs); + double rhsDistance = distances.get(rhs); + return (int) (lhsDistance - rhsDistance); + } + } + ); + } + return places; + } + public static List loadAttractionsFromLocationToPlaces(LatLng curLatLng, Context context){ + + List places = loadAttractionsFromLocation(curLatLng,context); + places = places.subList(0, Math.min(places.size(), MAX_RESULTS)); + for (Place place: places) { + String distance = formatDistanceBetween(curLatLng, place.location); + place.setDistance(distance); + } + return places; + } + public static List loadAttractionsFromLocationToBaseMarkerOptions(LatLng curLatLng, Context context){ + List baseMarkerOptionses = new ArrayList<>(); + List places = loadAttractionsFromLocation(curLatLng,context); + places = places.subList(0, Math.min(places.size(), MAX_RESULTS)); + for (Place place: places) { + String distance = formatDistanceBetween(curLatLng, place.location); + place.setDistance(distance); + baseMarkerOptionses.add(new MarkerOptions() + .position(new com.mapbox.mapboxsdk.geometry.LatLng(place.location.latitude,place.location.longitude)) + .title(place.name) + .snippet(place.description)); + } + return baseMarkerOptionses; + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java index 6dae3bc90..a686d66c5 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyListFragment.java @@ -1,14 +1,9 @@ package fr.free.nrw.commons.nearby; -import static fr.free.nrw.commons.utils.LengthUtils.computeDistanceBetween; -import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween; - import android.content.Intent; -import android.content.SharedPreferences; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; -import android.preference.PreferenceManager; import android.support.v4.app.ListFragment; import android.view.LayoutInflater; import android.view.View; @@ -16,24 +11,17 @@ import android.view.ViewGroup; import android.widget.ListView; import android.widget.ProgressBar; +import java.util.List; + import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnItemClick; import fr.free.nrw.commons.R; import fr.free.nrw.commons.location.LatLng; - -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; - import timber.log.Timber; public class NearbyListFragment extends ListFragment { - private static final int MAX_RESULTS = 1000; private NearbyAsyncTask nearbyAsyncTask; @BindView(R.id.listView) ListView listview; @@ -124,8 +112,8 @@ public class NearbyListFragment extends ListFragment { @Override protected List doInBackground(Void... params) { - return loadAttractionsFromLocation( - ((NearbyActivity)getActivity()).getLocationManager().getLatestLocation() + return NearbyController.loadAttractionsFromLocationToPlaces( + ((NearbyActivity)getActivity()).getLocationManager().getLatestLocation(), getActivity() ); } @@ -164,40 +152,4 @@ public class NearbyListFragment extends ListFragment { startActivity(mapIntent); } } - - private List loadAttractionsFromLocation(LatLng curLatLng) { - Timber.d("Loading attractions near %s", curLatLng); - if (curLatLng == null) { - return Collections.emptyList(); - } - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); - List places = prefs.getBoolean("useWikidata", true) - ? NearbyPlaces.getInstance().getFromWikidataQuery( - curLatLng, Locale.getDefault().getLanguage()) - : NearbyPlaces.getInstance().getFromWikiNeedsPictures(); - if (curLatLng != null) { - Timber.d("Sorting places by distance..."); - final Map distances = new HashMap<>(); - for (Place place: places) { - distances.put(place, computeDistanceBetween(place.location, curLatLng)); - } - Collections.sort(places, - new Comparator() { - @Override - public int compare(Place lhs, Place rhs) { - double lhsDistance = distances.get(lhs); - double rhsDistance = distances.get(rhs); - return (int) (lhsDistance - rhsDistance); - } - } - ); - } - - places = places.subList(0, Math.min(places.size(), MAX_RESULTS)); - for (Place place: places) { - String distance = formatDistanceBetween(curLatLng, place.location); - place.setDistance(distance); - } - return places; - } } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java index 367ecc039..7ed2ab03d 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyMapFragment.java @@ -1,23 +1,34 @@ package fr.free.nrw.commons.nearby; +import android.os.AsyncTask; import android.os.Bundle; +import android.support.annotation.Nullable; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ProgressBar; import butterknife.BindView; import butterknife.ButterKnife; import com.mapbox.mapboxsdk.Mapbox; +import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; import com.mapbox.services.android.telemetry.MapboxTelemetry; +import java.util.List; + import fr.free.nrw.commons.R; public class NearbyMapFragment extends android.support.v4.app.Fragment { + private NearbyAsyncTask nearbyAsyncTask; + @BindView(R.id.mapview) MapView mapView; + @BindView(R.id.progressBar) + ProgressBar progressBar; public NearbyMapFragment() { @@ -41,17 +52,16 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { mapView.onCreate(savedInstanceState); setHasOptionsMenu(false); - - mapView.getMapAsync(new OnMapReadyCallback() { - @Override - public void onMapReady(MapboxMap mapboxMap) { - - } - }); - return view; } + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + nearbyAsyncTask = new NearbyAsyncTask(); + nearbyAsyncTask.execute(); + } + @Override public void onStart() { mapView.onStart(); @@ -81,4 +91,41 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment { mapView.onDestroy(); super.onDestroyView(); } + + private class NearbyAsyncTask extends AsyncTask> { + + @Override + protected void onPreExecute() { + super.onPreExecute(); + progressBar.setVisibility(View.VISIBLE); + } + + @Override + protected void onProgressUpdate(Integer... values) { + super.onProgressUpdate(values); + progressBar.setProgress(values[0]); + } + + @Override + protected List doInBackground(Void... params) { + return NearbyController.loadAttractionsFromLocationToBaseMarkerOptions( + ((NearbyActivity)getActivity()).getLocationManager().getLatestLocation(), getActivity() + ); + } + + @Override + protected void onPostExecute(final List baseMarkerOptionses) { + super.onPostExecute(baseMarkerOptionses); + + if (isCancelled()) { + return; + } + mapView.getMapAsync(new OnMapReadyCallback() { + @Override + public void onMapReady(MapboxMap mapboxMap) { + mapboxMap.addMarkers(baseMarkerOptionses); + } + }); + } + } } diff --git a/app/src/main/res/layout/fragment_nearby_map.xml b/app/src/main/res/layout/fragment_nearby_map.xml index ff4ba4d54..715e0d532 100644 --- a/app/src/main/res/layout/fragment_nearby_map.xml +++ b/app/src/main/res/layout/fragment_nearby_map.xml @@ -13,4 +13,11 @@ mapbox:mapbox_cameraTargetLat="50.0755" mapbox:mapbox_cameraTargetLng="14.4378" mapbox:mapbox_styleUrl="@string/style_mapbox_streets" /> + + \ No newline at end of file