2011-08-25 12:09:41 -07:00
//
2010-06-20 11:04:23 -04:00
// NewsBlurViewController . m
// NewsBlur
//
// Created by Samuel Clay on 6 / 16 / 10.
// Copyright NewsBlur 2010. All rights reserved .
//
2012-06-15 17:24:37 -07:00
# import "FeedsViewController.h"
2010-06-21 17:17:26 -04:00
# import "NewsBlurAppDelegate.h"
2012-06-11 21:00:09 -07:00
# import "SplitStoryDetailViewController.h"
2011-07-18 09:56:48 -07:00
# import "FeedTableCell.h"
2011-08-04 17:58:28 -07:00
# import "ASIHTTPRequest.h"
# import "PullToRefreshView.h"
2011-08-13 23:00:51 -07:00
# import "MBProgressHUD.h"
2011-08-03 10:00:41 -07:00
# import "Base64.h"
2010-06-20 11:04:23 -04:00
# import "JSON.h"
2011-10-17 09:28:40 -07:00
# import "Utilities.h"
2010-06-20 11:04:23 -04:00
2011-07-19 09:38:49 -07:00
# define kTableViewRowHeight 40 ;
2012-06-15 17:24:37 -07:00
@ implementation FeedsViewController
2010-06-21 17:17:26 -04:00
@ synthesize appDelegate ;
2011-08-02 09:16:54 -07:00
@ synthesize feedTitlesTable ;
2010-06-20 11:04:23 -04:00
@ synthesize feedViewToolbar ;
2010-06-21 17:17:26 -04:00
@ synthesize feedScoreSlider ;
2010-11-11 23:48:27 -05:00
@ synthesize logoutButton ;
2011-08-02 09:16:54 -07:00
@ synthesize intelligenceControl ;
2011-08-02 10:13:06 -07:00
@ synthesize activeFeedLocations ;
2011-08-24 21:41:44 -07:00
@ synthesize visibleFeeds ;
2011-10-31 10:10:38 -07:00
@ synthesize stillVisibleFeeds ;
2011-08-03 10:00:41 -07:00
@ synthesize sitesButton ;
2011-10-06 16:25:38 -07:00
@ synthesize addButton ;
2011-08-04 17:27:31 -07:00
@ synthesize viewShowingAllFeeds ;
2011-08-04 17:58:28 -07:00
@ synthesize pull ;
@ synthesize lastUpdate ;
2011-10-14 09:51:27 -07:00
@ synthesize imageCache ;
2010-06-20 11:04:23 -04:00
2010-06-21 17:17:26 -04:00
# pragma mark -
2011-08-24 21:44:16 -07:00
# pragma mark Globals
2010-06-21 17:17:26 -04:00
2010-06-20 11:04:23 -04:00
- ( id ) initWithNibName : ( NSString * ) nibNameOrNil bundle : ( NSBundle * ) nibBundleOrNil {
2011-08-24 21:44:16 -07:00
2010-06-21 17:17:26 -04:00
if ( self = [ super initWithNibName : nibNameOrNil bundle : nibBundleOrNil ] ) {
2011-08-24 21:44:16 -07:00
[ appDelegate hideNavigationBar : NO ] ;
2010-06-20 11:04:23 -04:00
}
return self ;
}
- ( void ) viewDidLoad {
2011-08-24 21:44:16 -07:00
self . navigationItem . leftBarButtonItem = [ [ [ UIBarButtonItem alloc ] initWithTitle : @ "Logout" style : UIBarButtonItemStylePlain target : self action : @ selector ( doLogoutButton ) ] autorelease ] ;
[ appDelegate showNavigationBar : NO ] ;
self . viewShowingAllFeeds = NO ;
pull = [ [ PullToRefreshView alloc ] initWithScrollView : self . feedTitlesTable ] ;
2011-08-04 17:58:28 -07:00
[ pull setDelegate : self ] ;
[ self . feedTitlesTable addSubview : pull ] ;
2011-08-24 21:44:16 -07:00
2011-08-26 09:34:30 -07:00
[ [ NSNotificationCenter defaultCenter ]
addObserver : self
selector : @ selector ( returnToApp )
name : UIApplicationWillEnterForegroundNotification
object : nil ] ;
2011-08-24 21:44:16 -07:00
2011-10-14 09:51:27 -07:00
imageCache = [ [ NSCache alloc ] init ] ;
[ imageCache setDelegate : self ] ;
2011-10-06 16:25:38 -07:00
[ addButton setWidth : 40 ] ;
2010-06-20 11:04:23 -04:00
[ super viewDidLoad ] ;
}
2010-06-25 18:36:01 -04:00
- ( void ) viewWillAppear : ( BOOL ) animated {
2011-11-03 18:08:24 -07:00
// If there is an active feed or a set of feeds readin the river ,
// we need to update its table row to match the updated unread counts .
2011-11-29 17:57:20 -08:00
if ( appDelegate . activeFeed || appDelegate . isRiverView ) {
2011-08-02 09:16:54 -07:00
[ self . feedTitlesTable beginUpdates ] ;
[ self . feedTitlesTable
2011-11-29 17:57:20 -08:00
reloadRowsAtIndexPaths : [ self . feedTitlesTable indexPathsForVisibleRows ]
2011-08-24 21:44:16 -07:00
withRowAnimation : UITableViewRowAnimationNone ] ;
2011-08-02 09:16:54 -07:00
[ self . feedTitlesTable endUpdates ] ;
2011-08-24 21:44:16 -07:00
NSInteger previousLevel = [ self . intelligenceControl selectedSegmentIndex ] - 1 ;
NSInteger newLevel = [ appDelegate selectedIntelligence ] ;
if ( newLevel ! = previousLevel ) {
2011-08-27 15:53:51 -07:00
[ appDelegate setSelectedIntelligence : newLevel ] ;
2011-09-06 17:51:02 -07:00
if ( ! self . viewShowingAllFeeds ) {
[ self updateFeedsWithIntelligence : previousLevel newLevel : newLevel ] ;
}
2011-08-27 15:53:51 -07:00
[ self redrawUnreadCounts ] ;
2011-08-24 21:44:16 -07:00
}
}
2011-11-03 18:08:24 -07:00
2012-06-18 17:20:34 -07:00
[ self . intelligenceControl setImage : [ UIImage imageNamed : @ "thumbs_down.png" ]
2011-08-26 09:34:30 -07:00
forSegmentAtIndex : 0 ] ;
[ self . intelligenceControl setImage : [ UIImage imageNamed : @ "bullet_yellow.png" ]
forSegmentAtIndex : 1 ] ;
2012-06-18 17:20:34 -07:00
[ self . intelligenceControl setImage : [ UIImage imageNamed : @ "thumbs_up.png" ]
2011-08-26 09:34:30 -07:00
forSegmentAtIndex : 2 ] ;
2011-08-02 09:16:54 -07:00
[ self . intelligenceControl addTarget : self
2011-08-24 21:44:16 -07:00
action : @ selector ( selectIntelligence )
forControlEvents : UIControlEventValueChanged ] ;
2011-08-13 17:08:26 -07:00
[ self . intelligenceControl
2011-08-24 21:44:16 -07:00
setSelectedSegmentIndex : [ appDelegate selectedIntelligence ] + 1 ] ;
2010-11-13 18:32:43 -05:00
[ appDelegate showNavigationBar : animated ] ;
2011-10-26 23:12:21 -07:00
[ self . feedTitlesTable selectRowAtIndexPath : [ feedTitlesTable indexPathForSelectedRow ]
animated : YES scrollPosition : UITableViewScrollPositionMiddle ] ;
2012-06-11 12:25:38 -07:00
// remove the right detail view in storySplitController
if ( UI_USER _INTERFACE _IDIOM ( ) = = UIUserInterfaceIdiomPad ) {
2012-06-13 18:07:24 -07:00
NSArray * subviews = [ [ appDelegate . splitStoryDetailViewController . view subviews ] copy ] ;
2012-06-11 12:25:38 -07:00
for ( UIView * subview in subviews ) {
if ( subview . tag = = 12 ) {
[ subview removeFromSuperview ] ;
}
}
[ subviews release ] ;
}
2012-06-11 19:17:58 -07:00
2012-06-13 18:07:24 -07:00
appDelegate . splitStoryDetailViewController . navigationItem . titleView = nil ;
appDelegate . splitStoryDetailViewController . navigationItem . title = @ "NewsBlur" ;
appDelegate . splitStoryDetailViewController . navigationItem . rightBarButtonItem = nil ;
2010-06-25 18:36:01 -04:00
}
2010-06-21 17:17:26 -04:00
- ( void ) viewDidAppear : ( BOOL ) animated {
2011-10-18 17:44:05 -07:00
// appDelegate . activeFeed = nil ;
2011-08-24 21:44:16 -07:00
[ super viewDidAppear : animated ] ;
2010-06-21 17:17:26 -04:00
}
- ( void ) viewWillDisappear : ( BOOL ) animated {
2010-11-12 10:55:44 -05:00
// [ appDelegate showNavigationBar : YES ] ;
2010-06-21 17:17:26 -04:00
[ super viewWillDisappear : animated ] ;
}
2010-06-20 11:04:23 -04:00
2012-06-08 10:37:51 -07:00
- ( BOOL ) shouldAutorotateToInterfaceOrientation : ( UIInterfaceOrientation ) interfaceOrientation {
// Return YES for supported orientations
2012-06-08 19:21:10 -07:00
return YES ;
2012-06-07 11:42:29 -07:00
}
2010-06-20 11:04:23 -04:00
- ( void ) didReceiveMemoryWarning {
2011-08-24 21:44:16 -07:00
// Releases the view if it doesn ' t have a superview .
2010-06-20 11:04:23 -04:00
[ super didReceiveMemoryWarning ] ;
2011-08-24 21:44:16 -07:00
// Release any cached data , images , etc that aren ' t in use .
2010-06-20 11:04:23 -04:00
}
- ( void ) viewDidUnload {
2011-08-24 21:44:16 -07:00
// Release any retained subviews of the main view .
// e . g . self . myOutlet = nil ;
2010-06-20 11:04:23 -04:00
}
2011-08-24 21:44:16 -07:00
- ( void ) dealloc {
[ appDelegate release ] ;
[ feedTitlesTable release ] ;
[ feedViewToolbar release ] ;
[ feedScoreSlider release ] ;
[ logoutButton release ] ;
2011-08-02 09:16:54 -07:00
[ intelligenceControl release ] ;
2011-08-24 21:44:16 -07:00
[ activeFeedLocations release ] ;
[ visibleFeeds release ] ;
2011-10-31 10:10:38 -07:00
[ stillVisibleFeeds release ] ;
2011-08-24 21:44:16 -07:00
[ sitesButton release ] ;
2011-10-06 16:25:38 -07:00
[ addButton release ] ;
2011-08-24 21:44:16 -07:00
[ pull release ] ;
[ lastUpdate release ] ;
2011-10-14 09:51:27 -07:00
[ imageCache release ] ;
2011-08-24 21:44:16 -07:00
2010-06-20 11:04:23 -04:00
[ super dealloc ] ;
}
# pragma mark -
# pragma mark Initialization
2011-08-18 21:48:30 -07:00
- ( void ) returnToApp {
2011-10-18 17:44:05 -07:00
NSDate * decayDate = [ [ NSDate alloc ] initWithTimeIntervalSinceNow : ( BACKGROUND_REFRESH _SECONDS ) ] ;
2011-08-24 21:44:16 -07:00
NSLog ( @ "Last Update: %@ - %f" , self . lastUpdate , [ self . lastUpdate timeIntervalSinceDate : decayDate ] ) ;
if ( [ self . lastUpdate timeIntervalSinceDate : decayDate ] < 0 ) {
2011-08-26 09:34:30 -07:00
[ self fetchFeedList : YES ] ;
2011-08-24 21:44:16 -07:00
}
[ decayDate release ] ;
2011-08-18 21:48:30 -07:00
}
2011-08-13 23:00:51 -07:00
- ( void ) fetchFeedList : ( BOOL ) showLoader {
2011-10-18 17:44:05 -07:00
// NSLog ( @ "fetchFeedList: %d %d %@" , showLoader , appDelegate . navigationController . topViewController = = appDelegate . feedsViewController , [ appDelegate activeFeed ] ) ;
2011-09-07 09:56:54 -07:00
if ( showLoader && appDelegate . navigationController . topViewController = = appDelegate . feedsViewController ) {
2011-09-16 09:26:22 -07:00
[ MBProgressHUD hideHUDForView : self . view animated : YES ] ;
2011-08-24 21:44:16 -07:00
MBProgressHUD * HUD = [ MBProgressHUD showHUDAddedTo : self . view animated : YES ] ;
HUD . labelText = @ "On its way..." ;
}
2011-10-14 17:15:48 -07:00
2011-08-24 21:44:16 -07:00
NSURL * urlFeedList = [ NSURL URLWithString :
[ NSString stringWithFormat : @ "http://%@/reader/feeds?flat=true" ,
NEWSBLUR_URL ] ] ;
2011-09-05 22:06:31 -07:00
ASIHTTPRequest * request = [ ASIHTTPRequest requestWithURL : urlFeedList ] ;
2011-10-15 17:48:10 -07:00
[ [ NSHTTPCookieStorage sharedHTTPCookieStorage ]
setCookieAcceptPolicy : NSHTTPCookieAcceptPolicyAlways ] ;
2011-09-05 22:06:31 -07:00
[ request setDelegate : self ] ;
[ request setResponseEncoding : NSUTF8StringEncoding ] ;
[ request setDefaultResponseEncoding : NSUTF8StringEncoding ] ;
[ request setDidFinishSelector : @ selector ( finishLoadingFeedList : ) ] ;
[ request setDidFailSelector : @ selector ( finishedWithError : ) ] ;
[ request setTimeOutSeconds : 30 ] ;
[ request startAsynchronous ] ;
2011-08-24 21:44:16 -07:00
self . lastUpdate = [ NSDate date ] ;
2010-06-20 11:04:23 -04:00
}
2011-10-14 17:15:48 -07:00
- ( void ) finishedWithError : ( ASIHTTPRequest * ) request {
2011-08-24 21:44:16 -07:00
[ MBProgressHUD hideHUDForView : self . view animated : YES ] ;
[ pull finishedLoading ] ;
// User clicking on another link before the page loads is OK .
2011-10-27 09:44:58 -07:00
[ self informError : [ request error ] ] ;
2010-11-13 13:42:20 -05:00
}
2011-09-05 22:06:31 -07:00
- ( void ) finishLoadingFeedList : ( ASIHTTPRequest * ) request {
if ( [ request responseStatusCode ] = = 403 ) {
2011-11-30 09:38:31 -08:00
return [ appDelegate showLogin ] ;
} else if ( [ request responseStatusCode ] >= 500 ) {
[ pull finishedLoading ] ;
return [ self informError : @ "The server barfed!" ] ;
2011-09-05 22:06:31 -07:00
}
NSString * responseString = [ request responseString ] ;
NSDictionary * results = [ [ NSDictionary alloc ]
initWithDictionary : [ responseString JSONValue ] ] ;
2011-08-24 21:44:16 -07:00
[ MBProgressHUD hideHUDForView : self . view animated : YES ] ;
self . stillVisibleFeeds = [ NSMutableDictionary dictionary ] ;
self . visibleFeeds = [ NSMutableDictionary dictionary ] ;
[ pull finishedLoading ] ;
[ self loadFavicons ] ;
2011-09-05 22:06:31 -07:00
appDelegate . activeUsername = [ results objectForKey : @ "user" ] ;
if ( appDelegate . feedsViewController . view . window ) {
[ appDelegate setTitle : [ results objectForKey : @ "user" ] ] ;
2011-08-24 21:44:16 -07:00
}
2011-10-04 18:01:35 -07:00
appDelegate . dictFolders = [ results objectForKey : @ "flat_folders" ] ;
appDelegate . dictFeeds = [ results objectForKey : @ "feeds" ] ;
2011-09-05 22:06:31 -07:00
NSMutableDictionary * sortedFolders = [ [ NSMutableDictionary alloc ] init ] ;
2011-10-14 17:15:48 -07:00
NSArray * sortedArray ;
2011-09-05 22:06:31 -07:00
2011-10-04 18:01:35 -07:00
appDelegate . dictFoldersArray = [ NSMutableArray array ] ;
for ( id f in appDelegate . dictFolders ) {
[ appDelegate . dictFoldersArray addObject : f ] ;
2011-10-14 17:15:48 -07:00
NSArray * folder = [ appDelegate . dictFolders objectForKey : f ] ;
sortedArray = [ folder sortedArrayUsingComparator : ^ NSComparisonResult ( id id1 , id id2 ) {
2012-03-15 12:13:30 -07:00
NSString * feedTitleA = [ [ appDelegate . dictFeeds
objectForKey : [ NSString stringWithFormat : @ "%@" , id1 ] ]
objectForKey : @ "feed_title" ] ;
NSString * feedTitleB = [ [ appDelegate . dictFeeds
objectForKey : [ NSString stringWithFormat : @ "%@" , id2 ] ]
objectForKey : @ "feed_title" ] ;
return [ feedTitleA caseInsensitiveCompare : feedTitleB ] ;
2011-10-14 17:15:48 -07:00
} ] ;
[ sortedFolders setValue : sortedArray forKey : f ] ;
2011-09-05 22:06:31 -07:00
}
2011-10-14 17:15:48 -07:00
appDelegate . dictFolders = sortedFolders ;
2011-10-04 18:01:35 -07:00
[ appDelegate . dictFoldersArray sortUsingSelector : @ selector ( caseInsensitiveCompare : ) ] ;
2012-03-15 12:13:30 -07:00
NSLog ( @ "Folders: %@, Array: %@" , appDelegate . dictFolders , appDelegate . dictFoldersArray ) ;
2011-09-05 22:06:31 -07:00
[ self calculateFeedLocations : YES ] ;
[ self . feedTitlesTable reloadData ] ;
2012-06-09 09:38:32 -07:00
NSString * serveriPhoneVersion = [ results objectForKey : @ "iphone_version" ] ;
2011-12-07 09:57:33 -08:00
NSString * currentiPhoneVersion = [ [ [ NSBundle mainBundle ] infoDictionary ] objectForKey : @ "CFBundleVersion" ] ;
2012-06-07 12:45:11 -07:00
float serveriPhoneVersionFloat = [ serveriPhoneVersion floatValue ] ;
float currentiPhoneVersionFloat = [ currentiPhoneVersion floatValue ] ;
if ( currentiPhoneVersionFloat < serveriPhoneVersionFloat ) {
NSLog ( @ "Version: %f - %f" , serveriPhoneVersionFloat , currentiPhoneVersionFloat ) ;
2012-06-07 11:42:29 -07:00
NSString * title = [ NSString stringWithFormat : @ "You should download the new version of NewsBlur.\n\nNew version: v%@\nYou have: v%@" , serveriPhoneVersion , currentiPhoneVersion ] ;
2011-12-07 09:57:33 -08:00
UIAlertView * upgradeConfirm = [ [ UIAlertView alloc ] initWithTitle : title message : nil delegate : self cancelButtonTitle : @ "Cancel" otherButtonTitles : @ "Upgrade!" , nil ] ;
[ upgradeConfirm show ] ;
[ upgradeConfirm setTag : 2 ] ;
[ upgradeConfirm release ] ;
}
2011-09-05 22:06:31 -07:00
[ sortedFolders release ] ;
[ results release ] ;
2010-11-11 23:48:27 -05:00
}
- ( IBAction ) doLogoutButton {
2011-08-24 21:44:16 -07:00
UIAlertView * logoutConfirm = [ [ UIAlertView alloc ] initWithTitle : @ "Positive?" message : nil delegate : self cancelButtonTitle : @ "Cancel" otherButtonTitles : @ "Logout" , nil ] ;
[ logoutConfirm show ] ;
2011-12-07 09:57:33 -08:00
[ logoutConfirm setTag : 1 ] ;
2011-08-24 21:44:16 -07:00
[ logoutConfirm release ] ;
2011-08-21 21:39:29 -07:00
}
- ( void ) alertView : ( UIAlertView * ) alertView clickedButtonAtIndex : ( NSInteger ) buttonIndex {
2011-12-07 09:57:33 -08:00
if ( alertView . tag = = 1 ) {
if ( buttonIndex = = 0 ) {
return ;
} else {
NSLog ( @ "Logging out..." ) ;
NSString * urlS = [ NSString stringWithFormat : @ "http://%@/reader/logout?api=1" ,
NEWSBLUR_URL ] ;
NSURL * url = [ NSURL URLWithString : urlS ] ;
__block ASIHTTPRequest * request = [ ASIHTTPRequest requestWithURL : url ] ;
[ request setDelegate : self ] ;
[ request setResponseEncoding : NSUTF8StringEncoding ] ;
[ request setDefaultResponseEncoding : NSUTF8StringEncoding ] ;
[ request setFailedBlock : ^ ( void ) {
[ MBProgressHUD hideHUDForView : self . view animated : YES ] ;
[ self finishedWithError : request ] ;
} ] ;
[ request setCompletionBlock : ^ ( void ) {
[ MBProgressHUD hideHUDForView : self . view animated : YES ] ;
[ appDelegate showLogin ] ;
} ] ;
[ request setTimeOutSeconds : 30 ] ;
[ request startAsynchronous ] ;
[ ASIHTTPRequest setSessionCookies : nil ] ;
2011-09-15 18:15:47 -07:00
2011-12-07 09:57:33 -08:00
[ MBProgressHUD hideHUDForView : self . view animated : YES ] ;
MBProgressHUD * HUD = [ MBProgressHUD showHUDAddedTo : self . view animated : YES ] ;
HUD . labelText = @ "Logging out..." ;
}
} else if ( alertView . tag = = 2 ) {
if ( buttonIndex = = 0 ) {
return ;
} else {
2012-06-07 12:45:11 -07:00
// this doesn ' t work in simulator ! ! ! because simulator has no app store
2011-12-07 09:57:33 -08:00
NSURL * url = [ NSURL URLWithString : @ "http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=463981119&mt=8" ] ;
[ [ UIApplication sharedApplication ] openURL : url ] ;
}
2011-08-24 21:44:16 -07:00
}
2010-11-13 13:42:20 -05:00
}
2010-11-11 23:48:27 -05:00
2011-08-16 19:55:44 -07:00
- ( IBAction ) doSwitchSitesUnread {
2011-08-24 21:44:16 -07:00
self . viewShowingAllFeeds = ! self . viewShowingAllFeeds ;
2011-10-06 16:25:38 -07:00
if ( self . viewShowingAllFeeds ) {
2011-10-15 17:48:10 -07:00
[ self . sitesButton setImage : [ UIImage imageNamed : @ "ellipses_half.png" ] ] ;
2011-10-04 18:01:35 -07:00
// [ self . sitesButton setTitle : @ "Unreads" ] ;
2011-10-06 16:25:38 -07:00
} else {
2011-10-15 17:48:10 -07:00
[ self . sitesButton setImage : [ UIImage imageNamed : @ "ellipses.png" ] ] ;
2011-10-04 18:01:35 -07:00
// [ self . sitesButton setTitle : @ "All Sites" ] ;
2011-10-06 16:25:38 -07:00
}
2011-08-24 21:44:16 -07:00
NSInteger intelligenceLevel = [ appDelegate selectedIntelligence ] ;
NSMutableArray * indexPaths = [ NSMutableArray array ] ;
if ( self . viewShowingAllFeeds ) {
[ self calculateFeedLocations : NO ] ;
}
2011-10-19 08:49:35 -07:00
// NSLog ( @ "View showing all: %d and %@" , self . viewShowingAllFeeds , self . stillVisibleFeeds ) ;
2011-10-04 18:01:35 -07:00
for ( int s = 0 ; s < [ appDelegate . dictFoldersArray count ] ; s + + ) {
NSString * folderName = [ appDelegate . dictFoldersArray objectAtIndex : s ] ;
2011-08-24 21:44:16 -07:00
NSArray * activeFolderFeeds = [ self . activeFeedLocations objectForKey : folderName ] ;
2011-10-04 18:01:35 -07:00
NSArray * originalFolder = [ appDelegate . dictFolders objectForKey : folderName ] ;
2011-08-24 21:44:16 -07:00
for ( int f = 0 ; f < [ activeFolderFeeds count ] ; f + + ) {
int location = [ [ activeFolderFeeds objectAtIndex : f ] intValue ] ;
id feedId = [ originalFolder objectAtIndex : location ] ;
NSIndexPath * indexPath = [ NSIndexPath indexPathForRow : f inSection : s ] ;
NSString * feedIdStr = [ NSString stringWithFormat : @ "%@" , feedId ] ;
2011-10-04 18:01:35 -07:00
NSDictionary * feed = [ appDelegate . dictFeeds objectForKey : feedIdStr ] ;
2012-06-15 17:24:37 -07:00
int maxScore = [ FeedsViewController computeMaxScoreForFeed : feed ] ;
2011-08-24 21:44:16 -07:00
2011-10-19 08:49:35 -07:00
if ( ! self . viewShowingAllFeeds ||
( self . viewShowingAllFeeds && ! [ self . stillVisibleFeeds objectForKey : feedIdStr ] ) ) {
if ( maxScore < intelligenceLevel ) {
[ indexPaths addObject : indexPath ] ;
}
2011-08-24 21:44:16 -07:00
}
}
}
if ( ! self . viewShowingAllFeeds ) {
[ self calculateFeedLocations : YES ] ;
}
2011-08-04 17:27:31 -07:00
[ self . feedTitlesTable beginUpdates ] ;
if ( [ indexPaths count ] > 0 ) {
2011-08-24 21:44:16 -07:00
if ( self . viewShowingAllFeeds ) {
[ self . feedTitlesTable insertRowsAtIndexPaths : indexPaths
withRowAnimation : UITableViewRowAnimationNone ] ;
} else {
[ self . feedTitlesTable deleteRowsAtIndexPaths : indexPaths
withRowAnimation : UITableViewRowAnimationNone ] ;
}
2011-08-04 17:27:31 -07:00
}
[ self . feedTitlesTable endUpdates ] ;
2011-08-24 21:44:16 -07:00
2012-05-17 22:10:55 -04:00
CGPoint offset = CGPointMake ( 0 , 0 ) ;
[ self . feedTitlesTable setContentOffset : offset animated : YES ] ;
2011-10-14 16:35:40 -07:00
2011-08-24 21:44:16 -07:00
// Forget still visible feeds , since they won ' t be populated when
// all feeds are showing , and shouldn ' t be populated after this
// hide / show runs .
self . stillVisibleFeeds = [ NSMutableDictionary dictionary ] ;
2011-08-27 15:53:51 -07:00
[ self redrawUnreadCounts ] ;
2011-08-03 10:00:41 -07:00
}
2011-10-04 18:01:35 -07:00
- ( IBAction ) doAddButton {
[ appDelegate showAdd ] ;
}
2010-06-20 11:04:23 -04:00
# pragma mark -
# pragma mark Table View - Feed List
- ( NSInteger ) numberOfSectionsInTableView : ( UITableView * ) tableView {
2011-10-04 18:01:35 -07:00
return [ appDelegate . dictFoldersArray count ] ;
2010-06-20 11:04:23 -04:00
}
- ( NSString * ) tableView : ( UITableView * ) tableView titleForHeaderInSection : ( NSInteger ) section {
2011-10-04 18:01:35 -07:00
return [ appDelegate . dictFoldersArray objectAtIndex : section ] ;
2010-06-20 11:04:23 -04:00
}
- ( NSInteger ) tableView : ( UITableView * ) tableView numberOfRowsInSection : ( NSInteger ) section {
2011-10-04 18:01:35 -07:00
NSString * folderName = [ appDelegate . dictFoldersArray objectAtIndex : section ] ;
2011-08-24 21:44:16 -07:00
return [ [ self . activeFeedLocations objectForKey : folderName ] count ] ;
2010-06-20 11:04:23 -04:00
}
2011-08-02 18:03:11 -07:00
- ( UITableViewCell * ) tableView : ( UITableView * ) tableView
2011-11-29 18:39:52 -08:00
cellForRowAtIndexPath : ( NSIndexPath * ) indexPath {
2011-08-24 21:44:16 -07:00
static NSString * FeedCellIdentifier = @ "FeedCellIdentifier" ;
FeedTableCell * cell = ( FeedTableCell * ) [ tableView dequeueReusableCellWithIdentifier : FeedCellIdentifier ] ;
if ( cell = = nil ) {
2011-10-15 15:26:18 -07:00
cell = [ [ [ FeedTableCell alloc ] initWithStyle : UITableViewCellStyleDefault reuseIdentifier : @ "FeedCellIdentifier" ] autorelease ] ;
2011-08-24 21:44:16 -07:00
cell . appDelegate = ( NewsBlurAppDelegate * ) [ [ UIApplication sharedApplication ] delegate ] ;
}
2011-10-04 18:01:35 -07:00
NSString * folderName = [ appDelegate . dictFoldersArray objectAtIndex : indexPath . section ] ;
NSArray * feeds = [ appDelegate . dictFolders objectForKey : folderName ] ;
2011-08-24 21:44:16 -07:00
NSArray * activeFolderFeeds = [ self . activeFeedLocations objectForKey : folderName ] ;
int location = [ [ activeFolderFeeds objectAtIndex : indexPath . row ] intValue ] ;
id feedId = [ feeds objectAtIndex : location ] ;
NSString * feedIdStr = [ NSString stringWithFormat : @ "%@" , feedId ] ;
2011-10-04 18:01:35 -07:00
NSDictionary * feed = [ appDelegate . dictFeeds objectForKey : feedIdStr ] ;
2011-08-24 21:44:16 -07:00
2011-10-17 09:37:16 -07:00
cell . feedTitle = [ feed objectForKey : @ "feed_title" ] ;
cell . feedFavicon = [ Utilities getImage : feedIdStr ] ;
2011-08-24 21:44:16 -07:00
cell . positiveCount = [ [ feed objectForKey : @ "ps" ] intValue ] ;
cell . neutralCount = [ [ feed objectForKey : @ "nt" ] intValue ] ;
cell . negativeCount = [ [ feed objectForKey : @ "ng" ] intValue ] ;
return cell ;
2010-06-20 11:04:23 -04:00
}
2011-08-12 10:12:30 -07:00
- ( void ) tableView : ( UITableView * ) tableView
2011-11-29 18:39:52 -08:00
didSelectRowAtIndexPath : ( NSIndexPath * ) indexPath {
2011-10-04 18:01:35 -07:00
NSString * folderName = [ appDelegate . dictFoldersArray objectAtIndex : indexPath . section ] ;
NSArray * feeds = [ appDelegate . dictFolders objectForKey : folderName ] ;
2011-08-24 21:44:16 -07:00
NSArray * activeFolderFeeds = [ self . activeFeedLocations objectForKey : folderName ] ;
int location = [ [ activeFolderFeeds objectAtIndex : indexPath . row ] intValue ] ;
id feedId = [ feeds objectAtIndex : location ] ;
NSString * feedIdStr = [ NSString stringWithFormat : @ "%@" , feedId ] ;
2011-10-04 18:01:35 -07:00
NSDictionary * feed = [ appDelegate . dictFeeds objectForKey : feedIdStr ] ;
2011-08-24 21:44:16 -07:00
// If all feeds are already showing , no need to remember this one .
if ( ! self . viewShowingAllFeeds ) {
[ self . stillVisibleFeeds setObject : indexPath forKey : feedIdStr ] ;
}
[ appDelegate setActiveFeed : feed ] ;
2011-10-20 09:32:39 -07:00
[ appDelegate setActiveFolder : folderName ] ;
2011-08-24 21:44:16 -07:00
appDelegate . readStories = [ NSMutableArray array ] ;
2011-10-25 09:28:05 -07:00
appDelegate . isRiverView = NO ;
2011-08-24 21:44:16 -07:00
[ appDelegate loadFeedDetailView ] ;
2010-06-20 11:04:23 -04:00
}
2011-08-12 10:12:30 -07:00
- ( CGFloat ) tableView : ( UITableView * ) tableView
2011-11-29 18:39:52 -08:00
heightForRowAtIndexPath : ( NSIndexPath * ) indexPath {
2011-07-19 09:38:49 -07:00
return kTableViewRowHeight ;
}
2011-08-12 10:12:30 -07:00
- ( UIView * ) tableView : ( UITableView * ) tableView
2011-11-29 18:39:52 -08:00
viewForHeaderInSection : ( NSInteger ) section {
2012-06-07 13:37:23 -07:00
int headerLabelHeight , folderImageViewY , disclosureImageViewY ;
2012-06-07 17:52:14 -07:00
2012-06-09 09:38:32 -07:00
if ( [ [ UIDevice currentDevice ] userInterfaceIdiom ] = = UIUserInterfaceIdiomPad ) {
2012-06-07 13:37:23 -07:00
headerLabelHeight = 30 ;
folderImageViewY = 7 ;
disclosureImageViewY = 8 ;
2012-06-09 09:38:32 -07:00
} else {
2012-06-07 13:37:23 -07:00
headerLabelHeight = 20 ;
folderImageViewY = 2 ;
disclosureImageViewY = 3 ;
}
2011-08-24 21:44:16 -07:00
// create the parent view that will hold header Label
2011-10-26 23:12:21 -07:00
UIControl * customView = [ [ [ UIControl alloc ]
initWithFrame : CGRectMake ( 0.0 , 0.0 ,
2012-06-07 13:37:23 -07:00
tableView . bounds . size . width , headerLabelHeight + 1 ) ]
2011-10-26 23:12:21 -07:00
autorelease ] ;
2011-08-24 21:44:16 -07:00
UIView * borderBottom = [ [ [ UIView alloc ]
2012-06-07 13:37:23 -07:00
initWithFrame : CGRectMake ( 0.0 , headerLabelHeight ,
2011-08-24 21:44:16 -07:00
tableView . bounds . size . width , 1.0 ) ]
autorelease ] ;
borderBottom . backgroundColor = [ UIColorFromRGB ( 0 xB7BDC6 ) colorWithAlphaComponent : 0.5 ] ;
borderBottom . opaque = NO ;
[ customView addSubview : borderBottom ] ;
UILabel * headerLabel = [ [ UILabel alloc ] initWithFrame : CGRectZero ] ;
customView . opaque = NO ;
headerLabel . backgroundColor = [ UIColor clearColor ] ;
headerLabel . opaque = NO ;
headerLabel . textColor = [ UIColor colorWithRed : 0.3 green : 0.3 blue : 0.3 alpha : 1.0 ] ;
headerLabel . highlightedTextColor = [ UIColor whiteColor ] ;
headerLabel . font = [ UIFont boldSystemFontOfSize : 11 ] ;
2012-06-07 13:37:23 -07:00
headerLabel . frame = CGRectMake ( 36.0 , 1.0 , 286.0 , headerLabelHeight ) ;
2011-11-30 18:46:11 -08:00
headerLabel . shadowColor = [ UIColor colorWithRed : .94 green : 0.94 blue : 0.97 alpha : 1.0 ] ;
headerLabel . shadowOffset = CGSizeMake ( 0.0 , 1.0 ) ;
2011-11-29 18:39:52 -08:00
if ( section = = 0 ) {
headerLabel . text = @ "EVERYTHING" ;
2011-11-30 18:46:11 -08:00
customView . backgroundColor = [ UIColorFromRGB ( 0 xE6DDD7 )
colorWithAlphaComponent : 0.8 ] ;
2011-11-29 18:39:52 -08:00
} else {
2011-11-30 18:46:11 -08:00
headerLabel . text = [ [ appDelegate . dictFoldersArray objectAtIndex : section ] uppercaseString ] ;
2011-11-29 18:39:52 -08:00
customView . backgroundColor = [ UIColorFromRGB ( 0 xD7DDE6 )
colorWithAlphaComponent : 0.8 ] ;
}
2011-08-24 21:44:16 -07:00
[ customView addSubview : headerLabel ] ;
[ headerLabel release ] ;
UIImage * folderImage = [ UIImage imageNamed : @ "folder.png" ] ;
UIImageView * folderImageView = [ [ UIImageView alloc ] initWithImage : folderImage ] ;
2012-06-07 13:37:23 -07:00
folderImageView . frame = CGRectMake ( 14.0 , folderImageViewY , 16.0 , 16.0 ) ;
2011-08-24 21:44:16 -07:00
[ customView addSubview : folderImageView ] ;
[ folderImageView release ] ;
2011-10-26 23:12:21 -07:00
UIImage * disclosureImage = [ UIImage imageNamed : @ "disclosure.png" ] ;
UIImageView * disclosureImageView = [ [ UIImageView alloc ] initWithImage : disclosureImage ] ;
2012-06-07 13:37:23 -07:00
disclosureImageView . frame = CGRectMake ( customView . frame . size . width - 20 , disclosureImageViewY , 9.0 , 14.0 ) ;
2011-10-26 23:12:21 -07:00
[ customView addSubview : disclosureImageView ] ;
[ disclosureImageView release ] ;
2011-10-25 09:28:05 -07:00
UIButton * invisibleHeaderButton = [ UIButton buttonWithType : UIButtonTypeCustom ] ;
invisibleHeaderButton . frame = CGRectMake ( 0 , 0 , customView . frame . size . width , customView . frame . size . height ) ;
invisibleHeaderButton . alpha = .1 ;
2011-10-25 09:47:55 -07:00
invisibleHeaderButton . tag = section ;
[ invisibleHeaderButton addTarget : self action : @ selector ( didSelectSectionHeader : ) forControlEvents : UIControlEventTouchUpInside ] ;
2011-10-25 09:28:05 -07:00
[ customView addSubview : invisibleHeaderButton ] ;
2011-10-26 23:12:21 -07:00
[ invisibleHeaderButton addTarget : self action : @ selector ( sectionTapped : ) forControlEvents : UIControlEventTouchDown ] ;
2011-11-30 18:46:11 -08:00
[ invisibleHeaderButton addTarget : self action : @ selector ( sectionUntapped : ) forControlEvents : UIControlEventTouchUpInside ] ;
[ invisibleHeaderButton addTarget : self action : @ selector ( sectionUntapped : ) forControlEvents : UIControlEventTouchUpOutside ] ;
2011-10-26 23:12:21 -07:00
[ customView setAutoresizingMask : UIViewAutoresizingNone ] ;
2011-08-24 21:44:16 -07:00
return customView ;
2011-08-12 10:12:30 -07:00
}
2011-10-26 23:12:21 -07:00
- ( IBAction ) sectionTapped : ( UIButton * ) button {
2011-11-30 18:46:11 -08:00
button . backgroundColor = [ UIColor colorWithRed : 0.15 green : 0.55 blue : 0.95 alpha : 1.0 ] ;
}
- ( IBAction ) sectionUntapped : ( UIButton * ) button {
dispatch_after ( dispatch_time ( DISPATCH_TIME _NOW , 1.15 * NSEC_PER _SEC ) ,
dispatch_get _current _queue ( ) , ^ {
button . backgroundColor = [ UIColor clearColor ] ;
} ) ;
2011-10-26 23:12:21 -07:00
}
2011-08-12 10:12:30 -07:00
- ( CGFloat ) tableView : ( UITableView * ) tableView heightForHeaderInSection : ( NSInteger ) section {
2011-11-29 18:39:52 -08:00
// NSString * folder = [ appDelegate . dictFoldersArray objectAtIndex : section ] ;
// if ( [ [ folder stringByTrimmingCharactersInSet : [ NSCharacterSet whitespaceCharacterSet ] ] length ] = = 0 ) {
// return 0 ;
// }
2012-06-07 13:37:23 -07:00
if ( [ [ UIDevice currentDevice ] userInterfaceIdiom ] = = UIUserInterfaceIdiomPad ) {
return 31 ;
} else {
return 21 ;
}
2011-08-12 10:12:30 -07:00
}
2011-10-25 09:47:55 -07:00
- ( void ) didSelectSectionHeader : ( UIButton * ) button {
appDelegate . readStories = [ NSMutableArray array ] ;
appDelegate . isRiverView = YES ;
2011-10-26 08:40:31 -07:00
NSMutableArray * feeds = [ NSMutableArray array ] ;
2011-11-29 18:39:52 -08:00
if ( button . tag = = 0 ) {
[ appDelegate setActiveFolder : @ "Everything" ] ;
for ( NSString * folderName in self . activeFeedLocations ) {
NSArray * originalFolder = [ appDelegate . dictFolders objectForKey : folderName ] ;
NSArray * folderFeeds = [ self . activeFeedLocations objectForKey : folderName ] ;
for ( int l = 0 ; l < [ folderFeeds count ] ; l + + ) {
[ feeds addObject : [ originalFolder objectAtIndex : [ [ folderFeeds objectAtIndex : l ] intValue ] ] ] ;
}
}
} else {
NSString * folderName = [ appDelegate . dictFoldersArray objectAtIndex : button . tag ] ;
[ appDelegate setActiveFolder : folderName ] ;
NSArray * originalFolder = [ appDelegate . dictFolders objectForKey : folderName ] ;
NSArray * activeFolderFeeds = [ self . activeFeedLocations objectForKey : folderName ] ;
for ( int l = 0 ; l < [ activeFolderFeeds count ] ; l + + ) {
[ feeds addObject : [ originalFolder objectAtIndex : [ [ activeFolderFeeds objectAtIndex : l ] intValue ] ] ] ;
}
2011-10-26 08:40:31 -07:00
}
appDelegate . activeFolderFeeds = feeds ;
[ appDelegate loadRiverFeedDetailView ] ;
2011-10-25 09:28:05 -07:00
}
2011-08-02 09:16:54 -07:00
- ( IBAction ) selectIntelligence {
2011-08-27 15:53:51 -07:00
NSInteger newLevel = [ self . intelligenceControl selectedSegmentIndex ] - 1 ;
NSInteger previousLevel = [ appDelegate selectedIntelligence ] ;
[ appDelegate setSelectedIntelligence : newLevel ] ;
2011-08-24 21:44:16 -07:00
if ( ! self . viewShowingAllFeeds ) {
// NSLog ( @ "Select Intelligence from %d to %d." , previousLevel , newLevel ) ;
[ self updateFeedsWithIntelligence : previousLevel newLevel : newLevel ] ;
}
2011-08-27 15:53:51 -07:00
[ self redrawUnreadCounts ] ;
2011-08-02 18:19:46 -07:00
}
- ( void ) updateFeedsWithIntelligence : ( int ) previousLevel newLevel : ( int ) newLevel {
2011-08-02 09:16:54 -07:00
NSMutableArray * insertIndexPaths = [ NSMutableArray array ] ;
NSMutableArray * deleteIndexPaths = [ NSMutableArray array ] ;
2011-10-14 16:35:40 -07:00
NSMutableDictionary * addToVisibleFeeds = [ NSMutableDictionary dictionary ] ;
2011-08-24 21:44:16 -07:00
2011-08-24 21:41:44 -07:00
if ( newLevel <= previousLevel ) {
2011-08-24 21:44:16 -07:00
[ self calculateFeedLocations : NO ] ;
}
2011-10-04 18:01:35 -07:00
for ( int s = 0 ; s < [ appDelegate . dictFoldersArray count ] ; s + + ) {
NSString * folderName = [ appDelegate . dictFoldersArray objectAtIndex : s ] ;
2011-08-24 21:44:16 -07:00
NSArray * activeFolderFeeds = [ self . activeFeedLocations objectForKey : folderName ] ;
2011-10-04 18:01:35 -07:00
NSArray * originalFolder = [ appDelegate . dictFolders objectForKey : folderName ] ;
2011-10-14 16:35:40 -07:00
2011-10-25 09:47:55 -07:00
// if ( s = = 9 ) {
2011-10-14 16:35:40 -07:00
// NSLog ( @ "Section %d: %@. %d to %d" , s , folderName , previousLevel , newLevel ) ;
2011-10-25 09:47:55 -07:00
// }
2011-10-14 16:35:40 -07:00
2011-08-24 21:44:16 -07:00
for ( int f = 0 ; f < [ originalFolder count ] ; f + + ) {
NSNumber * feedId = [ originalFolder objectAtIndex : f ] ;
NSString * feedIdStr = [ NSString stringWithFormat : @ "%@" , feedId ] ;
2011-10-04 18:01:35 -07:00
NSDictionary * feed = [ appDelegate . dictFeeds objectForKey : feedIdStr ] ;
2012-06-15 17:24:37 -07:00
int maxScore = [ FeedsViewController computeMaxScoreForFeed : feed ] ;
2011-08-24 21:44:16 -07:00
2011-10-25 09:47:55 -07:00
// if ( s = = 9 ) {
2011-10-14 16:35:40 -07:00
// NSLog ( @ "MaxScore: %d for %@ (%@/%@/%@). Visible: %@" , maxScore ,
// [ feed objectForKey : @ "feed_title" ] ,
// [ feed objectForKey : @ "ng" ] , [ feed objectForKey : @ "nt" ] , [ feed objectForKey : @ "ng" ] ,
// [ self . visibleFeeds objectForKey : feedIdStr ] ) ;
2011-10-25 09:47:55 -07:00
// }
2011-10-14 16:35:40 -07:00
2011-08-24 21:44:16 -07:00
if ( [ self . visibleFeeds objectForKey : feedIdStr ] ) {
if ( maxScore < newLevel ) {
for ( int l = 0 ; l < [ activeFolderFeeds count ] ; l + + ) {
if ( [ originalFolder objectAtIndex : [ [ activeFolderFeeds objectAtIndex : l ] intValue ] ] = = feedId ) {
NSIndexPath * indexPath = [ NSIndexPath indexPathForRow : l inSection : s ] ;
[ deleteIndexPaths addObject : indexPath ] ;
if ( [ self . stillVisibleFeeds objectForKey : feedIdStr ] ) {
[ self . stillVisibleFeeds removeObjectForKey : feedIdStr ] ;
}
break ;
}
}
}
} else {
if ( maxScore >= newLevel ) {
for ( int l = 0 ; l < [ activeFolderFeeds count ] ; l + + ) {
if ( [ originalFolder objectAtIndex : [ [ activeFolderFeeds objectAtIndex : l ] intValue ] ] = = feedId ) {
NSIndexPath * indexPath = [ NSIndexPath indexPathForRow : l inSection : s ] ;
2011-10-14 16:35:40 -07:00
[ addToVisibleFeeds setObject : [ NSNumber numberWithBool : YES ] forKey : feedIdStr ] ;
2011-08-24 21:44:16 -07:00
[ insertIndexPaths addObject : indexPath ] ;
break ;
}
}
}
}
}
}
2011-10-14 16:35:40 -07:00
for ( id feedIdStr in addToVisibleFeeds ) {
[ self . visibleFeeds setObject : [ addToVisibleFeeds objectForKey : feedIdStr ] forKey : feedIdStr ] ;
}
2011-08-24 21:44:16 -07:00
for ( id feedIdStr in [ self . stillVisibleFeeds allKeys ] ) {
2011-10-04 18:01:35 -07:00
NSDictionary * feed = [ appDelegate . dictFeeds objectForKey : feedIdStr ] ;
2012-06-15 17:24:37 -07:00
int maxScore = [ FeedsViewController computeMaxScoreForFeed : feed ] ;
2011-08-24 21:44:16 -07:00
if ( previousLevel ! = newLevel && maxScore < newLevel ) {
[ deleteIndexPaths addObject : [ self . stillVisibleFeeds objectForKey : feedIdStr ] ] ;
[ self . stillVisibleFeeds removeObjectForKey : feedIdStr ] ;
[ self . visibleFeeds removeObjectForKey : feedIdStr ] ;
}
2011-08-02 09:16:54 -07:00
}
if ( newLevel > previousLevel ) {
2011-10-14 16:35:40 -07:00
[ self calculateFeedLocations : NO ] ;
2011-08-02 09:16:54 -07:00
}
[ self . feedTitlesTable beginUpdates ] ;
if ( [ deleteIndexPaths count ] > 0 ) {
[ self . feedTitlesTable deleteRowsAtIndexPaths : deleteIndexPaths
2011-08-24 21:44:16 -07:00
withRowAnimation : UITableViewRowAnimationNone ] ;
2011-08-02 09:16:54 -07:00
}
if ( [ insertIndexPaths count ] > 0 ) {
[ self . feedTitlesTable insertRowsAtIndexPaths : insertIndexPaths
withRowAnimation : UITableViewRowAnimationNone ] ;
}
[ self . feedTitlesTable endUpdates ] ;
2011-10-14 16:35:40 -07:00
[ self calculateFeedLocations : YES ] ;
2011-08-02 10:13:06 -07:00
}
2011-08-27 15:53:51 -07:00
- ( void ) redrawUnreadCounts {
for ( UITableViewCell * cell in self . feedTitlesTable . visibleCells ) {
[ cell setNeedsDisplay ] ;
}
}
2011-08-24 21:41:44 -07:00
- ( void ) calculateFeedLocations : ( BOOL ) markVisible {
2011-08-02 10:13:06 -07:00
self . activeFeedLocations = [ NSMutableDictionary dictionary ] ;
2011-08-24 21:44:16 -07:00
if ( markVisible ) {
self . visibleFeeds = [ NSMutableDictionary dictionary ] ;
}
2011-10-04 18:01:35 -07:00
for ( NSString * folderName in appDelegate . dictFoldersArray ) {
NSArray * folder = [ appDelegate . dictFolders objectForKey : folderName ] ;
2011-08-24 21:44:16 -07:00
NSMutableArray * feedLocations = [ NSMutableArray array ] ;
for ( int f = 0 ; f < [ folder count ] ; f + + ) {
id feedId = [ folder objectAtIndex : f ] ;
NSString * feedIdStr = [ NSString stringWithFormat : @ "%@" , feedId ] ;
2011-10-04 18:01:35 -07:00
NSDictionary * feed = [ appDelegate . dictFeeds objectForKey : feedIdStr ] ;
2011-08-24 21:44:16 -07:00
if ( self . viewShowingAllFeeds ) {
NSNumber * location = [ NSNumber numberWithInt : f ] ;
[ feedLocations addObject : location ] ;
} else {
2012-06-15 17:24:37 -07:00
int maxScore = [ FeedsViewController computeMaxScoreForFeed : feed ] ;
2011-10-14 16:35:40 -07:00
// NSLog ( @ "Computing score for %@: %d in %d (markVisible: %d)" ,
// [ feed objectForKey : @ "feed_title" ] , maxScore , appDelegate . selectedIntelligence , markVisible ) ;
2011-08-24 21:44:16 -07:00
if ( maxScore >= appDelegate . selectedIntelligence ) {
NSNumber * location = [ NSNumber numberWithInt : f ] ;
[ feedLocations addObject : location ] ;
if ( markVisible ) {
[ self . visibleFeeds setObject : [ NSNumber numberWithBool : YES ] forKey : feedIdStr ] ;
}
}
}
}
[ self . activeFeedLocations setObject : feedLocations forKey : folderName ] ;
}
2011-08-02 09:16:54 -07:00
}
2011-08-02 18:03:11 -07:00
+ ( int ) computeMaxScoreForFeed : ( NSDictionary * ) feed {
2011-08-24 21:44:16 -07:00
int maxScore = -2 ;
if ( [ [ feed objectForKey : @ "ng" ] intValue ] > 0 ) maxScore = -1 ;
if ( [ [ feed objectForKey : @ "nt" ] intValue ] > 0 ) maxScore = 0 ;
if ( [ [ feed objectForKey : @ "ps" ] intValue ] > 0 ) maxScore = 1 ;
return maxScore ;
2011-08-02 18:03:11 -07:00
}
2011-08-04 17:58:28 -07:00
# pragma mark -
# pragma mark Favicons
- ( void ) loadFavicons {
2011-08-24 21:44:16 -07:00
NSString * urlString = [ NSString stringWithFormat : @ "http://%@/reader/favicons" ,
NEWSBLUR_URL ] ;
NSURL * url = [ NSURL URLWithString : urlString ] ;
ASIHTTPRequest * request = [ ASIHTTPRequest requestWithURL : url ] ;
[ request setDidFinishSelector : @ selector ( saveAndDrawFavicons : ) ] ;
[ request setDidFailSelector : @ selector ( requestFailed : ) ] ;
[ request setDelegate : self ] ;
[ request startAsynchronous ] ;
2011-08-04 17:58:28 -07:00
}
- ( void ) saveAndDrawFavicons : ( ASIHTTPRequest * ) request {
NSString * responseString = [ request responseString ] ;
NSDictionary * results = [ [ NSDictionary alloc ]
initWithDictionary : [ responseString JSONValue ] ] ;
2011-08-24 21:44:16 -07:00
2011-10-18 08:56:13 -07:00
dispatch_queue _t queue = dispatch_get _global _queue ( DISPATCH_QUEUE _PRIORITY _HIGH , 0 ul ) ;
dispatch_async ( queue , ^ {
for ( id feed_id in results ) {
NSDictionary * feed = [ appDelegate . dictFeeds objectForKey : feed_id ] ;
[ feed setValue : [ results objectForKey : feed_id ] forKey : @ "favicon" ] ;
[ appDelegate . dictFeeds setValue : feed forKey : feed_id ] ;
NSString * favicon = [ feed objectForKey : @ "favicon" ] ;
if ( ( NSNull * ) favicon ! = [ NSNull null ] && [ favicon length ] > 0 ) {
NSData * imageData = [ NSData dataWithBase64EncodedString : favicon ] ;
UIImage * faviconImage = [ UIImage imageWithData : imageData ] ;
[ Utilities saveImage : faviconImage feedId : feed_id ] ;
}
2011-10-14 16:35:40 -07:00
}
2011-10-18 08:56:13 -07:00
[ Utilities saveimagesToDisk ] ;
dispatch_sync ( dispatch_get _main _queue ( ) , ^ {
[ results release ] ;
[ self . feedTitlesTable reloadData ] ;
} ) ;
} ) ;
2011-08-24 21:44:16 -07:00
2011-08-04 17:58:28 -07:00
}
- ( void ) requestFailed : ( ASIHTTPRequest * ) request {
NSError * error = [ request error ] ;
NSLog ( @ "Error: %@" , error ) ;
}
# pragma mark -
# pragma mark PullToRefresh
// called when the user pulls - to - refresh
- ( void ) pullToRefreshViewShouldRefresh : ( PullToRefreshView * ) view {
2011-08-24 21:44:16 -07:00
[ self fetchFeedList : NO ] ;
2011-08-04 17:58:28 -07:00
}
// called when the date shown needs to be updated , optional
- ( NSDate * ) pullToRefreshViewLastUpdated : ( PullToRefreshView * ) view {
2011-08-24 21:44:16 -07:00
return self . lastUpdate ;
2011-08-04 17:58:28 -07:00
}
2010-06-20 11:04:23 -04:00
@ end