| Index: remoting/ios/ui/host_list_view_controller.mm
|
| diff --git a/remoting/ios/ui/host_list_view_controller.mm b/remoting/ios/ui/host_list_view_controller.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7dd7fa2b3c94958fa47b2f42c02c0c10e5d5bcdf
|
| --- /dev/null
|
| +++ b/remoting/ios/ui/host_list_view_controller.mm
|
| @@ -0,0 +1,229 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#if !defined(__has_feature) || !__has_feature(objc_arc)
|
| +#error "This file requires ARC support."
|
| +#endif
|
| +
|
| +#import "remoting/ios/ui/host_list_view_controller.h"
|
| +
|
| +#import "remoting/ios/authorize.h"
|
| +#import "remoting/ios/host.h"
|
| +#import "remoting/ios/host_cell.h"
|
| +#import "remoting/ios/host_refresh.h"
|
| +#import "remoting/ios/utility.h"
|
| +#import "remoting/ios/ui/host_view_controller.h"
|
| +
|
| +@interface HostListViewController (Private)
|
| +- (void)refreshHostList;
|
| +- (void)checkUserAndRefreshHostList;
|
| +- (BOOL)isSignedIn;
|
| +- (void)signInUser;
|
| +// Callback from [Authorize createLoginController...]
|
| +- (void)viewController:(UIViewController*)viewController
|
| + finishedWithAuth:(GTMOAuth2Authentication*)authResult
|
| + error:(NSError*)error;
|
| +@end
|
| +
|
| +@implementation HostListViewController
|
| +
|
| +@synthesize userEmail = _userEmail;
|
| +@synthesize authorization = _authorization;
|
| +
|
| +// Override default setter
|
| +- (void)setAuthorization:(GTMOAuth2Authentication*)authorization {
|
| + _authorization = authorization;
|
| + if (_authorization.canAuthorize) {
|
| + _userEmail = _authorization.userEmail;
|
| + } else {
|
| + _userEmail = nil;
|
| + }
|
| +
|
| + NSString* userName = _userEmail;
|
| +
|
| + if (userName == nil) {
|
| + userName = @"Not logged in";
|
| + }
|
| +
|
| + [_btnAccount setTitle:userName forState:UIControlStateNormal];
|
| +
|
| + [self refreshHostList];
|
| +}
|
| +
|
| +// Override UIViewController
|
| +// Create google+ service for google authentication and oAuth2 authorization.
|
| +- (void)viewDidLoad {
|
| + [super viewDidLoad];
|
| +
|
| + [_tableHostList setDataSource:self];
|
| + [_tableHostList setDelegate:self];
|
| +
|
| + _versionInfo.title = [Utility appVersionNumberDisplayString];
|
| +}
|
| +
|
| +// Override UIViewController
|
| +- (void)viewWillAppear:(BOOL)animated {
|
| + [super viewWillAppear:animated];
|
| + [self.navigationController setNavigationBarHidden:NO animated:NO];
|
| + [self setAuthorization:[Authorize getAnyExistingAuthorization]];
|
| +}
|
| +
|
| +// Override UIViewController
|
| +// Cancel segue when host status is not online
|
| +- (BOOL)shouldPerformSegueWithIdentifier:(NSString*)identifier
|
| + sender:(id)sender {
|
| + if ([identifier isEqualToString:@"ConnectToHost"]) {
|
| + Host* host = [self hostAtIndex:[_tableHostList indexPathForCell:sender]];
|
| + if (![host.status isEqualToString:@"ONLINE"]) {
|
| + return NO;
|
| + }
|
| + }
|
| + return YES;
|
| +}
|
| +
|
| +// Override UIViewController
|
| +// check for segues defined in the storyboard by identifier, and set a few
|
| +// properties before transitioning
|
| +- (void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender {
|
| + if ([segue.identifier isEqualToString:@"ConnectToHost"]) {
|
| + // the designationViewController type is defined by the storyboard
|
| + HostViewController* hostView =
|
| + static_cast<HostViewController*>(segue.destinationViewController);
|
| +
|
| + NSString* authToken =
|
| + [_authorization.parameters valueForKey:@"access_token"];
|
| +
|
| + if (authToken == nil) {
|
| + authToken = _authorization.authorizationTokenKey;
|
| + }
|
| +
|
| + [hostView setHostDetails:[self hostAtIndex:[_tableHostList
|
| + indexPathForCell:sender]]
|
| + userEmail:_userEmail
|
| + authorizationToken:authToken];
|
| + }
|
| +}
|
| +
|
| +// @protocol HostRefreshDelegate, remember received host list for the table
|
| +// view to refresh from
|
| +- (void)hostListRefresh:(NSArray*)hostList
|
| + errorMessage:(NSString*)errorMessage {
|
| + if (hostList != nil) {
|
| + _hostList = hostList;
|
| + [_tableHostList reloadData];
|
| + }
|
| + [_refreshActivityIndicator stopAnimating];
|
| + if (errorMessage != nil) {
|
| + [Utility showAlert:@"Host Refresh Failed" message:errorMessage];
|
| + }
|
| +}
|
| +
|
| +// @protocol UITableViewDataSource
|
| +// Only have 1 section and it contains all the hosts
|
| +- (NSInteger)tableView:(UITableView*)tableView
|
| + numberOfRowsInSection:(NSInteger)section {
|
| + return [_hostList count];
|
| +}
|
| +
|
| +// @protocol UITableViewDataSource
|
| +// Convert a host entry to a table row
|
| +- (HostCell*)tableView:(UITableView*)tableView
|
| + cellForRowAtIndexPath:(NSIndexPath*)indexPath {
|
| + static NSString* CellIdentifier = @"HostStatusCell";
|
| +
|
| + HostCell* cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier
|
| + forIndexPath:indexPath];
|
| +
|
| + Host* host = [self hostAtIndex:indexPath];
|
| + cell.labelHostName.text = host.hostName;
|
| + cell.labelStatus.text = host.status;
|
| +
|
| + UIColor* statColor = nil;
|
| + if ([host.status isEqualToString:@"ONLINE"]) {
|
| + statColor = [[UIColor alloc] initWithRed:0 green:1 blue:0 alpha:1];
|
| + } else {
|
| + statColor = [[UIColor alloc] initWithRed:1 green:0 blue:0 alpha:1];
|
| + }
|
| + [cell.labelStatus setTextColor:statColor];
|
| +
|
| + return cell;
|
| +}
|
| +
|
| +// @protocol UITableViewDataSource
|
| +// Rows are not editable via standard UI mechanisms
|
| +- (BOOL)tableView:(UITableView*)tableView
|
| + canEditRowAtIndexPath:(NSIndexPath*)indexPath {
|
| + return NO;
|
| +}
|
| +
|
| +- (IBAction)btnRefreshHostListPressed:(id)sender {
|
| + [self refreshHostList];
|
| +}
|
| +
|
| +- (IBAction)btnAccountPressed:(id)sender {
|
| + [self signInUser];
|
| +}
|
| +
|
| +- (void)refreshHostList {
|
| + [_refreshActivityIndicator startAnimating];
|
| + _hostList = [[NSArray alloc] init];
|
| + [_tableHostList reloadData];
|
| +
|
| + // Insert a small delay so the user is well informed that something is
|
| + // happening by the animating activity indicator
|
| + [self performSelector:@selector(checkUserAndRefreshHostList)
|
| + withObject:nil
|
| + afterDelay:.5];
|
| +}
|
| +
|
| +// Most likely you want to call refreshHostList
|
| +- (void)checkUserAndRefreshHostList {
|
| + if (![self isSignedIn]) {
|
| + [self signInUser];
|
| + } else {
|
| + HostRefresh* hostRefresh = [[HostRefresh alloc] init];
|
| + [hostRefresh refreshHostList:_authorization delegate:self];
|
| + }
|
| +}
|
| +
|
| +- (BOOL)isSignedIn {
|
| + return (_userEmail != nil);
|
| +}
|
| +
|
| +// Launch the google.com authentication and authorization process. If a user is
|
| +// already signed in, begin by signing out so another account could be
|
| +// signed in.
|
| +- (void)signInUser {
|
| + [self presentViewController:
|
| + [Authorize createLoginController:self
|
| + finishedSelector:@selector(viewController:
|
| + finishedWithAuth:
|
| + error:)]
|
| + animated:YES
|
| + completion:nil];
|
| +}
|
| +
|
| +// Callback from [Authorize createLoginController...]
|
| +// Handle completion of the authentication process, and updates the service
|
| +// with the new credentials.
|
| +- (void)viewController:(UIViewController*)viewController
|
| + finishedWithAuth:(GTMOAuth2Authentication*)authResult
|
| + error:(NSError*)error {
|
| + [viewController.presentingViewController dismissViewControllerAnimated:NO
|
| + completion:nil];
|
| +
|
| + if (error != nil) {
|
| + [Utility showAlert:@"Authentication Error"
|
| + message:error.localizedDescription];
|
| + [self setAuthorization:nil];
|
| + } else {
|
| + [self setAuthorization:authResult];
|
| + }
|
| +}
|
| +
|
| +- (Host*)hostAtIndex:(NSIndexPath*)indexPath {
|
| + return [_hostList objectAtIndex:indexPath.row];
|
| +}
|
| +
|
| +@end
|
|
|