summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2013-10-19 10:13:51 +0400
committerAndrew Dolgov <[email protected]>2013-10-19 10:13:51 +0400
commitb8ee3dab39193c38323439c8d455a2e4929a51db (patch)
tree569eb2c023f56d4bbc55bbc2a14372e0aa1ff5a0 /src
parent0a7c9640d72c156c5496326d802eaae89a9bf658 (diff)
do no ttry setting web software rendering before api 11
reimplement titlewebview as an alternative rendering option bump version
Diffstat (limited to 'src')
-rw-r--r--src/org/fox/ttrss/ArticleFragment.java16
-rw-r--r--src/org/fox/ttrss/offline/OfflineArticleFragment.java20
-rw-r--r--src/org/fox/ttrss/util/TitleWebView.java91
3 files changed, 118 insertions, 9 deletions
diff --git a/src/org/fox/ttrss/ArticleFragment.java b/src/org/fox/ttrss/ArticleFragment.java
index 04e503b5..34e1f2cc 100644
--- a/src/org/fox/ttrss/ArticleFragment.java
+++ b/src/org/fox/ttrss/ArticleFragment.java
@@ -48,7 +48,7 @@ public class ArticleFragment extends Fragment implements GestureDetector.OnDoubl
private Article m_article;
private OnlineActivity m_activity;
private GestureDetector m_detector;
-
+
public void initialize(Article article) {
m_article = article;
}
@@ -92,7 +92,9 @@ public class ArticleFragment extends Fragment implements GestureDetector.OnDoubl
m_article = savedInstanceState.getParcelable("article");
}
- View view = inflater.inflate(R.layout.article_fragment, container, false);
+ boolean useTitleWebView = m_prefs.getBoolean("article_compat_view", false);
+
+ View view = inflater.inflate(useTitleWebView ? R.layout.article_fragment_compat : R.layout.article_fragment, container, false);
if (m_article != null) {
@@ -165,8 +167,10 @@ public class ArticleFragment extends Fragment implements GestureDetector.OnDoubl
registerForContextMenu(web);
// prevent flicker in ics
- if (!m_prefs.getBoolean("webview_hardware_accel", true)) {
- web.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+ if (!m_prefs.getBoolean("webview_hardware_accel", true) || useTitleWebView) {
+ if (android.os.Build.VERSION.SDK_INT >= 11) {
+ web.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+ }
}
web.setWebChromeClient(new WebChromeClient() {
@@ -259,6 +263,10 @@ public class ArticleFragment extends Fragment implements GestureDetector.OnDoubl
"</head>" +
"<body>" + articleContent;
+ if (useTitleWebView) {
+ content += "<p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>";
+ }
+
if (m_article.attachments != null && m_article.attachments.size() != 0) {
String flatContent = articleContent.replaceAll("[\r\n]", "");
boolean hasImages = flatContent.matches(".*?<img[^>+].*?");
diff --git a/src/org/fox/ttrss/offline/OfflineArticleFragment.java b/src/org/fox/ttrss/offline/OfflineArticleFragment.java
index dd7dde5e..b9d9f0de 100644
--- a/src/org/fox/ttrss/offline/OfflineArticleFragment.java
+++ b/src/org/fox/ttrss/offline/OfflineArticleFragment.java
@@ -123,7 +123,9 @@ public class OfflineArticleFragment extends Fragment implements GestureDetector.
m_articleId = savedInstanceState.getInt("articleId");
}
- View view = inflater.inflate(R.layout.article_fragment, container, false);
+ boolean useTitleWebView = m_prefs.getBoolean("article_compat_view", false);
+
+ View view = inflater.inflate(useTitleWebView ? R.layout.article_fragment_compat : R.layout.article_fragment, container, false);
m_cursor = m_activity.getReadableDb().query("articles LEFT JOIN feeds ON (feed_id = feeds."+BaseColumns._ID+")",
new String[] { "articles.*", "feeds.title AS feed_title" }, "articles." + BaseColumns._ID + "=?",
@@ -212,8 +214,10 @@ public class OfflineArticleFragment extends Fragment implements GestureDetector.
getActivity().getTheme().resolveAttribute(R.attr.linkColor, tv, true);
// prevent flicker in ics
- if (!m_prefs.getBoolean("webview_hardware_accel", true)) {
- web.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+ if (!m_prefs.getBoolean("webview_hardware_accel", true) || useTitleWebView) {
+ if (android.os.Build.VERSION.SDK_INT >= 11) {
+ web.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+ }
}
String theme = m_prefs.getString("theme", "THEME_DARK");
@@ -282,8 +286,14 @@ public class OfflineArticleFragment extends Fragment implements GestureDetector.
cssOverride +
"</style>" +
"</head>" +
- "<body>" + articleContent + "</body></html>";
-
+ "<body>" + articleContent;
+
+ if (useTitleWebView) {
+ content += "<p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>";
+ }
+
+ content += "</body></html>";
+
try {
String baseUrl = null;
diff --git a/src/org/fox/ttrss/util/TitleWebView.java b/src/org/fox/ttrss/util/TitleWebView.java
new file mode 100644
index 00000000..4d97918e
--- /dev/null
+++ b/src/org/fox/ttrss/util/TitleWebView.java
@@ -0,0 +1,91 @@
+package org.fox.ttrss.util;
+
+// http://www.techques.com/question/1-9718245/Webview-in-Scrollview
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.webkit.WebView;
+
+public class TitleWebView extends WebView{
+
+ public TitleWebView(Context context, AttributeSet attrs){
+ super(context, attrs);
+ }
+
+ private int titleHeight;
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ // determine height of title bar
+ View title = getChildAt(0);
+ titleHeight = title==null ? 0 : title.getMeasuredHeight();
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev){
+ return true; // don't pass our touch events to children (title bar), we send these in dispatchTouchEvent
+ }
+
+ private boolean touchInTitleBar;
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent me){
+
+ boolean wasInTitle = false;
+ switch(me.getActionMasked()){
+ case MotionEvent.ACTION_DOWN:
+ touchInTitleBar = (me.getY() <= visibleTitleHeight());
+ break;
+
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL:
+ wasInTitle = touchInTitleBar;
+ touchInTitleBar = false;
+ break;
+ }
+ if(touchInTitleBar || wasInTitle) {
+ View title = getChildAt(0);
+ if(title!=null) {
+ // this touch belongs to title bar, dispatch it here
+ me.offsetLocation(0, getScrollY());
+ return title.dispatchTouchEvent(me);
+ }
+ }
+ // this is our touch, offset and process
+ me.offsetLocation(0, -titleHeight);
+ return super.dispatchTouchEvent(me);
+ }
+
+ /**
+ * @return visible height of title (may return negative values)
+ */
+ private int visibleTitleHeight(){
+ return titleHeight-getScrollY();
+ }
+
+ @Override
+ protected void onScrollChanged(int l, int t, int oldl, int oldt){
+ super.onScrollChanged(l, t, oldl, oldt);
+ View title = getChildAt(0);
+ if(title!=null) // undo horizontal scroll, so that title scrolls only vertically
+ title.offsetLeftAndRight(l - title.getLeft());
+ }
+
+ @Override
+ protected void onDraw(Canvas c){
+
+ c.save();
+ int tH = visibleTitleHeight();
+ if(tH>0) {
+ // clip so that it doesn't clear background under title bar
+ int sx = getScrollX(), sy = getScrollY();
+ c.clipRect(sx, sy+tH, sx+getWidth(), sy+getHeight());
+ }
+ c.translate(0, titleHeight);
+ super.onDraw(c);
+ c.restore();
+ }
+ }