photo-ios/Trovebox/MenuViewController.m
2014-04-29 15:56:09 -03:00

524 lines
No EOL
21 KiB
Objective-C

//
// MenuViewController.m
// Trovebox
//
// Created by Patrick Santana on 5/10/12.
// Copyright 2013 Trovebox
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#import "MenuViewController.h"
#import "IIViewDeckController.h"
@interface MenuViewController()
- (MenuTableViewCell *) getDefaultUITableViewCell:(UITableView *)tableView image:(NSString *) imagePath imageSelected:(NSString *) imageSelectedPath;
@end
@implementation MenuViewController
@synthesize popoverController = _popoverController2;
@synthesize location = _location;
@synthesize appSettingsViewController;
@synthesize galleryController=_galleryController;
@synthesize albumController=_albumController;
@synthesize tagController=_tagController;
@synthesize syncController=_syncController;
@synthesize profileController=_profileController;
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle
{
self = [super initWithNibName:nibName bundle:nibBundle];
if (self){
// needs update menu
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(eventHandler:)
name:kNotificationNeededsUpdate
object:nil ];
self.tableView.backgroundColor = UIColorFromRGB(0x6B5851);
// no separator
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
coreLocationController = [[CoreLocationController alloc] init];
coreLocationController.delegate = self;
library = [[ALAssetsLibrary alloc] init];
}
return self;
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView.scrollsToTop = NO;
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 10.0f)];
self.tableView.scrollEnabled = NO;
}
- (BOOL) shouldAutorotate
{
return YES;
}
- (NSUInteger) supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// if type = group, returns only 7: We need to remove Tags and My Profile
NSString *type = [[NSUserDefaults standardUserDefaults] objectForKey:kTroveboxTypeUser];
if (type && [type isEqualToString:@"group"]){
return 7;
}else{
return 9;
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *menuTableViewSectionCellIdentifier = @"menuTableViewSectionCell";
static NSString *menuTableViewSearchCellIdentifier = @"menuTableViewSearchCell";
BOOL groupUser = NO;
NSString *type = [[NSUserDefaults standardUserDefaults] objectForKey:kTroveboxTypeUser];
if (type && [type isEqualToString:@"group"]){
groupUser = YES;
}
NSUInteger row = [indexPath row];
if ( row == 0){
// the first one is the search
// load the search cell
MenuTableViewSearchCell *cell = [tableView dequeueReusableCellWithIdentifier:menuTableViewSearchCellIdentifier];
if (cell == nil){
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MenuTableViewSearchCell" owner:nil options:nil];
for(id currentObject in topLevelObjects)
{
if([currentObject isKindOfClass:[MenuTableViewSearchCell class]])
{
cell = (MenuTableViewSearchCell *)currentObject;
break;
}
}
}
cell.contentView.backgroundColor = UIColorFromRGB(0x40332D);
cell.labelSearch.delegate = cell;
// set temporary the user's name
NSString *name = [[NSUserDefaults standardUserDefaults] objectForKey:kTroveboxNameUser];
if (name)
cell.labelTroveboxUser.text = name;
else{
cell.labelTroveboxUser.text = @"Trovebox User";
}
return cell;
}else if ( row == 1){
// latest activity
MenuTableViewCell *cell = [self getDefaultUITableViewCell:tableView image:@"menu-latest.png" imageSelected:@"menu-latest-selected.png"];
cell.label.text = NSLocalizedString(@"Latest Activity", @"Menu - title for Home");
return cell;
}else if ( row == 2){
// photos - gallery
MenuTableViewCell *cell = [self getDefaultUITableViewCell:tableView image:@"menu-gallery.png" imageSelected:@"menu-gallery-selected.png"];
cell.label.text = NSLocalizedString(@"Gallery", @"Menu - title for Gallery");
return cell;
}else if ( row == 3){
// albums
MenuTableViewCell *cell = [self getDefaultUITableViewCell:tableView image:@"menu-album.png" imageSelected:@"menu-album-selected.png"];
cell.label.text = NSLocalizedString(@"Albums", @"Menu - title for Albums");
return cell;
}else if ( row == 4 && !groupUser){
// tags
MenuTableViewCell *cell = [self getDefaultUITableViewCell:tableView image:@"menu-tags.png" imageSelected:@"menu-tags-selected.png"];
cell.label.text = NSLocalizedString(@"Tags", @"Menu - title for Tags");
return cell;
}else if ( (row == 5 && !groupUser) || (row == 4 && groupUser) ){
// upload & sync
MenuTableViewCell *cell = [self getDefaultUITableViewCell:tableView image:@"menu-upload.png" imageSelected:@"menu-upload-selected.png"];
cell.label.text = NSLocalizedString(@"Upload & Sync", @"Menu - title for Upload & Sync");
return cell;
}else if ( (row == 6 && !groupUser) || (row == 5 && groupUser) ){
// preferences
// load preference cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:menuTableViewSectionCellIdentifier];
if (cell == nil) {
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MenuTableViewSectionCell" owner:nil options:nil];
cell = [topLevelObjects objectAtIndex:0];
}
cell.contentView.backgroundColor = UIColorFromRGB(0x40332D);
return cell;
}else if ( row == 7 && !groupUser){
// my account
MenuTableViewCell *cell = [self getDefaultUITableViewCell:tableView image:@"menu-profile.png" imageSelected:@"menu-profile-selected.png"];
cell.label.text = NSLocalizedString(@"My Account", @"Menu - title for Account");
return cell;
}else {
// settings
MenuTableViewCell *cell = [self getDefaultUITableViewCell:tableView image:@"menu-settings.png" imageSelected:@"menu-settings-selected.png"];
cell.label.text = NSLocalizedString(@"Settings", @"Menu - title for Settings");
return cell;
}
}
- (MenuTableViewCell *) getDefaultUITableViewCell:(UITableView *)tableView image:(NSString *) imagePath imageSelected:(NSString *) imageSelectedPath
{
static NSString *menuTableViewCellIdentifier = @"menuTableViewCell";
MenuTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:menuTableViewCellIdentifier];
if (cell == nil) {
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MenuTableViewCell" owner:nil options:nil];
cell = [topLevelObjects objectAtIndex:0];
}
cell.imageSelected = imageSelectedPath;
cell.imageDefault = imagePath;
[cell.image setImage:[UIImage imageNamed:imagePath]];
return cell;
}
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
BOOL groupUser = NO;
NSString *type = [[NSUserDefaults standardUserDefaults] objectForKey:kTroveboxTypeUser];
if (type && [type isEqualToString:@"group"]){
groupUser = YES;
}
[self.viewDeckController closeLeftViewBouncing:^(IIViewDeckController *controller) {
if ([controller.centerController isKindOfClass:[UINavigationController class]]) {
if (indexPath.row == 1){
// Latest activity
controller.centerController = SharedAppDelegate.centerController;
}else if (indexPath.row ==2){
// Gallery
if (self.galleryController == nil){
self.galleryController = [[UINavigationController alloc]initWithRootViewController:[[GalleryViewController alloc] init]];
}
controller.centerController = self.galleryController;
}else if ( indexPath.row == 3){
// Albums
if (self.albumController == nil){
self.albumController = [[UINavigationController alloc]initWithRootViewController:[[AlbumViewController alloc] init]];
}
controller.centerController = self.albumController;
}else if ( indexPath.row == 4 && !groupUser){
// Tags
if (self.tagController == nil){
self.tagController = [[UINavigationController alloc]initWithRootViewController:[[TagViewController alloc] init]];
}
controller.centerController = self.tagController;
}else if ( (indexPath.row == 5 && !groupUser) || (indexPath.row == 4 && groupUser) ){
// Upload & Sync
if (self.syncController == nil){
SyncViewController *photoPicker = [[SyncViewController alloc] initWithNibName:@"SyncViewController" bundle:nil];
ELCImagePickerController *syncController = [[ELCImagePickerController alloc] initWithRootViewController:photoPicker] ;
[photoPicker setParent:syncController];
[syncController setDelegate:photoPicker];
self.syncController = syncController;
}
controller.centerController = self.syncController;
controller.centerController.navigationController.navigationBar.tintColor = [UIColor whiteColor];
}else if ( indexPath.row == 7 && !groupUser){
// Account - Profile
if (self.profileController == nil){
if ([DisplayUtilities isIPad]){
self.profileController = [[UINavigationController alloc]initWithRootViewController:[[ProfileViewController alloc] initWithNibName:@"ProfileViewControlleriPad" bundle:nil]];
}else{
self.profileController = [[UINavigationController alloc]initWithRootViewController:[[ProfileViewController alloc] init]];
}
}
controller.centerController = self.profileController;
}else{
// Settings
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:self.appSettingsViewController];
controller.centerController = nav;
}
}
[NSThread sleepForTimeInterval:(300+arc4random()%700)/1000000.0]; // mimic delay... not really necessary
}];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
// if type = group, returns only 7: We need to remove Tags and My Profile
BOOL groupUser = NO;
NSString *type = [[NSUserDefaults standardUserDefaults] objectForKey:kTroveboxTypeUser];
if (type && [type isEqualToString:@"group"]){
groupUser = YES;
}
if ( [indexPath row] == 0){
return 64;
}else if ( ([indexPath row] == 6) || (([indexPath row] == 5) && groupUser)){
return 37;
}else{
return 44;
}
}
- (void) openLoginViewController
{
// open the login
LoginViewController *controller = [[LoginViewController alloc]initWithNibName:[DisplayUtilities getCorrectNibName:@"LoginViewController"] bundle:nil ];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
[self presentViewController:navController animated:YES completion:nil];
}
- (void) eventHandler: (NSNotification *) notification{
#ifdef DEVELOPMENT_ENABLED
NSLog(@"###### Event triggered: %@", notification);
#endif
if ([notification.name isEqualToString:kNotificationNeededsUpdate]){
[self.tableView reloadData];
}
}
- (OpenPhotoIASKAppSettingsViewController*)appSettingsViewController {
if (!appSettingsViewController) {
appSettingsViewController = [[OpenPhotoIASKAppSettingsViewController alloc] initWithNibName:@"IASKAppSettingsView" bundle:nil];
appSettingsViewController.delegate = self;
[appSettingsViewController setShowCreditsFooter:NO];
appSettingsViewController.showDoneButton = NO;
}
return appSettingsViewController;
}
- (void)settingsViewController:(IASKAppSettingsViewController*)sender buttonTappedForKey:(NSString*)key {
if ([key isEqualToString:@"CleanCache"]){
[Timeline deleteAllTimelineInManagedObjectContext:[SharedAppDelegate managedObjectContext]];
NSError *saveError = nil;
if (![[SharedAppDelegate managedObjectContext] save:&saveError]){
NSLog(@"Error to save context = %@",[saveError localizedDescription]);
}
//remove cache
SDImageCache *imageCache = [SDImageCache sharedImageCache];
[imageCache clearMemory];
[imageCache clearDisk];
[imageCache cleanDisk];
}
}
- (void)settingsViewControllerDidEnd:(IASKAppSettingsViewController*)sender {
[self dismissViewControllerAnimated:YES completion:nil];
}
- (void) openCamera:(id) sender
{
#ifdef DEVELOPMENT_ENABLED
NSLog(@"Open Camera");
#endif
// refresh profile details
[[NSNotificationCenter defaultCenter] postNotificationName:kNotificationProfileRefresh object:nil];
self.viewDeckController.centerController = SharedAppDelegate.centerController;
[self selectLatestActivity];
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
[coreLocationController.locMgr startUpdatingLocation];
[self presentViewController:picker animated:YES completion:nil];
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
/*
// the image itself to save in the library,
// this data must be a raw data on DLCImagePickerController. Remove the PNG representation
UIImage *pickedImage = [info objectForKey:@"image"];
// User come from Snapshot. We will temporary save in the Library.
NSData* pngData = UIImageJPEGRepresentation(pickedImage,1.0);
CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)pngData, NULL);
NSDictionary *exifTemp = (__bridge NSDictionary *) CGImageSourceCopyPropertiesAtIndex(source,0,NULL);
__block NSMutableDictionary *exif = [exifTemp mutableCopy];
NSDictionary *gpsDict = [self currentLocation];
if ([gpsDict count] > 0) {
#ifdef DEVELOPMENT_ENABLED
NSLog(@"There is location");
#endif
[exif setObject:gpsDict forKey:(NSString*) kCGImagePropertyGPSDictionary];
}else{
#ifdef DEVELOPMENT_ENABLED
NSLog(@"No location found");
#endif
}
[library writeImageToSavedPhotosAlbum:[pickedImage CGImage] metadata:exif completionBlock:^(NSURL *newUrl, NSError *error) {
if (error) {
NSLog(@"The photo took by the user could not be saved = %@", [error description]);
} else {
PhotoViewController* controller = [[PhotoViewController alloc]initWithNibName:[DisplayUtilities getCorrectNibName:@"PhotoViewController"] bundle:nil url:newUrl];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
[navController.navigationBar troveboxStyle:NO];
[self dismissViewControllerAnimated:YES completion:^{
[self presentViewController:navController animated:YES completion:nil];
}];
}
}];
// stop location
[coreLocationController.locMgr stopUpdatingLocation];
*/
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[picker dismissViewControllerAnimated:YES completion:^{
[coreLocationController.locMgr stopUpdatingLocation];
}];
}
//Creates an EXIF field for the current geo location.
- (NSMutableDictionary*)currentLocation {
NSMutableDictionary *locDict = [[NSMutableDictionary alloc] init];
if (self.location != nil) {
CLLocationDegrees exifLatitude = self.location.coordinate.latitude;
CLLocationDegrees exifLongitude = self.location.coordinate.longitude;
[locDict setObject:self.location.timestamp forKey:(NSString*) kCGImagePropertyGPSTimeStamp];
if (exifLatitude < 0.0) {
exifLatitude = exifLatitude*(-1);
[locDict setObject:@"S" forKey:(NSString*)kCGImagePropertyGPSLatitudeRef];
} else {
[locDict setObject:@"N" forKey:(NSString*)kCGImagePropertyGPSLatitudeRef];
}
[locDict setObject:[NSNumber numberWithFloat:exifLatitude] forKey:(NSString*)kCGImagePropertyGPSLatitude];
if (exifLongitude < 0.0) {
exifLongitude=exifLongitude*(-1);
[locDict setObject:@"W" forKey:(NSString*)kCGImagePropertyGPSLongitudeRef];
} else {
[locDict setObject:@"E" forKey:(NSString*)kCGImagePropertyGPSLongitudeRef];
}
[locDict setObject:[NSNumber numberWithFloat:exifLongitude] forKey:(NSString*) kCGImagePropertyGPSLongitude];
}
return locDict;
}
- (void)locationUpdate:(CLLocation *)position{
self.location = position;
#ifdef DEVELOPMENT_ENABLED
NSLog(@"Position %@", position);
#endif
}
- (void)locationError:(NSError *)error {
NSLog(@"Location error %@", [error description]);
if ([error code] == kCLErrorDenied){
// validate if we had checked once if user allowed location
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
if (standardUserDefaults) {
if (![[NSUserDefaults standardUserDefaults] boolForKey:kValidateNotAllowedLocation] ||
[[NSUserDefaults standardUserDefaults] boolForKey:kValidateNotAllowedLocation] == NO){
// validated
[standardUserDefaults setBool:YES forKey:kValidateNotAllowedLocation];
// synchronize the keys
[standardUserDefaults synchronize];
}
}
}
}
- (void) selectLatestActivity
{
[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone];
}
- (void) displayProfileScreen
{
[self.viewDeckController openLeftViewAnimated:YES completion:^(IIViewDeckController *controller) {
// Account - Profile
if (self.profileController == nil){
self.profileController = [[UINavigationController alloc]initWithRootViewController:[[ProfileViewController alloc] init]];
self.profileController.title= NSLocalizedString(@"My Account", @"Menu - title for Account");
}
controller.centerController = self.profileController;
// select profile
[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:7 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone];
//sleep a little and close the left view
[NSThread sleepForTimeInterval:(300+arc4random()%700)/1000000.0]; // mimic delay... not really necessary
[self.viewDeckController closeLeftViewAnimated:YES];
}];
}
- (void) displayHomeScreen
{
[self.viewDeckController openLeftViewAnimated:YES completion:^(IIViewDeckController *controller) {
controller.centerController = SharedAppDelegate.centerController;
[self selectLatestActivity];
[MBProgressHUD hideAllHUDsForView:self.viewDeckController.view animated:YES];
[NSThread sleepForTimeInterval:(300+arc4random()%700)/1000000.0]; // mimic delay... not really necessary
[self.viewDeckController closeLeftViewAnimated:YES];
}];
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end