2011-10-04 18:01:35 -07:00
|
|
|
//
|
|
|
|
// LoginViewController.m
|
|
|
|
// NewsBlur
|
|
|
|
//
|
|
|
|
// Created by Samuel Clay on 10/31/10.
|
|
|
|
// Copyright 2010 NewsBlur. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
#import "AddViewController.h"
|
|
|
|
#import "NewsBlurAppDelegate.h"
|
|
|
|
#import "ASIHTTPRequest.h"
|
|
|
|
#import "ASIFormDataRequest.h"
|
|
|
|
#import "JSON.h"
|
|
|
|
|
|
|
|
@implementation AddViewController
|
|
|
|
|
|
|
|
@synthesize appDelegate;
|
2011-10-06 10:27:37 -07:00
|
|
|
@synthesize inFolderInput;
|
|
|
|
@synthesize newFolderInput;
|
|
|
|
@synthesize siteAddressInput;
|
2011-10-06 16:25:38 -07:00
|
|
|
@synthesize addButton;
|
|
|
|
@synthesize cancelButton;
|
2011-10-06 10:27:37 -07:00
|
|
|
@synthesize folderPicker;
|
2011-10-07 11:01:13 -07:00
|
|
|
@synthesize siteTable;
|
2011-10-04 18:01:35 -07:00
|
|
|
@synthesize jsonString;
|
2011-10-06 16:25:38 -07:00
|
|
|
@synthesize navBar;
|
2011-10-04 18:01:35 -07:00
|
|
|
@synthesize activityIndicator;
|
2011-10-07 11:01:13 -07:00
|
|
|
@synthesize addingLabel;
|
2011-10-04 18:01:35 -07:00
|
|
|
@synthesize errorLabel;
|
2011-10-06 16:25:38 -07:00
|
|
|
@synthesize addTypeControl;
|
2011-10-04 18:01:35 -07:00
|
|
|
@synthesize usernameLabel;
|
|
|
|
@synthesize usernameOrEmailLabel;
|
|
|
|
@synthesize passwordLabel;
|
|
|
|
@synthesize emailLabel;
|
|
|
|
@synthesize passwordOptionalLabel;
|
|
|
|
|
|
|
|
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
|
|
|
|
|
|
|
|
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2011-10-06 10:27:37 -07:00
|
|
|
- (void)viewDidLoad {
|
|
|
|
UIImageView *folderImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"folder.png"]];
|
|
|
|
[inFolderInput setLeftView:folderImage];
|
|
|
|
[inFolderInput setLeftViewMode:UITextFieldViewModeAlways];
|
|
|
|
[folderImage release];
|
2011-10-11 09:46:13 -07:00
|
|
|
UIImageView *folderImage2 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"folder.png"]];
|
|
|
|
[newFolderInput setLeftView:folderImage2];
|
|
|
|
[newFolderInput setLeftViewMode:UITextFieldViewModeAlways];
|
|
|
|
[folderImage2 release];
|
|
|
|
|
|
|
|
UIImageView *urlImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"world.png"]];
|
|
|
|
[siteAddressInput setLeftView:urlImage];
|
|
|
|
[siteAddressInput setLeftViewMode:UITextFieldViewModeAlways];
|
|
|
|
[urlImage release];
|
2011-10-04 18:01:35 -07:00
|
|
|
|
2011-10-06 16:25:38 -07:00
|
|
|
navBar.tintColor = [UIColor colorWithRed:0.16f green:0.36f blue:0.46 alpha:0.9];
|
|
|
|
|
2011-10-11 09:46:13 -07:00
|
|
|
newFolderInput.frame = CGRectMake(self.view.frame.size.width,
|
|
|
|
siteAddressInput.frame.origin.y,
|
|
|
|
siteAddressInput.frame.size.width,
|
|
|
|
siteAddressInput.frame.size.height);
|
|
|
|
|
2011-10-04 18:01:35 -07:00
|
|
|
[super viewDidLoad];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)viewWillAppear:(BOOL)animated {
|
|
|
|
[self.errorLabel setHidden:YES];
|
2011-10-07 11:01:13 -07:00
|
|
|
[self.addingLabel setHidden:YES];
|
|
|
|
[self.folderPicker setHidden:YES];
|
|
|
|
[self.siteTable setHidden:YES];
|
2011-10-04 18:01:35 -07:00
|
|
|
[self.activityIndicator stopAnimating];
|
|
|
|
[super viewWillAppear:animated];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)viewDidAppear:(BOOL)animated {
|
|
|
|
[self.activityIndicator stopAnimating];
|
|
|
|
[super viewDidAppear:animated];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
- (void)didReceiveMemoryWarning {
|
|
|
|
// Releases the view if it doesn't have a superview.
|
|
|
|
[super didReceiveMemoryWarning];
|
|
|
|
|
|
|
|
// Release any cached data, images, etc that aren't in use.
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)dealloc {
|
|
|
|
[appDelegate release];
|
2011-10-06 10:27:37 -07:00
|
|
|
[inFolderInput release];
|
|
|
|
[newFolderInput release];
|
|
|
|
[siteAddressInput release];
|
2011-10-06 16:25:38 -07:00
|
|
|
[addButton release];
|
|
|
|
[cancelButton release];
|
2011-10-06 10:27:37 -07:00
|
|
|
[folderPicker release];
|
2011-10-07 11:01:13 -07:00
|
|
|
[siteTable release];
|
2011-10-04 18:01:35 -07:00
|
|
|
[jsonString release];
|
2011-10-06 16:25:38 -07:00
|
|
|
[navBar release];
|
2011-10-04 18:01:35 -07:00
|
|
|
[super dealloc];
|
|
|
|
}
|
|
|
|
|
2011-10-10 09:57:54 -07:00
|
|
|
- (IBAction)doCancelButton {
|
|
|
|
[appDelegate.addViewController dismissModalViewControllerAnimated:YES];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (IBAction)doAddButton {
|
|
|
|
if ([self.addTypeControl selectedSegmentIndex] == 0) {
|
|
|
|
return [self addSite];
|
|
|
|
} else {
|
|
|
|
return [self addFolder];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)reload {
|
2011-10-11 09:46:13 -07:00
|
|
|
[inFolderInput setText:@""];
|
|
|
|
[siteAddressInput setText:@""];
|
|
|
|
[newFolderInput setText:@""];
|
2011-10-10 09:57:54 -07:00
|
|
|
[folderPicker reloadAllComponents];
|
2011-10-11 10:04:15 -07:00
|
|
|
|
|
|
|
folderPicker.frame = CGRectMake(0, self.view.bounds.size.height,
|
|
|
|
folderPicker.frame.size.width,
|
|
|
|
folderPicker.frame.size.height);
|
2011-10-10 09:57:54 -07:00
|
|
|
}
|
|
|
|
|
2011-10-04 18:01:35 -07:00
|
|
|
#pragma mark -
|
|
|
|
#pragma mark Add Site
|
|
|
|
|
2011-10-06 10:27:37 -07:00
|
|
|
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
|
2011-10-11 09:46:13 -07:00
|
|
|
[errorLabel setText:@""];
|
2011-10-10 09:57:54 -07:00
|
|
|
if (textField == inFolderInput && ![inFolderInput isFirstResponder]) {
|
2011-10-07 11:01:13 -07:00
|
|
|
[siteAddressInput resignFirstResponder];
|
|
|
|
[newFolderInput resignFirstResponder];
|
2011-10-10 09:57:54 -07:00
|
|
|
[inFolderInput setInputView:folderPicker];
|
2011-10-11 10:04:15 -07:00
|
|
|
if (folderPicker.frame.origin.y >= self.view.bounds.size.height) {
|
|
|
|
folderPicker.hidden = NO;
|
|
|
|
[UIView animateWithDuration:.35 animations:^{
|
|
|
|
folderPicker.frame = CGRectMake(0, self.view.bounds.size.height - folderPicker.frame.size.height, folderPicker.frame.size.width, folderPicker.frame.size.height);
|
|
|
|
}];
|
|
|
|
}
|
2011-10-06 10:27:37 -07:00
|
|
|
return NO;
|
2011-10-07 11:01:13 -07:00
|
|
|
} else if (textField == siteAddressInput) {
|
2011-10-11 09:46:13 -07:00
|
|
|
[self hideFolderPicker];
|
2011-10-07 11:01:13 -07:00
|
|
|
} else if (textField == newFolderInput) {
|
2011-10-11 09:46:13 -07:00
|
|
|
[self hideFolderPicker];
|
2011-10-06 10:27:37 -07:00
|
|
|
}
|
|
|
|
return YES;
|
|
|
|
}
|
|
|
|
|
2011-10-04 18:01:35 -07:00
|
|
|
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
|
2011-10-06 10:27:37 -07:00
|
|
|
if (textField == inFolderInput) {
|
2011-10-10 09:57:54 -07:00
|
|
|
|
|
|
|
} else if (textField == siteAddressInput) {
|
|
|
|
[self addSite];
|
|
|
|
} else if (textField == newFolderInput) {
|
|
|
|
[self addFolder];
|
2011-10-04 18:01:35 -07:00
|
|
|
}
|
|
|
|
return YES;
|
|
|
|
}
|
|
|
|
|
2011-10-10 09:57:54 -07:00
|
|
|
- (IBAction)addSite {
|
2011-10-11 09:46:13 -07:00
|
|
|
[self hideFolderPicker];
|
2011-10-10 09:57:54 -07:00
|
|
|
[siteAddressInput resignFirstResponder];
|
2011-10-07 11:01:13 -07:00
|
|
|
[self.addingLabel setHidden:NO];
|
|
|
|
[self.addingLabel setText:@"Adding site..."];
|
2011-10-04 18:01:35 -07:00
|
|
|
[self.errorLabel setHidden:YES];
|
|
|
|
[self.activityIndicator startAnimating];
|
2011-10-10 09:57:54 -07:00
|
|
|
NSString *urlString = [NSString stringWithFormat:@"http://%@/reader/add_url",
|
2011-10-04 18:01:35 -07:00
|
|
|
NEWSBLUR_URL];
|
|
|
|
NSURL *url = [NSURL URLWithString:urlString];
|
|
|
|
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
|
2011-10-11 10:04:15 -07:00
|
|
|
NSString *parent_folder = [self extractParentFolder];
|
|
|
|
[request setPostValue:parent_folder forKey:@"folder"];
|
2011-10-10 09:57:54 -07:00
|
|
|
[request setPostValue:[siteAddressInput text] forKey:@"url"];
|
2011-10-04 18:01:35 -07:00
|
|
|
[request setDelegate:self];
|
|
|
|
[request setDidFinishSelector:@selector(requestFinished:)];
|
|
|
|
[request setDidFailSelector:@selector(requestFailed:)];
|
|
|
|
[request startAsynchronous];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
- (void)requestFinished:(ASIHTTPRequest *)request {
|
2011-10-07 11:01:13 -07:00
|
|
|
[self.addingLabel setHidden:YES];
|
2011-10-04 18:01:35 -07:00
|
|
|
[self.activityIndicator stopAnimating];
|
|
|
|
NSString *responseString = [request responseString];
|
|
|
|
NSDictionary *results = [[NSDictionary alloc]
|
|
|
|
initWithDictionary:[responseString JSONValue]];
|
|
|
|
// int statusCode = [request responseStatusCode];
|
|
|
|
int code = [[results valueForKey:@"code"] intValue];
|
|
|
|
if (code == -1) {
|
2011-10-10 09:57:54 -07:00
|
|
|
[self.errorLabel setText:[results valueForKey:@"message"]];
|
2011-10-04 18:01:35 -07:00
|
|
|
[self.errorLabel setHidden:NO];
|
|
|
|
} else {
|
2011-10-10 09:57:54 -07:00
|
|
|
[appDelegate.addViewController dismissModalViewControllerAnimated:YES];
|
2011-10-04 18:01:35 -07:00
|
|
|
[appDelegate reloadFeedsView];
|
|
|
|
}
|
|
|
|
|
|
|
|
[results release];
|
|
|
|
}
|
|
|
|
|
2011-10-11 10:04:15 -07:00
|
|
|
- (NSString *)extractParentFolder {
|
|
|
|
NSString *parent_folder = [inFolderInput text];
|
|
|
|
int folder_loc = [parent_folder rangeOfString:@" - " options:NSBackwardsSearch].location;
|
|
|
|
if ([parent_folder length] && folder_loc != NSNotFound) {
|
|
|
|
parent_folder = [parent_folder substringFromIndex:(folder_loc + 3)];
|
|
|
|
}
|
|
|
|
return parent_folder;
|
|
|
|
}
|
2011-10-04 18:01:35 -07:00
|
|
|
|
2011-10-10 09:57:54 -07:00
|
|
|
#pragma mark -
|
|
|
|
#pragma mark Add Folder
|
|
|
|
|
|
|
|
|
|
|
|
- (IBAction)addFolder {
|
2011-10-11 09:46:13 -07:00
|
|
|
[self hideFolderPicker];
|
2011-10-10 09:57:54 -07:00
|
|
|
[newFolderInput resignFirstResponder];
|
2011-10-07 11:01:13 -07:00
|
|
|
[self.addingLabel setHidden:NO];
|
|
|
|
[self.addingLabel setText:@"Adding Folder..."];
|
2011-10-04 18:01:35 -07:00
|
|
|
[self.errorLabel setHidden:YES];
|
|
|
|
[self.activityIndicator startAnimating];
|
2011-10-10 09:57:54 -07:00
|
|
|
NSString *urlString = [NSString stringWithFormat:@"http://%@/reader/add_folder",
|
2011-10-04 18:01:35 -07:00
|
|
|
NEWSBLUR_URL];
|
|
|
|
NSURL *url = [NSURL URLWithString:urlString];
|
|
|
|
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
|
2011-10-11 10:04:15 -07:00
|
|
|
NSString *parent_folder = [self extractParentFolder];
|
2011-10-10 09:57:54 -07:00
|
|
|
[request setPostValue:parent_folder forKey:@"parent_folder"];
|
|
|
|
[request setPostValue:[newFolderInput text] forKey:@"folder"];
|
2011-10-04 18:01:35 -07:00
|
|
|
[request setDelegate:self];
|
2011-10-06 10:27:37 -07:00
|
|
|
[request setDidFinishSelector:@selector(finishAddFolder:)];
|
2011-10-04 18:01:35 -07:00
|
|
|
[request setDidFailSelector:@selector(requestFailed:)];
|
|
|
|
[request startAsynchronous];
|
|
|
|
}
|
|
|
|
|
2011-10-06 10:27:37 -07:00
|
|
|
- (void)finishAddFolder:(ASIHTTPRequest *)request {
|
2011-10-07 11:01:13 -07:00
|
|
|
[self.addingLabel setHidden:YES];
|
2011-10-04 18:01:35 -07:00
|
|
|
[self.activityIndicator stopAnimating];
|
|
|
|
NSString *responseString = [request responseString];
|
|
|
|
NSDictionary *results = [[NSDictionary alloc]
|
|
|
|
initWithDictionary:[responseString JSONValue]];
|
|
|
|
// int statusCode = [request responseStatusCode];
|
|
|
|
int code = [[results valueForKey:@"code"] intValue];
|
|
|
|
if (code == -1) {
|
2011-10-10 09:57:54 -07:00
|
|
|
[self.errorLabel setText:[results valueForKey:@"message"]];
|
2011-10-04 18:01:35 -07:00
|
|
|
[self.errorLabel setHidden:NO];
|
|
|
|
} else {
|
2011-10-10 09:57:54 -07:00
|
|
|
[appDelegate.addViewController dismissModalViewControllerAnimated:YES];
|
2011-10-04 18:01:35 -07:00
|
|
|
[appDelegate reloadFeedsView];
|
|
|
|
}
|
|
|
|
|
|
|
|
[results release];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)requestFailed:(ASIHTTPRequest *)request
|
|
|
|
{
|
2011-10-11 10:04:15 -07:00
|
|
|
[self.addingLabel setHidden:YES];
|
|
|
|
[self.errorLabel setHidden:NO];
|
|
|
|
[self.activityIndicator stopAnimating];
|
2011-10-04 18:01:35 -07:00
|
|
|
NSError *error = [request error];
|
|
|
|
NSLog(@"Error: %@", error);
|
2011-10-11 10:04:15 -07:00
|
|
|
[self.errorLabel setText:error.localizedDescription];
|
2011-10-04 18:01:35 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
#pragma mark -
|
2011-10-10 09:57:54 -07:00
|
|
|
#pragma mark Page Controls
|
2011-10-04 18:01:35 -07:00
|
|
|
|
2011-10-06 16:25:38 -07:00
|
|
|
- (IBAction)selectAddTypeSignup {
|
2011-10-04 18:01:35 -07:00
|
|
|
[self animateLoop];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)animateLoop {
|
2011-10-06 16:25:38 -07:00
|
|
|
if ([self.addTypeControl selectedSegmentIndex] == 0) {
|
|
|
|
[addButton setTitle:@"Add Site"];
|
2011-10-07 11:01:13 -07:00
|
|
|
[newFolderInput resignFirstResponder];
|
2011-10-04 18:01:35 -07:00
|
|
|
[UIView animateWithDuration:0.5 animations:^{
|
2011-10-07 11:01:13 -07:00
|
|
|
siteAddressInput.frame = CGRectMake(newFolderInput.frame.origin.x,
|
|
|
|
siteAddressInput.frame.origin.y,
|
|
|
|
siteAddressInput.frame.size.width,
|
|
|
|
siteAddressInput.frame.size.height);
|
|
|
|
newFolderInput.frame = CGRectMake(self.view.frame.size.width,
|
|
|
|
siteAddressInput.frame.origin.y,
|
|
|
|
siteAddressInput.frame.size.width,
|
|
|
|
siteAddressInput.frame.size.height);
|
2011-10-04 18:01:35 -07:00
|
|
|
}];
|
|
|
|
} else {
|
2011-10-06 16:25:38 -07:00
|
|
|
[addButton setTitle:@"Add Folder"];
|
2011-10-07 11:01:13 -07:00
|
|
|
[siteAddressInput resignFirstResponder];
|
|
|
|
newFolderInput.frame = CGRectMake(self.view.frame.size.width,
|
|
|
|
siteAddressInput.frame.origin.y,
|
|
|
|
siteAddressInput.frame.size.width,
|
|
|
|
siteAddressInput.frame.size.height);
|
2011-10-04 18:01:35 -07:00
|
|
|
[UIView animateWithDuration:0.5 animations:^{
|
2011-10-07 11:01:13 -07:00
|
|
|
newFolderInput.frame = CGRectMake(siteAddressInput.frame.origin.x,
|
|
|
|
siteAddressInput.frame.origin.y,
|
|
|
|
siteAddressInput.frame.size.width,
|
|
|
|
siteAddressInput.frame.size.height);
|
|
|
|
siteAddressInput.frame = CGRectMake(-1 * (siteAddressInput.frame.origin.x +
|
|
|
|
siteAddressInput.frame.size.width),
|
|
|
|
siteAddressInput.frame.origin.y,
|
|
|
|
siteAddressInput.frame.size.width,
|
|
|
|
siteAddressInput.frame.size.height);
|
2011-10-04 18:01:35 -07:00
|
|
|
}];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#pragma mark -
|
|
|
|
#pragma mark Folder Picker
|
|
|
|
|
|
|
|
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSInteger)pickerView:(UIPickerView *)pickerView
|
|
|
|
numberOfRowsInComponent:(NSInteger)component {
|
|
|
|
return [[appDelegate dictFoldersArray] count];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSString *)pickerView:(UIPickerView *)pickerView
|
|
|
|
titleForRow:(NSInteger)row
|
|
|
|
forComponent:(NSInteger)component {
|
2011-10-05 10:07:26 -07:00
|
|
|
if (row == 0) {
|
|
|
|
return @"— Top Level —";
|
|
|
|
} else {
|
|
|
|
return [[appDelegate dictFoldersArray] objectAtIndex:row];
|
|
|
|
}
|
2011-10-04 18:01:35 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
- (void)pickerView:(UIPickerView *)pickerView
|
|
|
|
didSelectRow:(NSInteger)row
|
|
|
|
inComponent:(NSInteger)component {
|
2011-10-10 09:57:54 -07:00
|
|
|
NSString *folder_title;
|
|
|
|
if (row == 0) {
|
|
|
|
folder_title = @"- Top Level -";
|
|
|
|
} else {
|
|
|
|
folder_title = [[appDelegate dictFoldersArray] objectAtIndex:row];
|
|
|
|
}
|
|
|
|
[inFolderInput setText:folder_title];
|
2011-10-04 18:01:35 -07:00
|
|
|
}
|
|
|
|
|
2011-10-11 09:46:13 -07:00
|
|
|
- (void)hideFolderPicker {
|
|
|
|
[UIView animateWithDuration:.35 animations:^{
|
|
|
|
folderPicker.frame = CGRectMake(0, self.view.bounds.size.height, folderPicker.frame.size.width, folderPicker.frame.size.height);
|
|
|
|
}];
|
|
|
|
}
|
|
|
|
|
2011-10-07 11:01:13 -07:00
|
|
|
#pragma mark -
|
|
|
|
#pragma mark Autocomplete sites
|
|
|
|
|
|
|
|
|
|
|
|
- (int)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2011-10-11 09:46:13 -07:00
|
|
|
- (UITableViewCell *)tableView:(UITableView *)tableView
|
|
|
|
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2011-10-04 18:01:35 -07:00
|
|
|
@end
|