mirror of
https://github.com/viq/NewsBlur.git
synced 2025-09-18 21:43:31 +00:00
Make initial sync on creation of Main activity folllow recommended two-step API pattern.
This commit is contained in:
parent
c87deeebac
commit
7bdd82c47d
6 changed files with 89 additions and 42 deletions
|
@ -73,8 +73,6 @@ public abstract class ItemsList extends SherlockFragmentActivity implements Sync
|
|||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void updateAfterSync() {
|
||||
if (itemListFragment != null) {
|
||||
|
@ -85,6 +83,15 @@ public abstract class ItemsList extends SherlockFragmentActivity implements Sync
|
|||
setSupportProgressBarIndeterminateVisibility(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updatePartialSync() {
|
||||
if (itemListFragment != null) {
|
||||
itemListFragment.hasUpdated();
|
||||
} else {
|
||||
Log.e(TAG, "Error updating list as it doesn't exist.");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateSyncStatus(boolean syncRunning) {
|
||||
if (syncRunning) {
|
||||
|
@ -99,4 +106,4 @@ public abstract class ItemsList extends SherlockFragmentActivity implements Sync
|
|||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -45,12 +45,17 @@ public class Main extends SherlockFragmentActivity implements StateChangedListen
|
|||
if (syncFragment == null) {
|
||||
syncFragment = new SyncUpdateFragment();
|
||||
fragmentManager.beginTransaction().add(syncFragment, SyncUpdateFragment.TAG).commit();
|
||||
triggerFullRefresh();
|
||||
// for our first sync, don't just trigger a heavyweight refresh, do it in two steps
|
||||
// so the UI appears more quickly (per the docs at newsblur.com/api)
|
||||
triggerFirstSync();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void triggerFullRefresh() {
|
||||
/**
|
||||
* Triggers an initial two-phase sync, so the UI can display quickly using /reader/feeds and
|
||||
* then call /reader/refresh_feeds to get updated counts.
|
||||
*/
|
||||
private void triggerFirstSync() {
|
||||
setSupportProgressBarIndeterminateVisibility(true);
|
||||
if (menu != null) {
|
||||
menu.findItem(R.id.menu_refresh).setEnabled(false);
|
||||
|
@ -58,11 +63,14 @@ public class Main extends SherlockFragmentActivity implements StateChangedListen
|
|||
|
||||
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_FOLDER_UPDATE);
|
||||
intent.putExtra(SyncService.SYNCSERVICE_TASK, SyncService.EXTRA_TASK_FOLDER_UPDATE_TWO_STEP);
|
||||
startService(intent);
|
||||
}
|
||||
|
||||
private void triggerRecount() {
|
||||
/**
|
||||
* Triggers a full, manually requested refresh of feed/folder data and counts.
|
||||
*/
|
||||
private void triggerRefresh() {
|
||||
setSupportProgressBarIndeterminateVisibility(true);
|
||||
if (menu != null) {
|
||||
menu.findItem(R.id.menu_refresh).setEnabled(false);
|
||||
|
@ -95,7 +103,7 @@ public class Main extends SherlockFragmentActivity implements StateChangedListen
|
|||
startActivity(profileIntent);
|
||||
return true;
|
||||
} else if (item.getItemId() == R.id.menu_refresh) {
|
||||
triggerRecount();
|
||||
triggerRefresh();
|
||||
return true;
|
||||
} else if (item.getItemId() == R.id.menu_add_feed) {
|
||||
Intent intent = new Intent(this, SearchForFeeds.class);
|
||||
|
@ -129,15 +137,29 @@ public class Main extends SherlockFragmentActivity implements StateChangedListen
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
/**
|
||||
* Called after the sync service completely finishes a task.
|
||||
*/
|
||||
@Override
|
||||
public void updateAfterSync() {
|
||||
folderFeedList.hasUpdated();
|
||||
setSupportProgressBarIndeterminateVisibility(false);
|
||||
menu.findItem(R.id.menu_refresh).setEnabled(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the sync service has made enough progress to update the UI but not
|
||||
* enough to stop the progress indicator.
|
||||
*/
|
||||
@Override
|
||||
public void updatePartialSync() {
|
||||
folderFeedList.hasUpdated();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateSyncStatus(boolean syncRunning) {
|
||||
// TODO: the progress bar is activated manually elsewhere in this activity. this
|
||||
// interface method may be redundant.
|
||||
if (syncRunning) {
|
||||
setSupportProgressBarIndeterminateVisibility(true);
|
||||
if (menu != null) {
|
||||
|
|
|
@ -179,6 +179,13 @@ public abstract class Reading extends SherlockFragmentActivity implements OnPage
|
|||
checkStoryCount(pager.getCurrentItem());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updatePartialSync() {
|
||||
stories.requery();
|
||||
readingAdapter.notifyDataSetChanged();
|
||||
checkStoryCount(pager.getCurrentItem());
|
||||
}
|
||||
|
||||
public abstract void checkStoryCount(int position);
|
||||
|
||||
@Override
|
||||
|
|
|
@ -11,7 +11,8 @@ import com.newsblur.service.DetachableResultReceiver.Receiver;
|
|||
import com.newsblur.service.SyncService;
|
||||
|
||||
public class SyncUpdateFragment extends Fragment implements Receiver {
|
||||
public static final String TAG = "SyncUpdateFragment";
|
||||
|
||||
public static final String TAG = SyncUpdateFragment.class.getName();
|
||||
public DetachableResultReceiver receiver;
|
||||
public boolean syncRunning = false;
|
||||
|
||||
|
@ -40,6 +41,12 @@ public class SyncUpdateFragment extends Fragment implements Receiver {
|
|||
((SyncUpdateFragmentInterface) getActivity()).updateAfterSync();
|
||||
}
|
||||
break;
|
||||
case SyncService.STATUS_PARTIAL_PROGRESS:
|
||||
syncRunning = true;
|
||||
if (getActivity() != null) {
|
||||
((SyncUpdateFragmentInterface) getActivity()).updatePartialSync();
|
||||
}
|
||||
break;
|
||||
case SyncService.STATUS_FINISHED_CLOSE:
|
||||
syncRunning = false;
|
||||
if (getActivity() != null) {
|
||||
|
@ -57,11 +64,11 @@ public class SyncUpdateFragment extends Fragment implements Receiver {
|
|||
break;
|
||||
case SyncService.STATUS_ERROR:
|
||||
syncRunning = false;
|
||||
Log.e(TAG, "There was an error");
|
||||
Log.e(this.getClass().getName(), "Sync completed with an error.");
|
||||
break;
|
||||
default:
|
||||
syncRunning = false;
|
||||
Log.e(TAG, "Unrecognised response attempting to get reading data");
|
||||
Log.e(this.getClass().getName(), "Sync completed with an unknown result.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -75,6 +82,7 @@ public class SyncUpdateFragment extends Fragment implements Receiver {
|
|||
|
||||
public interface SyncUpdateFragmentInterface {
|
||||
public void updateAfterSync();
|
||||
public void updatePartialSync();
|
||||
public void closeAfterUpdate();
|
||||
public void setNothingMoreToUpdate();
|
||||
public void updateSyncStatus(boolean syncRunning);
|
||||
|
|
|
@ -451,10 +451,6 @@ public class APIManager {
|
|||
}
|
||||
}
|
||||
|
||||
public boolean getFolderFeedMapping() {
|
||||
return getFolderFeedMapping(false);
|
||||
}
|
||||
|
||||
public boolean getFolderFeedMapping(boolean doUpdateCounts) {
|
||||
|
||||
final APIClient client = new APIClient(context);
|
||||
|
@ -462,9 +458,6 @@ public class APIManager {
|
|||
final FeedFolderResponse feedUpdate = new FeedFolderResponse(response.responseString, gson);
|
||||
|
||||
if (response.responseCode == HttpStatus.SC_OK && !response.hasRedirected) {
|
||||
if (feedUpdate.folders.size() == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
HashMap<String, Feed> existingFeeds = getExistingFeeds();
|
||||
|
||||
|
|
|
@ -46,17 +46,18 @@ public class SyncService extends IntentService {
|
|||
public static final String EXTRA_TASK_PAGE_NUMBER = "page";
|
||||
public static final String EXTRA_TASK_MULTIFEED_IDS = "multi_feedids";
|
||||
|
||||
public final static int STATUS_RUNNING = 0x02;
|
||||
// TODO: replace these with enums
|
||||
public final static int STATUS_RUNNING = 0x02;
|
||||
public final static int STATUS_FINISHED = 0x03;
|
||||
public final static int STATUS_ERROR = 0x04;
|
||||
public static final int STATUS_NO_MORE_UPDATES = 0x05;
|
||||
public static final int STATUS_FINISHED_CLOSE = 0x06;
|
||||
public static final int NOT_RUNNING = 0x01;
|
||||
public static final int STATUS_PARTIAL_PROGRESS = 0x07;
|
||||
|
||||
public static final int EXTRA_TASK_FOLDER_UPDATE = 30;
|
||||
public static final int EXTRA_TASK_FOLDER_UPDATE_TWO_STEP = 30;
|
||||
public static final int EXTRA_TASK_FOLDER_UPDATE_WITH_COUNT = 41;
|
||||
public static final int EXTRA_TASK_FEED_UPDATE = 31;
|
||||
public static final int EXTRA_TASK_REFRESH_COUNTS = 32;
|
||||
public static final int EXTRA_TASK_MARK_STORY_READ = 33;
|
||||
public static final int EXTRA_TASK_SOCIALFEED_UPDATE = 34;
|
||||
public static final int EXTRA_TASK_MARK_SOCIALSTORY_READ = 35;
|
||||
|
@ -90,35 +91,29 @@ public class SyncService extends IntentService {
|
|||
if (receiver != null) {
|
||||
receiver.send(STATUS_RUNNING, Bundle.EMPTY);
|
||||
}
|
||||
// TODO: is it ever valid for receiver to be null? if not, we could factor out all
|
||||
// the checks below
|
||||
|
||||
Log.d( this.getClass().getName(), "Sync Intent: " + intent.getIntExtra(SYNCSERVICE_TASK , -1) );
|
||||
|
||||
switch (intent.getIntExtra(SYNCSERVICE_TASK , -1)) {
|
||||
case EXTRA_TASK_FOLDER_UPDATE:
|
||||
if (!apiManager.getFolderFeedMapping()) {
|
||||
receiver.send(STATUS_NO_MORE_UPDATES, null);
|
||||
}
|
||||
|
||||
case EXTRA_TASK_FOLDER_UPDATE_TWO_STEP:
|
||||
// do a quick fetch of folders/feeds
|
||||
apiManager.getFolderFeedMapping(false);
|
||||
// notify UI of progress
|
||||
if (receiver != null) {
|
||||
receiver.send(STATUS_PARTIAL_PROGRESS, Bundle.EMPTY);
|
||||
}
|
||||
// update feed counts
|
||||
apiManager.refreshFeedCounts();
|
||||
// UI will be notified again by default
|
||||
break;
|
||||
|
||||
case EXTRA_TASK_FOLDER_UPDATE_WITH_COUNT:
|
||||
apiManager.getFolderFeedMapping(true);
|
||||
break;
|
||||
|
||||
// For the moment, we only retry offline updates when we refresh counts. We also assume here that every update is to mark a story as read.
|
||||
case EXTRA_TASK_REFRESH_COUNTS:
|
||||
Cursor cursor = getContentResolver().query(FeedProvider.OFFLINE_URI, null, null, null, null);
|
||||
while (cursor.moveToNext()) {
|
||||
OfflineUpdate update = OfflineUpdate.fromCursor(cursor);
|
||||
ArrayList<String> storyId = new ArrayList<String>();
|
||||
storyId.add(update.arguments[1]);
|
||||
if (apiManager.markStoryAsRead(update.arguments[0], storyId)) {
|
||||
getContentResolver().delete(FeedProvider.OFFLINE_URI, DatabaseConstants.UPDATE_ID + " = ?", new String[] { Integer.toString(update.id) });
|
||||
}
|
||||
}
|
||||
apiManager.refreshFeedCounts();
|
||||
cursor.close();
|
||||
break;
|
||||
|
||||
case EXTRA_TASK_MARK_STORY_READ:
|
||||
final String feedId = intent.getStringExtra(EXTRA_TASK_FEED_ID);
|
||||
final ArrayList<String> storyIds = intent.getStringArrayListExtra(EXTRA_TASK_STORY_ID);
|
||||
|
@ -263,4 +258,19 @@ public class SyncService extends IntentService {
|
|||
}
|
||||
}
|
||||
|
||||
/* TODO: this code existed in the refresh_feeds intent, but was never used. Now that
|
||||
we are actually using the API as intended, it is possible this needs to
|
||||
actually get called somewhere.
|
||||
Cursor cursor = getContentResolver().query(FeedProvider.OFFLINE_URI, null, null, null, null);
|
||||
while (cursor.moveToNext()) {
|
||||
OfflineUpdate update = OfflineUpdate.fromCursor(cursor);
|
||||
ArrayList<String> storyId = new ArrayList<String>();
|
||||
storyId.add(update.arguments[1]);
|
||||
if (apiManager.markStoryAsRead(update.arguments[0], storyId)) {
|
||||
getContentResolver().delete(FeedProvider.OFFLINE_URI, DatabaseConstants.UPDATE_ID + " = ?", new String[] { Integer.toString(update.id) });
|
||||
}
|
||||
}
|
||||
cursor.close();
|
||||
*/
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue