Initial decouple of feed story sync from sync service. Buggy.

This commit is contained in:
ojiikun 2013-12-22 21:14:31 +00:00
parent e84428a58a
commit 7367d9cad0
8 changed files with 69 additions and 54 deletions

View file

@ -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));
}
}

View file

@ -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));
}
}

View file

@ -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);

View file

@ -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

View file

@ -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() {

View file

@ -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) {

View file

@ -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));

View file

@ -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<Void, Void, StoriesResponse>() {
@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<Void, Void, NewsBlurResponse>() {
@ -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);
}
}