NewsBlur/media/ios/Classes/ActivityCell.m

181 lines
8 KiB
Mathematica
Raw Normal View History

2012-07-13 16:02:21 -07:00
//
// ActivityCell.m
2012-07-22 09:12:02 -07:00
// NewsBluractivity
2012-07-13 16:02:21 -07:00
//
// Created by Roy Yang on 7/13/12.
// Copyright (c) 2012 NewsBlur. All rights reserved.
//
#import "ActivityCell.h"
2012-07-13 18:14:32 -07:00
#import "NSAttributedString+Attributes.h"
2012-07-21 18:25:56 -07:00
#import "UIImageView+AFNetworking.h"
2012-07-13 16:02:21 -07:00
@implementation ActivityCell
@synthesize activityLabel;
2012-07-21 18:25:56 -07:00
@synthesize faviconView;
@synthesize topMargin;
@synthesize bottomMargin;
@synthesize leftMargin;
@synthesize rightMargin;
@synthesize avatarSize;
2012-07-13 16:02:21 -07:00
2012-07-21 18:25:56 -07:00
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
activityLabel = nil;
faviconView = nil;
// create favicon and label in view
UIImageView *favicon = [[UIImageView alloc] initWithFrame:CGRectZero];
self.faviconView = favicon;
[self.contentView addSubview:favicon];
OHAttributedLabel *activity = [[OHAttributedLabel alloc] initWithFrame:CGRectZero];
activity.backgroundColor = [UIColor whiteColor];
activity.automaticallyAddLinksForType = NO;
self.activityLabel = activity;
[self.contentView addSubview:activity];
topMargin = 15;
bottomMargin = 15;
leftMargin = 20;
rightMargin = 20;
avatarSize = 48;
2012-07-13 16:02:21 -07:00
}
2012-07-21 18:25:56 -07:00
2012-07-13 16:02:21 -07:00
return self;
}
2012-07-22 14:23:50 -07:00
- (void)layoutSubviews {
2012-07-21 18:25:56 -07:00
[super layoutSubviews];
// determine outer bounds
CGRect contentRect = self.contentView.bounds;
// position label to bounds
CGRect labelRect = contentRect;
labelRect.origin.x = labelRect.origin.x + leftMargin + avatarSize + leftMargin;
labelRect.origin.y = labelRect.origin.y + topMargin - 1;
labelRect.size.width = contentRect.size.width - leftMargin - avatarSize - leftMargin - rightMargin;
labelRect.size.height = contentRect.size.height - topMargin - bottomMargin;
self.activityLabel.frame = labelRect;
2012-07-13 16:02:21 -07:00
}
2012-07-21 18:25:56 -07:00
- (int)setActivity:(NSDictionary *)activity withUserProfile:(NSDictionary *)userProfile withWidth:(int)width {
2012-07-21 18:25:56 -07:00
// must set the height again for dynamic height in heightForRowAtIndexPath in
CGRect activityLabelRect = self.activityLabel.bounds;
activityLabelRect.size.width = width - leftMargin - avatarSize - leftMargin - rightMargin;
self.activityLabel.frame = activityLabelRect;
2012-07-22 09:12:02 -07:00
self.faviconView.frame = CGRectMake(leftMargin, topMargin, avatarSize, avatarSize);
2012-07-13 16:02:21 -07:00
NSString *category = [activity objectForKey:@"category"];
NSString *content = [activity objectForKey:@"content"];
2012-07-21 18:25:56 -07:00
NSString *comment = [NSString stringWithFormat:@"\"%@\"", content];
2012-07-16 19:45:14 -07:00
NSString *title = [self stripFormatting:[NSString stringWithFormat:@"%@", [activity objectForKey:@"title"]]];
2012-07-21 18:25:56 -07:00
NSString *time = [[NSString stringWithFormat:@"%@ ago", [activity objectForKey:@"time_since"]] uppercaseString];
NSString *withUserUsername = @"";
NSString *username = [NSString stringWithFormat:@"%@", [userProfile objectForKey:@"username"]];
2012-07-21 18:25:56 -07:00
NSString* txt;
if ([category isEqualToString:@"follow"] ||
[category isEqualToString:@"comment_reply"] ||
2012-08-15 19:31:34 -07:00
[category isEqualToString:@"comment_like"] ||
[category isEqualToString:@"signup"]) {
// this is for the rare instance when the with_user doesn't return anything
if ([[activity objectForKey:@"with_user"] class] == [NSNull class]) {
self.faviconView.frame = CGRectZero;
self.activityLabel.attributedText = nil;
return 1;
}
2012-08-13 17:35:04 -07:00
// UIImage *placeholder = [UIImage imageNamed:@"user_light"];
2012-07-21 18:25:56 -07:00
[self.faviconView setImageWithURL:[NSURL URLWithString:[[activity objectForKey:@"with_user"] objectForKey:@"photo_url"]]
2012-08-13 17:35:04 -07:00
placeholderImage:nil];
} else if ([category isEqualToString:@"sharedstory"]) {
2012-08-13 22:48:50 -07:00
// UIImage *placeholder = [UIImage imageNamed:@"user_light"];
[self.faviconView setImageWithURL:[NSURL URLWithString:[userProfile objectForKey:@"photo_url"]]
2012-08-13 22:48:50 -07:00
placeholderImage:nil];
} else if ([category isEqualToString:@"feedsub"]) {
2012-08-13 17:35:04 -07:00
// UIImage *placeholder = [UIImage imageNamed:@"world"];
2012-07-21 18:25:56 -07:00
NSString *faviconUrl = [NSString stringWithFormat:@"http://%@/rss_feeds/icon/%i",
NEWSBLUR_URL,
2012-07-22 09:12:02 -07:00
[[activity objectForKey:@"feed_id"] intValue]];
2012-07-21 18:25:56 -07:00
[self.faviconView setImageWithURL:[NSURL URLWithString:faviconUrl ]
2012-08-13 17:35:04 -07:00
placeholderImage:nil];
2012-07-22 09:12:02 -07:00
self.faviconView.contentMode = UIViewContentModeScaleAspectFit;
self.faviconView.frame = CGRectMake(leftMargin+16, topMargin, 16, 16);
2012-07-21 18:25:56 -07:00
}
if ([category isEqualToString:@"follow"]) {
withUserUsername = [[activity objectForKey:@"with_user"] objectForKey:@"username"];
2012-08-15 19:31:34 -07:00
txt = [NSString stringWithFormat:@"%@ followed %@.", username, withUserUsername];
2012-07-13 16:02:21 -07:00
} else if ([category isEqualToString:@"comment_reply"]) {
2012-07-21 18:25:56 -07:00
withUserUsername = [[activity objectForKey:@"with_user"] objectForKey:@"username"];
txt = [NSString stringWithFormat:@"%@ replied to %@: \n%@", username, withUserUsername, comment];
2012-07-16 19:45:14 -07:00
} else if ([category isEqualToString:@"comment_like"]) {
2012-07-21 18:25:56 -07:00
withUserUsername = [[activity objectForKey:@"with_user"] objectForKey:@"username"];
txt = [NSString stringWithFormat:@"%@ favorited %@'s comment on %@:\n%@", username, withUserUsername, title, comment];
} else if ([category isEqualToString:@"sharedstory"]) {
2012-07-21 18:25:56 -07:00
if ([content isEqualToString:@""] || content == nil) {
txt = [NSString stringWithFormat:@"%@ shared %@.", username, title];
} else {
txt = [NSString stringWithFormat:@"%@ shared %@:\n%@", username, title, comment];
2012-07-16 19:45:14 -07:00
}
2012-07-13 16:02:21 -07:00
} else if ([category isEqualToString:@"star"]) {
2012-07-30 18:49:12 -07:00
txt = [NSString stringWithFormat:@"You saved \"%@\".", content];
2012-07-13 16:02:21 -07:00
} else if ([category isEqualToString:@"feedsub"]) {
2012-07-30 18:49:12 -07:00
txt = [NSString stringWithFormat:@"You subscribed to %@.", content];
2012-08-15 19:31:34 -07:00
} else if ([category isEqualToString:@"signup"]) {
txt = [NSString stringWithFormat:@"You signed up for NewsBlur.", content];
2012-07-21 18:25:56 -07:00
}
2012-07-21 18:25:56 -07:00
NSString *txtWithTime = [NSString stringWithFormat:@"%@\n%@", txt, time];
NSMutableAttributedString* attrStr = [NSMutableAttributedString attributedStringWithString:txtWithTime];
// for those calls we don't specify a range so it affects the whole string
[attrStr setFont:[UIFont fontWithName:@"Helvetica" size:14]];
[attrStr setTextColor:UIColorFromRGB(0x333333)];
if (![username isEqualToString:@"You"]){
[attrStr setTextColor:UIColorFromRGB(NEWSBLUR_LINK_COLOR) range:[txtWithTime rangeOfString:username]];
2012-07-21 18:25:56 -07:00
[attrStr setTextBold:YES range:[txt rangeOfString:username]];
2012-07-13 16:02:21 -07:00
}
[attrStr setTextColor:UIColorFromRGB(NEWSBLUR_LINK_COLOR) range:[txtWithTime rangeOfString:title]];
2012-07-13 16:02:21 -07:00
2012-07-21 18:25:56 -07:00
if(withUserUsername.length) {
[attrStr setTextColor:UIColorFromRGB(NEWSBLUR_LINK_COLOR) range:[txtWithTime rangeOfString:withUserUsername]];
2012-07-21 18:25:56 -07:00
[attrStr setTextBold:YES range:[txtWithTime rangeOfString:withUserUsername]];
}
[attrStr setTextColor:UIColorFromRGB(0x666666) range:[txtWithTime rangeOfString:comment]];
[attrStr setTextColor:UIColorFromRGB(0x999999) range:[txtWithTime rangeOfString:time]];
[attrStr setFont:[UIFont fontWithName:@"Helvetica" size:10] range:[txtWithTime rangeOfString:time]];
[attrStr setTextAlignment:kCTLeftTextAlignment lineBreakMode:kCTLineBreakByWordWrapping lineHeight:4];
self.activityLabel.attributedText = attrStr;
[self.activityLabel sizeToFit];
2012-07-13 18:14:32 -07:00
int height = self.activityLabel.frame.size.height;
2012-07-22 09:12:02 -07:00
return MAX(height, self.faviconView.frame.size.height);
2012-07-13 16:02:21 -07:00
}
2012-07-16 19:45:14 -07:00
- (NSString *)stripFormatting:(NSString *)str {
while ([str rangeOfString:@" "].location != NSNotFound) {
str = [str stringByReplacingOccurrencesOfString:@" " withString:@" "];
}
while ([str rangeOfString:@"\n"].location != NSNotFound) {
str = [str stringByReplacingOccurrencesOfString:@"\n" withString:@" "];
}
return str;
}
2012-07-13 16:02:21 -07:00
@end