From e40b8aa0628e6a32322891bb047143bd75e350ed Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Thu, 15 Aug 2019 09:38:30 +0300 Subject: support flavor_image/flavor_stream supplied via API prevent GalleryActivity lockup if flavor image is not found --- .../main/java/org/fox/ttrss/GalleryActivity.java | 130 +++++++++++---------- .../main/java/org/fox/ttrss/HeadlinesFragment.java | 4 +- .../src/main/java/org/fox/ttrss/types/Article.java | 15 +++ 3 files changed, 87 insertions(+), 62 deletions(-) (limited to 'org.fox.ttrss') diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryActivity.java index 8e7c4756..ebcceaf4 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryActivity.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryActivity.java @@ -151,6 +151,72 @@ public class GalleryActivity extends CommonActivity { } } + boolean collectGalleryContents(String imgSrcFirst, Document doc, List uncheckedItems ) { + Elements elems = doc.select("img,video"); + + boolean firstFound = false; + + for (Element elem : elems) { + + GalleryEntry item = new GalleryEntry(); + + if ("video".equals(elem.tagName().toLowerCase())) { + String cover = elem.attr("poster"); + + Element source = elem.select("source").first(); + String src = source.attr("src"); + + //Log.d(TAG, "vid/src=" + src); + + if (src.startsWith("//")) { + src = "https:" + src; + } + + if (imgSrcFirst.equals(src)) + firstFound = true; + + item.url = src; + item.coverUrl = cover; + item.type = GalleryEntry.GalleryEntryType.TYPE_VIDEO; + + } else { + String src = elem.attr("src"); + + if (src.startsWith("//")) { + src = "https:" + src; + } + + if (imgSrcFirst.equals(src)) + firstFound = true; + + Log.d(TAG, "img/fir=" + imgSrcFirst + ";"); + Log.d(TAG, "img/src=" + src + "; ff=" + firstFound); + + try { + Uri checkUri = Uri.parse(src); + + if (!"data".equals(checkUri.getScheme().toLowerCase())) { + item.url = src; + item.type = GalleryEntry.GalleryEntryType.TYPE_IMAGE; + } + + } catch (Exception e) { + e.printStackTrace(); + } + + } + + if ((firstFound || imgSrcFirst.equals("")) && item.url != null) { + if (m_items.size() == 0) + m_items.add(item); + else + uncheckedItems.add(item); + } + } + + return firstFound; + } + @Override public void onCreate(Bundle savedInstanceState) { ActivityCompat.postponeEnterTransition(this); @@ -182,67 +248,11 @@ public class GalleryActivity extends CommonActivity { String imgSrcFirst = getIntent().getStringExtra("firstSrc"); Document doc = Jsoup.parse(m_content); - Elements elems = doc.select("img,video"); - boolean firstFound = false; - - for (Element elem : elems) { - - GalleryEntry item = new GalleryEntry(); - - if ("video".equals(elem.tagName().toLowerCase())) { - String cover = elem.attr("poster"); - - Element source = elem.select("source").first(); - String src = source.attr("src"); - - //Log.d(TAG, "vid/src=" + src); - - if (src.startsWith("//")) { - src = "https:" + src; - } - - if (imgSrcFirst.equals(src)) - firstFound = true; - - item.url = src; - item.coverUrl = cover; - item.type = GalleryEntry.GalleryEntryType.TYPE_VIDEO; - - } else { - String src = elem.attr("src"); - - if (src.startsWith("//")) { - src = "https:" + src; - } - - if (imgSrcFirst.equals(src)) - firstFound = true; - - Log.d(TAG, "img/fir=" + imgSrcFirst); - Log.d(TAG, "img/src=" + src + "; ff=" + firstFound); - - try { - Uri checkUri = Uri.parse(src); - - if (!"data".equals(checkUri.getScheme().toLowerCase())) { - item.url = src; - item.type = GalleryEntry.GalleryEntryType.TYPE_IMAGE; - } - - } catch (Exception e) { - e.printStackTrace(); - } - - } - - if (firstFound && item.url != null) { - if (m_items.size() == 0) - m_items.add(item); - else - uncheckedItems.add(item); - } - } + // if we were unable to find first image, try again for all media content so that + // gallery doesn't lock up because of a pending shared transition + if (!collectGalleryContents(imgSrcFirst, doc, uncheckedItems)) + collectGalleryContents("", doc, uncheckedItems); } findViewById(R.id.gallery_overflow).setOnClickListener(new View.OnClickListener() { diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java index fa53e714..ed3c7b24 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java @@ -1131,12 +1131,12 @@ public class HeadlinesFragment extends StateSavedFragment { if (!m_prefs.getBoolean("headlines_show_content", true)) { holder.excerptView.setVisibility(View.GONE); } else { - String excerpt; + String excerpt = ""; try { if (article.excerpt != null) { excerpt = article.excerpt; - } else { + } else if (article.articleDoc != null) { excerpt = article.articleDoc.text(); if (excerpt.length() > CommonActivity.EXCERPT_MAX_LENGTH) diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Article.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Article.java index 070ddcc0..bb2c09f1 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Article.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/Article.java @@ -39,6 +39,8 @@ public class Article implements Parcelable { public String author; public String note; public boolean selected; + public String flavor_image; + public String flavor_stream; /* not serialized */ transient public Document articleDoc; @@ -67,6 +69,19 @@ public class Article implements Parcelable { } public void collectMediaInfo() { + if (flavor_image != null && flavor_image.length() > 0) { + flavorImageUri = flavor_image; + + flavorImage = new Element("img") + .attr("src", flavorImageUri); + + if (flavor_stream != null && flavor_stream.length() > 0) { + flavorStreamUri = flavor_stream; + } + + return; + } + articleDoc = Jsoup.parse(content); if (articleDoc != null) { -- cgit v1.2.3