diff --git a/clients/android/NewsBlur/src/com/newsblur/activity/FeedItemsList.java b/clients/android/NewsBlur/src/com/newsblur/activity/FeedItemsList.java index 95d4f04e3..7eaaaa864 100644 --- a/clients/android/NewsBlur/src/com/newsblur/activity/FeedItemsList.java +++ b/clients/android/NewsBlur/src/com/newsblur/activity/FeedItemsList.java @@ -22,6 +22,7 @@ import com.newsblur.fragment.SyncUpdateFragment; import com.newsblur.network.APIManager; import com.newsblur.network.MarkFeedAsReadTask; import com.newsblur.service.SyncService; +import com.newsblur.util.FeedUtils; import com.newsblur.util.PrefsUtils; import com.newsblur.util.ReadFilter; import com.newsblur.util.StoryOrder; @@ -122,14 +123,7 @@ public class FeedItemsList extends ItemsList { public void triggerRefresh(int page) { if (!stopLoading) { 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.EXTRA_TASK_TYPE, SyncService.TaskType.FEED_UPDATE); - intent.putExtra(SyncService.EXTRA_TASK_PAGE_NUMBER, Integer.toString(page)); - intent.putExtra(SyncService.EXTRA_TASK_FEED_ID, feedId); - intent.putExtra(SyncService.EXTRA_TASK_ORDER, getStoryOrder()); - intent.putExtra(SyncService.EXTRA_TASK_READ_FILTER, PrefsUtils.getReadFilterForFeed(this, feedId)); - startService(intent); + FeedUtils.updateFeed(this, this, feedId, page, getStoryOrder(), PrefsUtils.getReadFilterForFeed(this, feedId)); } } diff --git a/clients/android/NewsBlur/src/com/newsblur/activity/FeedReading.java b/clients/android/NewsBlur/src/com/newsblur/activity/FeedReading.java index 172a0cb9e..3fdf58275 100644 --- a/clients/android/NewsBlur/src/com/newsblur/activity/FeedReading.java +++ b/clients/android/NewsBlur/src/com/newsblur/activity/FeedReading.java @@ -56,16 +56,7 @@ public class FeedReading extends Reading { @Override public void triggerRefresh(int page) { updateSyncStatus(true); - final Intent intent = new Intent(Intent.ACTION_SYNC, null, this, SyncService.class); - intent.putExtra(SyncService.EXTRA_STATUS_RECEIVER, syncFragment.receiver); - intent.putExtra(SyncService.EXTRA_TASK_TYPE, SyncService.TaskType.FEED_UPDATE); - intent.putExtra(SyncService.EXTRA_TASK_FEED_ID, feedId); - if (page > 1) { - intent.putExtra(SyncService.EXTRA_TASK_PAGE_NUMBER, Integer.toString(page)); - } - intent.putExtra(SyncService.EXTRA_TASK_ORDER, PrefsUtils.getStoryOrderForFeed(this, feedId)); - intent.putExtra(SyncService.EXTRA_TASK_READ_FILTER, PrefsUtils.getReadFilterForFeed(this, feedId)); - startService(intent); + FeedUtils.updateFeed(this, this, feedId, page, PrefsUtils.getStoryOrderForFeed(this, feedId), PrefsUtils.getReadFilterForFeed(this, feedId)); } } diff --git a/clients/android/NewsBlur/src/com/newsblur/activity/ItemsList.java b/clients/android/NewsBlur/src/com/newsblur/activity/ItemsList.java index 0af3e10d5..218b785bb 100644 --- a/clients/android/NewsBlur/src/com/newsblur/activity/ItemsList.java +++ b/clients/android/NewsBlur/src/com/newsblur/activity/ItemsList.java @@ -13,13 +13,15 @@ import com.newsblur.fragment.ItemListFragment; import com.newsblur.fragment.ReadFilterDialogFragment; import com.newsblur.fragment.StoryOrderDialogFragment; import com.newsblur.fragment.SyncUpdateFragment; +import com.newsblur.util.FeedUtils; +import com.newsblur.util.FeedUtils.ActionCompletionListener; import com.newsblur.util.ReadFilter; import com.newsblur.util.ReadFilterChangedListener; import com.newsblur.util.StoryOrder; import com.newsblur.util.StoryOrderChangedListener; import com.newsblur.view.StateToggleButton.StateChangedListener; -public abstract class ItemsList extends NbFragmentActivity implements SyncUpdateFragment.SyncUpdateFragmentInterface, StateChangedListener, StoryOrderChangedListener, ReadFilterChangedListener { +public abstract class ItemsList extends NbFragmentActivity implements SyncUpdateFragment.SyncUpdateFragmentInterface, ActionCompletionListener, StateChangedListener, StoryOrderChangedListener, ReadFilterChangedListener { public static final String EXTRA_STATE = "currentIntelligenceState"; public static final String EXTRA_BLURBLOG_USERNAME = "blurblogName"; @@ -120,6 +122,17 @@ public abstract class ItemsList extends NbFragmentActivity implements SyncUpdate stopLoading = true; } + @Override + public void actionCompleteCallback(boolean noMoreData) { + if (itemListFragment != null) { + itemListFragment.hasUpdated(); + } + setSupportProgressBarIndeterminateVisibility(false); + if (noMoreData) { + stopLoading = true; + } + } + @Override public void changedState(int state) { itemListFragment.changeState(state); diff --git a/clients/android/NewsBlur/src/com/newsblur/activity/Reading.java b/clients/android/NewsBlur/src/com/newsblur/activity/Reading.java index 50a2e158a..1a2a889e1 100644 --- a/clients/android/NewsBlur/src/com/newsblur/activity/Reading.java +++ b/clients/android/NewsBlur/src/com/newsblur/activity/Reading.java @@ -219,11 +219,24 @@ public abstract class Reading extends NbFragmentActivity implements OnPageChange } @Override - public void actionCompleteCallback() { - stories.requery(); + public void actionCompleteCallback(boolean noMoreData) { + this.requestedPage = false; + updateSyncStatus(false); + if (noMoreData) { + this.noMoreApiPages = true; + } + stories.requery(); + readingAdapter.notifyDataSetChanged(); + this.enableOverlays(); + checkStoryCount(pager.getCurrentItem()); + if (this.unreadSearchLatch != null) { + this.unreadSearchLatch.countDown(); + } ReadingItemFragment fragment = getReadingFragment(); - fragment.updateStory(readingAdapter.getStory(pager.getCurrentItem())); - fragment.updateSaveButton(); + if (fragment != null ) { + fragment.updateStory(readingAdapter.getStory(pager.getCurrentItem())); + fragment.updateSaveButton(); + } } // interface OnPageChangeListener diff --git a/clients/android/NewsBlur/src/com/newsblur/fragment/ReadingItemFragment.java b/clients/android/NewsBlur/src/com/newsblur/fragment/ReadingItemFragment.java index 3cd29e25d..3436bde35 100644 --- a/clients/android/NewsBlur/src/com/newsblur/fragment/ReadingItemFragment.java +++ b/clients/android/NewsBlur/src/com/newsblur/fragment/ReadingItemFragment.java @@ -191,7 +191,9 @@ public class ReadingItemFragment extends Fragment implements ClassifierDialogFra } public void updateStory(Story story) { - this.story = story; + if (story != null ) { + this.story = story; + } } private void setupShareButton() { diff --git a/clients/android/NewsBlur/src/com/newsblur/network/APIManager.java b/clients/android/NewsBlur/src/com/newsblur/network/APIManager.java index 8eaf601e8..16d13734f 100644 --- a/clients/android/NewsBlur/src/com/newsblur/network/APIManager.java +++ b/clients/android/NewsBlur/src/com/newsblur/network/APIManager.java @@ -193,25 +193,24 @@ public class APIManager { } } - public StoriesResponse getStoriesForFeed(String feedId, String pageNumber, StoryOrder order, ReadFilter filter) { + public StoriesResponse getStoriesForFeed(String feedId, int pageNumber, StoryOrder order, ReadFilter filter) { final ContentValues values = new ContentValues(); Uri feedUri = Uri.parse(APIConstants.URL_FEED_STORIES).buildUpon().appendPath(feedId).build(); values.put(APIConstants.PARAMETER_FEEDS, feedId); - values.put(APIConstants.PARAMETER_PAGE_NUMBER, pageNumber); + values.put(APIConstants.PARAMETER_PAGE_NUMBER, Integer.toString(pageNumber)); values.put(APIConstants.PARAMETER_ORDER, order.getParameterValue()); values.put(APIConstants.PARAMETER_READ_FILTER, filter.getParameterValue()); - final APIResponse response = get(feedUri.toString(), values); - Uri storyUri = FeedProvider.FEED_STORIES_URI.buildUpon().appendPath(feedId).build(); + APIResponse response = get(feedUri.toString(), values); + StoriesResponse storiesResponse = (StoriesResponse) response.getResponse(gson, StoriesResponse.class); if (!response.isError()) { - if (TextUtils.equals(pageNumber, "1")) { - contentResolver.delete(storyUri, null, null); - } - StoriesResponse storiesResponse = (StoriesResponse) response.getResponse(gson, StoriesResponse.class); - + 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()) { @@ -226,11 +225,8 @@ public class APIManager { for (UserProfile user : storiesResponse.users) { contentResolver.insert(FeedProvider.USERS_URI, user.getValues()); } - - return storiesResponse; - } else { - return null; - } + } + return storiesResponse; } public StoriesResponse getStoriesForFeeds(String[] feedIds, String pageNumber, StoryOrder order, ReadFilter filter) { diff --git a/clients/android/NewsBlur/src/com/newsblur/service/SyncService.java b/clients/android/NewsBlur/src/com/newsblur/service/SyncService.java index 46a20d82c..6293fe413 100644 --- a/clients/android/NewsBlur/src/com/newsblur/service/SyncService.java +++ b/clients/android/NewsBlur/src/com/newsblur/service/SyncService.java @@ -57,7 +57,6 @@ public class SyncService extends IntentService { public enum TaskType { FOLDER_UPDATE_TWO_STEP, FOLDER_UPDATE_WITH_COUNT, - FEED_UPDATE, SOCIALFEED_UPDATE, MULTIFEED_UPDATE, MULTISOCIALFEED_UPDATE, @@ -110,17 +109,6 @@ public class SyncService extends IntentService { apiManager.getFolderFeedMapping(true); break; - case FEED_UPDATE: - if (!TextUtils.isEmpty(intent.getStringExtra(EXTRA_TASK_FEED_ID))) { - StoriesResponse storiesForFeed = apiManager.getStoriesForFeed(intent.getStringExtra(EXTRA_TASK_FEED_ID), intent.getStringExtra(EXTRA_TASK_PAGE_NUMBER), (StoryOrder) intent.getSerializableExtra(EXTRA_TASK_ORDER), (ReadFilter) intent.getSerializableExtra(EXTRA_TASK_READ_FILTER)); - if (storiesForFeed == null || storiesForFeed.stories.length == 0) { - resultStatus = SyncStatus.STATUS_NO_MORE_UPDATES; - } - } else { - Log.e(this.getClass().getName(), "No feed to refresh included in SyncRequest"); - } - break; - case MULTIFEED_UPDATE: if (intent.getStringArrayExtra(EXTRA_TASK_MULTIFEED_IDS) != null) { StoriesResponse storiesForFeeds = apiManager.getStoriesForFeeds(intent.getStringArrayExtra(EXTRA_TASK_MULTIFEED_IDS), intent.getStringExtra(EXTRA_TASK_PAGE_NUMBER), (StoryOrder) intent.getSerializableExtra(EXTRA_TASK_ORDER), (ReadFilter) intent.getSerializableExtra(EXTRA_TASK_READ_FILTER)); diff --git a/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java b/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java index 228992172..b02b1a22c 100644 --- a/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java +++ b/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java @@ -20,7 +20,6 @@ import android.text.TextUtils; import android.util.Log; import android.widget.Toast; -import com.google.gson.Gson; import com.newsblur.R; import com.newsblur.database.DatabaseConstants; import com.newsblur.database.FeedProvider; @@ -31,12 +30,31 @@ import com.newsblur.domain.Story; import com.newsblur.domain.ValueMultimap; import com.newsblur.network.APIManager; import com.newsblur.network.domain.NewsBlurResponse; +import com.newsblur.network.domain.StoriesResponse; import com.newsblur.service.SyncService; import com.newsblur.util.AppConstants; public class FeedUtils { - private static Gson gson = new Gson(); + public static void updateFeed(final Context context, final ActionCompletionListener receiver, final String feedId, final int pageNumber, final StoryOrder order, final ReadFilter filter) { + new AsyncTask() { + @Override + protected StoriesResponse doInBackground(Void... arg) { + APIManager apiManager = new APIManager(context); + return apiManager.getStoriesForFeed(feedId, pageNumber, order, filter); + } + @Override + protected void onPostExecute(StoriesResponse result) { + if (result.isError()) { + // TODO: we have always silently ignored feed fetch errors, but probably shouldn't + return; + } + if (receiver != null) { + receiver.actionCompleteCallback(result.stories.length == 0); + } + } + }.execute(); + } private static void setStorySaved(final Story story, final boolean saved, final Context context, final APIManager apiManager, final ActionCompletionListener receiver) { new AsyncTask() { @@ -62,7 +80,7 @@ public class FeedUtils { } if (receiver != null) { - receiver.actionCompleteCallback(); + receiver.actionCompleteCallback(false); } } }.execute(); @@ -291,6 +309,6 @@ public class FeedUtils { * as a result. */ public interface ActionCompletionListener { - public abstract void actionCompleteCallback(); + public abstract void actionCompleteCallback(boolean noMoreData); } }