diff options
-rw-r--r-- | AndroidManifest.xml | 4 | ||||
-rw-r--r-- | res/layout/article_fragment_compat.xml | 97 | ||||
-rw-r--r-- | res/values/strings.xml | 2 | ||||
-rw-r--r-- | res/xml/preferences.xml | 5 | ||||
-rw-r--r-- | src/org/fox/ttrss/ArticleFragment.java | 16 | ||||
-rw-r--r-- | src/org/fox/ttrss/offline/OfflineArticleFragment.java | 20 | ||||
-rw-r--r-- | src/org/fox/ttrss/util/TitleWebView.java | 91 |
7 files changed, 224 insertions, 11 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 5a8ee1e9..bf1b2d8c 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.fox.ttrss" - android:versionCode="211" - android:versionName="1.16b8" > + android:versionCode="212" + android:versionName="1.16b9" > <uses-sdk android:minSdkVersion="8" diff --git a/res/layout/article_fragment_compat.xml b/res/layout/article_fragment_compat.xml new file mode 100644 index 00000000..8c37eb72 --- /dev/null +++ b/res/layout/article_fragment_compat.xml @@ -0,0 +1,97 @@ +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/article_fragment" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:background="?articleBackground" + android:orientation="vertical" + android:padding="5sp" > + + <org.fox.ttrss.util.TitleWebView + android:id="@+id/content" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_weight="1"> + + <LinearLayout + android:id="@+id/article_header" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_weight="0" + android:orientation="vertical" + android:paddingBottom="2dp" > + + <TextView + android:id="@+id/title" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_weight="1" + android:paddingBottom="4dp" + android:text="My simple headline" + android:textColor="?linkColor" + android:textSize="18sp" /> + + <TextView + android:id="@+id/author" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_weight="1" + android:ellipsize="end" + android:gravity="right" + android:singleLine="true" + android:text="by Author" + android:textColor="?headlineSecondaryTextColor" + android:textSize="12sp" /> + + <TextView + android:id="@+id/comments" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_weight="1" + android:gravity="right" + android:text="24 comments" + android:textColor="?linkColor" + android:textSize="12sp" /> + + <ImageView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="4dp" + android:layout_marginTop="4dp" + android:layout_weight="0" + android:background="?ttrssHorizontalDivider" + android:paddingTop="2dip" /> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingBottom="4dp" + android:layout_weight="1" > + + <TextView + android:id="@+id/tags" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="0.5" + android:ellipsize="end" + android:singleLine="true" + android:text="Example Feed" + android:textColor="?headlineSecondaryTextColor" + android:textSize="12sp" /> + + <TextView + android:id="@+id/date" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="0.5" + android:gravity="right" + android:text="Jan 01, 12:00" + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="?headlineSecondaryTextColor" + android:textSize="12sp" /> + </LinearLayout> + </LinearLayout> + + + </org.fox.ttrss.util.TitleWebView> + +</LinearLayout>
\ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 7b475ddc..229a21e1 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -209,4 +209,6 @@ <string name="download_articles_and_go_offline">Download articles and go offline</string> <string name="tasker_save_and_close">Save and close</string> <string name="synchronize_read_articles_and_go_online">Synchronize read articles and go online</string> + <string name="prefs_compatible_article_layout">Compatible article layout</string> + <string name="prefs_compatible_layout_summary">Enable if you see glitches in article content</string> </resources> diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml index 7f247d92..ec74841a 100644 --- a/res/xml/preferences.xml +++ b/res/xml/preferences.xml @@ -162,6 +162,11 @@ </PreferenceCategory>
<PreferenceCategory android:title="@string/debugging" >
<CheckBoxPreference
+ android:defaultValue="false"
+ android:key="article_compat_view"
+ android:title="@string/prefs_compatible_article_layout"
+ android:summary="@string/prefs_compatible_layout_summary" />
+ <CheckBoxPreference
android:defaultValue="true"
android:key="webview_hardware_accel"
android:summary="@string/accel_webview_summary"
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> </p><p> </p><p> </p><p> </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> </p><p> </p><p> </p><p> </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(); + } + } |