mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-11-03 16:23:54 +01:00
Improvised query
This commit is contained in:
parent
3e9c3a6dae
commit
8e343f25a5
7 changed files with 142 additions and 17 deletions
|
|
@ -27,6 +27,7 @@ import io.reactivex.Observable;
|
|||
import io.reactivex.Single;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.regex.Matcher;
|
||||
|
|
@ -35,6 +36,7 @@ import javax.inject.Inject;
|
|||
import javax.inject.Singleton;
|
||||
import okhttp3.HttpUrl;
|
||||
import okhttp3.OkHttpClient;
|
||||
import okhttp3.Protocol;
|
||||
import okhttp3.Request;
|
||||
import okhttp3.Response;
|
||||
import okhttp3.ResponseBody;
|
||||
|
|
@ -411,7 +413,7 @@ public class OkHttpJsonApiClient {
|
|||
throws Exception {
|
||||
final String wikidataQuery = FileUtils.readFromResource("/queries/query_for_item.rq");
|
||||
final String query = wikidataQuery
|
||||
.replace("${ENTITY}", entityId)
|
||||
.replace("${ENTITY}", "wd:"+entityId)
|
||||
.replace("${LANG}", language);
|
||||
final HttpUrl.Builder urlBuilder = HttpUrl
|
||||
.parse(sparqlQueryUrl)
|
||||
|
|
@ -435,6 +437,44 @@ public class OkHttpJsonApiClient {
|
|||
throw new Exception(response.message());
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public List<Place> getNearbyPlacesFromQID(
|
||||
final List<Place> placeList, final String language) throws IOException {
|
||||
final String wikidataQuery = FileUtils.readFromResource("/queries/query_for_item.rq");
|
||||
String qids = "";
|
||||
for (final Place place : placeList) {
|
||||
qids += "\n" + ("wd:" + place.getWikiDataEntityId());
|
||||
}
|
||||
final String query = wikidataQuery
|
||||
.replace("${ENTITY}", qids)
|
||||
.replace("${LANG}", language);
|
||||
final HttpUrl.Builder urlBuilder = HttpUrl
|
||||
.parse(sparqlQueryUrl)
|
||||
.newBuilder()
|
||||
.addQueryParameter("query", query)
|
||||
.addQueryParameter("format", "json");
|
||||
|
||||
final Request request = new Request.Builder()
|
||||
.url(urlBuilder.build())
|
||||
.build();
|
||||
|
||||
try (Response response = okHttpClient.newCall(request).execute()) {
|
||||
if (response.isSuccessful()) {
|
||||
final String json = response.body().string();
|
||||
final NearbyResponse nearbyResponse = gson.fromJson(json, NearbyResponse.class);
|
||||
final List<NearbyResultItem> bindings = nearbyResponse.getResults().getBindings();
|
||||
final List<Place> places = new ArrayList<>();
|
||||
for (final NearbyResultItem item : bindings) {
|
||||
final Place placeFromNearbyItem = Place.from(item);
|
||||
places.add(placeFromNearbyItem);
|
||||
}
|
||||
return places;
|
||||
} else {
|
||||
throw new IOException("Unexpected response code: " + response.code());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Make API Call to get Places
|
||||
*
|
||||
|
|
|
|||
|
|
@ -131,6 +131,10 @@ public class NearbyController extends MapController {
|
|||
);
|
||||
}
|
||||
|
||||
public List<Place> getPlacesFromQID(List<Place> placeList) throws Exception {
|
||||
return nearbyPlaces.getPlacesFromQID(placeList, Locale.getDefault().getLanguage());
|
||||
}
|
||||
|
||||
public Place getNearbyPlace(String entity) throws Exception {
|
||||
return nearbyPlaces.getPlaceFromWikidataQuery(
|
||||
entity,
|
||||
|
|
|
|||
|
|
@ -134,6 +134,12 @@ public class NearbyPlaces {
|
|||
.getNearbyPlace(entityId, lang);
|
||||
}
|
||||
|
||||
public List<Place> getPlacesFromQID(final List<Place> placeList,
|
||||
final String lang) throws Exception {
|
||||
return okHttpJsonApiClient
|
||||
.getNearbyPlacesFromQID(placeList, lang);
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs the Wikidata query to retrieve the KML String
|
||||
*
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@ import fr.free.nrw.commons.contributions.MainActivity.ActiveFragment;
|
|||
import fr.free.nrw.commons.databinding.FragmentNearbyParentBinding;
|
||||
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
|
||||
import fr.free.nrw.commons.kvstore.JsonKvStore;
|
||||
import fr.free.nrw.commons.location.LatLng;
|
||||
import fr.free.nrw.commons.location.LocationPermissionsHelper;
|
||||
import fr.free.nrw.commons.location.LocationPermissionsHelper.LocationPermissionCallback;
|
||||
import fr.free.nrw.commons.location.LocationServiceManager;
|
||||
|
|
@ -103,6 +104,8 @@ import java.util.Iterator;
|
|||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
|
|
@ -1326,10 +1329,12 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
|
|||
if (nearbyPlacesInfo.placeList == null || nearbyPlacesInfo.placeList.isEmpty()) {
|
||||
showErrorMessage(getString(R.string.no_nearby_places_around));
|
||||
} else {
|
||||
updateMapMarkers(nearbyPlacesInfo, true);
|
||||
updateMapMarkers(nearbyPlacesInfo.placeList, nearbyPlacesInfo.currentLatLng,
|
||||
true);
|
||||
lastFocusLocation = searchLatLng;
|
||||
lastMapFocus = new GeoPoint(searchLatLng.getLatitude(),
|
||||
searchLatLng.getLongitude());
|
||||
loadPlacesDataAsync(nearbyPlacesInfo.placeList, nearbyPlacesInfo.currentLatLng);
|
||||
}
|
||||
},
|
||||
throwable -> {
|
||||
|
|
@ -1364,9 +1369,11 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
|
|||
// Updating last searched location
|
||||
applicationKvStore.putString("LastLocation",
|
||||
searchLatLng.getLatitude() + "," + searchLatLng.getLongitude());
|
||||
updateMapMarkers(nearbyPlacesInfo, false);
|
||||
updateMapMarkers(nearbyPlacesInfo.placeList, nearbyPlacesInfo.currentLatLng,
|
||||
false);
|
||||
lastMapFocus = new GeoPoint(searchLatLng.getLatitude(),
|
||||
searchLatLng.getLongitude());
|
||||
loadPlacesDataAsync(nearbyPlacesInfo.placeList, nearbyPlacesInfo.currentLatLng);
|
||||
}
|
||||
},
|
||||
throwable -> {
|
||||
|
|
@ -1379,15 +1386,48 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
|
|||
}));
|
||||
}
|
||||
|
||||
public void loadPlacesDataAsync(List<Place> placeList, LatLng curLatLng) {
|
||||
final Observable<List<Place>> nearbyPlacesInfoObservable = Observable
|
||||
.fromCallable(() -> nearbyController
|
||||
.getPlacesFromQID(placeList));
|
||||
compositeDisposable.add(nearbyPlacesInfoObservable
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(p -> {
|
||||
List<Place> places = p;
|
||||
if (places == null || places.isEmpty()) {
|
||||
showErrorMessage(getString(R.string.no_nearby_places_around));
|
||||
} else {
|
||||
for (Place place : places) {
|
||||
for (Place foundPlace : placeList) {
|
||||
if (place.siteLinks.getWikidataLink().equals(foundPlace.siteLinks.getWikidataLink())) {
|
||||
place.location = foundPlace.location;
|
||||
place.distance = foundPlace.distance;
|
||||
place.setMonument(foundPlace.isMonument());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
updateMapMarkers(places, curLatLng, false);
|
||||
}
|
||||
},
|
||||
throwable -> {
|
||||
Timber.e(throwable);
|
||||
showErrorMessage(getString(R.string.error_fetching_nearby_places)
|
||||
+ throwable.getLocalizedMessage());
|
||||
setFilterState();
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
* Populates places for your location, should be used for finding nearby places around a
|
||||
* location where you are.
|
||||
*
|
||||
* @param nearbyPlacesInfo This variable has place list information and distances.
|
||||
* @param nearbyPlaces This variable has place list information and distances.
|
||||
*/
|
||||
private void updateMapMarkers(final NearbyController.NearbyPlacesInfo nearbyPlacesInfo,
|
||||
private void updateMapMarkers(final List<Place> nearbyPlaces, final LatLng curLatLng,
|
||||
final boolean shouldUpdateSelectedMarker) {
|
||||
presenter.updateMapMarkers(nearbyPlacesInfo, shouldUpdateSelectedMarker);
|
||||
presenter.updateMapMarkers(nearbyPlaces, curLatLng, shouldUpdateSelectedMarker);
|
||||
setFilterState();
|
||||
}
|
||||
|
||||
|
|
@ -1774,7 +1814,7 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
|
|||
return (isBookmarked ?
|
||||
R.drawable.ic_custom_map_marker_green_bookmarked :
|
||||
R.drawable.ic_custom_map_marker_green);
|
||||
} else if (!place.exists) { // Means that the topic of the Wikidata item does not exist in the real world anymore, for instance it is a past event, or a place that was destroyed
|
||||
} else if (!place.exists || (place.name == "")) { // Means that the topic of the Wikidata item does not exist in the real world anymore, for instance it is a past event, or a place that was destroyed
|
||||
return (isBookmarked ?
|
||||
R.drawable.ic_custom_map_marker_grey_bookmarked :
|
||||
R.drawable.ic_custom_map_marker_grey);
|
||||
|
|
@ -1797,6 +1837,13 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
|
|||
Marker marker = new Marker(binding.map);
|
||||
marker.setPosition(point);
|
||||
marker.setIcon(icon);
|
||||
if (!Objects.equals(place.name, "")){
|
||||
marker.setTitle(place.name);
|
||||
marker.setSnippet(
|
||||
containsParentheses(place.getLongDescription())
|
||||
? getTextBetweenParentheses(
|
||||
place.getLongDescription()) : place.getLongDescription());
|
||||
}
|
||||
marker.setTextLabelFontSize(40);
|
||||
marker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_TOP);
|
||||
marker.setOnMarkerClickListener((marker1, mapView) -> {
|
||||
|
|
@ -1807,7 +1854,16 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
|
|||
binding.bottomSheetDetails.dataCircularProgress.setVisibility(View.VISIBLE);
|
||||
binding.bottomSheetDetails.icon.setVisibility(View.GONE);
|
||||
binding.bottomSheetDetails.wikiDataLl.setVisibility(View.GONE);
|
||||
getPlaceData(place.getWikiDataEntityId(), place, marker1);
|
||||
if (Objects.equals(place.name, "")){
|
||||
getPlaceData(place.getWikiDataEntityId(), place, marker1);
|
||||
}else {
|
||||
marker.showInfoWindow();
|
||||
binding.bottomSheetDetails.dataCircularProgress.setVisibility(View.GONE);
|
||||
binding.bottomSheetDetails.icon.setVisibility(View.VISIBLE);
|
||||
binding.bottomSheetDetails.wikiDataLl.setVisibility(View.VISIBLE);
|
||||
passInfoToSheet(place);
|
||||
hideBottomSheet();
|
||||
}
|
||||
bottomSheetDetailsBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
|
||||
return true;
|
||||
});
|
||||
|
|
@ -1830,6 +1886,14 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
|
|||
Marker marker = new Marker(binding.map);
|
||||
marker.setPosition(point);
|
||||
marker.setIcon(icon);
|
||||
Place place = nearbyBaseMarkers.get(i).getPlace();
|
||||
if (!Objects.equals(place.name, "")){
|
||||
marker.setTitle(place.name);
|
||||
marker.setSnippet(
|
||||
containsParentheses(place.getLongDescription())
|
||||
? getTextBetweenParentheses(
|
||||
place.getLongDescription()) : place.getLongDescription());
|
||||
}
|
||||
marker.setTextLabelFontSize(40);
|
||||
marker.setId(String.valueOf(i));
|
||||
marker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_TOP);
|
||||
|
|
@ -1840,11 +1904,20 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
|
|||
}
|
||||
clickedMarker = marker1;
|
||||
int index = Integer.parseInt(marker1.getId());
|
||||
Place place = nearbyBaseMarkers.get(index).getPlace();
|
||||
Place updatedPlace = nearbyBaseMarkers.get(index).getPlace();
|
||||
binding.bottomSheetDetails.dataCircularProgress.setVisibility(View.VISIBLE);
|
||||
binding.bottomSheetDetails.icon.setVisibility(View.GONE);
|
||||
binding.bottomSheetDetails.wikiDataLl.setVisibility(View.GONE);
|
||||
getPlaceData(place.getWikiDataEntityId(), place, marker1);
|
||||
if (Objects.equals(updatedPlace.name, "")){
|
||||
getPlaceData(updatedPlace.getWikiDataEntityId(), updatedPlace, marker1);
|
||||
}else {
|
||||
marker.showInfoWindow();
|
||||
binding.bottomSheetDetails.dataCircularProgress.setVisibility(View.GONE);
|
||||
binding.bottomSheetDetails.icon.setVisibility(View.VISIBLE);
|
||||
binding.bottomSheetDetails.wikiDataLl.setVisibility(View.VISIBLE);
|
||||
passInfoToSheet(place);
|
||||
hideBottomSheet();
|
||||
}
|
||||
bottomSheetDetailsBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
|
||||
return true;
|
||||
});
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ class ResultTuple {
|
|||
@SerializedName("xml:lang")
|
||||
val language: String
|
||||
val type: String
|
||||
val value: String
|
||||
var value: String
|
||||
|
||||
constructor(lang: String, type: String, value: String) {
|
||||
this.language = lang
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ import fr.free.nrw.commons.nearby.Label;
|
|||
import fr.free.nrw.commons.nearby.MarkerPlaceGroup;
|
||||
import fr.free.nrw.commons.nearby.NearbyController;
|
||||
import fr.free.nrw.commons.nearby.NearbyFilterState;
|
||||
import fr.free.nrw.commons.nearby.Place;
|
||||
import fr.free.nrw.commons.nearby.contract.NearbyParentFragmentContract;
|
||||
import fr.free.nrw.commons.utils.LocationUtils;
|
||||
import fr.free.nrw.commons.wikidata.WikidataEditListener;
|
||||
|
|
@ -213,19 +214,20 @@ public class NearbyParentFragmentPresenter
|
|||
* Populates places for custom location, should be used for finding nearby places around a
|
||||
* location where you are not at.
|
||||
*
|
||||
* @param nearbyPlacesInfo This variable has placeToCenter list information and distances.
|
||||
* @param nearbyPlaces This variable has placeToCenter list information and distances.
|
||||
*/
|
||||
public void updateMapMarkers(NearbyController.NearbyPlacesInfo nearbyPlacesInfo, boolean shouldTrackPosition) {
|
||||
public void updateMapMarkers(List<Place> nearbyPlaces, LatLng currentLatLng,
|
||||
boolean shouldTrackPosition) {
|
||||
if (null != nearbyParentFragmentView) {
|
||||
nearbyParentFragmentView.clearAllMarkers();
|
||||
List<BaseMarker> baseMarkers = NearbyController
|
||||
.loadAttractionsFromLocationToBaseMarkerOptions(nearbyPlacesInfo.currentLatLng,
|
||||
.loadAttractionsFromLocationToBaseMarkerOptions(currentLatLng,
|
||||
// Curlatlang will be used to calculate distances
|
||||
nearbyPlacesInfo.placeList);
|
||||
nearbyPlaces);
|
||||
nearbyParentFragmentView.updateMapMarkers(baseMarkers);
|
||||
lockUnlockNearby(false); // So that new location updates wont come
|
||||
nearbyParentFragmentView.setProgressBarVisibility(false);
|
||||
nearbyParentFragmentView.updateListFragment(nearbyPlacesInfo.placeList);
|
||||
nearbyParentFragmentView.updateListFragment(nearbyPlaces);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ SELECT
|
|||
WHERE {
|
||||
SERVICE <https://query.wikidata.org/sparql> {
|
||||
values ?item {
|
||||
wd:${ENTITY}
|
||||
${ENTITY}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue