use viewpager-based article swiping for offline mode

This commit is contained in:
Andrew Dolgov 2011-12-10 10:22:27 +03:00
parent 71e5c1f770
commit 3467aa5dc0
7 changed files with 174 additions and 35 deletions

View File

@ -19,7 +19,7 @@ public class ArticlePager extends Fragment {
private class PagerAdapter extends FragmentStatePagerAdapter { private class PagerAdapter extends FragmentStatePagerAdapter {
public PagerAdapter(FragmentManager fm, Article article) { public PagerAdapter(FragmentManager fm) {
super(fm); super(fm);
} }
@ -55,12 +55,11 @@ public class ArticlePager extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.article_pager, container, false); View view = inflater.inflate(R.layout.article_pager, container, false);
m_adapter = new PagerAdapter(getActivity().getSupportFragmentManager(), m_onlineServices.getSelectedArticle()); m_adapter = new PagerAdapter(getActivity().getSupportFragmentManager());
ViewPager pager = (ViewPager) view.findViewById(R.id.article_pager); ViewPager pager = (ViewPager) view.findViewById(R.id.article_pager);
HeadlinesFragment hf = (HeadlinesFragment)getActivity().getSupportFragmentManager().findFragmentById(R.id.headlines_fragment); int position = m_hf.getArticlePosition(m_article);
int position = hf.getArticlePosition(m_article);
pager.setAdapter(m_adapter); pager.setAdapter(m_adapter);
pager.setCurrentItem(position); pager.setCurrentItem(position);
@ -79,9 +78,11 @@ public class ArticlePager extends Fragment {
Article article = m_hf.getArticleAtPosition(position); Article article = m_hf.getArticleAtPosition(position);
if (article != null) { if (article != null) {
article.unread = false; if (article.unread) {
article.unread = false;
m_onlineServices.saveArticleUnread(article);
}
m_onlineServices.setSelectedArticle(article); m_onlineServices.setSelectedArticle(article);
m_onlineServices.saveArticleUnread(article);
} }
} }
}); });

View File

@ -1070,7 +1070,11 @@ public class MainActivity extends FragmentActivity implements OnlineServices {
m_selectedArticle = null; m_selectedArticle = null;
initMainMenu(); initMainMenu();
refreshFeeds();
if (!m_enableCats || m_activeCategory != null)
refreshFeeds();
else
refreshCategories();
} }

View File

@ -14,6 +14,7 @@ import android.database.sqlite.SQLiteStatement;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.provider.BaseColumns; import android.provider.BaseColumns;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction; import android.support.v4.app.FragmentTransaction;
import android.util.Log; import android.util.Log;
@ -625,11 +626,12 @@ public class OfflineActivity extends FragmentActivity implements
} }
// we don't want to lose selected article in headlines so we refresh them before setting selected id to 0
refreshViews();
m_selectedArticleId = 0; m_selectedArticleId = 0;
initMainMenu(); initMainMenu();
refreshViews();
} }
private int getSelectedArticleCount() { private int getSelectedArticleCount() {
@ -990,12 +992,18 @@ public class OfflineActivity extends FragmentActivity implements
stmt.execute(); stmt.execute();
stmt.close(); stmt.close();
OfflineArticleFragment frag = new OfflineArticleFragment(); Fragment frag;
if (m_smallScreenMode) {
frag = new OfflineArticlePager(articleId);
} else {
frag = new OfflineArticleFragment(articleId);
}
FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.article_fragment, frag); ft.replace(R.id.article_fragment, frag);
ft.commit(); ft.commit();
if (m_compatMode) { if (m_compatMode) {
if (compatAnimation == 0) if (compatAnimation == 0)
findViewById(R.id.main).setAnimation( findViewById(R.id.main).setAnimation(
@ -1020,4 +1028,10 @@ public class OfflineActivity extends FragmentActivity implements
public int getSelectedArticleId() { public int getSelectedArticleId() {
return m_selectedArticleId; return m_selectedArticleId;
} }
@Override
public void setSelectedArticleId(int articleId) {
m_selectedArticleId = articleId;
refreshViews();
}
} }

View File

@ -39,19 +39,23 @@ public class OfflineArticleFragment extends Fragment {
private SharedPreferences m_prefs; private SharedPreferences m_prefs;
private int m_articleId; private int m_articleId;
private int m_nextArticleId;
private int m_prevArticleId;
private Cursor m_cursor; private Cursor m_cursor;
private OfflineServices m_offlineServices; private OfflineServices m_offlineServices;
public OfflineArticleFragment() {
super();
}
public OfflineArticleFragment(int articleId) {
super();
m_articleId = articleId;
}
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (savedInstanceState != null) { if (savedInstanceState != null) {
m_articleId = savedInstanceState.getInt("articleId"); m_articleId = savedInstanceState.getInt("articleId");
m_prevArticleId = savedInstanceState.getInt("prevArticleId");
m_nextArticleId = savedInstanceState.getInt("nextArticleId");
} }
View view = inflater.inflate(R.layout.article_fragment, container, false); View view = inflater.inflate(R.layout.article_fragment, container, false);
@ -204,9 +208,6 @@ public class OfflineArticleFragment extends Fragment {
super.onSaveInstanceState(out); super.onSaveInstanceState(out);
out.putInt("articleId", m_articleId); out.putInt("articleId", m_articleId);
out.putInt("prevArticleId", m_prevArticleId);
out.putInt("nextArticleId", m_nextArticleId);
} }
@Override @Override
@ -216,11 +217,6 @@ public class OfflineArticleFragment extends Fragment {
m_prefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); m_prefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
m_offlineServices = (OfflineServices)activity; m_offlineServices = (OfflineServices)activity;
m_articleId = m_offlineServices.getSelectedArticleId();
m_prevArticleId = m_offlineServices.getRelativeArticleId(m_articleId, m_offlineServices.getActiveFeedId(), RelativeArticle.BEFORE);
m_nextArticleId = m_offlineServices.getRelativeArticleId(m_articleId, m_offlineServices.getActiveFeedId(), RelativeArticle.AFTER);
} }

View File

@ -0,0 +1,108 @@
package org.fox.ttrss;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteStatement;
import android.os.Bundle;
import android.provider.BaseColumns;
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 OfflineArticlePager extends Fragment {
private PagerAdapter m_adapter;
private OfflineServices m_offlineServices;
private OfflineHeadlinesFragment m_hf;
private int m_articleId;
private class PagerAdapter extends FragmentStatePagerAdapter {
public PagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
int articleId = m_hf.getArticleIdAtPosition(position);
if (articleId != 0) {
return new OfflineArticleFragment(articleId);
}
return null;
}
@Override
public int getCount() {
return m_hf.getArticleCount();
}
}
public OfflineArticlePager() {
super();
}
public OfflineArticlePager(int articleId) {
super();
m_articleId = articleId;
}
@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());
ViewPager pager = (ViewPager) view.findViewById(R.id.article_pager);
int position = m_hf.getArticleIdPosition(m_articleId);
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) {
int articleId = m_hf.getArticleIdAtPosition(position);
if (articleId != 0) {
m_offlineServices.setSelectedArticleId(articleId);
SQLiteStatement stmt = m_offlineServices.getWritableDb().compileStatement(
"UPDATE articles SET unread = 0 " + "WHERE " + BaseColumns._ID
+ " = ?");
stmt.bindLong(1, articleId);
stmt.execute();
stmt.close();
}
}
});
return view;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
m_hf = (OfflineHeadlinesFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.headlines_fragment);
m_offlineServices = (OfflineServices)activity;
}
}

View File

@ -107,6 +107,7 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
if (m_cursor != null) { if (m_cursor != null) {
m_adapter.changeCursor(m_cursor); m_adapter.changeCursor(m_cursor);
setActiveArticleId(m_offlineServices.getSelectedArticleId());
m_adapter.notifyDataSetChanged(); m_adapter.notifyDataSetChanged();
} }
} }
@ -229,7 +230,9 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
public int getItemViewType(int position) { public int getItemViewType(int position) {
Cursor c = (Cursor) getItem(position); Cursor c = (Cursor) getItem(position);
if (c.getLong(0) == m_activeArticleId) { //Log.d(TAG, "@gIVT " + position + " " + c.getInt(0) + " vs " + m_activeArticleId);
if (c.getInt(0) == m_activeArticleId) {
return VIEW_SELECTED; return VIEW_SELECTED;
} else if (c.getInt(c.getColumnIndex("unread")) == 1) { } else if (c.getInt(c.getColumnIndex("unread")) == 1) {
return VIEW_UNREAD; return VIEW_UNREAD;
@ -394,16 +397,15 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
m_adapter.notifyDataSetChanged(); m_adapter.notifyDataSetChanged();
} }
public void setActiveArticleId(int id) { public void setActiveArticleId(int articleId) {
m_activeArticleId = id; m_activeArticleId = articleId;
m_adapter.notifyDataSetChanged(); // m_adapter.notifyDataSetChanged();
/* ListView list = (ListView)getView().findViewById(R.id.headlines); ListView list = (ListView)getView().findViewById(R.id.headlines);
if (list != null) { if (list != null) {
int position = m_adapter.getPosition(getArticleById(id)); list.setSelection(getArticleIdPosition(articleId));
list.setSelection(position); }
} */
} }
public Cursor getArticleAtPosition(int position) { public Cursor getArticleAtPosition(int position) {
@ -411,18 +413,31 @@ public class OfflineHeadlinesFragment extends Fragment implements OnItemClickLis
} }
public int getArticleIdAtPosition(int position) { public int getArticleIdAtPosition(int position) {
Cursor c = getArticleAtPosition(position); /*Cursor c = getArticleAtPosition(position);
if (c != null) { if (c != null) {
int id = c.getInt(0); int id = c.getInt(0);
return id; return id;
} } */
return 0; return (int) m_adapter.getItemId(position);
} }
public int getActiveArticleId() { public int getActiveArticleId() {
return m_activeArticleId; return m_activeArticleId;
} }
public int getArticleIdPosition(int articleId) {
for (int i = 0; i < m_adapter.getCount(); i++) {
if (articleId == m_adapter.getItemId(i))
return i;
}
return 0;
}
public int getArticleCount() {
return m_adapter.getCount();
}
} }

View File

@ -13,4 +13,5 @@ public interface OfflineServices {
public int getSelectedArticleId(); public int getSelectedArticleId();
public void initMainMenu(); public void initMainMenu();
public boolean isSmallScreen(); public boolean isSmallScreen();
public void setSelectedArticleId(int articleId);
} }