diff --git a/app/src/main/java/sk/virtualvoid/core/CustomHtml.java b/app/src/main/java/sk/virtualvoid/core/CustomHtml.java
index ca39b74..8854bbd 100644
--- a/app/src/main/java/sk/virtualvoid/core/CustomHtml.java
+++ b/app/src/main/java/sk/virtualvoid/core/CustomHtml.java
@@ -21,11 +21,15 @@
* @author Juraj
*/
public class CustomHtml {
+ private static final Pattern VIDEO_TAG_PATTERN = Pattern.compile("", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
+ private static final Pattern SRC_ATTRIBUTE_PATTERN = Pattern.compile("\\bsrc\\s*=\\s*['\"]?([^'\"\\s>]+)", Pattern.CASE_INSENSITIVE);
+
public static Spanned fromHtml(String source) {
return fromHtml(source, null);
}
public static Spanned fromHtml(String source, Html.ImageGetter imageGetter) {
+ source = replaceVideoTags(source);
Spanned spanned = android.text.Html.fromHtml(source, imageGetter, null);
return correctLinkPaths(spanned);
}
@@ -33,7 +37,7 @@ public static Spanned fromHtml(String source, Html.ImageGetter imageGetter) {
public static Spanned correctLinkPaths(Spanned input) {
Pattern discussionPostPtr = Pattern.compile(".*/discussion/(\\d+)/id/(\\d+)", Pattern.CASE_INSENSITIVE);
Pattern discussionPtr = Pattern.compile(".*/discussion/(\\d+)", Pattern.CASE_INSENSITIVE);
- Pattern attachmentPtr = Pattern.compile(".*(original).(\\w{3})(\\?name=).*", Pattern.CASE_INSENSITIVE);
+ Pattern attachmentPtr = Pattern.compile(".*(original)\\.(jpg|jpeg|png|gif|webp)(\\?.*)?$", Pattern.CASE_INSENSITIVE);
Pattern mailReplyPtr = Pattern.compile(".*/mail/id/(\\d+)", Pattern.CASE_INSENSITIVE);
URLSpan[] urlSpans = input.getSpans(0, input.length(), URLSpan.class);
@@ -77,6 +81,32 @@ public static Spanned correctLinkPaths(Spanned input) {
return input;
}
+ private static String replaceVideoTags(String source) {
+ if (source == null) {
+ return "";
+ }
+
+ Matcher matcher = VIDEO_TAG_PATTERN.matcher(source);
+ StringBuffer result = new StringBuffer();
+ while (matcher.find()) {
+ String videoTag = matcher.group();
+ String videoUrl = findSrc(videoTag);
+ String replacement = videoUrl != null && !videoUrl.isEmpty()
+ ? String.format("[video]", videoUrl.replace("\"", "%22"))
+ : "[video]";
+
+ matcher.appendReplacement(result, Matcher.quoteReplacement(replacement));
+ }
+ matcher.appendTail(result);
+
+ return result.toString();
+ }
+
+ private static String findSrc(String html) {
+ Matcher matcher = SRC_ATTRIBUTE_PATTERN.matcher(html);
+ return matcher.find() ? matcher.group(1) : null;
+ }
+
private static boolean createCustomUrlSpan(Spanned input, URLSpan span, int start, int end, int flags, Pattern ptr) {
Matcher matcher = ptr.matcher(span.getURL());
if (matcher.matches()) {
@@ -105,7 +135,7 @@ private static boolean createCustomAttachmentUrlSpan(Spanned input, URLSpan span
if (matcher.matches()) {
((Spannable) input).removeSpan(span);
- CustomUrlSpan replacement = new CustomUrlSpan(Constants.fixAttachmentUrl(span.getURL()));
+ CustomUrlSpan replacement = new CustomUrlSpan(Constants.fixAttachmentUrl(span.getURL()), true, false, -1);
((Spannable) input).setSpan(replacement, start, end, flags);
diff --git a/app/src/main/java/sk/virtualvoid/nyxdroid/v2/MailActivity.java b/app/src/main/java/sk/virtualvoid/nyxdroid/v2/MailActivity.java
index 994e8b1..ab8dbbc 100644
--- a/app/src/main/java/sk/virtualvoid/nyxdroid/v2/MailActivity.java
+++ b/app/src/main/java/sk/virtualvoid/nyxdroid/v2/MailActivity.java
@@ -1,5 +1,7 @@
package sk.virtualvoid.nyxdroid.v2;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
import java.util.ArrayList;
import sk.virtualvoid.core.CoreUtility;
@@ -269,6 +271,16 @@ public boolean onOptionsItemSelected(MenuItem item) {
@Override
public boolean onNavigationRequested(NavigationType navigationType, String url, Long discussionId, Long writeupId, Long mailId) {
+ if (navigationType == NavigationType.IMAGE) {
+ try {
+ String decodedUrl = URLDecoder.decode(url, Constants.DEFAULT_CHARSET.displayName());
+ return gallery(decodedUrl);
+ } catch (UnsupportedEncodingException e) {
+ Log.e(Constants.TAG, "MailActivity::onNavigationRequested: IMAGE url decoding problem: " + e.getMessage());
+ return false;
+ }
+ }
+
if (navigationType == NavigationType.MAIL && mailId != null) {
return load(true, mailId, null, null);
}
@@ -276,6 +288,27 @@ public boolean onNavigationRequested(NavigationType navigationType, String url,
return super.onNavigationRequested(navigationType, url, discussionId, writeupId, mailId);
}
+ private boolean gallery(String url) {
+ Bundle info = new Bundle();
+ info.putLong(Constants.KEY_WU_ID, 0);
+ info.putString(Constants.KEY_NICK, "");
+ info.putLong(Constants.KEY_TIME, 0);
+ info.putInt(Constants.KEY_RATING, 0);
+ info.putBoolean(Constants.KEY_UNREAD, false);
+ info.putString(Constants.KEY_URL, url);
+ info.putString(Constants.KEY_THUMBNAIL_URL, url);
+
+ Bundle[] infoArray = new Bundle[] { info };
+ Intent intent = new Intent(MailActivity.this, GalleryActivity.class);
+ intent.putExtra(Constants.KEY_URL, url);
+ intent.putExtra(Constants.KEY_BUNDLE_ARRAY, infoArray);
+
+ startActivityForResult(intent, Constants.REQUEST_GALLERY);
+ overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out);
+
+ return true;
+ }
+
@Override
protected void onListViewDataRequested() {
Mail lastMail = null;