Adding unread icon to story detail. Fixing inconsistencies in unreads.

This commit is contained in:
Samuel Clay 2013-10-04 12:37:51 -07:00
parent b28b081d33
commit 439ece29fb
7 changed files with 65 additions and 11 deletions

View file

@ -967,10 +967,12 @@
}
- (void)loadStory:(FeedDetailTableCell *)cell atRow:(NSInteger)row {
cell.isRead = YES;
[cell setNeedsLayout];
NSInteger storyIndex = [appDelegate indexFromLocation:row];
appDelegate.activeStory = [[appDelegate activeFeedStories] objectAtIndex:storyIndex];
if ([appDelegate isStoryUnread:appDelegate.activeStory]) {
[self markStoryAsRead:appDelegate.activeStory];
}
[self redrawUnreadStory];
[appDelegate loadStoryDetailView];
}
@ -978,7 +980,7 @@
NSInteger rowIndex = [appDelegate locationOfActiveStory];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:rowIndex inSection:0];
FeedDetailTableCell *cell = (FeedDetailTableCell*) [self.storyTitlesTable cellForRowAtIndexPath:indexPath];
cell.isRead = [[appDelegate.activeStory objectForKey:@"read_status"] boolValue];
cell.isRead = ![appDelegate isStoryUnread:appDelegate.activeStory];
cell.isShared = [[appDelegate.activeStory objectForKey:@"shared"] boolValue];
cell.isStarred = [[appDelegate.activeStory objectForKey:@"starred"] boolValue];
[cell setNeedsDisplay];

View file

@ -1075,9 +1075,9 @@
BOOL recentlyRead = [[self.recentlyReadStories
objectForKey:[story objectForKey:@"story_hash"]] boolValue];
// NSLog(@"isUnread: %d/%d/%d (%@ / %@)", readStatusUnread, storyHashUnread,
// recentlyRead, [[story objectForKey:@"story_title"] substringToIndex:10],
// [story objectForKey:@"story_hash"]);
NSLog(@"isUnread: (%d || %d) && %d (%@ / %@)", readStatusUnread, storyHashUnread,
!recentlyRead, [[story objectForKey:@"story_title"] substringToIndex:10],
[story objectForKey:@"story_hash"]);
return (readStatusUnread || storyHashUnread) && !recentlyRead;
}
@ -1662,6 +1662,7 @@
[self.recentlyReadStories setObject:[NSNumber numberWithBool:YES]
forKey:[story objectForKey:@"story_hash"]];
[self.recentlyReadStoryLocations addObject:[NSNumber numberWithInteger:location]];
[self.unreadStoryHashes removeObjectForKey:[story objectForKey:@"story_hash"]];
}
@ -2407,6 +2408,7 @@
[db executeUpdate:@"drop table if exists `cached_images`"];
[db executeUpdate:@"drop table if exists `users`"];
// [db executeUpdate:@"drop table if exists `queued_read_hashes`"]; // Nope, don't clear this.
// [db executeUpdate:@"drop table if exists `queued_saved_hashes`"]; // Nope, don't clear this.
NSLog(@"Dropped db: %@", [db lastErrorMessage]);
sqlite3_exec(db.sqliteHandle, [[NSString stringWithFormat:@"PRAGMA user_version = %d", CURRENT_DB_VERSION] UTF8String], NULL, NULL, NULL);
}
@ -2462,6 +2464,14 @@
")"];
[db executeUpdate:createReadTable];
NSString *createSavedTable = [NSString stringWithFormat:@"create table if not exists queued_saved_hashes "
"("
" story_feed_id varchar(20),"
" story_hash varchar(24),"
" UNIQUE(story_hash) ON CONFLICT IGNORE"
")"];
[db executeUpdate:createSavedTable];
NSString *createImagesTable = [NSString stringWithFormat:@"create table if not exists cached_images "
"("
" story_feed_id varchar(20),"

View file

@ -338,6 +338,13 @@
[self.activeStory objectForKey:@"starred_date"]];
}
NSString *storyUnread = @"";
if ([appDelegate isStoryUnread:self.activeStory]) {
NSInteger score = [NewsBlurAppDelegate computeStoryScore:[self.activeStory objectForKey:@"intelligence"]];
storyUnread = [NSString stringWithFormat:@"<div class=\"NB-story-unread NB-%@\"></div>",
score > 0 ? @"positive" : score < 0 ? @"negative" : @"neutral"];
}
NSString *storyTitle = [self.activeStory objectForKey:@"story_title"];
NSMutableDictionary *titleClassifiers = [[appDelegate.activeClassifiers objectForKey:feedId]
objectForKey:@"titles"];
@ -354,12 +361,16 @@
NSString *storyHeader = [NSString stringWithFormat:@
"<div class=\"NB-header\"><div class=\"NB-header-inner\">"
"<div class=\"NB-story-title\">%@</div>"
"<div class=\"NB-story-title\">"
" %@"
" %@"
"</div>"
"<div class=\"NB-story-date\">%@</div>"
"%@"
"%@"
"%@"
"</div></div>",
storyUnread,
storyTitle,
[self.activeStory objectForKey:@"long_parsed_date"],
storyAuthor,

View file

@ -777,6 +777,8 @@
if ([appDelegate isStoryUnread:appDelegate.activeStory]) {
[appDelegate markActiveStoryRead];
[self.currentPage refreshHeader];
[appDelegate.feedDetailViewController redrawUnreadStory];
NSString *urlString = [NSString stringWithFormat:@"%@/reader/mark_story_hashes_as_read",
NEWSBLUR_URL];
@ -924,7 +926,7 @@
[appDelegate markActiveStoryUnread];
[appDelegate.feedDetailViewController redrawUnreadStory];
[self setNextPreviousButtons];
[self refreshHeaders];
[self.currentPage flashCheckmarkHud:@"unread"];
}
@ -941,9 +943,10 @@
[appDelegate markActiveStoryUnread];
[appDelegate.feedDetailViewController redrawUnreadStory];
[self setNextPreviousButtons];
[self.currentPage flashCheckmarkHud:@"unread"];
}
[self refreshHeaders];
}

View file

@ -775,7 +775,7 @@
FF67D3B1168924C40057A7DA /* TrainerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TrainerViewController.m; sourceTree = "<group>"; };
FF67D3B6168977690057A7DA /* TrainerViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TrainerViewController.xib; sourceTree = "<group>"; };
FF67D3BA168A70630057A7DA /* trainer.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; name = trainer.css; path = ../static/trainer.css; sourceTree = "<group>"; };
FF67D3BD168A708D0057A7DA /* storyDetailView.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; name = storyDetailView.css; path = ../static/storyDetailView.css; sourceTree = "<group>"; };
FF67D3BD168A708D0057A7DA /* storyDetailView.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; name = storyDetailView.css; path = ../static/storyDetailView.css; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.css; };
FF67D3BE168A708D0057A7DA /* storyDetailView.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = storyDetailView.js; path = ../static/storyDetailView.js; sourceTree = "<group>"; };
FF67D3BF168A708D0057A7DA /* zepto.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = zepto.js; path = ../static/zepto.js; sourceTree = "<group>"; };
FF67D3C4168A71870057A7DA /* trainer.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = trainer.js; path = ../static/trainer.js; sourceTree = "<group>"; };

View file

@ -5,7 +5,7 @@
#import <SystemConfiguration/SystemConfiguration.h>
#import <MobileCoreServices/MobileCoreServices.h>
//#define DEBUG 1
#define DEBUG 1
#ifdef DEBUG
#define BACKGROUND_REFRESH_SECONDS -5

View file

@ -204,6 +204,34 @@ body.NB-iphone {
color: #B85044;
text-shadow: 0 1px 0 #F6E9E9;
}
.NB-story-unread {
float: left;
margin: 6px 6px 0 0;
width: 8px;
height: 8px;
background: transparent url("data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACVElEQVQ4EXVTPW8TQRCd/XCM7QgF2QSnsYQbRGKgpA+QitY/IBUSrgAjQWW5oojocCTSRKJ1SRMpgCIhIVrERwlSmthnsBXLd7bPtzvM7HFgkDlrvbuz782+N7srEBHmv/395+tCQY2imwCiHK/hVwHwBg20trfvfJnHiyRBu91eGgU/dohYI4CaB82NDSVqLWfzD6vVashxl4DJQ//7S5pvcbB4YQ2KxTXIZDI8hfF4DJ3OCXS6J25OtMOzufxtTiI5cjrq7ViLW+l0GiqVq1AqlUBrDWEYusZjjvEaY6y1t5jDXLG392wDJX6gsapsXCHAGTA2YhAk9oQQIKUEJTVMpxP49PkjAEKECq9pC+YuWlCr51dBKQWTyRiM+U8CpZ2yQr4AXs/TIoKaNoibVBhYWTlH5AlE0YwUGECLtEl8QgLoJwUpUJQg5bBdrwuWTkqT1DIn4I/lRf/sHq+Q1182jDEuibMIUNZI+vkqTMOpk86AxHtCTnpOwsSIMNxT2pAVfCOll4LAd4ViciI9ISY9W2GitVPX0/xYgsHX7HcwGJAC45o1BFrQknXGuhpZeyStwV2L1gyHQ1fEeAfeZXHjQjOWOcxVBweHvXfv3xZI+nVeTKVSrmDOCtuZa3yx+v2+U0m2WvfvPXqh2d/oNKxnl/Xl2Wx20/M8yGazkMvl3JlzApbu+z4EQRCXA+GVP5rVefL7MTWbzaVMTtL1FPwSFz4mOm6DAnYnI1NvNBp/HlOcNv5/8rS5LlDW6Chu0H29SH1IxT8mX0cobOvxg8Zfz/knWROSyKoTDHAAAAAASUVORK5CYII=") no-repeat center center;
background-size: 8px;
}
.NB-extra-small .NB-story-unread {
margin-top: 4px;
}
.NB-small .NB-story-unread {
margin-top: 5px;
}
.NB-large .NB-story-unread {
margin-top: 7px;
}
.NB-extra-large .NB-story-unread {
margin-top: 8px;
}
.NB-story-unread.NB-positive {
background: transparent url("data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAJCSURBVDiNfZO9a1NhFMZ/733vvWnTSoZULBkqltBiHRxKsYOLUdvFpc6COAkGEUv9KwJ1kAacRGexg6MaijgInVw6FcWAWqu1ps3n/TjHIR9NVPrAgXd4z/M85zkcw1+4v56bMYY8Sg7DJADKRwwlVdYeLpW2+v+b7mN5PedjKKiSB+zfxB3ExrCG8mB1qRT0CJbXc77CS5QFgIlTWSZSM4z4KQBqQYVyZYvy9+22quEVcG11qRQ4ACJaUGVheDTBfHaRqfQsvk0QxA2CuIFvE0ylZ5nPLjI8mkCUqyJaADD3nl86B3wA7Fw2R9I7QSwRsUaoSkfRwRoX67jUw0M2t0sAEcp51xjuqGLHT2ZwHY9acEAsIaIxinaCMjjGYh0Pz/qMj2XY+fnVNQ55V2LNAaSTGRrhIWEc9NT7CbouIvFJj2T4tvsFhZyrwqRx2hE3wipRn7pqh8CYnotIAlzrt7crTLqKghhaUZ0wDo6sd5qPFt4miSTElZBOPIELfFLR6WrrN45jB6wPQI9GaUV1VBQMZRfhjcL0fmOX1FD6/839RjBUmnsoYJQNR0SLKhpX91o0o1p7hcdUM6pR3WuhorGIFu3mi88/5q6fHgMuBK0QO9QOTZF/KpQmB79qbfuwVrzx9pkLUNsPVpIp72wUxFf2d6okRl2GRjys8VAU0YhmLaRVjbqTvK5XwpXeLQDcfDTvJ1NeAY4/JqBYr4QrT+++DwYIurj95OKMY01elcvAGZQAKBuHDYl17fGtdwPn/AezNkQDSAjjKwAAAABJRU5ErkJggg==") no-repeat center center;
background-size: 8px;
}
.NB-story-unread.NB-negative {
background: transparent url("data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACT0lEQVQ4EX1TTWsUQRB9NTPZXfcjxKhkFTxkL4FNIKDk6CVqBPXsj3Cv+iv2vPkRXkUvfhDILaAQiAEvihE0IR9gJjvZnZ3u8tXsxiQabCjorqr36nVVt6gqzq7th9ebYRC0BLoISGMY0y8Kee+879Rf/9w8my8nBJtP5grXugdthbYIDM8mne7VCaSzW5l83nyxkZo/JzDwlaO9l6yyZM7SzSlaHWGlZEe4bg+979u0nfxMdW/2q1cfG0lgnol4r515LKFUxPhCE+XpGwgY0W6Sm+3NZzHLYe59wxhWvj2oz4q6daiEk7dnEBUiaDoAsowMo/6IAFEEKYwhSzMcfPhMqGbqw/lInXvqoWG5PolAPdyvGCAB/YAfEQS8eci2kCCgguLUZSTb+5GIa0XO+UVlgeJ4BT7uQnt96IDVnT+vIAwgY1TBmOXGP/asgYtR5n0DlBhQsjNwLp/VqQYnE2YBCBsxcBA2wFQ4U6faiPKNKFzSA/opb2bSCf5n0UdVYsoI5psw1jRyql9ZaSblqCI61QInlf8m8VRAcEYVeWFgK/Be39nh8DCBZ0AdnxLPFxpjlmO5hvHer8jaQnWWDV5nsXCqVsYYm/W/NeAVduLEUhwHNR8srMWfyLRsjLtHx+izUd4qXWAWs5xR9WXDDp/ynBTicvkVWe8ZdZXzrtEie4JsSEbymNM5sgkN19takjxqbmh6+plIcli61PaCFjEXfyaBY2x5onf8zMDG9YdgxIzVW8WmSMgfqXc5/mm+5hSCLaauqLrOnY/9c9/5N8X6eiwIgjoOAAAAAElFTkSuQmCC") no-repeat center center;
background-size: 8px;
}
.NB-story-date {
display: inline;
color: #818776;