aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/pixart/messenger/utils/RichPreview.java
diff options
context:
space:
mode:
authorChristian Schneppe <christian@pix-art.de>2019-02-18 21:07:20 +0100
committerChristian Schneppe <christian@pix-art.de>2019-02-18 21:07:20 +0100
commitc820c915a20a5e90fd3d98b4f18b182f6a97235a (patch)
treea1de1b3fb2f1689f6b6462f465f4efcac956e690 /src/main/java/de/pixart/messenger/utils/RichPreview.java
parent1079f26d902a7cd5666e5159778a6828a102e40e (diff)
try to fix some NPE in RichPreview
Diffstat (limited to 'src/main/java/de/pixart/messenger/utils/RichPreview.java')
-rw-r--r--src/main/java/de/pixart/messenger/utils/RichPreview.java178
1 files changed, 178 insertions, 0 deletions
diff --git a/src/main/java/de/pixart/messenger/utils/RichPreview.java b/src/main/java/de/pixart/messenger/utils/RichPreview.java
new file mode 100644
index 000000000..639a02c8d
--- /dev/null
+++ b/src/main/java/de/pixart/messenger/utils/RichPreview.java
@@ -0,0 +1,178 @@
+package de.pixart.messenger.utils;
+
+import android.os.AsyncTask;
+import android.webkit.URLUtil;
+
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import io.github.ponnamkarthik.richlinkpreview.MetaData;
+import io.github.ponnamkarthik.richlinkpreview.ResponseListener;
+
+/**
+ * Created by ponna on 16-01-2018.
+ */
+
+public class RichPreview {
+
+ MetaData metaData;
+ ResponseListener responseListener;
+ String url;
+
+ public RichPreview(ResponseListener responseListener) {
+ this.responseListener = responseListener;
+ metaData = new MetaData();
+ }
+
+ public void getPreview(String url) {
+ this.url = url;
+ new RichPreview.getData().execute();
+ }
+
+ private class getData extends AsyncTask<Void, Void, Void> {
+
+ @Override
+ protected Void doInBackground(Void... params) {
+ Document doc = null;
+ try {
+ doc = Jsoup.connect(url)
+ .timeout(30 * 1000)
+ .get();
+
+ Elements elements = doc.getElementsByTag("meta");
+
+ // getTitle doc.select("meta[property=og:title]")
+ String title = doc.select("meta[property=og:title]").attr("content");
+
+ if (title == null || title.isEmpty()) {
+ title = doc.title();
+ }
+ metaData.setTitle(title);
+
+ //getDescription
+ String description = doc.select("meta[name=description]").attr("content");
+ if (description.isEmpty() || description == null) {
+ description = doc.select("meta[name=Description]").attr("content");
+ }
+ if (description.isEmpty() || description == null) {
+ description = doc.select("meta[property=og:description]").attr("content");
+ }
+ if (description.isEmpty() || description == null) {
+ description = "";
+ }
+ metaData.setDescription(description);
+
+
+ // getMediaType
+ Elements mediaTypes = doc.select("meta[name=medium]");
+ String type = "";
+ if (mediaTypes.size() > 0) {
+ String media = mediaTypes.attr("content");
+
+ type = media.equals("image") ? "photo" : media;
+ } else {
+ type = doc.select("meta[property=og:type]").attr("content");
+ }
+ metaData.setMediatype(type);
+
+
+ //getImages
+ Elements imageElements = doc.select("meta[property=og:image]");
+ if (imageElements.size() > 0) {
+ String image = imageElements.attr("content");
+ if (!image.isEmpty()) {
+ metaData.setImageurl(resolveURL(url, image));
+ }
+ }
+ if (metaData.getImageurl().isEmpty()) {
+ String src = doc.select("link[rel=image_src]").attr("href");
+ if (!src.isEmpty()) {
+ metaData.setImageurl(resolveURL(url, src));
+ } else {
+ src = doc.select("link[rel=apple-touch-icon]").attr("href");
+ if (!src.isEmpty()) {
+ metaData.setImageurl(resolveURL(url, src));
+ metaData.setFavicon(resolveURL(url, src));
+ } else {
+ src = doc.select("link[rel=icon]").attr("href");
+ if (!src.isEmpty()) {
+ metaData.setImageurl(resolveURL(url, src));
+ metaData.setFavicon(resolveURL(url, src));
+ }
+ }
+ }
+ }
+
+ //Favicon
+ String src = doc.select("link[rel=apple-touch-icon]").attr("href");
+ if (!src.isEmpty()) {
+ metaData.setFavicon(resolveURL(url, src));
+ } else {
+ src = doc.select("link[rel=icon]").attr("href");
+ if (!src.isEmpty()) {
+ metaData.setFavicon(resolveURL(url, src));
+ }
+ }
+
+ for (Element element : elements) {
+ if (element.hasAttr("property")) {
+ String str_property = element.attr("property").toString().trim();
+ if (str_property.equals("og:url")) {
+ metaData.setUrl(element.attr("content").toString());
+ }
+ if (str_property.equals("og:site_name")) {
+ metaData.setSitename(element.attr("content").toString());
+ }
+ }
+ }
+
+ if (metaData.getUrl().equals("") || metaData.getUrl().isEmpty()) {
+ URI uri = null;
+ try {
+ uri = new URI(url);
+ } catch (URISyntaxException e) {
+ e.printStackTrace();
+ }
+ if (url == null) {
+ metaData.setUrl(url);
+ } else {
+ metaData.setUrl(uri != null ? uri.getHost() : null);
+ }
+ }
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ responseListener.onError(new Exception("No Html Received from " + url + " Check your Internet " + e.getLocalizedMessage()));
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Void aVoid) {
+ super.onPostExecute(aVoid);
+ responseListener.onData(metaData);
+ }
+ }
+
+ private String resolveURL(String url, String part) {
+ if (URLUtil.isValidUrl(part)) {
+ return part;
+ } else {
+ URI base_uri = null;
+ try {
+ base_uri = new URI(url);
+ } catch (URISyntaxException e) {
+ e.printStackTrace();
+ }
+ base_uri = base_uri != null ? base_uri.resolve(part) : null;
+ return base_uri != null ? base_uri.toString() : null;
+ }
+ }
+}
+