Fix compile errors
[pithos-ios] / Classes / RootViewController.m
1 //
2 //  RootViewController.m
3 //  OpenStack
4 //
5 //  Created by Mike Mayo on 9/30/10.
6 //  The OpenStack project is provided under the Apache 2.0 license.
7 //
8
9 #import "RootViewController.h"
10 #import "ProvidersViewController.h"
11 #import "OpenStackAccount.h"
12 #import "Provider.h"
13 #import "Archiver.h"
14 #import "ActivityIndicatorView.h"
15 #import "UIViewController+Conveniences.h"
16 #import "SettingsViewController.h"
17 #import "Keychain.h"
18 #import "PasscodeViewController.h"
19 #import "OpenStackAppDelegate.h"
20 #import "AccountHomeViewController.h"
21 #import "PithosImageViewController.h"
22
23
24 @implementation RootViewController
25
26 @synthesize tableView, popoverController, detailItem;
27 @synthesize restoreAccountView;
28
29 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
30     return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait);
31 }
32
33 - (void)restoreProviderView:(AccountDetailsViewController *)accountDetailsViewController {
34     OpenStackAppDelegate *app = [[UIApplication sharedApplication] delegate];
35     ProvidersViewController *vc = [[ProvidersViewController alloc] initWithNibName:@"ProvidersViewController" bundle:nil];
36     vc.rootViewController = self;
37     if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
38         vc.modalPresentationStyle = UIModalPresentationFormSheet;
39         if (app.rootViewController.popoverController != nil) {
40             [app.rootViewController.popoverController dismissPopoverAnimated:YES];
41         }
42     }   
43     [self presentModalViewControllerWithNavigation:vc animated:NO];
44     [vc restoreAccountDetailsViewController:accountDetailsViewController];
45     [vc release];    
46 }
47
48 - (void)restoreAccountView:(AccountSettingsViewController *)accountSettingsViewController {
49     /*NSArray *pathList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
50     NSString *path =  [pathList  objectAtIndex:0];
51     NSString *filePath = [NSString stringWithFormat:@"%@/iostestfile.txt", path];
52     */
53    /* self.navigationItem.title = @"Accounts";
54     
55     self.navigationItem.leftBarButtonItem = self.editButtonItem;
56     
57     UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addButtonPressed:)];
58     self.navigationItem.rightBarButtonItem = addButton;
59     [addButton release];
60 */
61     AccountHomeViewController *vc = [[AccountHomeViewController alloc] initWithNibName:@"AccountHomeViewController" bundle:nil];
62     vc.account = accountSettingsViewController.account;
63     vc.account.hasBeenRefreshed = NO;
64     vc.rootViewController = self;
65     [self.navigationController pushViewController:vc animated:YES];
66     [vc release];
67 }
68
69 #pragma mark -
70 #pragma mark Split view support
71
72 /*
73  When setting the detail item, update the view and dismiss the popover controller if it's showing.
74  */
75 - (void)setDetailItem:(id)newDetailItem {
76     if (detailItem != newDetailItem) {
77         [detailItem release];
78         detailItem = [newDetailItem retain];
79     }
80     
81     if (self.popoverController != nil) {
82         [self.popoverController dismissPopoverAnimated:YES];
83     }
84 }
85
86 - (void)splitViewController:(UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController: (UIPopoverController*)pc {
87     OpenStackAppDelegate *app = [[UIApplication sharedApplication] delegate];
88     app.barButtonItem = barButtonItem;
89     UIViewController *vc = [[[app.splitViewController.viewControllers objectAtIndex:1] viewControllers] lastObject];
90     barButtonItem.title = [[[self.navigationController.viewControllers lastObject] navigationItem] title];
91     vc.navigationItem.leftBarButtonItem = barButtonItem;
92     self.popoverController = pc;
93 }
94
95 - (void)splitViewController: (UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem {    
96     OpenStackAppDelegate *app = [[UIApplication sharedApplication] delegate];
97     app.barButtonItem = barButtonItem;
98     UIViewController *vc = [[[app.splitViewController.viewControllers objectAtIndex:1] viewControllers] lastObject];
99     vc.navigationItem.leftBarButtonItem = nil;
100     self.popoverController = nil;
101 }
102
103 #pragma mark -
104 #pragma mark Button Handlers
105
106 - (void)addButtonPressed:(id)sender {
107     OpenStackAppDelegate *app = [[UIApplication sharedApplication] delegate];
108     ProvidersViewController *vc = [[ProvidersViewController alloc] initWithNibName:@"ProvidersViewController" bundle:nil];
109     vc.rootViewController = self;
110     if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
111         vc.modalPresentationStyle = UIModalPresentationFormSheet;
112         if (app.rootViewController.popoverController != nil) {
113             [app.rootViewController.popoverController dismissPopoverAnimated:YES];
114         }
115     }                
116     [self presentModalViewControllerWithNavigation:vc];
117     [vc release];    
118 }
119    
120 - (void)settingsButtonPressed:(id)sender {
121
122     //self.navigationController.navigationBarHidden = YES;
123     
124     //UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 460.0)];
125
126     SettingsViewController *settingsViewController = [[SettingsViewController alloc] initWithNibName:@"SettingsViewController" bundle:nil];
127     
128     UINavigationController *settingsNavigationController = [[UINavigationController alloc] initWithRootViewController:settingsViewController];
129     settingsNavigationController.view.frame = CGRectMake(0.0, 0.0, 320.0, 460.0);
130     
131     if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad) {
132         settingsNavigationController.navigationBar.tintColor = self.navigationController.navigationBar.tintColor;
133         settingsNavigationController.navigationBar.translucent = self.navigationController.navigationBar.translucent;
134         settingsNavigationController.navigationBar.opaque = self.navigationController.navigationBar.opaque;
135         settingsNavigationController.navigationBar.barStyle = self.navigationController.navigationBar.barStyle;
136     } else {
137         settingsNavigationController.navigationBar.barStyle = UIBarStyleBlack;
138         settingsNavigationController.navigationBar.opaque = NO;
139     }
140
141     if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
142         if (self.popoverController != nil) {
143             [self.popoverController dismissPopoverAnimated:YES];
144         }        
145         settingsNavigationController.modalPresentationStyle = UIModalPresentationFormSheet;
146         [self presentModalViewController:settingsNavigationController animated:YES];
147     } else {
148         settingsNavigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
149         [self presentModalViewController:settingsNavigationController animated:YES];
150     }
151     
152     [settingsViewController release];
153     [settingsNavigationController release];
154     
155     
156 }
157
158 #pragma mark -
159 #pragma mark View lifecycle
160
161 - (void)setEditing:(BOOL)editing animated:(BOOL)animated {
162     [self.tableView setEditing:editing animated:animated];
163     [super setEditing:editing animated:animated];
164 }
165
166 - (void)presentAndRelease:(NSTimer *)timer {
167     UIViewController *vc = [timer.userInfo objectForKey:@"vc"];
168     [self presentModalViewControllerWithNavigation:vc animated:NO];
169     [vc release];
170 }
171
172 - (void)viewDidLoad {
173     [super viewDidLoad];
174
175     self.navigationItem.title = @"Accounts";
176
177     self.navigationItem.leftBarButtonItem = self.editButtonItem;
178     
179     UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addButtonPressed:)];
180     self.navigationItem.rightBarButtonItem = addButton;
181     [addButton release];    
182 }
183
184 - (void)viewWillAppear:(BOOL)animated {
185     [super viewWillAppear:animated];
186     [self.tableView reloadData];
187     
188     if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
189         PithosImageViewController *vc = [[PithosImageViewController alloc] initWithNibName:@"PithosImageViewController" bundle:nil];
190         [self.navigationController presentPrimaryViewController:vc];
191         [vc release];
192     }
193     
194 }
195
196 - (void)viewDidAppear:(BOOL)animated {
197     [super viewDidAppear:animated];
198     
199     if (!viewHasAppearedBefore) {
200         if ([[OpenStackAccount accounts] count] == 0) {
201             // if there are no accounts, go straight to the add account screen on launch
202             ProvidersViewController *vc = [[ProvidersViewController alloc] initWithNibName:@"ProvidersViewController" bundle:nil];
203             vc.rootViewController = self;
204             if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
205                 vc.modalPresentationStyle = UIModalPresentationFormSheet;
206             }   
207             [self presentModalViewControllerWithNavigation:vc];        
208             [vc release];   
209         } else if (([[OpenStackAccount accounts] count] == 1) && (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad)) {
210             // if there's only one account, go to its home screen
211             // NOTE: not doing this on iPad because it screws up the split view controller.
212             // TODO: make this work well with split view on iPad
213             AccountHomeViewController *vc = [[AccountHomeViewController alloc] initWithNibName:@"AccountHomeViewController" bundle:nil];
214             vc.account = [[OpenStackAccount accounts] objectAtIndex:0];
215             vc.rootViewController = self;
216             vc.rootViewIndexPath = [NSIndexPath indexPathForRow:0 inSection:0];
217             [self.navigationController pushViewController:vc animated:NO];
218             [vc release];
219         }
220         viewHasAppearedBefore = YES;
221     }
222 }
223
224 /*
225 - (void)viewWillDisappear:(BOOL)animated {
226         [super viewWillDisappear:animated];
227 }
228 */
229 /*
230 - (void)viewDidDisappear:(BOOL)animated {
231         [super viewDidDisappear:animated];
232 }
233 */
234
235 #pragma mark -
236 #pragma mark Table view data source
237
238 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
239     return 1;
240 }
241
242 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
243     return [[OpenStackAccount accounts] count];
244 }
245
246 - (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
247     
248     static NSString *CellIdentifier = @"Cell";
249     
250     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
251     if (cell == nil) {
252         cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
253         cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
254     }
255     
256         // Configure the cell.
257     OpenStackAccount *account = [[OpenStackAccount accounts] objectAtIndex:indexPath.row];
258     cell.textLabel.text = account.username;
259     cell.detailTextLabel.text = account.provider.name;
260         
261     if (account.provider.logoURLs && [account.provider.logoURLs objectForKey:@"provider_icon"]) {
262         cell.imageView.image = [UIImage imageNamed:[account.provider.logoURLs objectForKey:@"provider_icon"]];
263     } else {
264         cell.imageView.image = [UIImage imageNamed:@"pithos-solo-smallest.png"];
265     }
266
267     return cell;
268 }
269
270 - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
271     return YES;
272 }
273
274 - (void)tableView:(UITableView *)aTableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
275     
276     if (editingStyle == UITableViewCellEditingStyleDelete) {
277         NSMutableArray *accounts = [NSMutableArray arrayWithArray:[OpenStackAccount accounts]];
278         [[accounts objectAtIndex:indexPath.row] setFlaggedForDelete:YES];
279         [accounts removeObjectAtIndex:indexPath.row];
280         [OpenStackAccount persist:accounts];
281
282         // Delete the row from the data source.
283         [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
284
285     } else if (editingStyle == UITableViewCellEditingStyleInsert) {
286         // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
287     }   
288 }
289
290 // Override to support rearranging the table view.
291 - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
292     NSMutableArray *accounts = [NSMutableArray arrayWithArray:[OpenStackAccount accounts]];
293     OpenStackAccount *account = [accounts objectAtIndex:fromIndexPath.row];
294     [accounts removeObjectAtIndex:fromIndexPath.row];
295     [accounts insertObject:account atIndex:toIndexPath.row];
296     [OpenStackAccount persist:accounts];
297 }
298
299 // Override to support conditional rearranging of the table view.
300 - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
301     // Return NO if you do not want the item to be re-orderable.
302     return YES;
303 }
304
305 #pragma mark -
306 #pragma mark Table view delegate
307
308 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
309     AccountHomeViewController *vc = [[AccountHomeViewController alloc] initWithNibName:@"AccountHomeViewController" bundle:nil];
310     vc.account = [[OpenStackAccount accounts] objectAtIndex:indexPath.row];
311     vc.account.hasBeenRefreshed = NO;
312     vc.rootViewController = self;
313     vc.rootViewIndexPath = indexPath;
314     [self.navigationController pushViewController:vc animated:YES];
315     [vc release];
316 }
317
318 #pragma mark -
319 #pragma mark Memory management
320
321 - (void)didReceiveMemoryWarning {
322     // Releases the view if it doesn't have a superview.
323     [super didReceiveMemoryWarning];
324     
325     // Relinquish ownership any cached data, images, etc that aren't in use.
326 }
327
328 - (void)viewDidUnload {
329     // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
330     // For example: self.myOutlet = nil;
331 }
332
333
334 - (void)dealloc {
335     [tableView release];
336     [popoverController release];
337     [detailItem release];     
338     [super dealloc];
339 }
340
341
342 @end
343