mirror of
https://github.com/viq/NewsBlur.git
synced 2025-09-18 21:43:31 +00:00
Fix unread counts from ghost feeds, correctly pick up feed/folder renames.
This commit is contained in:
parent
cd0ced2d52
commit
d9849cf9eb
2 changed files with 62 additions and 40 deletions
|
@ -121,6 +121,7 @@ public class FeedProvider extends ContentProvider {
|
|||
|
||||
case ALL_FEEDS:
|
||||
db.delete(DatabaseConstants.FEED_TABLE, null, null);
|
||||
db.delete(DatabaseConstants.FOLDER_TABLE, null, null);
|
||||
db.delete(DatabaseConstants.FEED_FOLDER_MAP_TABLE, null, null);
|
||||
db.delete(DatabaseConstants.STORY_TABLE, null, null);
|
||||
return 1;
|
||||
|
@ -170,6 +171,18 @@ public class FeedProvider extends ContentProvider {
|
|||
final SQLiteDatabase db = databaseHelper.getWritableDatabase();
|
||||
switch (uriMatcher.match(uri)) {
|
||||
case ALL_FOLDERS:
|
||||
db.beginTransaction();
|
||||
try {
|
||||
for(ContentValues values: valuesArray) {
|
||||
db.insertWithOnConflict(DatabaseConstants.FOLDER_TABLE, null, values, SQLiteDatabase.CONFLICT_REPLACE);
|
||||
count++;
|
||||
}
|
||||
db.setTransactionSuccessful();
|
||||
} finally {
|
||||
db.endTransaction();
|
||||
}
|
||||
break;
|
||||
case FEED_FOLDER_MAP:
|
||||
db.beginTransaction();
|
||||
try {
|
||||
for(ContentValues values: valuesArray) {
|
||||
|
@ -181,6 +194,18 @@ public class FeedProvider extends ContentProvider {
|
|||
db.endTransaction();
|
||||
}
|
||||
break;
|
||||
case ALL_FEEDS:
|
||||
db.beginTransaction();
|
||||
try {
|
||||
for(ContentValues values: valuesArray) {
|
||||
db.insertWithOnConflict(DatabaseConstants.FEED_TABLE, null, values, SQLiteDatabase.CONFLICT_REPLACE);
|
||||
count++;
|
||||
}
|
||||
db.setTransactionSuccessful();
|
||||
} finally {
|
||||
db.endTransaction();
|
||||
}
|
||||
break;
|
||||
case ALL_SOCIAL_FEEDS:
|
||||
db.beginTransaction();
|
||||
try {
|
||||
|
|
|
@ -480,7 +480,8 @@ public class APIManager {
|
|||
final ContentValues params = new ContentValues();
|
||||
params.put( APIConstants.PARAMETER_UPDATE_COUNTS, (doUpdateCounts ? "true" : "false") );
|
||||
final APIResponse response = client.get(APIConstants.URL_FEEDS, params);
|
||||
final FeedFolderResponse feedUpdate = new FeedFolderResponse(response.responseString, gson);
|
||||
|
||||
final FeedFolderResponse feedUpdate = new FeedFolderResponse(response.responseString, gson);
|
||||
|
||||
if (response.responseCode == HttpStatus.SC_OK && !response.hasRedirected) {
|
||||
|
||||
|
@ -490,63 +491,48 @@ public class APIManager {
|
|||
PrefsUtils.logout(context);
|
||||
return false;
|
||||
}
|
||||
|
||||
HashMap<String, Feed> existingFeeds = getExistingFeeds();
|
||||
|
||||
|
||||
// this actually cleans out the feed, folder, and story tables
|
||||
contentResolver.delete(FeedProvider.FEEDS_URI, null, null);
|
||||
|
||||
// populate the feeds table
|
||||
List<ContentValues> feedValues = new ArrayList<ContentValues>();
|
||||
for (String newFeedId : feedUpdate.feeds.keySet()) {
|
||||
if (existingFeeds.get(newFeedId) == null || !feedUpdate.feeds.get(newFeedId).equals(existingFeeds.get(newFeedId))) {
|
||||
feedValues.add(feedUpdate.feeds.get(newFeedId).getValues());
|
||||
}
|
||||
}
|
||||
if(feedValues.size() > 0) {
|
||||
contentResolver.bulkInsert(FeedProvider.FEEDS_URI, feedValues.toArray(new ContentValues[feedValues.size()]));
|
||||
feedValues.add(feedUpdate.feeds.get(newFeedId).getValues());
|
||||
}
|
||||
bulkInsertList(FeedProvider.FEEDS_URI, feedValues);
|
||||
|
||||
for (String olderFeedId : existingFeeds.keySet()) {
|
||||
if (feedUpdate.feeds.get(olderFeedId) == null) {
|
||||
Uri feedUri = FeedProvider.FEEDS_URI.buildUpon().appendPath(olderFeedId).build();
|
||||
contentResolver.delete(feedUri, null, null);
|
||||
}
|
||||
}
|
||||
|
||||
List<ContentValues> socialFeedValues = new ArrayList<ContentValues>();
|
||||
// populate the social feeds table
|
||||
List<ContentValues> socialFeedValues = new ArrayList<ContentValues>();
|
||||
for (final SocialFeed feed : feedUpdate.socialFeeds) {
|
||||
socialFeedValues.add(feed.getValues());
|
||||
}
|
||||
if(socialFeedValues.size() > 0) {
|
||||
contentResolver.bulkInsert(FeedProvider.SOCIAL_FEEDS_URI, socialFeedValues.toArray(new ContentValues[socialFeedValues.size()]));
|
||||
}
|
||||
|
||||
Cursor folderCursor = contentResolver.query(FeedProvider.FOLDERS_URI, null, null, null, null);
|
||||
folderCursor.moveToFirst();
|
||||
HashSet<String> existingFolders = new HashSet<String>();
|
||||
while (!folderCursor.isAfterLast()) {
|
||||
existingFolders.add(Folder.fromCursor(folderCursor).getName());
|
||||
folderCursor.moveToNext();
|
||||
}
|
||||
folderCursor.close();
|
||||
bulkInsertList(FeedProvider.SOCIAL_FEEDS_URI, socialFeedValues);
|
||||
|
||||
// populate the folder and folder-feed-mapping tables
|
||||
List<ContentValues> folderValues = new ArrayList<ContentValues>();
|
||||
List<ContentValues> ffmValues = new ArrayList<ContentValues>();
|
||||
for (final Entry<String, List<Long>> entry : feedUpdate.folders.entrySet()) {
|
||||
if (!TextUtils.isEmpty(entry.getKey())) {
|
||||
String folderName = entry.getKey().trim();
|
||||
if (!existingFolders.contains(folderName) && !TextUtils.isEmpty(folderName)) {
|
||||
final ContentValues folderValues = new ContentValues();
|
||||
folderValues.put(DatabaseConstants.FOLDER_NAME, folderName);
|
||||
contentResolver.insert(FeedProvider.FOLDERS_URI, folderValues);
|
||||
if (!TextUtils.isEmpty(folderName)) {
|
||||
final ContentValues values = new ContentValues();
|
||||
values.put(DatabaseConstants.FOLDER_NAME, folderName);
|
||||
folderValues.add(values);
|
||||
}
|
||||
|
||||
for (Long feedId : entry.getValue()) {
|
||||
if (!existingFeeds.containsKey(Long.toString(feedId))) {
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(DatabaseConstants.FEED_FOLDER_FEED_ID, feedId);
|
||||
values.put(DatabaseConstants.FEED_FOLDER_FOLDER_NAME, folderName);
|
||||
contentResolver.insert(FeedProvider.FEED_FOLDER_MAP_URI, values);
|
||||
}
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(DatabaseConstants.FEED_FOLDER_FEED_ID, feedId);
|
||||
values.put(DatabaseConstants.FEED_FOLDER_FOLDER_NAME, folderName);
|
||||
ffmValues.add(values);
|
||||
}
|
||||
}
|
||||
}
|
||||
bulkInsertList(FeedProvider.FOLDERS_URI, folderValues);
|
||||
bulkInsertList(FeedProvider.FEED_FOLDER_MAP_URI, ffmValues);
|
||||
|
||||
// populate the starred stories count table
|
||||
int starredStoriesCount = feedUpdate.starredCount;
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(DatabaseConstants.STARRED_STORY_COUNT_COUNT, starredStoriesCount);
|
||||
|
@ -754,4 +740,15 @@ public class APIManager {
|
|||
}
|
||||
return isServerMessage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience method to call contentResolver.bulkInsert using a list rather than an array.
|
||||
*/
|
||||
private int bulkInsertList(Uri uri, List<ContentValues> list) {
|
||||
if (list.size() > 0) {
|
||||
return contentResolver.bulkInsert(uri, list.toArray(new ContentValues[list.size()]));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue