From ddd5e602a9d98c0a6913a537c8cfc02dafdeb344 Mon Sep 17 00:00:00 2001 From: maskara Date: Mon, 15 May 2017 11:43:03 +0200 Subject: [PATCH] Fixed nearby query to show read article link only for wikipedia articles --- app/src/main/assets/queries/nearby_query.rq | 18 ++- .../nrw/commons/nearby/NearbyInfoDialog.java | 18 +-- .../free/nrw/commons/nearby/NearbyPlaces.java | 21 ++-- .../fr/free/nrw/commons/nearby/Place.java | 8 +- .../fr/free/nrw/commons/nearby/Sitelinks.java | 103 ++++++++++++++++++ .../fr/free/nrw/commons/utils/FileUtils.java | 6 +- 6 files changed, 143 insertions(+), 31 deletions(-) create mode 100644 app/src/main/java/fr/free/nrw/commons/nearby/Sitelinks.java diff --git a/app/src/main/assets/queries/nearby_query.rq b/app/src/main/assets/queries/nearby_query.rq index 02f741228..b6610c6c2 100644 --- a/app/src/main/assets/queries/nearby_query.rq +++ b/app/src/main/assets/queries/nearby_query.rq @@ -6,7 +6,8 @@ SELECT (SAMPLE(COALESCE(?class_label_preferred_language, ?class_label_any_language, "?")) as ?class_label) (SAMPLE(COALESCE(?icon0, ?icon1)) as ?icon) (SAMPLE(COALESCE(?emoji0, ?emoji1)) as ?emoji) - (SAMPLE(?sitelink) as ?sitelink) + ?wikipediaArticle + ?commonsArticle WHERE { # Around given location... SERVICE wikibase:around { @@ -37,7 +38,18 @@ SELECT OPTIONAL { ?sitelink schema:about ?item . ?sitelink schema:inLanguage "en" - } + } + OPTIONAL { + ?wikipediaArticle schema:about ?item ; + schema:isPartOf . + SERVICE wikibase:label { bd:serviceParam wikibase:language "en" } + } + + OPTIONAL { + ?commonsArticle schema:about ?item ; + schema:isPartOf . + SERVICE wikibase:label { bd:serviceParam wikibase:language "en" } + } } } - GROUP BY ?item \ No newline at end of file + GROUP BY ?item ?wikipediaArticle ?commonsArticle \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java index 3bf6f7a50..a4b9a74cb 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyInfoDialog.java @@ -14,7 +14,6 @@ import butterknife.ButterKnife; import butterknife.OnClick; import butterknife.Unbinder; import fr.free.nrw.commons.R; -import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.ui.widget.OverlayDialog; import fr.free.nrw.commons.utils.DialogUtil; @@ -25,8 +24,7 @@ public class NearbyInfoDialog extends OverlayDialog { private final static String ARG_DESC = "placeDesc"; private final static String ARG_LATITUDE = "latitude"; private final static String ARG_LONGITUDE = "longitude"; - private final static String ARG_ARTICLE_LINK = "articleLink"; - private final static String ARG_WIKI_DATA_LINK = "wikiDataLink"; + private final static String ARG_SITE_LINK = "sitelink"; @BindView(R.id.link_preview_title) TextView placeTitle; @@ -58,15 +56,10 @@ public class NearbyInfoDialog extends OverlayDialog { } private void getArticleLink(Bundle bundle) { - String articleLink = bundle.getString(ARG_ARTICLE_LINK); - articleLink = articleLink.replace("<", "").replace(">", ""); + Sitelinks sitelinks = bundle.getParcelable(ARG_SITE_LINK); - if (Utils.isNullOrWhiteSpace(articleLink) || articleLink == "\n") { - articleLink = bundle.getString(ARG_WIKI_DATA_LINK).replace("<", "").replace(">", ""); - } - - if (!Utils.isNullOrWhiteSpace(articleLink) && articleLink != "\n") { - this.articleLink = Uri.parse(articleLink); + if (sitelinks.getWikipediaLink() != null) { + this.articleLink = sitelinks.getWikipediaLink(); } else { goToButton.setVisibility(View.GONE); } @@ -79,8 +72,7 @@ public class NearbyInfoDialog extends OverlayDialog { bundle.putString(ARG_DESC, place.description); bundle.putDouble(ARG_LATITUDE, place.location.latitude); bundle.putDouble(ARG_LONGITUDE, place.location.longitude); - bundle.putString(ARG_ARTICLE_LINK, place.siteLink.toString()); - bundle.putString(ARG_WIKI_DATA_LINK, place.wikiDataLink.toString()); + bundle.putParcelable(ARG_SITE_LINK, place.siteLinks); mDialog.setArguments(bundle); DialogUtil.showSafely(fragmentActivity, mDialog); } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java index a9bd8f5ce..152812fd2 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyPlaces.java @@ -70,17 +70,19 @@ public class NearbyPlaces { List places = new ArrayList<>(); String query = FileUtils.readFromFile(context, "queries/nearby_query.rq") - .replace("${RAD}", String.format(Locale.ROOT, "%.2f", radius)) + .replace("${RADIUS}", String.format(Locale.ROOT, "%.2f", radius)) .replace("${LAT}", String.format(Locale.ROOT, "%.4f", cur.latitude)) .replace("${LONG}", String.format(Locale.ROOT, "%.4f", cur.longitude)) .replace("${LANG}", lang); - Timber.v(query); + + Timber.d("Wikidata query "+ query); // format as a URL String url = WIKIDATA_QUERY_URL.replace( "${QUERY}", URLEncoder.encode(query, "utf-8").replace("+", "%20") ); + Timber.d(url); URLConnection conn = new URL(url).openConnection(); conn.setRequestProperty("Accept", "text/tab-separated-values"); @@ -99,8 +101,9 @@ public class NearbyPlaces { String point = fields[0]; String name = Utils.stripLocalizedString(fields[2]); String type = Utils.stripLocalizedString(fields[4]); - String sitelink = Utils.stripLocalizedString(fields[7]); - String wikiDataLink = Utils.stripLocalizedString(fields[3]); + String wikipediaSitelink = Utils.stripLocalizedString(fields[7]); + String commonsSitelink = Utils.stripLocalizedString(fields[8]); + String wikiDataLink = Utils.stripLocalizedString(fields[1]); String icon = fields[5]; double latitude = 0; @@ -123,8 +126,11 @@ public class NearbyPlaces { type, // details Uri.parse(icon), new LatLng(latitude, longitude), - Uri.parse(sitelink), - Uri.parse(wikiDataLink) + new Sitelinks.Builder() + .setWikipediaLink(wikipediaSitelink) + .setCommonsLink(commonsSitelink) + .setWikidataLink(wikiDataLink) + .build() )); } in.close(); @@ -182,8 +188,7 @@ public class NearbyPlaces { type, // details null, new LatLng(latitude, longitude), - null, - null + new Sitelinks.Builder().build() )); } in.close(); diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/Place.java b/app/src/main/java/fr/free/nrw/commons/nearby/Place.java index a975282e9..dcc7fd74f 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/Place.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/Place.java @@ -16,19 +16,17 @@ public class Place { public Bitmap image; public Bitmap secondaryImage; public String distance; - public Uri siteLink; - public Uri wikiDataLink; + public Sitelinks siteLinks; public Place(String name, String description, String longDescription, - Uri secondaryImageUrl, LatLng location, Uri siteLink, Uri wikiDataLink) { + Uri secondaryImageUrl, LatLng location, Sitelinks siteLinks) { this.name = name; this.description = description; this.longDescription = longDescription; this.secondaryImageUrl = secondaryImageUrl; this.location = location; - this.siteLink = siteLink; - this.wikiDataLink = wikiDataLink; + this.siteLinks = siteLinks; } public void setDistance(String distance) { diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/Sitelinks.java b/app/src/main/java/fr/free/nrw/commons/nearby/Sitelinks.java new file mode 100644 index 000000000..28a81e4a7 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/nearby/Sitelinks.java @@ -0,0 +1,103 @@ +package fr.free.nrw.commons.nearby; + +import android.net.Uri; +import android.os.Parcel; +import android.os.Parcelable; +import android.support.annotation.Nullable; + +import fr.free.nrw.commons.Utils; + +public class Sitelinks implements Parcelable { + private final String wikipediaLink; + private final String commonsLink; + private final String wikidataLink; + + + protected Sitelinks(Parcel in) { + wikipediaLink = in.readString(); + commonsLink = in.readString(); + wikidataLink = in.readString(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(wikipediaLink); + dest.writeString(commonsLink); + dest.writeString(wikidataLink); + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public Sitelinks createFromParcel(Parcel in) { + return new Sitelinks(in); + } + + @Override + public Sitelinks[] newArray(int size) { + return new Sitelinks[size]; + } + }; + + @Nullable + public Uri getWikipediaLink() { + return sanitiseString(wikipediaLink); + } + + @Nullable + public Uri getCommonsLink() { + return sanitiseString(commonsLink); + } + + @Nullable + public Uri getWikidataLink() { + return sanitiseString(wikidataLink); + } + + @Nullable + private Uri sanitiseString(String stringUrl) { + stringUrl = stringUrl.replace("<", "").replace(">", ""); + if (!Utils.isNullOrWhiteSpace(stringUrl) && stringUrl != null) { + return Uri.parse(stringUrl); + } + return null; + } + + public Sitelinks(Sitelinks.Builder builder) { + this.wikidataLink = builder.wikidataLink; + this.wikipediaLink = builder.wikipediaLink; + this.commonsLink = builder.commonsLink; + } + + public static class Builder { + private String wikidataLink; + private String commonsLink; + private String wikipediaLink; + + public Builder() { + } + + public Sitelinks.Builder setWikipediaLink(String link) { + this.wikipediaLink = link; + return this; + } + + public Sitelinks.Builder setWikidataLink(String link) { + this.wikidataLink = link; + return this; + } + + public Sitelinks.Builder setCommonsLink(@Nullable String link) { + this.commonsLink = link; + return this; + } + + public Sitelinks build() { + return new Sitelinks(this); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java b/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java index 4cb20ae0a..158c13da0 100644 --- a/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java +++ b/app/src/main/java/fr/free/nrw/commons/utils/FileUtils.java @@ -6,19 +6,21 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import timber.log.Timber; + public class FileUtils { public static String readFromFile(Context context, String fileName) { String stringBuilder = ""; BufferedReader reader = null; try { reader = new BufferedReader( - new InputStreamReader(context.getAssets().open(fileName), "UTF-8")); + new InputStreamReader(context.getAssets().open(fileName))); String mLine; while ((mLine = reader.readLine()) != null) { stringBuilder += mLine + "\n"; } } catch (IOException e) { - //log the exception + Timber.e("File not found exception", e); } finally { if (reader != null) { try {