Merge pull request #457 from dosiecki/master

Android: Refactor Story Loading
This commit is contained in:
Samuel Clay 2014-01-08 10:50:26 -08:00
commit 77e1228c39
26 changed files with 130 additions and 310 deletions

View file

@ -44,8 +44,6 @@ public class AllSharedStoriesItemsList extends ItemsList {
listTransaction.add(R.id.activity_itemlist_container, itemListFragment, AllSharedStoriesItemListFragment.class.getName());
listTransaction.commit();
}
triggerRefresh(1);
}
@Override

View file

@ -51,8 +51,6 @@ public class AllStoriesItemsList extends ItemsList implements MarkAllReadDialogL
listTransaction.add(R.id.activity_itemlist_container, itemListFragment, AllStoriesItemListFragment.class.getName());
listTransaction.commit();
}
triggerRefresh(1);
}
@Override

View file

@ -50,6 +50,7 @@ public class FeedItemsList extends ItemsList {
Feed feed = Feed.fromCursor(cursor);
setTitle(feed.title);
}
cursor.close();
itemListFragment = (FeedItemListFragment) fragmentManager.findFragmentByTag(FeedItemListFragment.class.getName());
if (itemListFragment == null) {
@ -59,8 +60,6 @@ public class FeedItemsList extends ItemsList {
listTransaction.add(R.id.activity_itemlist_container, itemListFragment, FeedItemListFragment.class.getName());
listTransaction.commit();
}
triggerRefresh(1);
}
public void deleteFeed() {

View file

@ -59,8 +59,6 @@ public class FolderItemsList extends ItemsList implements MarkAllReadDialogListe
listTransaction.add(R.id.activity_itemlist_container, itemListFragment, FolderItemListFragment.class.getName());
listTransaction.commit();
}
triggerRefresh(1);
}
@Override

View file

@ -42,7 +42,7 @@ public class FolderReading extends Reading {
@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle bundle) {
return new CursorLoader(this, FeedProvider.MULTIFEED_STORIES_URI, null, DatabaseConstants.getStorySelectionFromState(currentState), feedIds, null);
return new CursorLoader(this, FeedProvider.MULTIFEED_STORIES_URI, null, DatabaseConstants.getStorySelectionFromState(currentState), feedIds, DatabaseConstants.getStorySortOrder(PrefsUtils.getStoryOrderForFolder(this, folderName)));
}
@Override

View file

@ -108,19 +108,23 @@ public abstract class ItemsList extends NbFragmentActivity implements ActionComp
@Override
public void storyOrderChanged(StoryOrder newValue) {
FeedUtils.clearStories(this);
updateStoryOrderPreference(newValue);
itemListFragment.setStoryOrder(newValue);
itemListFragment.resetPagination();
stopLoading = false;
triggerRefresh(1);
itemListFragment.hasUpdated();
}
public abstract void updateStoryOrderPreference(StoryOrder newValue);
@Override
public void readFilterChanged(ReadFilter newValue) {
FeedUtils.clearStories(this);
updateReadFilterPreference(newValue);
itemListFragment.resetPagination();
stopLoading = false;
triggerRefresh(1);
itemListFragment.hasUpdated();
}
protected abstract void updateReadFilterPreference(ReadFilter newValue);

View file

@ -17,6 +17,7 @@ import com.newsblur.fragment.FolderListFragment;
import com.newsblur.fragment.LogoutDialogFragment;
import com.newsblur.fragment.SyncUpdateFragment;
import com.newsblur.service.SyncService;
import com.newsblur.util.FeedUtils;
import com.newsblur.util.PrefsUtils;
import com.newsblur.view.StateToggleButton.StateChangedListener;
@ -65,6 +66,8 @@ public class Main extends NbFragmentActivity implements StateChangedListener, Sy
if (PrefsUtils.isTimeToAutoSync(this)) {
triggerRefresh();
}
// clear all stories from the DB, the story activities will load them.
FeedUtils.clearStories(this);
}
/**

View file

@ -144,7 +144,7 @@ public abstract class Reading extends NbFragmentActivity implements OnPageChange
@Override
public void onLoaderReset(Loader<Cursor> loader) {
;
readingAdapter.swapCursor(null);
}
@Override
@ -515,7 +515,6 @@ public abstract class Reading extends NbFragmentActivity implements OnPageChange
boolean unreadFound = false;
boolean error = false;
unreadSearch:while (!unreadFound) {
Story story = readingAdapter.getStory(candidate);
if (story == null) {

View file

@ -44,8 +44,6 @@ public class SavedStoriesItemsList extends ItemsList {
listTransaction.add(R.id.activity_itemlist_container, itemListFragment, SavedStoriesItemListFragment.class.getName());
listTransaction.commit();
}
triggerRefresh(1);
}
@Override

View file

@ -12,6 +12,7 @@ import com.newsblur.database.FeedProvider;
import com.newsblur.database.MixedFeedsReadingAdapter;
import com.newsblur.service.SyncService;
import com.newsblur.util.FeedUtils;
import com.newsblur.util.StoryOrder;
public class SavedStoriesReading extends Reading {
@ -27,7 +28,7 @@ public class SavedStoriesReading extends Reading {
@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle bundle) {
return new CursorLoader(this, FeedProvider.STARRED_STORIES_URI, null, null, null, null);
return new CursorLoader(this, FeedProvider.STARRED_STORIES_URI, null, null, null, DatabaseConstants.getStorySortOrder(StoryOrder.NEWEST));
}
@Override

View file

@ -42,8 +42,6 @@ public class SocialFeedItemsList extends ItemsList {
listTransaction.add(R.id.activity_itemlist_container, itemListFragment, SocialFeedItemListFragment.class.getName());
listTransaction.commit();
}
triggerRefresh(1);
}

View file

@ -49,7 +49,7 @@ public class SocialFeedReading extends Reading {
@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle bundle) {
Uri storiesURI = FeedProvider.SOCIALFEED_STORIES_URI.buildUpon().appendPath(userId).build();
return new CursorLoader(this, storiesURI, null, DatabaseConstants.getStorySelectionFromState(currentState), null, null);
return new CursorLoader(this, storiesURI, null, DatabaseConstants.getStorySelectionFromState(currentState), null, DatabaseConstants.getStorySharedSortOrder(PrefsUtils.getStoryOrderForFeed(this, userId)));
}
@Override

View file

@ -17,7 +17,7 @@ import com.newsblur.R;
import com.newsblur.domain.Feed;
import com.newsblur.domain.Story;
public class FeedItemsAdapter extends SimpleCursorAdapter implements StoryItemsAdapter {
public class FeedItemsAdapter extends StoryItemsAdapter {
private Cursor cursor;
private final Feed feed;

View file

@ -378,7 +378,12 @@ public class FeedProvider extends ContentProvider {
" FROM " + DatabaseConstants.STARRED_STORIES_TABLE +
" INNER JOIN " + DatabaseConstants.FEED_TABLE +
" ON " + DatabaseConstants.STARRED_STORIES_TABLE + "." + DatabaseConstants.STORY_FEED_ID + " = " + DatabaseConstants.FEED_TABLE + "." + DatabaseConstants.FEED_ID;
return db.rawQuery(savedStoriesQuery, null);
StringBuilder q = new StringBuilder();
q.append(savedStoriesQuery);
if (!TextUtils.isEmpty(sortOrder)) {
q.append(" ORDER BY " + sortOrder);
}
return db.rawQuery(q.toString(), null);
case STARRED_STORIES_COUNT:
return db.query(DatabaseConstants.STARRED_STORY_COUNT_TABLE, projection, selection, selectionArgs, null, null, null);

View file

@ -7,7 +7,6 @@ import android.content.Context;
import android.database.Cursor;
import android.graphics.Color;
import android.graphics.Typeface;
import android.support.v4.widget.SimpleCursorAdapter;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
@ -19,7 +18,7 @@ import com.newsblur.activity.NewsBlurApplication;
import com.newsblur.domain.Story;
import com.newsblur.util.ImageLoader;
public class MultipleFeedItemsAdapter extends SimpleCursorAdapter implements StoryItemsAdapter {
public class MultipleFeedItemsAdapter extends StoryItemsAdapter {
private Cursor cursor;
private ImageLoader imageLoader;

View file

@ -1,13 +1,21 @@
package com.newsblur.database;
import android.content.Context;
import android.database.Cursor;
import android.support.v4.widget.SimpleCursorAdapter;
import java.util.List;
import com.newsblur.domain.Story;
public interface StoryItemsAdapter {
public abstract class StoryItemsAdapter extends SimpleCursorAdapter {
Story getStory(int position);
public StoryItemsAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
super(context, layout, c, from, to, flags);
}
List<Story> getPreviousStories(int position);
public abstract Story getStory(int position);
public abstract List<Story> getPreviousStories(int position);
}

View file

@ -13,8 +13,6 @@ import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
@ -31,14 +29,10 @@ import com.newsblur.util.NetworkUtils;
import com.newsblur.util.StoryOrder;
import com.newsblur.view.SocialItemViewBinder;
public class AllSharedStoriesItemListFragment extends ItemListFragment implements LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, OnScrollListener {
public class AllSharedStoriesItemListFragment extends ItemListFragment implements LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener {
public int currentState;
private boolean doRequest = true;
private ContentResolver contentResolver;
private SimpleCursorAdapter adapter;
private boolean requestedPage;
private int currentPage = 0;
public static int ITEMLIST_LOADER = 0x01;
private Cursor countCursor;
@ -52,9 +46,6 @@ public class AllSharedStoriesItemListFragment extends ItemListFragment implement
super.onCreate(savedInstanceState);
currentState = getArguments().getInt("currentState");
storyOrder = (StoryOrder)getArguments().getSerializable("storyOrder");
if (!NetworkUtils.isOnline(getActivity())) {
doRequest = false;
}
}
@Override
@ -67,6 +58,10 @@ public class AllSharedStoriesItemListFragment extends ItemListFragment implement
groupFrom = new String[] { DatabaseConstants.STORY_TITLE, DatabaseConstants.STORY_AUTHORS, DatabaseConstants.STORY_TITLE, DatabaseConstants.STORY_SHORTDATE, DatabaseConstants.STORY_INTELLIGENCE_AUTHORS, DatabaseConstants.FEED_TITLE };
groupTo = new int[] { R.id.row_item_title, R.id.row_item_author, R.id.row_item_title, R.id.row_item_date, R.id.row_item_sidebar, R.id.row_item_feedtitle };
Cursor cursor = contentResolver.query(FeedProvider.ALL_SHARED_STORIES_URI, null, DatabaseConstants.getStorySelectionFromState(currentState), null, DatabaseConstants.getStorySortOrder(storyOrder));
adapter = new MultipleFeedItemsAdapter(getActivity(), R.layout.row_socialitem, cursor, groupFrom, groupTo, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
adapter.setViewBinder(new SocialItemViewBinder(getActivity()));
itemList.setAdapter(adapter);
getLoaderManager().initLoader(ITEMLIST_LOADER , null, this);
@ -76,20 +71,6 @@ public class AllSharedStoriesItemListFragment extends ItemListFragment implement
return v;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (adapter == null) {
adapter = new MultipleFeedItemsAdapter(getActivity(), R.layout.row_socialitem, cursor, groupFrom, groupTo, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
adapter.setViewBinder(new SocialItemViewBinder(getActivity()));
itemList.setAdapter(adapter);
}
if (cursor != null) {
adapter.swapCursor(cursor);
}
}
public void hasUpdated() {
if (isAdded()) {
getLoaderManager().restartLoader(ITEMLIST_LOADER , null, this);
@ -105,8 +86,7 @@ public class AllSharedStoriesItemListFragment extends ItemListFragment implement
@Override
public void changeState(int state) {
currentState = state;
Cursor cursor = contentResolver.query(FeedProvider.ALL_SHARED_STORIES_URI, null, DatabaseConstants.getStorySelectionFromState(currentState), null, DatabaseConstants.getStorySortOrder(storyOrder));
adapter.swapCursor(cursor);
hasUpdated();
}
public static ItemListFragment newInstance(int currentState, StoryOrder storyOrder) {
@ -119,18 +99,6 @@ public class AllSharedStoriesItemListFragment extends ItemListFragment implement
return everythingFragment;
}
@Override
public void onScroll(AbsListView view, int firstVisible, int visibleCount, int totalCount) {
if (firstVisible + visibleCount == totalCount && !requestedPage && doRequest) {
currentPage += 1;
requestedPage = true;
((ItemsList) getActivity()).triggerRefresh(currentPage);
}
}
@Override
public void onScrollStateChanged(AbsListView arg0, int arg1) { }
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent i = new Intent(getActivity(), AllSharedStoriesReading.class);
@ -141,12 +109,12 @@ public class AllSharedStoriesItemListFragment extends ItemListFragment implement
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
CursorLoader cursorLoader = new CursorLoader(getActivity(), FeedProvider.ALL_SHARED_STORIES_URI, null, DatabaseConstants.getStorySelectionFromState(currentState), null, DatabaseConstants.getStorySortOrder(storyOrder));
return cursorLoader;
return new CursorLoader(getActivity(), FeedProvider.ALL_SHARED_STORIES_URI, null, DatabaseConstants.getStorySelectionFromState(currentState), null, DatabaseConstants.getStorySortOrder(storyOrder));
}
@Override
public void setStoryOrder(StoryOrder storyOrder) {
this.storyOrder = storyOrder;
}
}

View file

@ -11,8 +11,6 @@ import android.support.v4.widget.CursorAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
@ -29,14 +27,10 @@ import com.newsblur.util.NetworkUtils;
import com.newsblur.util.StoryOrder;
import com.newsblur.view.SocialItemViewBinder;
public class AllStoriesItemListFragment extends StoryItemListFragment implements LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, OnScrollListener {
public class AllStoriesItemListFragment extends StoryItemListFragment implements LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener {
public int currentState;
private boolean doRequest = true;
private ContentResolver contentResolver;
private MultipleFeedItemsAdapter adapter;
private boolean requestedPage;
private int currentPage = 0;
private StoryOrder storyOrder;
@ -47,10 +41,6 @@ public class AllStoriesItemListFragment extends StoryItemListFragment implements
super.onCreate(savedInstanceState);
currentState = getArguments().getInt("currentState");
storyOrder = (StoryOrder)getArguments().getSerializable("storyOrder");
if (!NetworkUtils.isOnline(getActivity())) {
doRequest = false;
}
}
@Override
@ -60,16 +50,14 @@ public class AllStoriesItemListFragment extends StoryItemListFragment implements
itemList.setEmptyView(v.findViewById(R.id.empty_view));
contentResolver = getActivity().getContentResolver();
Cursor cursor = contentResolver.query(FeedProvider.ALL_STORIES_URI, null, DatabaseConstants.getStorySelectionFromState(currentState), null, DatabaseConstants.getStorySortOrder(storyOrder));
Cursor cursor = getActivity().getContentResolver().query(FeedProvider.ALL_STORIES_URI, null, DatabaseConstants.getStorySelectionFromState(currentState), null, DatabaseConstants.getStorySortOrder(storyOrder));
String[] groupFrom = new String[] { DatabaseConstants.STORY_TITLE, DatabaseConstants.STORY_AUTHORS, DatabaseConstants.STORY_TITLE, DatabaseConstants.STORY_SHORTDATE, DatabaseConstants.STORY_INTELLIGENCE_AUTHORS, DatabaseConstants.FEED_TITLE };
int[] groupTo = new int[] { R.id.row_item_title, R.id.row_item_author, R.id.row_item_title, R.id.row_item_date, R.id.row_item_sidebar, R.id.row_item_feedtitle };
getLoaderManager().initLoader(ITEMLIST_LOADER , null, this);
adapter = new MultipleFeedItemsAdapter(getActivity(), R.layout.row_socialitem, cursor, groupFrom, groupTo, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
getLoaderManager().initLoader(ITEMLIST_LOADER , null, this);
itemList.setOnScrollListener(this);
adapter.setViewBinder(new SocialItemViewBinder(getActivity()));
@ -80,13 +68,6 @@ public class AllStoriesItemListFragment extends StoryItemListFragment implements
return v;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (cursor != null) {
adapter.swapCursor(cursor);
}
}
public void hasUpdated() {
if (isAdded()) {
getLoaderManager().restartLoader(ITEMLIST_LOADER , null, this);
@ -102,16 +83,9 @@ public class AllStoriesItemListFragment extends StoryItemListFragment implements
@Override
public void changeState(int state) {
currentState = state;
refreshStories();
hasUpdated();
}
@Override
protected void refreshStories() {
final String selection = DatabaseConstants.getStorySelectionFromState(currentState);
Cursor cursor = contentResolver.query(FeedProvider.ALL_STORIES_URI, null, selection, null, DatabaseConstants.getStorySortOrder(storyOrder));
adapter.swapCursor(cursor);
}
public static ItemListFragment newInstance(int currentState, StoryOrder storyOrder) {
ItemListFragment everythingFragment = new AllStoriesItemListFragment();
Bundle arguments = new Bundle();
@ -122,18 +96,6 @@ public class AllStoriesItemListFragment extends StoryItemListFragment implements
return everythingFragment;
}
@Override
public void onScroll(AbsListView view, int firstVisible, int visibleCount, int totalCount) {
if (firstVisible + visibleCount == totalCount && !requestedPage && doRequest) {
currentPage += 1;
requestedPage = true;
((ItemsList) getActivity()).triggerRefresh(currentPage);
}
}
@Override
public void onScrollStateChanged(AbsListView arg0, int arg1) { }
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent i = new Intent(getActivity(), AllStoriesReading.class);
@ -144,8 +106,7 @@ public class AllStoriesItemListFragment extends StoryItemListFragment implements
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
CursorLoader cursorLoader = new CursorLoader(getActivity(), FeedProvider.ALL_STORIES_URI, null, DatabaseConstants.getStorySelectionFromState(currentState), null, DatabaseConstants.getStorySortOrder(storyOrder));
return cursorLoader;
return new CursorLoader(getActivity(), FeedProvider.ALL_STORIES_URI, null, DatabaseConstants.getStorySelectionFromState(currentState), null, DatabaseConstants.getStorySortOrder(storyOrder));
}
@Override
@ -153,8 +114,4 @@ public class AllStoriesItemListFragment extends StoryItemListFragment implements
this.storyOrder = storyOrder;
}
@Override
protected StoryItemsAdapter getAdapter() {
return adapter;
}
}

View file

@ -13,8 +13,6 @@ import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
@ -32,14 +30,10 @@ import com.newsblur.util.NetworkUtils;
import com.newsblur.util.StoryOrder;
import com.newsblur.view.FeedItemViewBinder;
public class FeedItemListFragment extends StoryItemListFragment implements LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, OnScrollListener {
public class FeedItemListFragment extends StoryItemListFragment implements LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener {
private ContentResolver contentResolver;
private String feedId;
private FeedItemsAdapter adapter;
private int currentState;
private int currentPage = 1;
private boolean requestedPage = false;
public static int ITEMLIST_LOADER = 0x01;
@ -72,7 +66,7 @@ public class FeedItemListFragment extends StoryItemListFragment implements Loade
itemList.setEmptyView(v.findViewById(R.id.empty_view));
contentResolver = getActivity().getContentResolver();
ContentResolver contentResolver = getActivity().getContentResolver();
Uri storiesUri = FeedProvider.FEED_STORIES_URI.buildUpon().appendPath(feedId).build();
Cursor storiesCursor = contentResolver.query(storiesUri, null, DatabaseConstants.getStorySelectionFromState(currentState), null, DatabaseConstants.getStorySortOrder(storyOrder));
Uri feedUri = FeedProvider.FEEDS_URI.buildUpon().appendPath(feedId).build();
@ -116,13 +110,6 @@ public class FeedItemListFragment extends StoryItemListFragment implements Loade
return cursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (cursor != null) {
adapter.swapCursor(cursor);
}
}
public void hasUpdated() {
if (isAdded()) {
getLoaderManager().restartLoader(ITEMLIST_LOADER , null, this);
@ -146,36 +133,12 @@ public class FeedItemListFragment extends StoryItemListFragment implements Loade
public void changeState(int state) {
currentState = state;
refreshStories();
hasUpdated();
}
@Override
protected void refreshStories() {
Uri storiesUri = FeedProvider.FEED_STORIES_URI.buildUpon().appendPath(feedId).build();
Cursor cursor = contentResolver.query(storiesUri, null, DatabaseConstants.getStorySelectionFromState(currentState), null, DatabaseConstants.getStorySortOrder(storyOrder));
adapter.swapCursor(cursor);
}
@Override
public void onScroll(AbsListView view, int firstVisible, int visibleCount, int totalCount) {
if (firstVisible + visibleCount == totalCount && !requestedPage) {
currentPage += 1;
requestedPage = true;
((ItemsList) getActivity()).triggerRefresh(currentPage);
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) { }
@Override
public void setStoryOrder(StoryOrder storyOrder) {
this.storyOrder = storyOrder;
}
@Override
protected StoryItemsAdapter getAdapter() {
return adapter;
}
}

View file

@ -14,8 +14,6 @@ import android.support.v4.widget.CursorAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
@ -33,17 +31,12 @@ import com.newsblur.util.NetworkUtils;
import com.newsblur.util.StoryOrder;
import com.newsblur.view.FeedItemViewBinder;
public class FolderItemListFragment extends StoryItemListFragment implements LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, OnScrollListener {
public class FolderItemListFragment extends StoryItemListFragment implements LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener {
private ContentResolver contentResolver;
private String[] feedIds;
private MultipleFeedItemsAdapter adapter;
private Uri storiesUri;
private int currentState;
private int currentPage = 1;
private String folderName;
private boolean requestedPage = false;
private boolean doRequest = true;
private Folder folder;
private StoryOrder storyOrder;
@ -73,10 +66,6 @@ public class FolderItemListFragment extends StoryItemListFragment implements Loa
ArrayList<String> feedIdArrayList = getArguments().getStringArrayList("feedIds");
feedIds = new String[feedIdArrayList.size()];
feedIdArrayList.toArray(feedIds);
if (!NetworkUtils.isOnline(getActivity())) {
doRequest = false;
}
}
@Override
@ -87,9 +76,8 @@ public class FolderItemListFragment extends StoryItemListFragment implements Loa
itemList.setEmptyView(v.findViewById(R.id.empty_view));
contentResolver = getActivity().getContentResolver();
storiesUri = FeedProvider.MULTIFEED_STORIES_URI;
Cursor cursor = contentResolver.query(storiesUri, null, DatabaseConstants.getStorySelectionFromState(currentState), feedIds, DatabaseConstants.getStorySortOrder(storyOrder));
Cursor cursor = contentResolver.query(FeedProvider.MULTIFEED_STORIES_URI, null, DatabaseConstants.getStorySelectionFromState(currentState), feedIds, DatabaseConstants.getStorySortOrder(storyOrder));
getActivity().startManagingCursor(cursor);
String[] groupFrom = new String[] { DatabaseConstants.STORY_TITLE, DatabaseConstants.FEED_TITLE, DatabaseConstants.STORY_READ, DatabaseConstants.STORY_SHORTDATE, DatabaseConstants.STORY_INTELLIGENCE_AUTHORS, DatabaseConstants.STORY_AUTHORS };
@ -112,16 +100,7 @@ public class FolderItemListFragment extends StoryItemListFragment implements Loa
@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle bundle) {
Uri uri = FeedProvider.MULTIFEED_STORIES_URI;
CursorLoader cursorLoader = new CursorLoader(getActivity(), uri, null, DatabaseConstants.getStorySelectionFromState(currentState), feedIds, DatabaseConstants.getStorySortOrder(storyOrder));
return cursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (cursor != null) {
adapter.swapCursor(cursor);
}
return new CursorLoader(getActivity(), FeedProvider.MULTIFEED_STORIES_URI, null, DatabaseConstants.getStorySelectionFromState(currentState), feedIds, DatabaseConstants.getStorySortOrder(storyOrder));
}
public void hasUpdated() {
@ -148,36 +127,12 @@ public class FolderItemListFragment extends StoryItemListFragment implements Loa
public void changeState(int state) {
currentState = state;
refreshStories();
hasUpdated();
}
@Override
protected void refreshStories() {
final String selection = DatabaseConstants.getStorySelectionFromState(currentState);
Cursor cursor = contentResolver.query(storiesUri, null, selection, feedIds, DatabaseConstants.getStorySortOrder(storyOrder));
getActivity().startManagingCursor(cursor);
adapter.swapCursor(cursor);
}
@Override
public void onScroll(AbsListView view, int firstVisible, int visibleCount, int totalCount) {
if (firstVisible + visibleCount == totalCount && !requestedPage && doRequest) {
currentPage += 1;
requestedPage = true;
((ItemsList) getActivity()).triggerRefresh(currentPage);
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) { }
@Override
public void setStoryOrder(StoryOrder storyOrder) {
this.storyOrder = storyOrder;
}
@Override
protected StoryItemsAdapter getAdapter() {
return adapter;
}
}

View file

@ -1,20 +1,35 @@
package com.newsblur.fragment;
import android.database.Cursor;
import android.support.v4.app.Fragment;
import android.support.v4.content.Loader;
import android.util.Log;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import android.widget.TextView;
import com.newsblur.R;
import com.newsblur.activity.ItemsList;
import com.newsblur.database.StoryItemsAdapter;
import com.newsblur.util.StoryOrder;
public abstract class ItemListFragment extends Fragment {
public abstract class ItemListFragment extends Fragment implements OnScrollListener {
protected int currentPage = 0;
protected boolean requestedPage;
protected StoryItemsAdapter adapter;
public abstract void hasUpdated();
public abstract void changeState(final int state);
public abstract void setStoryOrder(StoryOrder storyOrder);
public void resetPagination() {
this.currentPage = 0;
}
public void setEmptyListView(int rid) {
View v = this.getView();
if (v == null) return; // we might have beat construction?
@ -28,5 +43,33 @@ public abstract class ItemListFragment extends Fragment {
TextView emptyView = (TextView) itemList.getEmptyView();
emptyView.setText(rid);
}
@Override
public synchronized void onScroll(AbsListView view, int firstVisible, int visibleCount, int totalCount) {
if (totalCount != 0 && (firstVisible + visibleCount == totalCount) && !requestedPage) {
currentPage += 1;
requestedPage = true;
triggerRefresh(currentPage);
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) { }
protected void triggerRefresh(int page) {
((ItemsList) getActivity()).triggerRefresh(page);
}
// all child classes need this callback, so implement it here
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (cursor != null) {
if (cursor.getCount() == 0) {
currentPage += 1;
requestedPage = true;
triggerRefresh(currentPage);
}
adapter.swapCursor(cursor);
}
}
}

View file

@ -12,8 +12,6 @@ import android.support.v4.widget.SimpleCursorAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
@ -29,23 +27,15 @@ import com.newsblur.util.NetworkUtils;
import com.newsblur.util.StoryOrder;
import com.newsblur.view.SocialItemViewBinder;
public class SavedStoriesItemListFragment extends ItemListFragment implements LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, OnScrollListener {
public class SavedStoriesItemListFragment extends ItemListFragment implements LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener {
private boolean doRequest = true;
private ContentResolver contentResolver;
private SimpleCursorAdapter adapter;
private boolean requestedPage;
private int currentPage = 0;
public static int ITEMLIST_LOADER = 0x01;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!NetworkUtils.isOnline(getActivity())) {
doRequest = false;
}
}
@Override
@ -56,7 +46,7 @@ public class SavedStoriesItemListFragment extends ItemListFragment implements Lo
itemList.setEmptyView(v.findViewById(R.id.empty_view));
contentResolver = getActivity().getContentResolver();
Cursor cursor = contentResolver.query(FeedProvider.STARRED_STORIES_URI, null, null, null, null);
Cursor cursor = contentResolver.query(FeedProvider.STARRED_STORIES_URI, null, null, null, DatabaseConstants.getStorySortOrder(StoryOrder.NEWEST));
String[] groupFrom = new String[] { DatabaseConstants.STORY_TITLE, DatabaseConstants.STORY_AUTHORS, DatabaseConstants.STORY_TITLE, DatabaseConstants.STORY_SHORTDATE, DatabaseConstants.STORY_INTELLIGENCE_AUTHORS, DatabaseConstants.FEED_TITLE };
int[] groupTo = new int[] { R.id.row_item_title, R.id.row_item_author, R.id.row_item_title, R.id.row_item_date, R.id.row_item_sidebar, R.id.row_item_feedtitle };
@ -74,13 +64,6 @@ public class SavedStoriesItemListFragment extends ItemListFragment implements Lo
return v;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (cursor != null) {
adapter.swapCursor(cursor);
}
}
public void hasUpdated() {
if (isAdded()) {
getLoaderManager().restartLoader(ITEMLIST_LOADER , null, this);
@ -103,18 +86,6 @@ public class SavedStoriesItemListFragment extends ItemListFragment implements Lo
return fragment;
}
@Override
public void onScroll(AbsListView view, int firstVisible, int visibleCount, int totalCount) {
if (firstVisible + visibleCount == totalCount && !requestedPage && doRequest) {
currentPage += 1;
requestedPage = true;
((ItemsList) getActivity()).triggerRefresh(currentPage);
}
}
@Override
public void onScrollStateChanged(AbsListView arg0, int arg1) { }
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent i = new Intent(getActivity(), SavedStoriesReading.class);
@ -124,8 +95,7 @@ public class SavedStoriesItemListFragment extends ItemListFragment implements Lo
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
CursorLoader cursorLoader = new CursorLoader(getActivity(), FeedProvider.STARRED_STORIES_URI, null, null, null, null);
return cursorLoader;
return new CursorLoader(getActivity(), FeedProvider.STARRED_STORIES_URI, null, null, null, DatabaseConstants.getStorySortOrder(StoryOrder.NEWEST));
}
@Override

View file

@ -13,8 +13,6 @@ import android.support.v4.widget.SimpleCursorAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
@ -30,15 +28,13 @@ import com.newsblur.domain.SocialFeed;
import com.newsblur.util.StoryOrder;
import com.newsblur.view.SocialItemViewBinder;
public class SocialFeedItemListFragment extends ItemListFragment implements LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, OnScrollListener {
public class SocialFeedItemListFragment extends ItemListFragment implements LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener {
private ContentResolver contentResolver;
private String userId, username;
private SimpleCursorAdapter adapter;
private Uri storiesUri;
private SocialFeed socialFeed;
private int currentState, currentPage = 1;
private boolean requestedPage;
private int currentState;
public static int ITEMLIST_LOADER = 0x01;
private Uri socialFeedUri;
@ -58,10 +54,16 @@ public class SocialFeedItemListFragment extends ItemListFragment implements Load
storiesUri = FeedProvider.SOCIALFEED_STORIES_URI.buildUpon().appendPath(userId).build();
setupSocialFeed();
Uri uri = FeedProvider.SOCIALFEED_STORIES_URI.buildUpon().appendPath(userId).build();
Cursor cursor = getActivity().getContentResolver().query(uri, null, DatabaseConstants.getStorySelectionFromState(currentState), null, DatabaseConstants.getStorySharedSortOrder(storyOrder));
groupFroms = new String[] { DatabaseConstants.FEED_FAVICON_URL, DatabaseConstants.FEED_TITLE, DatabaseConstants.STORY_TITLE, DatabaseConstants.STORY_SHORTDATE, DatabaseConstants.STORY_AUTHORS, DatabaseConstants.STORY_INTELLIGENCE_AUTHORS};
groupTos = new int[] { R.id.row_item_feedicon, R.id.row_item_feedtitle, R.id.row_item_title, R.id.row_item_date, R.id.row_item_author, R.id.row_item_sidebar};
adapter = new MultipleFeedItemsAdapter(getActivity(), R.layout.row_socialitem, cursor, groupFroms, groupTos, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
adapter.setViewBinder(new SocialItemViewBinder(getActivity()));
getLoaderManager().initLoader(ITEMLIST_LOADER , null, this);
}
@ -102,19 +104,6 @@ public class SocialFeedItemListFragment extends ItemListFragment implements Load
return cursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (adapter == null) {
adapter = new MultipleFeedItemsAdapter(getActivity(), R.layout.row_socialitem, cursor, groupFroms, groupTos, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
adapter.setViewBinder(new SocialItemViewBinder(getActivity()));
itemList.setAdapter(adapter);
}
if (cursor != null) {
adapter.swapCursor(cursor);
}
}
public void hasUpdated() {
setupSocialFeed();
requestedPage = false;
@ -128,17 +117,6 @@ public class SocialFeedItemListFragment extends ItemListFragment implements Load
adapter.notifyDataSetInvalidated();
}
@Override
public void onScroll(AbsListView view, int firstVisible, int visibleCount, int totalCount) {
if (firstVisible + visibleCount == totalCount) {
if (!requestedPage) {
currentPage += 1;
requestedPage = true;
((ItemsList) getActivity()).triggerRefresh(currentPage);
}
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent i = new Intent(getActivity(), SocialFeedReading.class);
@ -151,15 +129,9 @@ public class SocialFeedItemListFragment extends ItemListFragment implements Load
public void changeState(int state) {
currentState = state;
final String selection = DatabaseConstants.getStorySelectionFromState(state);
Cursor cursor = contentResolver.query(storiesUri, null, selection, null, DatabaseConstants.getStorySharedSortOrder(storyOrder));
adapter.swapCursor(cursor);
getActivity().startManagingCursor(cursor);
hasUpdated();
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) { }
@Override
public void setStoryOrder(StoryOrder storyOrder) {
this.storyOrder = storyOrder;

View file

@ -29,14 +29,13 @@ public abstract class StoryItemListFragment extends ItemListFragment implements
@Override
public boolean onContextItemSelected(MenuItem item) {
final AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
StoryItemsAdapter adapter = getAdapter();
if (item.getItemId() == R.id.menu_mark_story_as_read) {
final Story story = adapter.getStory(menuInfo.position);
if(! story.read) {
List<Story> storiesToMarkAsRead = new ArrayList<Story>();
storiesToMarkAsRead.add(story);
FeedUtils.markStoriesAsRead(storiesToMarkAsRead, getActivity());
refreshStories();
hasUpdated();
}
} else if (item.getItemId() == R.id.menu_mark_previous_stories_as_read) {
final List<Story> previousStories = adapter.getPreviousStories(menuInfo.position);
@ -47,7 +46,7 @@ public abstract class StoryItemListFragment extends ItemListFragment implements
}
}
FeedUtils.markStoriesAsRead(storiesToMarkAsRead, getActivity());
refreshStories();
hasUpdated();
} else if (item.getItemId() == R.id.menu_shared) {
Story story = adapter.getStory(menuInfo.position);
FeedUtils.shareStory(story, getActivity());
@ -55,8 +54,4 @@ public abstract class StoryItemListFragment extends ItemListFragment implements
return super.onContextItemSelected(item);
}
protected abstract void refreshStories();
protected abstract StoryItemsAdapter getAdapter();
}

View file

@ -208,9 +208,6 @@ public class APIManager {
Uri storyUri = FeedProvider.FEED_STORIES_URI.buildUpon().appendPath(feedId).build();
Uri classifierUri = FeedProvider.CLASSIFIER_URI.buildUpon().appendPath(feedId).build();
if (pageNumber == 1) {
contentResolver.delete(storyUri, null, null);
}
contentResolver.delete(classifierUri, null, null);
for (ContentValues classifierValues : storiesResponse.classifiers.getContentValues()) {
@ -241,11 +238,6 @@ public class APIManager {
StoriesResponse storiesResponse = (StoriesResponse) response.getResponse(gson, StoriesResponse.class);
if (!response.isError()) {
if (pageNumber == 1) {
Uri storyUri = FeedProvider.ALL_STORIES_URI;
contentResolver.delete(storyUri, null, null);
}
for (Story story : storiesResponse.stories) {
Uri storyUri = FeedProvider.FEED_STORIES_URI.buildUpon().appendPath(story.feedId).build();
contentResolver.insert(storyUri, story.getValues());
@ -255,7 +247,6 @@ public class APIManager {
for (UserProfile user : storiesResponse.users) {
contentResolver.insert(FeedProvider.USERS_URI, user.getValues());
}
}
return storiesResponse;
}
@ -267,9 +258,6 @@ public class APIManager {
StoriesResponse storiesResponse = (StoriesResponse) response.getResponse(gson, StoriesResponse.class);
if (!response.isError()) {
if (pageNumber == 1) {
contentResolver.delete(FeedProvider.STARRED_STORIES_URI, null, null);
}
for (Story story : storiesResponse.stories) {
contentResolver.insert(FeedProvider.STARRED_STORIES_URI, story.getValues());
insertComments(story);
@ -294,11 +282,6 @@ public class APIManager {
SocialFeedResponse storiesResponse = (SocialFeedResponse) response.getResponse(gson, SocialFeedResponse.class);
if (!response.isError()) {
if (pageNumber == 1) {
Uri storyUri = FeedProvider.ALL_STORIES_URI;
contentResolver.delete(storyUri, null, null);
}
for (Story story : storiesResponse.stories) {
for (String userId : story.sharedUserIds) {
Uri storySocialUri = FeedProvider.SOCIALFEED_STORIES_URI.buildUpon().appendPath(userId).build();
@ -337,15 +320,11 @@ public class APIManager {
SocialFeedResponse socialFeedResponse = (SocialFeedResponse) response.getResponse(gson, SocialFeedResponse.class);
if (!response.isError()) {
Uri storySocialUri = FeedProvider.SOCIALFEED_STORIES_URI.buildUpon().appendPath(userId).build();
if (pageNumber == 1) {
contentResolver.delete(storySocialUri, null, null);
}
for (Story story : socialFeedResponse.stories) {
insertComments(story);
Uri storyUri = FeedProvider.FEED_STORIES_URI.buildUpon().appendPath(story.feedId).build();
Uri storySocialUri = FeedProvider.SOCIALFEED_STORIES_URI.buildUpon().appendPath(userId).build();
contentResolver.insert(storyUri, story.getValues());
contentResolver.insert(storySocialUri, story.getValues());
}

View file

@ -48,7 +48,7 @@ public class FeedUtils {
protected void onPostExecute(StoriesResponse result) {
handleStoryResponse(context, result, result.stories, receiver);
}
}.execute();
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public static void updateFeeds(final Context context, final ActionCompletionListener receiver, final String[] feedIds, final int pageNumber, final StoryOrder order, final ReadFilter filter) {
@ -62,7 +62,7 @@ public class FeedUtils {
protected void onPostExecute(StoriesResponse result) {
handleStoryResponse(context, result, result.stories, receiver);
}
}.execute();
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public static void updateSocialFeed(final Context context, final ActionCompletionListener receiver, final String feedId, final String socialUsername, final int pageNumber, final StoryOrder order, final ReadFilter filter) {
@ -76,7 +76,7 @@ public class FeedUtils {
protected void onPostExecute(SocialFeedResponse result) {
handleStoryResponse(context, result, result.stories, receiver);
}
}.execute();
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public static void updateSocialFeeds(final Context context, final ActionCompletionListener receiver, final String[] feedIds, final int pageNumber, final StoryOrder order, final ReadFilter filter) {
@ -90,7 +90,7 @@ public class FeedUtils {
protected void onPostExecute(SocialFeedResponse result) {
handleStoryResponse(context, result, result.stories, receiver);
}
}.execute();
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public static void updateSavedStories(final Context context, final ActionCompletionListener receiver, final int pageNumber) {
@ -104,7 +104,17 @@ public class FeedUtils {
protected void onPostExecute(StoriesResponse result) {
handleStoryResponse(context, result, result.stories, receiver);
}
}.execute();
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public static void clearStories(final Context context) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... arg) {
context.getContentResolver().delete(FeedProvider.ALL_STORIES_URI, null, null);
return null;
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
private static void handleStoryResponse(Context context, NewsBlurResponse response, Story[] stories, ActionCompletionListener receiver) {