diff --git a/res/layout/article_fragment.xml b/res/layout/article_fragment.xml index 62f15143..596e4117 100644 --- a/res/layout/article_fragment.xml +++ b/res/layout/article_fragment.xml @@ -40,14 +40,7 @@ android:layout_height="wrap_content" android:gravity="center_vertical" android:layout_weight="0" - android:layout_gravity="center_vertical" > - - + android:layout_gravity="center_vertical" > - - diff --git a/res/layout/article_pager.xml b/res/layout/article_pager.xml new file mode 100644 index 00000000..7647cce7 --- /dev/null +++ b/res/layout/article_pager.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/src/org/fox/ttrss/ArticleFragment.java b/src/org/fox/ttrss/ArticleFragment.java index f9c665ab..cc406e85 100644 --- a/src/org/fox/ttrss/ArticleFragment.java +++ b/src/org/fox/ttrss/ArticleFragment.java @@ -31,16 +31,26 @@ import android.widget.TextView; import com.google.ads.AdRequest; import com.google.ads.AdView; -public class ArticleFragment extends Fragment implements OnClickListener { +public class ArticleFragment extends Fragment { @SuppressWarnings("unused") private final String TAG = this.getClass().getSimpleName(); private SharedPreferences m_prefs; private Article m_article; private OnlineServices m_onlineServices; - private Article m_nextArticle; - private Article m_prevArticle; - private GestureDetector m_gestureDetector; + //private Article m_nextArticle; + //private Article m_prevArticle; + + public ArticleFragment() { + super(); + } + + public ArticleFragment(Article article) { + super(); + + m_article = article; + } + private View.OnTouchListener m_gestureListener; @Override @@ -51,17 +61,6 @@ public class ArticleFragment extends Fragment implements OnClickListener { } View view = inflater.inflate(R.layout.article_fragment, container, false); - - m_gestureDetector = new GestureDetector(new MyGestureDetector()); - m_gestureListener = new View.OnTouchListener() { - public boolean onTouch(View v, MotionEvent aEvent) { - if (m_gestureDetector.onTouchEvent(aEvent)) - return true; - else - return false; - } - }; - Activity activity = (Activity)getActivity(); @@ -191,26 +190,6 @@ public class ArticleFragment extends Fragment implements OnClickListener { av.setVisibility(View.GONE); } } - - ImageView next = (ImageView)view.findViewById(R.id.next_article); - - if (next != null) { - if (m_nextArticle != null) { - next.setOnClickListener(this); - } else { - next.setImageResource(R.drawable.ic_next_article_disabled); - } - } - - ImageView prev = (ImageView)view.findViewById(R.id.prev_article); - - if (prev != null) { - if (m_prevArticle != null) { - prev.setOnClickListener(this); - } else { - prev.setImageResource(R.drawable.ic_prev_article_disabled); - } - } } @@ -228,6 +207,7 @@ public class ArticleFragment extends Fragment implements OnClickListener { out.putParcelable("article", m_article); } + @Override public void onAttach(Activity activity) { @@ -235,59 +215,7 @@ public class ArticleFragment extends Fragment implements OnClickListener { m_prefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); m_onlineServices = (OnlineServices)activity; - m_article = m_onlineServices.getSelectedArticle(); - - m_prevArticle = m_onlineServices.getRelativeArticle(m_article, RelativeArticle.BEFORE); - m_nextArticle = m_onlineServices.getRelativeArticle(m_article, RelativeArticle.AFTER); + //m_article = m_onlineServices.getSelectedArticle(); } - @Override - public void onClick(View v) { - if (v.getId() == R.id.next_article) { - m_onlineServices.openArticle(m_nextArticle, 0); - } else if (v.getId() == R.id.prev_article) { - m_onlineServices.openArticle(m_prevArticle, R.anim.slide_right); - } - } - - // http://blog.blackmoonit.com/2010/07/gesture-detection-swipe-detection_4292.html - class MyGestureDetector extends SimpleOnGestureListener { - private static final int SWIPE_MIN_DISTANCE = 100; - private static final int SWIPE_MAX_OFF_PATH = 100; - private static final int SWIPE_THRESHOLD_VELOCITY = 100; - - @Override - public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { - float dX = e2.getX()-e1.getX(); - float dY = e1.getY()-e2.getY(); - if (Math.abs(dY)=SWIPE_THRESHOLD_VELOCITY && - Math.abs(dX)>=SWIPE_MIN_DISTANCE ) { - if (dX>0) { - //Log.d(TAG, "Right swipe"); - - if (m_prevArticle != null) - m_onlineServices.openArticle(m_prevArticle, R.anim.slide_right); - - } else { - //Log.d(TAG, "Left swipe"); - - if (m_nextArticle != null) - m_onlineServices.openArticle(m_nextArticle, 0); - - } - return true; - /* } else if (Math.abs(dX)=SWIPE_THRESHOLD_VELOCITY && - Math.abs(dY)>=SWIPE_MIN_DISTANCE ) { - if (dY>0) { - Log.d(TAG, "Up swipe"); - } else { - Log.d(TAG, "Down swipe"); - } - return true; */ - } - return false; - } - }; } diff --git a/src/org/fox/ttrss/ArticlePager.java b/src/org/fox/ttrss/ArticlePager.java new file mode 100644 index 00000000..e8638dd2 --- /dev/null +++ b/src/org/fox/ttrss/ArticlePager.java @@ -0,0 +1,100 @@ +package org.fox.ttrss; + +import android.app.Activity; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentStatePagerAdapter; +import android.support.v4.view.ViewPager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +public class ArticlePager extends Fragment { + + private PagerAdapter m_adapter; + private OnlineServices m_onlineServices; + private HeadlinesFragment m_hf; + private Article m_article; + + private class PagerAdapter extends FragmentStatePagerAdapter { + + public PagerAdapter(FragmentManager fm, Article article) { + super(fm); + } + + @Override + public Fragment getItem(int position) { + Article article = m_hf.getArticleAtPosition(position); + + if (article != null) { + ArticleFragment af = new ArticleFragment(article); + return af; + } + return null; + } + + @Override + public int getCount() { + return m_hf.getAllArticles().size(); + } + + } + + public ArticlePager() { + super(); + } + + public ArticlePager(Article article) { + super(); + + m_article = article; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.article_pager, container, false); + + m_adapter = new PagerAdapter(getActivity().getSupportFragmentManager(), m_onlineServices.getSelectedArticle()); + + ViewPager pager = (ViewPager) view.findViewById(R.id.article_pager); + + HeadlinesFragment hf = (HeadlinesFragment)getActivity().getSupportFragmentManager().findFragmentById(R.id.headlines_fragment); + int position = hf.getArticlePosition(m_article); + + pager.setAdapter(m_adapter); + pager.setCurrentItem(position); + pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { + + @Override + public void onPageScrollStateChanged(int arg0) { + } + + @Override + public void onPageScrolled(int arg0, float arg1, int arg2) { + } + + @Override + public void onPageSelected(int position) { + Article article = m_hf.getArticleAtPosition(position); + + if (article != null) { + article.unread = false; + m_onlineServices.setSelectedArticle(article); + m_onlineServices.saveArticleUnread(article); + } + } + }); + + return view; + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + + m_hf = (HeadlinesFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.headlines_fragment); + m_onlineServices = (OnlineServices)activity; + } + +} diff --git a/src/org/fox/ttrss/HeadlinesFragment.java b/src/org/fox/ttrss/HeadlinesFragment.java index 56741f90..3a0232df 100644 --- a/src/org/fox/ttrss/HeadlinesFragment.java +++ b/src/org/fox/ttrss/HeadlinesFragment.java @@ -479,6 +479,11 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, public void notifyUpdated() { m_adapter.notifyDataSetChanged(); + + Article article = m_onlineServices.getSelectedArticle(); + if (article != null) { + setActiveArticleId(article.id); + } } public ArticleList getAllArticles() { @@ -547,5 +552,9 @@ public class HeadlinesFragment extends Fragment implements OnItemClickListener, return m_activeArticleId; } + public int getArticlePosition(Article article) { + return m_adapter.getPosition(article); + } + } diff --git a/src/org/fox/ttrss/MainActivity.java b/src/org/fox/ttrss/MainActivity.java index 6c4672ee..8b24f1b3 100644 --- a/src/org/fox/ttrss/MainActivity.java +++ b/src/org/fox/ttrss/MainActivity.java @@ -23,6 +23,7 @@ import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.preference.PreferenceManager; +import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTransaction; import android.util.Log; @@ -1389,7 +1390,13 @@ public class MainActivity extends FragmentActivity implements OnlineServices { findViewById(R.id.article_fragment).setVisibility(View.VISIBLE); } - ArticleFragment frag = new ArticleFragment(); + Fragment frag; + + if (m_smallScreenMode) { + frag = new ArticlePager(article); + } else { + frag = new ArticleFragment(article); + } FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.article_fragment, frag); @@ -1717,4 +1724,10 @@ public class MainActivity extends FragmentActivity implements OnlineServices { viewCategory(cat, browse && cat.id >= 0); } + + @Override + public void setSelectedArticle(Article article) { + m_selectedArticle = article; + updateHeadlines(); + } } \ No newline at end of file diff --git a/src/org/fox/ttrss/OfflineArticleFragment.java b/src/org/fox/ttrss/OfflineArticleFragment.java index 2d1f7f13..4e44e3a2 100644 --- a/src/org/fox/ttrss/OfflineArticleFragment.java +++ b/src/org/fox/ttrss/OfflineArticleFragment.java @@ -33,7 +33,7 @@ import android.widget.TextView; import com.google.ads.AdView; -public class OfflineArticleFragment extends Fragment implements OnClickListener { +public class OfflineArticleFragment extends Fragment { @SuppressWarnings("unused") private final String TAG = this.getClass().getSimpleName(); @@ -41,8 +41,7 @@ public class OfflineArticleFragment extends Fragment implements OnClickListener private int m_articleId; private int m_nextArticleId; private int m_prevArticleId; - private GestureDetector m_gestureDetector; - private View.OnTouchListener m_gestureListener; + private Cursor m_cursor; private OfflineServices m_offlineServices; @@ -57,17 +56,7 @@ public class OfflineArticleFragment extends Fragment implements OnClickListener View view = inflater.inflate(R.layout.article_fragment, container, false); - m_gestureDetector = new GestureDetector(new MyGestureDetector()); - m_gestureListener = new View.OnTouchListener() { - public boolean onTouch(View v, MotionEvent aEvent) { - if (m_gestureDetector.onTouchEvent(aEvent)) - return true; - else - return false; - } - }; - - + // TODO change to interface? Activity activity = getActivity(); @@ -174,8 +163,7 @@ public class OfflineArticleFragment extends Fragment implements OnClickListener e.printStackTrace(); } - if (m_offlineServices.isSmallScreen()) - web.setOnTouchListener(m_gestureListener); + } TextView dv = (TextView)view.findViewById(R.id.date); @@ -198,27 +186,7 @@ public class OfflineArticleFragment extends Fragment implements OnClickListener if (av != null) { av.setVisibility(View.GONE); } - - ImageView next = (ImageView)view.findViewById(R.id.next_article); - - if (next != null) { - if (m_nextArticleId != 0) { - next.setOnClickListener(this); - } else { - next.setImageResource(R.drawable.ic_next_article_disabled); - } - } - - ImageView prev = (ImageView)view.findViewById(R.id.prev_article); - - if (prev != null) { - if (m_prevArticleId != 0) { - prev.setOnClickListener(this); - } else { - prev.setImageResource(R.drawable.ic_prev_article_disabled); - } - } - + } return view; @@ -255,53 +223,5 @@ public class OfflineArticleFragment extends Fragment implements OnClickListener m_nextArticleId = m_offlineServices.getRelativeArticleId(m_articleId, m_offlineServices.getActiveFeedId(), RelativeArticle.AFTER); } - @Override - public void onClick(View v) { - if (v.getId() == R.id.next_article) { - m_offlineServices.openArticle(m_nextArticleId, 0); - } else if (v.getId() == R.id.prev_article) { - m_offlineServices.openArticle(m_prevArticleId, R.anim.slide_right); - } - } - - // http://blog.blackmoonit.com/2010/07/gesture-detection-swipe-detection_4292.html - class MyGestureDetector extends SimpleOnGestureListener { - private static final int SWIPE_MIN_DISTANCE = 100; - private static final int SWIPE_MAX_OFF_PATH = 100; - private static final int SWIPE_THRESHOLD_VELOCITY = 100; - - @Override - public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { - float dX = e2.getX()-e1.getX(); - float dY = e1.getY()-e2.getY(); - if (Math.abs(dY)=SWIPE_THRESHOLD_VELOCITY && - Math.abs(dX)>=SWIPE_MIN_DISTANCE ) { - if (dX>0) { - //Log.d(TAG, "Right swipe"); - - if (m_prevArticleId != 0) - m_offlineServices.openArticle(m_prevArticleId, 0); - - } else { - //Log.d(TAG, "Left swipe"); - if (m_nextArticleId != 0) - m_offlineServices.openArticle(m_nextArticleId, 0); - - } - return true; - /* } else if (Math.abs(dX)=SWIPE_THRESHOLD_VELOCITY && - Math.abs(dY)>=SWIPE_MIN_DISTANCE ) { - if (dY>0) { - Log.d(TAG, "Up swipe"); - } else { - Log.d(TAG, "Down swipe"); - } - return true; */ - } - return false; - } - }; } diff --git a/src/org/fox/ttrss/OnlineServices.java b/src/org/fox/ttrss/OnlineServices.java index a0f20c53..60684738 100644 --- a/src/org/fox/ttrss/OnlineServices.java +++ b/src/org/fox/ttrss/OnlineServices.java @@ -24,5 +24,6 @@ public interface OnlineServices { public boolean getUnreadOnly(); public boolean getLicensed(); public int getApiLevel(); + public void setSelectedArticle(Article article); }