mirror of
https://github.com/viq/NewsBlur.git
synced 2025-09-18 21:43:31 +00:00
Add infinite scroll for feed item list and social feed item list.
This commit is contained in:
parent
64166b6dfe
commit
72a50217e5
12 changed files with 169 additions and 53 deletions
|
@ -46,10 +46,18 @@ public class FeedItemsList extends ItemsList {
|
|||
|
||||
@Override
|
||||
public void triggerRefresh() {
|
||||
triggerRefresh(0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void triggerRefresh(int page) {
|
||||
setSupportProgressBarIndeterminateVisibility(true);
|
||||
final Intent intent = new Intent(Intent.ACTION_SYNC, null, this, SyncService.class);
|
||||
intent.putExtra(SyncService.EXTRA_STATUS_RECEIVER, syncFragment.receiver);
|
||||
intent.putExtra(SyncService.SYNCSERVICE_TASK, SyncService.EXTRA_TASK_FEED_UPDATE);
|
||||
if (page > 1) {
|
||||
intent.putExtra(SyncService.EXTRA_TASK_PAGE_NUMBER, Integer.toString(page));
|
||||
}
|
||||
intent.putExtra(SyncService.EXTRA_TASK_FEED_ID, feedId);
|
||||
startService(intent);
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ public class FeedReading extends Reading {
|
|||
super.onCreate(savedInstanceBundle);
|
||||
|
||||
feedId = getIntent().getStringExtra(Reading.EXTRA_FEED);
|
||||
Uri storiesURI = FeedProvider.STORIES_URI.buildUpon().appendPath(feedId).build();
|
||||
Uri storiesURI = FeedProvider.FEED_STORIES_URI.buildUpon().appendPath(feedId).build();
|
||||
|
||||
stories = contentResolver.query(storiesURI, null, FeedProvider.getSelectionFromState(currentState), null, null);
|
||||
|
||||
|
|
|
@ -54,6 +54,7 @@ public abstract class ItemsList extends SherlockFragmentActivity implements Sync
|
|||
}
|
||||
|
||||
public abstract void triggerRefresh();
|
||||
public abstract void triggerRefresh(int page);
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
|
|
|
@ -44,14 +44,22 @@ public class SocialFeedItemsList extends ItemsList {
|
|||
triggerRefresh();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void triggerRefresh() {
|
||||
triggerRefresh(0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void triggerRefresh(int page) {
|
||||
setSupportProgressBarIndeterminateVisibility(true);
|
||||
final Intent intent = new Intent(Intent.ACTION_SYNC, null, this, SyncService.class);
|
||||
intent.putExtra(SyncService.EXTRA_STATUS_RECEIVER, syncFragment.receiver);
|
||||
intent.putExtra(SyncService.SYNCSERVICE_TASK, SyncService.EXTRA_TASK_SOCIALFEED_UPDATE);
|
||||
intent.putExtra(SyncService.EXTRA_TASK_SOCIALFEED_ID, userId);
|
||||
if (page > 1) {
|
||||
intent.putExtra(SyncService.EXTRA_TASK_PAGE_NUMBER, Integer.toString(page));
|
||||
}
|
||||
intent.putExtra(SyncService.EXTRA_TASK_SOCIALFEED_USERNAME, username);
|
||||
startService(intent);
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ public class SocialFeedReading extends Reading {
|
|||
|
||||
String userId = getIntent().getStringExtra(Reading.EXTRA_USERID);
|
||||
|
||||
Uri storiesURI = FeedProvider.SOCIAL_FEEDS_URI.buildUpon().appendPath(userId).build();
|
||||
Uri storiesURI = FeedProvider.SOCIALFEED_STORIES_URI.buildUpon().appendPath(userId).build();
|
||||
stories = contentResolver.query(storiesURI, null, FeedProvider.getSelectionFromState(currentState), null, null);
|
||||
setTitle(getIntent().getStringExtra(EXTRA_USERNAME));
|
||||
setupPager(stories);
|
||||
|
|
|
@ -24,7 +24,8 @@ public class FeedProvider extends ContentProvider {
|
|||
public static final Uri FEEDS_URI = Uri.parse("content://" + AUTHORITY + "/" + VERSION + "/feeds/");
|
||||
public static final Uri MODIFY_COUNT_URI = Uri.parse("content://" + AUTHORITY + "/" + VERSION + "/feedcount/");
|
||||
public static final Uri MODIFY_SOCIALCOUNT_URI = Uri.parse("content://" + AUTHORITY + "/" + VERSION + "/socialfeedcount/");
|
||||
public static final Uri STORIES_URI = Uri.parse("content://" + AUTHORITY + "/" + VERSION + "/stories/");
|
||||
public static final Uri FEED_STORIES_URI = Uri.parse("content://" + AUTHORITY + "/" + VERSION + "/stories/feed/");
|
||||
public static final Uri SOCIALFEED_STORIES_URI = Uri.parse("content://" + AUTHORITY + "/" + VERSION + "/stories/socialfeed/");
|
||||
public static final Uri STORY_URI = Uri.parse("content://" + AUTHORITY + "/" + VERSION + "/story/");
|
||||
public static final Uri COMMENTS_URI = Uri.parse("content://" + AUTHORITY + "/" + VERSION + "/comments/");
|
||||
public static final Uri FEED_FOLDER_MAP_URI = Uri.parse("content://" + AUTHORITY + "/" + VERSION + "/feedfoldermap/");
|
||||
|
@ -37,27 +38,30 @@ public class FeedProvider extends ContentProvider {
|
|||
private static final int INDIVIDUAL_FOLDER = 4;
|
||||
private static final int FEED_FOLDER_MAP = 5;
|
||||
private static final int SPECIFIC_FEED_FOLDER_MAP = 6;
|
||||
private static final int INDIVIDUAL_SOCIALFEED = 7;
|
||||
private static final int SOCIALFEED_STORIES = 7;
|
||||
private static final int INDIVIDUAL_FEED = 8;
|
||||
private static final int STORY_COMMENTS = 9;
|
||||
private static final int INDIVIDUAL_STORY = 10;
|
||||
private static final int DECREMENT_FEED_COUNT = 11;
|
||||
private static final int OFFLINE_UPDATES = 12;
|
||||
private static final int DECREMENT_SOCIALFEED_COUNT = 13;
|
||||
private static final int INDIVIDUAL_SOCIAL_FEED = 14;
|
||||
|
||||
private BlurDatabase databaseHelper;
|
||||
|
||||
private static UriMatcher uriMatcher;
|
||||
static {
|
||||
// TODO: Tidy this url-structure. It's not forward-facing but it's kind of a mess.
|
||||
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
|
||||
uriMatcher.addURI(AUTHORITY, VERSION + "/feeds/", ALL_FEEDS);
|
||||
uriMatcher.addURI(AUTHORITY, VERSION + "/social_feeds/", ALL_SOCIAL_FEEDS);
|
||||
uriMatcher.addURI(AUTHORITY, VERSION + "/social_feeds/#/", INDIVIDUAL_SOCIALFEED);
|
||||
uriMatcher.addURI(AUTHORITY, VERSION + "/social_feeds/#/", INDIVIDUAL_SOCIAL_FEED);
|
||||
uriMatcher.addURI(AUTHORITY, VERSION + "/feeds/*/", INDIVIDUAL_FEED);
|
||||
uriMatcher.addURI(AUTHORITY, VERSION + "/feedcount/", DECREMENT_FEED_COUNT);
|
||||
uriMatcher.addURI(AUTHORITY, VERSION + "/socialfeedcount/", DECREMENT_SOCIALFEED_COUNT);
|
||||
uriMatcher.addURI(AUTHORITY, VERSION + "/feed/*/", INDIVIDUAL_FEED);
|
||||
uriMatcher.addURI(AUTHORITY, VERSION + "/stories/#/", FEED_STORIES);
|
||||
uriMatcher.addURI(AUTHORITY, VERSION + "/stories/socialfeed/#/", SOCIALFEED_STORIES);
|
||||
uriMatcher.addURI(AUTHORITY, VERSION + "/stories/feed/#/", FEED_STORIES);
|
||||
uriMatcher.addURI(AUTHORITY, VERSION + "/story/*/", INDIVIDUAL_STORY);
|
||||
uriMatcher.addURI(AUTHORITY, VERSION + "/comments/", STORY_COMMENTS);
|
||||
uriMatcher.addURI(AUTHORITY, VERSION + "/feedfoldermap/", FEED_FOLDER_MAP);
|
||||
|
@ -126,7 +130,7 @@ public class FeedProvider extends ContentProvider {
|
|||
break;
|
||||
|
||||
// Inserting a story for a social feed
|
||||
case INDIVIDUAL_SOCIALFEED:
|
||||
case SOCIALFEED_STORIES:
|
||||
db.beginTransaction();
|
||||
final ContentValues socialMapValues = new ContentValues();
|
||||
socialMapValues.put(DatabaseConstants.SOCIALFEED_STORY_USER_ID, uri.getLastPathSegment());
|
||||
|
@ -265,8 +269,10 @@ public class FeedProvider extends ContentProvider {
|
|||
case OFFLINE_UPDATES:
|
||||
return db.query(DatabaseConstants.UPDATE_TABLE, null, null, null, null, null, null);
|
||||
case ALL_SOCIAL_FEEDS:
|
||||
return db.query(DatabaseConstants.SOCIALFEED_TABLE, null, selection, null, null, null, null);
|
||||
case INDIVIDUAL_SOCIALFEED:
|
||||
return db.query(DatabaseConstants.SOCIALFEED_TABLE, null, selection, null, null, null, null);
|
||||
case INDIVIDUAL_SOCIAL_FEED:
|
||||
return db.query(DatabaseConstants.SOCIALFEED_TABLE, null, DatabaseConstants.SOCIAL_FEED_ID + " = ?", new String[] { uri.getLastPathSegment() }, null, null, null);
|
||||
case SOCIALFEED_STORIES:
|
||||
String[] userArgument = new String[] { uri.getLastPathSegment() };
|
||||
|
||||
String userQuery = "SELECT " + TextUtils.join(",", DatabaseConstants.STORY_COLUMNS) + ", " + DatabaseConstants.FEED_TITLE + ", " +
|
||||
|
@ -299,7 +305,7 @@ public class FeedProvider extends ContentProvider {
|
|||
switch (uriMatcher.match(uri)) {
|
||||
case INDIVIDUAL_FEED:
|
||||
return db.update(DatabaseConstants.FEED_TABLE, values, DatabaseConstants.FEED_ID + " = ?", new String[] { uri.getLastPathSegment() });
|
||||
case INDIVIDUAL_SOCIALFEED:
|
||||
case SOCIALFEED_STORIES:
|
||||
return db.update(DatabaseConstants.SOCIALFEED_TABLE, values, DatabaseConstants.FEED_ID + " = ?", new String[] { uri.getLastPathSegment() });
|
||||
case INDIVIDUAL_STORY:
|
||||
return db.update(DatabaseConstants.STORY_TABLE, values, DatabaseConstants.STORY_ID + " = ?", new String[] { uri.getLastPathSegment() });
|
||||
|
|
|
@ -36,7 +36,8 @@ public class SocialFeed {
|
|||
return values;
|
||||
}
|
||||
|
||||
public SocialFeed fromCursor(final Cursor cursor) {
|
||||
public static SocialFeed fromCursor(final Cursor cursor) {
|
||||
cursor.moveToFirst();
|
||||
SocialFeed socialFeed = new SocialFeed();
|
||||
socialFeed.userId = cursor.getString(cursor.getColumnIndex(DatabaseConstants.SOCIAL_FEED_ID));
|
||||
socialFeed.username = cursor.getString(cursor.getColumnIndex(DatabaseConstants.SOCIAL_FEED_USERNAME));
|
||||
|
|
|
@ -14,6 +14,8 @@ 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;
|
||||
|
@ -24,10 +26,12 @@ import com.newsblur.activity.ItemsList;
|
|||
import com.newsblur.activity.Reading;
|
||||
import com.newsblur.database.DatabaseConstants;
|
||||
import com.newsblur.database.FeedProvider;
|
||||
import com.newsblur.domain.Feed;
|
||||
import com.newsblur.util.AppConstants;
|
||||
import com.newsblur.view.ItemViewBinder;
|
||||
|
||||
public class FeedItemListFragment extends ItemListFragment implements LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener {
|
||||
|
||||
public class FeedItemListFragment extends ItemListFragment implements LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, OnScrollListener {
|
||||
|
||||
private static final String TAG = "itemListFragment";
|
||||
public static final String FRAGMENT_TAG = "itemListFragment";
|
||||
private ContentResolver contentResolver;
|
||||
|
@ -35,56 +39,64 @@ public class FeedItemListFragment extends ItemListFragment implements LoaderMana
|
|||
private SimpleCursorAdapter adapter;
|
||||
private Uri storiesUri;
|
||||
private int currentState;
|
||||
private int currentPage = 1;
|
||||
private boolean requestedPage = false;
|
||||
|
||||
public static int ITEMLIST_LOADER = 0x01;
|
||||
private int READING_RETURNED = 0x02;
|
||||
private Feed feed;
|
||||
|
||||
public FeedItemListFragment(final String feedId, final int currentState) {
|
||||
this.feedId = feedId;
|
||||
this.currentState = currentState;
|
||||
}
|
||||
|
||||
|
||||
public FeedItemListFragment() {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
}
|
||||
|
||||
|
||||
public static FeedItemListFragment newInstance(final String feedId, int currentState) {
|
||||
return new FeedItemListFragment(feedId, currentState);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
View v = inflater.inflate(R.layout.fragment_itemlist, null);
|
||||
ListView itemList = (ListView) v.findViewById(R.id.itemlistfragment_list);
|
||||
|
||||
|
||||
contentResolver = getActivity().getContentResolver();
|
||||
storiesUri = FeedProvider.STORIES_URI.buildUpon().appendPath(feedId).build();
|
||||
Cursor cursor = contentResolver.query(storiesUri, null, FeedProvider.getSelectionFromState(currentState), null, DatabaseConstants.STORY_DATE + " DESC");
|
||||
storiesUri = FeedProvider.FEED_STORIES_URI.buildUpon().appendPath(feedId).build();
|
||||
Uri feedUri = FeedProvider.FEEDS_URI.buildUpon().appendPath(feedId).build();
|
||||
|
||||
Cursor cursor = contentResolver.query(storiesUri, null, FeedProvider.getSelectionFromState(currentState), null, DatabaseConstants.STORY_DATE + " DESC");
|
||||
feed = Feed.fromCursor(contentResolver.query(feedUri, null, null, null, null));
|
||||
|
||||
String[] groupFrom = new String[] { DatabaseConstants.STORY_TITLE, DatabaseConstants.STORY_AUTHORS, DatabaseConstants.STORY_READ, DatabaseConstants.STORY_SHORTDATE, DatabaseConstants.STORY_INTELLIGENCE_AUTHORS };
|
||||
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 };
|
||||
|
||||
getLoaderManager().initLoader(ITEMLIST_LOADER , null, this);
|
||||
|
||||
|
||||
adapter = new SimpleCursorAdapter(getActivity(), R.layout.row_item, cursor, groupFrom, groupTo, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
|
||||
|
||||
itemList.setOnScrollListener(this);
|
||||
|
||||
adapter.setViewBinder(new ItemViewBinder());
|
||||
itemList.setAdapter(adapter);
|
||||
itemList.setOnItemClickListener(this);
|
||||
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Loader<Cursor> onCreateLoader(int loaderId, Bundle bundle) {
|
||||
Uri uri = FeedProvider.STORIES_URI.buildUpon().appendPath(feedId).build();
|
||||
Uri uri = FeedProvider.FEED_STORIES_URI.buildUpon().appendPath(feedId).build();
|
||||
CursorLoader cursorLoader = new CursorLoader(getActivity(), uri, null, FeedProvider.getSelectionFromState(currentState), null, DatabaseConstants.STORY_DATE + " DESC");
|
||||
return cursorLoader;
|
||||
return cursorLoader;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -93,9 +105,10 @@ public class FeedItemListFragment extends ItemListFragment implements LoaderMana
|
|||
adapter.swapCursor(cursor);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void hasUpdated() {
|
||||
getLoaderManager().restartLoader(ITEMLIST_LOADER , null, this);
|
||||
requestedPage = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -120,6 +133,37 @@ public class FeedItemListFragment extends ItemListFragment implements LoaderMana
|
|||
adapter.swapCursor(cursor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onScroll(AbsListView view, int firstVisible, int visibleCount, int totalCount) {
|
||||
if (firstVisible + visibleCount == totalCount) {
|
||||
boolean loadMore = false;
|
||||
|
||||
switch (currentState) {
|
||||
case AppConstants.STATE_ALL:
|
||||
loadMore = feed.positiveCount + feed.neutralCount + feed.negativeCount > totalCount;
|
||||
break;
|
||||
case AppConstants.STATE_BEST:
|
||||
loadMore = feed.positiveCount > totalCount;
|
||||
break;
|
||||
case AppConstants.STATE_SOME:
|
||||
loadMore = feed.positiveCount + feed.neutralCount > totalCount;
|
||||
break;
|
||||
}
|
||||
|
||||
if (loadMore && !requestedPage) {
|
||||
currentPage += 1;
|
||||
requestedPage = true;
|
||||
((ItemsList) getActivity()).triggerRefresh(currentPage);
|
||||
} else {
|
||||
Log.d(TAG, "No need");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onScrollStateChanged(AbsListView view, int scrollState) { }
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -14,21 +14,24 @@ 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;
|
||||
|
||||
import com.newsblur.R;
|
||||
import com.newsblur.activity.ItemsList;
|
||||
import com.newsblur.activity.NewsBlurApplication;
|
||||
import com.newsblur.activity.Reading;
|
||||
import com.newsblur.activity.SocialFeedReading;
|
||||
import com.newsblur.database.DatabaseConstants;
|
||||
import com.newsblur.database.FeedProvider;
|
||||
import com.newsblur.database.SocialFeedItemsAdapter;
|
||||
import com.newsblur.domain.SocialFeed;
|
||||
import com.newsblur.util.AppConstants;
|
||||
import com.newsblur.view.SocialItemViewBinder;
|
||||
|
||||
public class SocialFeedItemListFragment extends ItemListFragment implements LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener {
|
||||
public class SocialFeedItemListFragment extends ItemListFragment implements LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, OnScrollListener {
|
||||
|
||||
private static final String TAG = "socialfeedListFragment";
|
||||
public static final String FRAGMENT_TAG = "socialfeedListFragment";
|
||||
|
@ -36,9 +39,13 @@ public class SocialFeedItemListFragment extends ItemListFragment implements Load
|
|||
private String userId, username;
|
||||
private SimpleCursorAdapter adapter;
|
||||
private Uri storiesUri;
|
||||
private int currentState;
|
||||
private SocialFeed socialFeed;
|
||||
private int currentState, currentPage = 1;
|
||||
private boolean requestedPage;
|
||||
|
||||
public static int ITEMLIST_LOADER = 0x01;
|
||||
private int READING_RETURNED = 0x02;
|
||||
private Uri socialFeedUri;
|
||||
|
||||
public SocialFeedItemListFragment(final String userId, final String username, final int currentState) {
|
||||
this.userId = userId;
|
||||
|
@ -53,19 +60,12 @@ public class SocialFeedItemListFragment extends ItemListFragment implements Load
|
|||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
}
|
||||
|
||||
public static SocialFeedItemListFragment newInstance(final String userId, final String username, final int currentState) {
|
||||
return new SocialFeedItemListFragment(userId, username, currentState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
View v = inflater.inflate(R.layout.fragment_itemlist, null);
|
||||
ListView itemList = (ListView) v.findViewById(R.id.itemlistfragment_list);
|
||||
|
||||
contentResolver = getActivity().getContentResolver();
|
||||
storiesUri = FeedProvider.SOCIAL_FEEDS_URI.buildUpon().appendPath(userId).build();
|
||||
storiesUri = FeedProvider.SOCIALFEED_STORIES_URI.buildUpon().appendPath(userId).build();
|
||||
socialFeedUri = FeedProvider.SOCIAL_FEEDS_URI.buildUpon().appendPath(userId).build();
|
||||
|
||||
socialFeed = SocialFeed.fromCursor(contentResolver.query(socialFeedUri, null, null, null, null));
|
||||
|
||||
Cursor cursor = contentResolver.query(storiesUri, null, FeedProvider.getSelectionFromState(currentState), null, DatabaseConstants.STORY_DATE + " DESC");
|
||||
|
||||
String[] groupFrom = new String[] { DatabaseConstants.FEED_FAVICON_URL, DatabaseConstants.FEED_TITLE, DatabaseConstants.STORY_TITLE, DatabaseConstants.STORY_READ, DatabaseConstants.STORY_SHORTDATE, DatabaseConstants.STORY_INTELLIGENCE_AUTHORS};
|
||||
|
@ -76,6 +76,17 @@ public class SocialFeedItemListFragment extends ItemListFragment implements Load
|
|||
adapter = new SocialFeedItemsAdapter(getActivity(), R.layout.row_socialitem, cursor, groupFrom, groupTo, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
|
||||
|
||||
adapter.setViewBinder(new SocialItemViewBinder(getActivity()));
|
||||
}
|
||||
|
||||
public static SocialFeedItemListFragment newInstance(final String userId, final String username, final int currentState) {
|
||||
return new SocialFeedItemListFragment(userId, username, currentState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
View v = inflater.inflate(R.layout.fragment_itemlist, null);
|
||||
ListView itemList = (ListView) v.findViewById(R.id.itemlistfragment_list);
|
||||
itemList.setOnScrollListener(this);
|
||||
itemList.setAdapter(adapter);
|
||||
itemList.setOnItemClickListener(this);
|
||||
|
||||
|
@ -84,7 +95,7 @@ public class SocialFeedItemListFragment extends ItemListFragment implements Load
|
|||
|
||||
@Override
|
||||
public Loader<Cursor> onCreateLoader(int loaderId, Bundle bundle) {
|
||||
Uri uri = FeedProvider.SOCIAL_FEEDS_URI.buildUpon().appendPath(userId).build();
|
||||
Uri uri = FeedProvider.SOCIALFEED_STORIES_URI.buildUpon().appendPath(userId).build();
|
||||
CursorLoader cursorLoader = new CursorLoader(getActivity(), uri, null, FeedProvider.getSelectionFromState(currentState), null, DatabaseConstants.STORY_DATE + " DESC");
|
||||
return cursorLoader;
|
||||
}
|
||||
|
@ -98,6 +109,7 @@ public class SocialFeedItemListFragment extends ItemListFragment implements Load
|
|||
|
||||
public void hasUpdated() {
|
||||
getLoaderManager().restartLoader(ITEMLIST_LOADER , null, this);
|
||||
requestedPage = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -105,6 +117,34 @@ public class SocialFeedItemListFragment extends ItemListFragment implements Load
|
|||
Log.d(TAG, "Loader reset");
|
||||
adapter.notifyDataSetInvalidated();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onScroll(AbsListView view, int firstVisible, int visibleCount, int totalCount) {
|
||||
if (firstVisible + visibleCount == totalCount) {
|
||||
boolean loadMore = false;
|
||||
|
||||
switch (currentState) {
|
||||
case AppConstants.STATE_ALL:
|
||||
loadMore = socialFeed.positiveCount + socialFeed.neutralCount + socialFeed.negativeCount > totalCount;
|
||||
break;
|
||||
case AppConstants.STATE_BEST:
|
||||
loadMore = socialFeed.positiveCount > totalCount;
|
||||
break;
|
||||
case AppConstants.STATE_SOME:
|
||||
loadMore = socialFeed.positiveCount + socialFeed.neutralCount > totalCount;
|
||||
break;
|
||||
}
|
||||
|
||||
if (loadMore && !requestedPage) {
|
||||
currentPage += 1;
|
||||
requestedPage = true;
|
||||
((ItemsList) getActivity()).triggerRefresh(currentPage);
|
||||
} else {
|
||||
Log.d(TAG, "No need");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||
|
@ -123,4 +163,7 @@ public class SocialFeedItemListFragment extends ItemListFragment implements Load
|
|||
adapter.swapCursor(cursor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onScrollStateChanged(AbsListView view, int scrollState) { }
|
||||
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@ public class APIConstants {
|
|||
public static final String PARAMETER_SHARE_COMMENT = "comments";
|
||||
public static final String PARAMETER_SHARE_SOURCEID = "source_user_id";
|
||||
public static final String PARAMETER_MARKSOCIAL_JSON = "users_feeds_stories";
|
||||
public static final String PARAMETER_PAGE_NUMBER = "page";
|
||||
|
||||
public static final String NEWSBLUR_URL = "http://www.newsblur.com";
|
||||
|
||||
|
|
|
@ -133,15 +133,18 @@ public class APIManager {
|
|||
}
|
||||
}
|
||||
|
||||
public StoriesResponse getStoriesForFeed(String feedId) {
|
||||
public StoriesResponse getStoriesForFeed(String feedId, String pageNumber) {
|
||||
final APIClient client = new APIClient(context);
|
||||
final ContentValues values = new ContentValues();
|
||||
values.put(APIConstants.PARAMETER_FEEDS, feedId);
|
||||
if (!TextUtils.isEmpty(pageNumber)) {
|
||||
values.put(APIConstants.PARAMETER_PAGE_NUMBER, "" + pageNumber);
|
||||
}
|
||||
Uri feedUri = Uri.parse(APIConstants.URL_FEED_STORIES).buildUpon().appendPath(feedId).build();
|
||||
final APIResponse response = client.get(feedUri.toString(), values);
|
||||
StoriesResponse storiesResponse = gson.fromJson(response.responseString, StoriesResponse.class);
|
||||
if (response.responseCode == HttpStatus.SC_OK && !response.hasRedirected) {
|
||||
Uri storyUri = FeedProvider.STORIES_URI.buildUpon().appendPath(feedId).build();
|
||||
Uri storyUri = FeedProvider.FEED_STORIES_URI.buildUpon().appendPath(feedId).build();
|
||||
for (Story story : storiesResponse.stories) {
|
||||
contentResolver.insert(storyUri, story.getValues());
|
||||
for (Comment comment : story.comments) {
|
||||
|
@ -160,18 +163,20 @@ public class APIManager {
|
|||
}
|
||||
}
|
||||
|
||||
public SocialFeedResponse getStoriesForSocialFeed(String userId, String username) {
|
||||
public SocialFeedResponse getStoriesForSocialFeed(String userId, String username, String pageNumber) {
|
||||
final APIClient client = new APIClient(context);
|
||||
final ContentValues values = new ContentValues();
|
||||
values.put(APIConstants.PARAMETER_USER_ID, userId);
|
||||
values.put(APIConstants.PARAMETER_USERNAME, username);
|
||||
|
||||
if (!TextUtils.isEmpty(pageNumber)) {
|
||||
values.put(APIConstants.PARAMETER_PAGE_NUMBER, "" + pageNumber);
|
||||
}
|
||||
Uri feedUri = Uri.parse(APIConstants.URL_SOCIALFEED_STORIES).buildUpon().appendPath(userId).appendPath(username).build();
|
||||
final APIResponse response = client.get(feedUri.toString(), values);
|
||||
SocialFeedResponse socialFeedResponse = gson.fromJson(response.responseString, SocialFeedResponse.class);
|
||||
if (response.responseCode == HttpStatus.SC_OK && !response.hasRedirected) {
|
||||
for (Story story : socialFeedResponse.stories) {
|
||||
Uri storyUri = FeedProvider.STORIES_URI.buildUpon().appendPath(story.feedId).build();
|
||||
Uri storyUri = FeedProvider.FEED_STORIES_URI.buildUpon().appendPath(story.feedId).build();
|
||||
contentResolver.insert(storyUri, story.getValues());
|
||||
|
||||
for (Comment comment : story.comments) {
|
||||
|
@ -184,9 +189,8 @@ public class APIManager {
|
|||
contentResolver.insert(FeedProvider.COMMENTS_URI, comment.getValues());
|
||||
}
|
||||
|
||||
Uri storySocialUri = FeedProvider.SOCIAL_FEEDS_URI.buildUpon().appendPath(userId).build();
|
||||
Uri storySocialUri = FeedProvider.SOCIALFEED_STORIES_URI.buildUpon().appendPath(userId).build();
|
||||
contentResolver.insert(storySocialUri, story.getValues());
|
||||
|
||||
}
|
||||
|
||||
for (Feed feed : socialFeedResponse.feeds) {
|
||||
|
|
|
@ -33,7 +33,7 @@ public class SyncService extends IntentService {
|
|||
public static final String EXTRA_TASK_SOCIALFEED_ID = "userId";
|
||||
public static final String EXTRA_TASK_SOCIALFEED_USERNAME = "username";
|
||||
public static final String EXTRA_TASK_MARK_SOCIAL_JSON = "socialJson";
|
||||
|
||||
public static final String EXTRA_TASK_PAGE_NUMBER = "page";
|
||||
|
||||
public final static int STATUS_RUNNING = 0x02;
|
||||
public final static int STATUS_FINISHED = 0x03;
|
||||
|
@ -117,7 +117,7 @@ public class SyncService extends IntentService {
|
|||
break;
|
||||
case EXTRA_TASK_FEED_UPDATE:
|
||||
if (!TextUtils.isEmpty(intent.getStringExtra(EXTRA_TASK_FEED_ID))) {
|
||||
apiManager.getStoriesForFeed(intent.getStringExtra(EXTRA_TASK_FEED_ID));
|
||||
apiManager.getStoriesForFeed(intent.getStringExtra(EXTRA_TASK_FEED_ID), intent.getStringExtra(EXTRA_TASK_PAGE_NUMBER));
|
||||
} else {
|
||||
Log.e(TAG, "No feed to refresh included in SyncRequest");
|
||||
receiver.send(STATUS_ERROR, Bundle.EMPTY);
|
||||
|
@ -125,7 +125,7 @@ public class SyncService extends IntentService {
|
|||
break;
|
||||
case EXTRA_TASK_SOCIALFEED_UPDATE:
|
||||
if (!TextUtils.isEmpty(intent.getStringExtra(EXTRA_TASK_SOCIALFEED_ID)) && !TextUtils.isEmpty(intent.getStringExtra(EXTRA_TASK_SOCIALFEED_USERNAME))) {
|
||||
apiManager.getStoriesForSocialFeed(intent.getStringExtra(EXTRA_TASK_SOCIALFEED_ID), intent.getStringExtra(EXTRA_TASK_SOCIALFEED_USERNAME));
|
||||
apiManager.getStoriesForSocialFeed(intent.getStringExtra(EXTRA_TASK_SOCIALFEED_ID), intent.getStringExtra(EXTRA_TASK_SOCIALFEED_USERNAME), intent.getStringExtra(EXTRA_TASK_PAGE_NUMBER));
|
||||
} else {
|
||||
Log.e(TAG, "Missing parameters forsocialfeed SyncRequest");
|
||||
receiver.send(STATUS_ERROR, Bundle.EMPTY);
|
||||
|
|
Loading…
Add table
Reference in a new issue