NewsBlur/media/ios/Classes/NewsBlurViewController.m

1242 lines
50 KiB
Mathematica
Raw Normal View History

//
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.
//
#import "NewsBlurViewController.h"
#import "NewsBlurAppDelegate.h"
#import "NBContainerViewController.h"
2012-07-10 16:48:05 -07:00
#import "DashboardViewController.h"
#import "FeedTableCell.h"
2012-06-19 13:51:48 -07:00
#import "FeedsMenuViewController.h"
#import "UserProfileViewController.h"
2012-07-24 16:03:16 -07:00
#import "StoryDetailViewController.h"
#import "ASIHTTPRequest.h"
#import "PullToRefreshView.h"
#import "MBProgressHUD.h"
#import "Base64.h"
#import "Utilities.h"
#import "UIBarButtonItem+WEPopover.h"
2010-06-20 11:04:23 -04:00
2012-08-02 12:01:42 -07:00
#define kPhoneTableViewRowHeight 36;
#define kTableViewRowHeight 36;
2012-07-19 11:26:17 -07:00
#define kBlurblogTableViewRowHeight 47;
2012-08-02 12:01:42 -07:00
#define kPhoneBlurblogTableViewRowHeight 39;
@implementation NewsBlurViewController
@synthesize appDelegate;
@synthesize innerView;
@synthesize feedTitlesTable;
2010-06-20 11:04:23 -04:00
@synthesize feedViewToolbar;
@synthesize feedScoreSlider;
2012-06-19 10:55:46 -07:00
@synthesize homeButton;
@synthesize intelligenceControl;
@synthesize activeFeedLocations;
@synthesize visibleFeeds;
@synthesize stillVisibleFeeds;
@synthesize viewShowingAllFeeds;
@synthesize pull;
@synthesize lastUpdate;
2011-10-14 09:51:27 -07:00
@synthesize imageCache;
2012-06-19 13:51:48 -07:00
@synthesize popoverController;
@synthesize currentRowAtIndexPath;
2010-06-20 11:04:23 -04:00
#pragma mark -
2011-08-24 21:44:16 -07:00
#pragma mark Globals
2010-06-20 11:04:23 -04:00
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
2010-06-20 11:04:23 -04:00
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
popoverClass = [WEPopoverController class];
2012-07-27 19:42:19 -07:00
self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:0.16f green:0.36f blue:0.46 alpha:0.9];
2011-08-24 21:44:16 -07:00
pull = [[PullToRefreshView alloc] initWithScrollView:self.feedTitlesTable];
[pull setDelegate:self];
[self.feedTitlesTable addSubview:pull];
2011-08-24 21:44:16 -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];
2010-06-20 11:04:23 -04:00
}
- (void)viewWillAppear:(BOOL)animated {
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
[appDelegate.masterContainerViewController transitionFromFeedDetail];
2012-08-02 18:00:48 -07:00
}
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
[self setUserAvatarLayout:orientation];
[super viewWillAppear:animated];
2012-07-16 19:45:14 -07:00
NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults];
if ([userPreferences integerForKey:@"selectedIntelligence"] == 1) {
NSLog(@"Show FOCUS stories");
self.viewShowingAllFeeds = NO;
[self.intelligenceControl setSelectedSegmentIndex:2];
[appDelegate setSelectedIntelligence:1];
} else if ([userPreferences integerForKey:@"selectedIntelligence"] == 0) {
NSLog(@"Show UNREAD stories");
self.viewShowingAllFeeds = NO;
[self.intelligenceControl setSelectedSegmentIndex:1];
[appDelegate setSelectedIntelligence:0];
} else { // default state, ALL stories
NSLog(@"Show ALL stories");
self.viewShowingAllFeeds = YES;
[self.intelligenceControl setSelectedSegmentIndex:0];
[appDelegate setSelectedIntelligence:0];
}
// self.feedTitlesTable.separatorStyle = UITableViewCellSeparatorStyleNone; // DO NOT USE. THIS BREAKS SHIT.
UIColor *bgColor = [UIColor colorWithRed:0.95 green:0.95 blue:0.95 alpha:1.0];
self.feedTitlesTable.backgroundColor = bgColor;
self.feedTitlesTable.separatorColor = [UIColor clearColor];
2012-07-16 19:45:14 -07:00
// reset all feed detail specific data
appDelegate.activeFeed = nil;
appDelegate.isSocialView = NO;
appDelegate.isRiverView = NO;
appDelegate.inFindingStoryMode = NO;
2012-07-24 16:03:16 -07:00
[MBProgressHUD hideHUDForView:appDelegate.storyDetailViewController.view animated:NO];
2012-07-16 19:45:14 -07:00
if (appDelegate.activeFeed || appDelegate.isRiverView) {
[self.feedTitlesTable beginUpdates];
[self.feedTitlesTable
reloadRowsAtIndexPaths:[self.feedTitlesTable indexPathsForVisibleRows]
2011-08-24 21:44:16 -07:00
withRowAnimation:UITableViewRowAnimationNone];
[self.feedTitlesTable endUpdates];
2011-08-24 21:44:16 -07:00
NSInteger previousLevel = [self.intelligenceControl selectedSegmentIndex] - 1;
NSInteger newLevel = [appDelegate selectedIntelligence];
if (newLevel != previousLevel) {
[appDelegate setSelectedIntelligence:newLevel];
if (!self.viewShowingAllFeeds) {
[self updateFeedsWithIntelligence:previousLevel newLevel:newLevel];
}
[self redrawUnreadCounts];
2011-08-24 21:44:16 -07:00
}
}
2012-08-02 18:00:48 -07:00
// perform these only if coming from the feed detail view
if (appDelegate.inFeedDetail) {
appDelegate.inFeedDetail = NO;
// reload the data and then set the highlight again
[self.feedTitlesTable reloadData];
[self redrawUnreadCounts];
[self.feedTitlesTable selectRowAtIndexPath:self.currentRowAtIndexPath
animated:NO
scrollPosition:UITableViewScrollPositionNone];
}
}
- (void)viewDidAppear:(BOOL)animated {
2012-07-27 19:42:19 -07:00
// [self.feedTitlesTable selectRowAtIndexPath:self.currentRowAtIndexPath
// animated:NO
// scrollPosition:UITableViewScrollPositionNone];
2011-08-24 21:44:16 -07:00
[super viewDidAppear:animated];
2012-07-27 19:42:19 -07:00
[self performSelector:@selector(fadeSelectedCell) withObject:self afterDelay:0.6];
}
- (void)fadeSelectedCell {
2012-07-18 17:23:57 -07:00
[self.feedTitlesTable deselectRowAtIndexPath:[self.feedTitlesTable indexPathForSelectedRow]
animated:YES];
}
2012-07-31 15:57:56 -07:00
- (void)viewWillDisappear:(BOOL)animated {
[self.popoverController dismissPopoverAnimated:YES];
self.popoverController = nil;
2012-06-19 14:27:35 -07:00
[super viewWillDisappear:animated];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return YES;
2012-06-07 11:42:29 -07:00
}
2012-06-29 23:25:56 -07:00
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
2012-08-02 18:00:48 -07:00
[self setUserAvatarLayout:toInterfaceOrientation];
}
- (void)setUserAvatarLayout:(UIInterfaceOrientation)orientation {
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
2012-08-02 18:00:48 -07:00
if (UIInterfaceOrientationIsPortrait(orientation)) {
UIButton *avatar = (UIButton *)self.navigationItem.leftBarButtonItem.customView;
CGRect buttonFrame = avatar.frame;
buttonFrame.size = CGSizeMake(32, 32);
avatar.frame = buttonFrame;
} else {
UIButton *avatar = (UIButton *)self.navigationItem.leftBarButtonItem.customView;
CGRect buttonFrame = avatar.frame;
buttonFrame.size = CGSizeMake(28, 28);
avatar.frame = buttonFrame;
}
}
2012-06-29 23:25:56 -07:00
}
2012-07-20 22:00:30 -07:00
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
[self.feedTitlesTable reloadData];
}
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 {
[self setInnerView:nil];
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
}
#pragma mark -
#pragma mark Initialization
- (void)returnToApp {
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) {
[self fetchFeedList:YES refreshFeeds:YES];
2011-08-24 21:44:16 -07:00
}
2012-07-11 20:19:42 -07:00
}
-(void)fetchFeedList:(BOOL)showLoader refreshFeeds:(BOOL)refreshFeeds {
if (showLoader && appDelegate.navigationController.topViewController == appDelegate.feedsViewController) {
[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...";
}
// if (refreshFeeds) {
// [self refreshFeedList];
// return;
// }
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&update_counts=false",
2011-08-24 21:44:16 -07:00
NEWSBLUR_URL]];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:urlFeedList];
[[NSHTTPCookieStorage sharedHTTPCookieStorage]
setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
[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.
[self informError:[request error]];
}
- (void)finishLoadingFeedList:(ASIHTTPRequest *)request {
if ([request responseStatusCode] == 403) {
return [appDelegate showLogin];
} else if ([request responseStatusCode] >= 500) {
[pull finishedLoading];
return [self informError:@"The server barfed!"];
}
2012-07-27 16:10:13 -07:00
NSString *responseString = [request responseString];
NSData *responseData=[responseString dataUsingEncoding:NSUTF8StringEncoding];
NSError *error;
NSDictionary *results = [NSJSONSerialization
JSONObjectWithData:responseData
options:kNilOptions
error:&error];
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];
2012-06-26 11:45:42 -07:00
appDelegate.activeUsername = [results objectForKey:@"user"];
// set title only if on currestont controller
2012-08-02 18:00:48 -07:00
if (appDelegate.feedsViewController.view.window && [results objectForKey:@"user"]) {
[appDelegate setTitle:[results objectForKey:@"user"]];
2012-08-02 18:00:48 -07:00
}
2012-07-11 18:08:07 -07:00
// adding user avatar to left
NSString *url = [NSString stringWithFormat:@"%@", [[results objectForKey:@"social_profile"] objectForKey:@"photo_url"]];
NSURL * imageURL = [NSURL URLWithString:url];
NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
UIImage * userAvatarImage = [UIImage imageWithData:imageData];
2012-07-11 18:08:07 -07:00
userAvatarImage = [Utilities roundCorneredImage:userAvatarImage radius:6];
UIButton *userAvatarButton = [UIButton buttonWithType:UIButtonTypeCustom];
2012-08-02 18:00:48 -07:00
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
userAvatarButton.bounds = CGRectMake(0, 0, 32, 32);
[userAvatarButton addTarget:self action:@selector(showUserProfile) forControlEvents:UIControlEventTouchUpInside];
[userAvatarButton setImage:userAvatarImage forState:UIControlStateNormal];
2012-08-02 18:00:48 -07:00
UIBarButtonItem *userAvatar = [[UIBarButtonItem alloc]
initWithCustomView:userAvatarButton];
self.navigationItem.leftBarButtonItem = userAvatar;
2012-08-02 18:00:48 -07:00
[self setUserAvatarLayout:orientation];
2012-07-11 18:08:07 -07:00
// adding settings button to right
2012-07-12 11:35:32 -07:00
// UIImage *settingsImage = [UIImage imageNamed:@"settings.png"];
// UIButton *settings = [UIButton buttonWithType:UIButtonTypeCustom];
// settings.bounds = CGRectMake(0, 0, 32, 32);
// [settings addTarget:self action:@selector(showSettingsPopover:) forControlEvents:UIControlEventTouchUpInside];
// [settings setImage:settingsImage forState:UIControlStateNormal];
//
// UIBarButtonItem *settingsButton = [[UIBarButtonItem alloc]
// initWithCustomView:settings];
2012-07-12 11:35:32 -07:00
UIBarButtonItem *settingsButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"settings.png"] style:UIBarButtonItemStylePlain target:self action:@selector(showSettingsPopover:)];
2012-07-12 11:35:32 -07:00
self.navigationItem.rightBarButtonItem = settingsButton;
NSMutableDictionary *sortedFolders = [[NSMutableDictionary alloc] init];
2011-10-14 17:15:48 -07:00
NSArray *sortedArray;
2012-07-26 23:07:47 -07:00
// Set up dictUserProfile and userActivitiesArray
2012-07-01 18:26:39 -07:00
appDelegate.dictUserProfile = [results objectForKey:@"social_profile"];
2012-07-26 23:07:47 -07:00
appDelegate.userActivitiesArray = [results objectForKey:@"activities"];
2012-07-10 16:48:05 -07:00
[appDelegate.dashboardViewController refreshInteractions];
[appDelegate.dashboardViewController refreshActivity];
2012-07-11 18:08:07 -07:00
2012-06-26 12:29:37 -07:00
// Set up dictSocialFeeds
2012-06-26 11:45:42 -07:00
NSArray *socialFeedsArray = [results objectForKey:@"social_feeds"];
2012-06-25 15:02:20 -07:00
NSMutableArray *socialFolder = [[NSMutableArray alloc] init];
NSMutableDictionary *socialDict = [[NSMutableDictionary alloc] init];
2012-07-15 15:06:06 -07:00
NSMutableDictionary *tempActiveFeeds = [[NSMutableDictionary alloc] init];
appDelegate.dictActiveFeeds = tempActiveFeeds;
2012-06-25 15:02:20 -07:00
2012-06-26 11:45:42 -07:00
for (int i = 0; i < socialFeedsArray.count; i++) {
2012-06-25 15:02:20 -07:00
NSString *userKey = [NSString stringWithFormat:@"%@",
2012-06-26 11:45:42 -07:00
[[socialFeedsArray objectAtIndex:i] objectForKey:@"id"]];
[socialFolder addObject: [[socialFeedsArray objectAtIndex:i] objectForKey:@"id"]];
[socialDict setObject:[socialFeedsArray objectAtIndex:i]
2012-06-25 15:02:20 -07:00
forKey:userKey];
}
2012-07-01 18:26:39 -07:00
2012-06-25 15:02:20 -07:00
appDelegate.dictSocialFeeds = socialDict;
2012-06-26 11:45:42 -07:00
[self loadAvatars];
2012-07-10 16:48:05 -07:00
2012-06-26 12:29:37 -07:00
// set up dictFolders
2012-07-27 16:10:13 -07:00
NSMutableDictionary * allFolders = [[results objectForKey:@"flat_folders"] mutableCopy];
2012-06-26 12:29:37 -07:00
[allFolders setValue:socialFolder forKey:@""];
appDelegate.dictFolders = allFolders;
// set up dictFeeds
2012-07-27 16:10:13 -07:00
appDelegate.dictFeeds = [[results objectForKey:@"feeds"] mutableCopy];
2012-06-26 12:29:37 -07:00
// sort all the folders
appDelegate.dictFoldersArray = [NSMutableArray array];
for (id f in appDelegate.dictFolders) {
[appDelegate.dictFoldersArray addObject:f];
NSArray *folder = [appDelegate.dictFolders objectForKey:f];
sortedArray = [folder sortedArrayUsingComparator:^NSComparisonResult(id id1, id id2) {
NSString *feedTitleA;
NSString *feedTitleB;
if ([appDelegate isSocialFeed:[NSString stringWithFormat:@"%@", id1]]) {
feedTitleA = [[appDelegate.dictSocialFeeds
objectForKey:[NSString stringWithFormat:@"%@", id1]]
objectForKey:@"feed_title"];
feedTitleB = [[appDelegate.dictSocialFeeds
objectForKey:[NSString stringWithFormat:@"%@", id2]]
objectForKey:@"feed_title"];
} else {
feedTitleA = [[appDelegate.dictFeeds
objectForKey:[NSString stringWithFormat:@"%@", id1]]
objectForKey:@"feed_title"];
feedTitleB = [[appDelegate.dictFeeds
objectForKey:[NSString stringWithFormat:@"%@", id2]]
objectForKey:@"feed_title"];
}
return [feedTitleA caseInsensitiveCompare:feedTitleB];
}];
[sortedFolders setValue:sortedArray forKey:f];
}
2011-10-14 17:15:48 -07:00
appDelegate.dictFolders = sortedFolders;
[appDelegate.dictFoldersArray sortUsingSelector:@selector(caseInsensitiveCompare:)];
2012-06-25 15:02:20 -07:00
2012-06-27 10:04:44 -07:00
if (self.viewShowingAllFeeds) {
[self calculateFeedLocations:NO];
} else {
[self calculateFeedLocations:YES];
}
[self.feedTitlesTable reloadData];
2012-06-27 10:04:44 -07:00
2012-06-28 11:12:38 -07:00
// NSLog(@"appDelegate.dictFolders: %@", appDelegate.dictFolders);
// NSLog(@"appDelegate.dictFoldersArray: %@", appDelegate.dictFoldersArray);
2012-06-27 10:04:44 -07:00
// test for latest version of app
2012-06-09 09:38:32 -07:00
NSString *serveriPhoneVersion = [results objectForKey:@"iphone_version"];
NSString *currentiPhoneVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
float serveriPhoneVersionFloat = [serveriPhoneVersion floatValue];
float currentiPhoneVersionFloat = [currentiPhoneVersion floatValue];
if (currentiPhoneVersionFloat < serveriPhoneVersionFloat) {
NSLog(@"Version: %f - %f", serveriPhoneVersionFloat, currentiPhoneVersionFloat);
2012-06-26 11:45:42 -07:00
NSString *title = [NSString stringWithFormat:@
"You should download the new version of NewsBlur.\n\nNew version: v%@\nYou have: v%@",
serveriPhoneVersion,
currentiPhoneVersion];
UIAlertView *upgradeConfirm = [[UIAlertView alloc] initWithTitle:title
message:nil
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Upgrade!", nil];
[upgradeConfirm show];
[upgradeConfirm setTag:2];
}
}
- (void)showUserProfile {
appDelegate.activeUserProfileId = [NSString stringWithFormat:@"%@", [appDelegate.dictUserProfile objectForKey:@"user_id"]];
appDelegate.activeUserProfileName = @"You";
[appDelegate showUserProfileModal:self.navigationItem.leftBarButtonItem];
}
2012-07-31 15:57:56 -07:00
- (IBAction)tapAddSite:(id)sender {
[appDelegate showAddSiteModal];
}
2012-07-12 11:35:32 -07:00
- (void)showSettingsPopover:(id)sender {
2012-06-19 13:51:48 -07:00
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
[appDelegate.masterContainerViewController showFeedMenuPopover:sender];
} else {
if (self.popoverController == nil) {
self.popoverController = [[WEPopoverController alloc]
initWithContentViewController:appDelegate.feedsMenuViewController];
2012-06-19 13:51:48 -07:00
self.popoverController.delegate = self;
} else {
[self.popoverController dismissPopoverAnimated:YES];
self.popoverController = nil;
2012-06-19 13:51:48 -07:00
}
if ([self.popoverController respondsToSelector:@selector(setContainerViewProperties:)]) {
[self.popoverController setContainerViewProperties:[self improvedContainerViewProperties]];
}
2012-07-31 15:17:51 -07:00
[self.popoverController setPopoverContentSize:CGSizeMake(200, 86)];
[self.popoverController presentPopoverFromBarButtonItem:self.navigationItem.rightBarButtonItem
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
2012-06-19 13:51:48 -07:00
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
2012-06-19 10:55:46 -07:00
if (alertView.tag == 2) {
if (buttonIndex == 0) {
return;
} else {
// this doesn't work in simulator!!! because simulator has no app store
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
}
}
2012-06-27 10:04:44 -07:00
- (void)switchSitesUnread {
NSDictionary *feed;
2011-08-24 21:44:16 -07:00
NSInteger intelligenceLevel = [appDelegate selectedIntelligence];
NSMutableArray *indexPaths = [NSMutableArray array];
// if show all sites, calculate feeds and mark visible
2011-08-24 21:44:16 -07:00
if (self.viewShowingAllFeeds) {
[self calculateFeedLocations:NO];
}
2012-06-27 10:04:44 -07:00
// NSLog(@"View showing all: %d and %@", self.viewShowingAllFeeds, self.stillVisibleFeeds);
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];
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];
if ([appDelegate isSocialFeed:feedIdStr]) {
feed = [appDelegate.dictSocialFeeds objectForKey:feedIdStr];
} else {
feed = [appDelegate.dictFeeds objectForKey:feedIdStr];
}
2012-06-27 10:04:44 -07:00
int maxScore = [NewsBlurViewController computeMaxScoreForFeed:feed];
2011-08-24 21:44:16 -07:00
// BOOL isUser = [[NSString stringWithFormat:@"%@", feedId]
// isEqualToString:
// [NSString stringWithFormat:@"%@", [appDelegate.dictUserProfile objectForKey:@"id"]]];
// if unread
if (!self.viewShowingAllFeeds) {
if (maxScore < intelligenceLevel) {
[indexPaths addObject:indexPath];
}
} else if (self.viewShowingAllFeeds && ![self.stillVisibleFeeds objectForKey:feedIdStr]) {
if (maxScore < intelligenceLevel) {
[indexPaths addObject:indexPath];
}
2011-08-24 21:44:16 -07:00
}
}
}
// if show unreads, calculate feeds and mark visible
2011-08-24 21:44:16 -07:00
if (!self.viewShowingAllFeeds) {
[self calculateFeedLocations:YES];
}
[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 {
2011-08-24 21:44:16 -07:00
[self.feedTitlesTable deleteRowsAtIndexPaths:indexPaths
withRowAnimation:UITableViewRowAnimationNone];
}
}
[self.feedTitlesTable endUpdates];
2011-08-24 21:44:16 -07:00
CGPoint offset = CGPointMake(0, 0);
[self.feedTitlesTable setContentOffset:offset animated:YES];
2012-06-27 10:04:44 -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];
[self redrawUnreadCounts];
}
2010-06-20 11:04:23 -04:00
#pragma mark -
#pragma mark Table View - Feed List
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [appDelegate.dictFoldersArray count];
2010-06-20 11:04:23 -04:00
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return [appDelegate.dictFoldersArray objectAtIndex:section];
2010-06-20 11:04:23 -04:00
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
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
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
2012-06-25 15:02:20 -07:00
NSDictionary *feed;
NSString *CellIdentifier;
2011-08-24 21:44:16 -07:00
if (indexPath.section == 0) {
CellIdentifier = @"BlurblogCellIdentifier";
} else {
CellIdentifier = @"FeedCellIdentifier";
}
FeedTableCell *cell = (FeedTableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
2011-08-24 21:44:16 -07:00
if (cell == nil) {
cell = [[FeedTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
2011-08-24 21:44:16 -07:00
cell.appDelegate = (NewsBlurAppDelegate *)[[UIApplication sharedApplication] delegate];
}
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];
2012-06-25 15:02:20 -07:00
2011-08-24 21:44:16 -07:00
NSString *feedIdStr = [NSString stringWithFormat:@"%@",feedId];
2012-06-27 10:18:29 -07:00
BOOL isSocial = [appDelegate isSocialFeed:feedIdStr];
2012-06-25 15:02:20 -07:00
2012-06-27 10:18:29 -07:00
if (isSocial) {
2012-06-25 15:02:20 -07:00
feed = [appDelegate.dictSocialFeeds objectForKey:feedIdStr];
cell.feedFavicon = [Utilities getImage:feedIdStr isSocial:YES];
2012-06-25 15:02:20 -07:00
} else {
feed = [appDelegate.dictFeeds objectForKey:feedIdStr];
2012-06-25 18:05:25 -07:00
cell.feedFavicon = [Utilities getImage:feedIdStr];
2012-06-25 15:02:20 -07:00
}
cell.feedTitle = [feed objectForKey:@"feed_title"];
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];
2012-06-27 10:18:29 -07:00
cell.isSocial = isSocial;
2011-08-24 21:44:16 -07:00
return cell;
2010-06-20 11:04:23 -04:00
}
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
2012-07-27 19:42:19 -07:00
// set the current row pointer
self.currentRowAtIndexPath = indexPath;
2012-06-25 15:02:20 -07:00
NSDictionary *feed;
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];
2012-06-25 15:02:20 -07:00
2012-06-26 16:24:19 -07:00
if ([appDelegate isSocialFeed:feedIdStr]) {
2012-06-25 15:02:20 -07:00
feed = [appDelegate.dictSocialFeeds objectForKey:feedIdStr];
2012-06-26 16:24:19 -07:00
appDelegate.isSocialView = YES;
2012-06-25 15:02:20 -07:00
} else {
feed = [appDelegate.dictFeeds objectForKey:feedIdStr];
2012-06-26 16:24:19 -07:00
appDelegate.isSocialView = NO;
2012-06-25 15:02:20 -07:00
}
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];
[appDelegate setActiveFolder:folderName];
2011-08-24 21:44:16 -07:00
appDelegate.readStories = [NSMutableArray array];
appDelegate.isRiverView = NO;
2011-08-24 21:44:16 -07:00
[appDelegate loadFeedDetailView];
2010-06-20 11:04:23 -04:00
}
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *folderName = [appDelegate.dictFoldersArray objectAtIndex:indexPath.section];
if ([folderName isEqualToString:@""]) { // blurblogs
2012-08-02 12:01:42 -07:00
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
return kBlurblogTableViewRowHeight;
} else {
return kPhoneBlurblogTableViewRowHeight;
}
} else {
2012-08-02 12:01:42 -07:00
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
return kTableViewRowHeight;
} else {
return kPhoneTableViewRowHeight;
}
}
}
- (UIView *)tableView:(UITableView *)tableView
viewForHeaderInSection:(NSInteger)section {
int headerLabelHeight, folderImageViewY, disclosureImageViewY;
2012-06-09 09:38:32 -07:00
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
headerLabelHeight = 28;
2012-07-19 11:26:17 -07:00
folderImageViewY = 3;
disclosureImageViewY = 7;
2012-06-09 09:38:32 -07:00
} else {
headerLabelHeight = 20;
folderImageViewY = 0;
disclosureImageViewY = 4;
}
2011-08-24 21:44:16 -07:00
// create the parent view that will hold header Label
2012-07-15 15:06:06 -07:00
UIControl* customView = [[UIControl alloc]
initWithFrame:CGRectMake(0.0, 0.0,
2012-07-15 15:06:06 -07:00
tableView.bounds.size.width, headerLabelHeight + 1)];
2012-07-19 11:26:17 -07:00
UIView *borderTop = [[UIView alloc]
initWithFrame:CGRectMake(0.0, 0,
tableView.bounds.size.width, 1.0)];
borderTop.backgroundColor = UIColorFromRGB(0xe0e0e0);
borderTop.opaque = NO;
[customView addSubview:borderTop];
2011-08-24 21:44:16 -07:00
2012-07-15 15:06:06 -07:00
UIView *borderBottom = [[UIView alloc]
2012-07-19 11:26:17 -07:00
initWithFrame:CGRectMake(0.0, headerLabelHeight,
2012-07-15 15:06:06 -07:00
tableView.bounds.size.width, 1.0)];
2011-08-24 21:44:16 -07:00
borderBottom.backgroundColor = [UIColorFromRGB(0xB7BDC6) 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];
headerLabel.frame = CGRectMake(36.0, 1.0, 286.0, headerLabelHeight);
headerLabel.shadowColor = [UIColor colorWithRed:.94 green:0.94 blue:0.97 alpha:1.0];
headerLabel.shadowOffset = CGSizeMake(0.0, 1.0);
if (section == 0) {
2012-06-27 14:37:37 -07:00
headerLabel.text = @"BLURBLOGS";
// customView.backgroundColor = [UIColorFromRGB(0xD7DDE6)
// colorWithAlphaComponent:0.8];
2012-06-26 11:45:42 -07:00
} else if (section == 1) {
headerLabel.text = @"ALL SITES";
// customView.backgroundColor = [UIColorFromRGB(0xE6DDD7)
// colorWithAlphaComponent:0.8];
} else {
headerLabel.text = [[appDelegate.dictFoldersArray objectAtIndex:section] uppercaseString];
// customView.backgroundColor = [UIColorFromRGB(0xD7DDE6)
// colorWithAlphaComponent:0.8];
}
customView.backgroundColor = [UIColorFromRGB(0xD7DDE6)
colorWithAlphaComponent:0.8];
2011-08-24 21:44:16 -07:00
[customView addSubview:headerLabel];
UIImage *folderImage;
2012-07-19 11:26:17 -07:00
int folderImageViewX = 10;
if (section == 0) {
folderImage = [UIImage imageNamed:@"group.png"];
2012-07-27 15:10:20 -07:00
folderImageViewX = 9;
} else if (section == 1) {
folderImage = [UIImage imageNamed:@"archive.png"];
2012-07-19 11:26:17 -07:00
folderImageViewX = 9;
} else {
folderImage = [UIImage imageNamed:@"folder_2.png"];
}
2011-08-24 21:44:16 -07:00
UIImageView *folderImageView = [[UIImageView alloc] initWithImage:folderImage];
2012-07-19 11:26:17 -07:00
folderImageView.frame = CGRectMake(folderImageViewX, folderImageViewY, 20, 20);
2011-08-24 21:44:16 -07:00
[customView addSubview:folderImageView];
if (section != 0) {
UIImage *disclosureImage = [UIImage imageNamed:@"disclosure.png"];
UIImageView *disclosureImageView = [[UIImageView alloc] initWithImage:disclosureImage];
disclosureImageView.frame = CGRectMake(customView.frame.size.width - 20, disclosureImageViewY, 9.0, 14.0);
[customView addSubview:disclosureImageView];
}
UIButton *invisibleHeaderButton = [UIButton buttonWithType:UIButtonTypeCustom];
invisibleHeaderButton.frame = CGRectMake(0, 0, customView.frame.size.width, customView.frame.size.height);
invisibleHeaderButton.alpha = .1;
invisibleHeaderButton.tag = section;
[invisibleHeaderButton addTarget:self action:@selector(didSelectSectionHeader:) forControlEvents:UIControlEventTouchUpInside];
[customView addSubview:invisibleHeaderButton];
[invisibleHeaderButton addTarget:self action:@selector(sectionTapped:) forControlEvents:UIControlEventTouchDown];
[invisibleHeaderButton addTarget:self action:@selector(sectionUntapped:) forControlEvents:UIControlEventTouchUpInside];
[invisibleHeaderButton addTarget:self action:@selector(sectionUntappedOutside:) forControlEvents:UIControlEventTouchUpOutside];
[customView setAutoresizingMask:UIViewAutoresizingNone];
2011-08-24 21:44:16 -07:00
return customView;
}
- (IBAction)sectionTapped:(UIButton *)button {
// current position of social header
if (button.tag == 0) {
return;
}
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];
});
}
- (IBAction)sectionUntappedOutside:(UIButton *)button {
button.backgroundColor = [UIColor clearColor];
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
// NSString *folder = [appDelegate.dictFoldersArray objectAtIndex:section];
// if ([[folder stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length] == 0) {
// return 0;
// }
2012-07-20 22:00:30 -07:00
if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) {
return 0;
}
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad){
2012-07-20 22:00:30 -07:00
return 28;
}else{
return 21;
}
}
- (void)didSelectSectionHeader:(UIButton *)button {
2012-07-27 19:42:19 -07:00
// reset pointer to the cells
self.currentRowAtIndexPath = nil;
// current position of social header
if (button.tag == 0) {
return;
}
appDelegate.readStories = [NSMutableArray array];
appDelegate.isRiverView = YES;
NSMutableArray *feeds = [NSMutableArray array];
if (button.tag == 1) {
[appDelegate setActiveFolder:@"Everything"];
for (NSString *folderName in self.activeFeedLocations) {
if (![folderName isEqualToString:@""]) { // remove all blurblugs which is a blank folder name
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]]];
}
}
appDelegate.activeFolderFeeds = feeds;
[appDelegate loadRiverFeedDetailView];
}
- (IBAction)selectIntelligence {
[MBProgressHUD hideHUDForView:self.feedTitlesTable animated:NO];
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.innerView animated:YES];
hud.mode = MBProgressHUDModeText;
hud.removeFromSuperViewOnHide = YES;
int selectedSegmentIndex = [self.intelligenceControl selectedSegmentIndex];
NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults];
if (selectedSegmentIndex == 0) {
hud.labelText = @"All Stories";
2012-07-16 19:45:14 -07:00
[userPreferences setInteger:-1 forKey:@"selectedIntelligence"];
[userPreferences synchronize];
2012-07-16 19:45:14 -07:00
if (appDelegate.selectedIntelligence != 0) {
int previousLevel = appDelegate.selectedIntelligence;
[appDelegate setSelectedIntelligence:0];
2012-07-16 19:45:14 -07:00
[self updateFeedsWithIntelligence:previousLevel newLevel:0];
[self redrawUnreadCounts];
}
2012-07-09 17:42:32 -07:00
self.viewShowingAllFeeds = YES;
[self switchSitesUnread];
} else if(selectedSegmentIndex == 1) {
// NSString *unreadStr = [NSString stringWithFormat:@"%i Unread Stories", appDelegate.allUnreadCount];
hud.labelText = @"Unread Stories";
2012-07-16 19:45:14 -07:00
[userPreferences setInteger:0 forKey:@"selectedIntelligence"];
[userPreferences synchronize];
2012-07-16 19:45:14 -07:00
if (appDelegate.selectedIntelligence != 0) {
int previousLevel = appDelegate.selectedIntelligence;
[appDelegate setSelectedIntelligence:0];
2012-07-16 19:45:14 -07:00
[self updateFeedsWithIntelligence:previousLevel newLevel:0];
[self redrawUnreadCounts];
}
2012-07-09 17:42:32 -07:00
self.viewShowingAllFeeds = NO;
[self switchSitesUnread];
} else {
hud.labelText = @"Focus Stories";
2012-07-16 19:45:14 -07:00
[userPreferences setInteger:1 forKey:@"selectedIntelligence"];
[userPreferences synchronize];
if (self.viewShowingAllFeeds == YES) {
self.viewShowingAllFeeds = NO;
[self switchSitesUnread];
}
[appDelegate setSelectedIntelligence:1];
[self updateFeedsWithIntelligence:0 newLevel:1];
[self redrawUnreadCounts];
2011-08-24 21:44:16 -07:00
}
[hud hide:YES afterDelay:0.75];
}
- (void)updateFeedsWithIntelligence:(int)previousLevel newLevel:(int)newLevel {
NSMutableArray *insertIndexPaths = [NSMutableArray array];
NSMutableArray *deleteIndexPaths = [NSMutableArray array];
NSMutableDictionary *addToVisibleFeeds = [NSMutableDictionary dictionary];
2011-08-24 21:44:16 -07:00
if (newLevel <= previousLevel) {
2011-08-24 21:44:16 -07:00
[self calculateFeedLocations:NO];
}
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];
NSArray *originalFolder = [appDelegate.dictFolders objectForKey:folderName];
// if (s == 9) {
// NSLog(@"Section %d: %@. %d to %d", s, folderName, previousLevel, newLevel);
// }
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];
2012-06-26 12:29:37 -07:00
NSDictionary *feed;
// BOOL isUser = [feedIdStr isEqualToString:
// [NSString stringWithFormat:@"%@", [appDelegate.dictUserProfile objectForKey:@"id"]]];
2012-06-26 12:29:37 -07:00
if ([appDelegate isSocialFeed:feedIdStr]) {
feed = [appDelegate.dictSocialFeeds objectForKey:feedIdStr];
} else {
feed = [appDelegate.dictFeeds objectForKey:feedIdStr];
}
int maxScore = [NewsBlurViewController computeMaxScoreForFeed:feed];
2011-08-24 21:44:16 -07:00
// if (s == 9) {
// NSLog(@"MaxScore: %d for %@ (%@/%@/%@). Visible: %@", maxScore,
// [feed objectForKey:@"feed_title"],
// [feed objectForKey:@"ng"], [feed objectForKey:@"nt"], [feed objectForKey:@"ng"],
// [self.visibleFeeds objectForKey:feedIdStr]);
// }
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];
[addToVisibleFeeds setObject:[NSNumber numberWithBool:YES] forKey:feedIdStr];
2011-08-24 21:44:16 -07:00
[insertIndexPaths addObject:indexPath];
break;
}
}
}
}
}
}
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]) {
2012-06-26 12:29:37 -07:00
NSDictionary *feed;
if ([appDelegate isSocialFeed:feedIdStr]) {
feed = [appDelegate.dictSocialFeeds objectForKey:feedIdStr];
} else {
feed = [appDelegate.dictFeeds objectForKey:feedIdStr];
}
int maxScore = [NewsBlurViewController 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];
}
}
if (newLevel > previousLevel) {
[self calculateFeedLocations:NO];
}
[self.feedTitlesTable beginUpdates];
if ([deleteIndexPaths count] > 0) {
[self.feedTitlesTable deleteRowsAtIndexPaths:deleteIndexPaths
2011-08-24 21:44:16 -07:00
withRowAnimation:UITableViewRowAnimationNone];
}
if ([insertIndexPaths count] > 0) {
[self.feedTitlesTable insertRowsAtIndexPaths:insertIndexPaths
withRowAnimation:UITableViewRowAnimationNone];
}
[self.feedTitlesTable endUpdates];
// scrolls to the top and fixes header rendering bug
CGPoint offsetOne = CGPointMake(0, 1);
CGPoint offset = CGPointMake(0, 0);
[self.feedTitlesTable setContentOffset:offsetOne animated:NO];
[self.feedTitlesTable setContentOffset:offset animated:NO];
[self calculateFeedLocations:YES];
}
- (void)redrawUnreadCounts {
for (UITableViewCell *cell in self.feedTitlesTable.visibleCells) {
[cell setNeedsDisplay];
}
}
- (void)calculateFeedLocations:(BOOL)markVisible {
2012-07-15 15:06:06 -07:00
NSDictionary *feed;
self.activeFeedLocations = [NSMutableDictionary dictionary];
2011-08-24 21:44:16 -07:00
if (markVisible) {
self.visibleFeeds = [NSMutableDictionary dictionary];
}
for (NSString *folderName in appDelegate.dictFoldersArray) {
NSArray *folder = [appDelegate.dictFolders objectForKey:folderName];
2011-08-24 21:44:16 -07:00
NSMutableArray *feedLocations = [NSMutableArray array];
2012-06-26 11:45:42 -07:00
for (int f = 0; f < [folder count]; f++) {
2011-08-24 21:44:16 -07:00
id feedId = [folder objectAtIndex:f];
NSString *feedIdStr = [NSString stringWithFormat:@"%@",feedId];
2012-06-26 11:45:42 -07:00
if ([folderName isEqualToString:@""]){
2012-06-25 15:02:20 -07:00
feed = [appDelegate.dictSocialFeeds objectForKey:feedIdStr];
} else {
feed = [appDelegate.dictFeeds objectForKey:feedIdStr];
}
// BOOL isUser = [[NSString stringWithFormat:@"%@", feedId]
// isEqualToString:
// [NSString stringWithFormat:@"%@", [appDelegate.dictUserProfile objectForKey:@"id"]]];
2012-06-25 15:02:20 -07:00
2011-08-24 21:44:16 -07:00
if (self.viewShowingAllFeeds) {
NSNumber *location = [NSNumber numberWithInt:f];
[feedLocations addObject:location];
} else {
int maxScore = [NewsBlurViewController computeMaxScoreForFeed:feed];
// if ([folderName isEqualToString:@""]){
// 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];
}
}
}
2011-08-24 21:44:16 -07:00
}
if ([folderName isEqualToString:@""]){
2012-07-20 15:54:10 -07:00
// NSLog(@"feedLocations count is %i: ", [feedLocations count]);
}
// NSLog(@"feedLocations %@", feedLocations);
2011-08-24 21:44:16 -07:00
[self.activeFeedLocations setObject:feedLocations forKey:folderName];
2011-08-24 21:44:16 -07:00
}
2012-06-25 15:02:20 -07:00
// NSLog(@"Active feed locations %@", self.activeFeedLocations);
}
+ (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;
}
#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];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
2011-08-24 21:44:16 -07:00
[request setDidFinishSelector:@selector(saveAndDrawFavicons:)];
[request setDidFailSelector:@selector(requestFailed:)];
[request setDelegate:self];
[request startAsynchronous];
}
2012-06-26 11:45:42 -07:00
- (void)loadAvatars {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
for (NSString *feed_id in [appDelegate.dictSocialFeeds allKeys]) {
2012-06-26 11:45:42 -07:00
NSDictionary *feed = [appDelegate.dictSocialFeeds objectForKey:feed_id];
NSURL *imageURL = [NSURL URLWithString:[feed objectForKey:@"photo_url"]];
2012-06-26 11:45:42 -07:00
NSData *imageData = [NSData dataWithContentsOfURL:imageURL];
UIImage *faviconImage = [UIImage imageWithData:imageData];
2012-07-11 18:08:07 -07:00
faviconImage = [Utilities roundCorneredImage:faviconImage radius:6];
2012-06-26 11:45:42 -07:00
[Utilities saveImage:faviconImage feedId:feed_id];
}
[Utilities saveimagesToDisk];
dispatch_sync(dispatch_get_main_queue(), ^{
[self.feedTitlesTable reloadData];
});
});
}
2012-07-11 18:08:07 -07:00
- (void)saveAndDrawFavicons:(ASIHTTPRequest *)request {
NSString *responseString = [request responseString];
2012-07-27 16:10:13 -07:00
NSData *responseData=[responseString dataUsingEncoding:NSUTF8StringEncoding];
NSError *error;
NSDictionary *results = [NSJSONSerialization
JSONObjectWithData:responseData
options:kNilOptions
error:&error];
2011-08-24 21:44:16 -07:00
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
for (id feed_id in results) {
2012-07-27 16:10:13 -07:00
NSMutableDictionary *feed = [[appDelegate.dictFeeds objectForKey:feed_id] mutableCopy];
[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];
}
}
[Utilities saveimagesToDisk];
dispatch_sync(dispatch_get_main_queue(), ^{
[self.feedTitlesTable reloadData];
});
});
2011-08-24 21:44:16 -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 {
[self refreshFeedList];
}
- (void)refreshFeedList {
// refresh the feed
NSURL *urlFeedList = [NSURL URLWithString:
[NSString stringWithFormat:@"http://%@/reader/refresh_feeds",
NEWSBLUR_URL]];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:urlFeedList];
[[NSHTTPCookieStorage sharedHTTPCookieStorage]
setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
[request setDelegate:self];
[request setResponseEncoding:NSUTF8StringEncoding];
[request setDefaultResponseEncoding:NSUTF8StringEncoding];
[request setDidFinishSelector:@selector(finishRefreshingFeedList:)];
[request setDidFailSelector:@selector(requestFailed:)];
[request setTimeOutSeconds:30];
[request startAsynchronous];
}
- (void)finishRefreshingFeedList:(ASIHTTPRequest *)request {
[self fetchFeedList:NO refreshFeeds:NO];
}
// 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;
}
#pragma mark -
#pragma mark WEPopoverControllerDelegate implementation
- (void)popoverControllerDidDismissPopover:(WEPopoverController *)thePopoverController {
//Safe to release the popover here
self.popoverController = nil;
}
- (BOOL)popoverControllerShouldDismissPopover:(WEPopoverController *)thePopoverController {
//The popover is automatically dismissed if you click outside it, unless you return NO here
return YES;
}
/**
Thanks to Paul Solt for supplying these background images and container view properties
*/
- (WEPopoverContainerViewProperties *)improvedContainerViewProperties {
WEPopoverContainerViewProperties *props = [WEPopoverContainerViewProperties alloc];
NSString *bgImageName = nil;
CGFloat bgMargin = 0.0;
CGFloat bgCapSize = 0.0;
CGFloat contentMargin = 5.0;
bgImageName = @"popoverBg.png";
// These constants are determined by the popoverBg.png image file and are image dependent
bgMargin = 13; // margin width of 13 pixels on all sides popoverBg.png (62 pixels wide - 36 pixel background) / 2 == 26 / 2 == 13
bgCapSize = 31; // ImageSize/2 == 62 / 2 == 31 pixels
props.leftBgMargin = bgMargin;
props.rightBgMargin = bgMargin;
props.topBgMargin = bgMargin;
props.bottomBgMargin = bgMargin;
props.leftBgCapSize = bgCapSize;
props.topBgCapSize = bgCapSize;
props.bgImageName = bgImageName;
props.leftContentMargin = contentMargin;
props.rightContentMargin = contentMargin - 1; // Need to shift one pixel for border to look correct
props.topContentMargin = contentMargin;
props.bottomContentMargin = contentMargin;
props.arrowMargin = 4.0;
props.upArrowImageName = @"popoverArrowUp.png";
props.downArrowImageName = @"popoverArrowDown.png";
props.leftArrowImageName = @"popoverArrowLeft.png";
props.rightArrowImageName = @"popoverArrowRight.png";
return props;
}
@end