diff --git a/app/src/main/java/fr/free/nrw/commons/Media.java b/app/src/main/java/fr/free/nrw/commons/Media.java index 581cfb630..9b5da3304 100644 --- a/app/src/main/java/fr/free/nrw/commons/Media.java +++ b/app/src/main/java/fr/free/nrw/commons/Media.java @@ -39,6 +39,7 @@ public class Media implements Parcelable { protected String imageUrl; protected String filename; protected String description; // monolingual description on input... + protected String discussion; protected long dataLength; protected Date dateCreated; protected @Nullable Date dateUploaded; @@ -195,6 +196,22 @@ public class Media implements Parcelable { this.filename = filename; } + /** + * Sets the discussion of the file. + * @param discussion + */ + public void setDiscussion(String discussion) { + this.discussion = discussion; + } + + /** + * Gets the file discussion as a string. + * @return file discussion as a string + */ + public String getDiscussion() { + return discussion; + } + /** * Gets the file description. * @return file description as a string diff --git a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java index ded06e779..520a5a4c0 100644 --- a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java +++ b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java @@ -1,5 +1,6 @@ package fr.free.nrw.commons; +import android.text.Html; import androidx.annotation.Nullable; import android.text.TextUtils; @@ -39,6 +40,7 @@ public class MediaDataExtractor { private boolean deletionStatus; private ArrayList categories; private Map descriptions; + private String discussion; private String license; private @Nullable LatLng coordinates; @@ -48,6 +50,7 @@ public class MediaDataExtractor { this.descriptions = new HashMap<>(); this.fetched = false; this.mediaWikiApi = mwApi; + this.discussion = new String(); } /* @@ -70,6 +73,9 @@ public class MediaDataExtractor { } MediaResult result = mediaWikiApi.fetchMediaByFilename(filename); + MediaResult discussion = mediaWikiApi.fetchMediaByFilename(filename.replace("File", "File talk")); + setDiscussion(discussion.getWikiSource()); + // In-page category links are extracted from source, as XML doesn't cover [[links]] extractCategories(result.getWikiSource()); @@ -94,6 +100,14 @@ public class MediaDataExtractor { } } + private void setDiscussion(String source) { + try { + discussion = Html.fromHtml(mediaWikiApi.parseWikicode(source)).toString(); + } catch (IOException e) { + e.printStackTrace(); + } + } + private void processWikiParseTree(String source, LicenseList licenseList) throws IOException { Document doc; try { @@ -307,6 +321,7 @@ public class MediaDataExtractor { media.setCategories(categories); media.setDescriptions(descriptions); media.setCoordinates(coordinates); + media.setDiscussion(discussion); if (license != null) { media.setLicense(license); } diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java index 95ec7a2f3..ae097b488 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java @@ -112,6 +112,8 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { TextView coordinates; @BindView(R.id.mediaDetailuploadeddate) TextView uploadedDate; + @BindView(R.id.mediaDetailDisc) + TextView mediaDiscussion; @BindView(R.id.seeMore) TextView seeMore; @BindView(R.id.nominatedDeletionBanner) @@ -341,6 +343,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { license.setText(prettyLicense(media)); coordinates.setText(prettyCoordinates(media)); uploadedDate.setText(prettyUploadedDate(media)); + mediaDiscussion.setText(prettyDiscussion(media)); categoryNames.clear(); categoryNames.addAll(media.getCategories()); @@ -502,6 +505,14 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { return desc; } } + private String prettyDiscussion(Media media) { + String disc = media.getDiscussion().trim(); + if (disc.equals("")) { + return getString(R.string.detail_discussion_empty); + } else { + return disc; + } + } private String prettyLicense(Media media) { String licenseKey = media.getLicense(); diff --git a/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java b/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java index ac828e835..3ba74085f 100644 --- a/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java +++ b/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java @@ -306,6 +306,17 @@ public class ApacheHttpClientMediaWikiApi implements MediaWikiApi { .getString("/api/query/pages/page/imageinfo/ii/@thumburl"); } + @Override + public String parseWikicode(String source) throws IOException { + return api.action("flow-parsoid-utils") + .param("from", "wikitext") + .param("to", "html") + .param("content", source) + .param("title", "Main_page") + .get() + .getString("/api/flow-parsoid-utils/@content"); + } + @Override @NonNull public MediaResult fetchMediaByFilename(String filename) throws IOException { diff --git a/app/src/main/java/fr/free/nrw/commons/mwapi/MediaWikiApi.java b/app/src/main/java/fr/free/nrw/commons/mwapi/MediaWikiApi.java index 254c03798..57303428e 100644 --- a/app/src/main/java/fr/free/nrw/commons/mwapi/MediaWikiApi.java +++ b/app/src/main/java/fr/free/nrw/commons/mwapi/MediaWikiApi.java @@ -66,6 +66,8 @@ public interface MediaWikiApi { @Nullable boolean addWikidataEditTag(String revisionId) throws IOException; + String parseWikicode(String source) throws IOException; + @NonNull MediaResult fetchMediaByFilename(String filename) throws IOException; diff --git a/app/src/main/res/layout/fragment_media_detail.xml b/app/src/main/res/layout/fragment_media_detail.xml index df1b64b6e..6ac2d737b 100644 --- a/app/src/main/res/layout/fragment_media_detail.xml +++ b/app/src/main/res/layout/fragment_media_detail.xml @@ -309,6 +309,37 @@ android:textStyle="bold"/> + + + + + + + + +