/* * Copyright (C) 2016 The Android Open Source Project * * 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 "MenuController.h" #import "UIAlertView+Extensions.h" #import "WALTLogger.h" #import "WALTAppDelegate.h" #import "WALTClient.h" @implementation MenuController { WALTClient *_client; UIActivityIndicatorView *_spinner; } - (void)viewDidLoad { [super viewDidLoad]; _spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; _client = ((WALTAppDelegate *)[UIApplication sharedApplication].delegate).client; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [_client addObserver:self forKeyPath:@"connected" options:NSKeyValueObservingOptionInitial context:NULL]; } - (void)dealloc { [_client removeObserver:self forKeyPath:@"connected"]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (_client.isConnected) { [_spinner stopAnimating]; self.syncCell.accessoryView = nil; // Display a checkmark. [[WALTLogger sessionLogger] appendString:@"WALT\tCONNECTED\n"]; [[WALTLogger sessionLogger] appendFormat:@"SYNC\t%lld\t%lld\n", _client.minError, _client.maxError]; } else { self.syncCell.accessoryView = _spinner; [_spinner startAnimating]; [[WALTLogger sessionLogger] appendString:@"WALT\tDISCONNECTED\n"]; // Return to this view controller. UINavigationController *navigationController = self.navigationController; if (navigationController.visibleViewController != self) { [navigationController popToRootViewControllerAnimated:YES]; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"WALT Connection Error" message:@"WALT disconnected." delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil]; [alert show]; } } [self.tableView reloadData]; // Update accessory types. } - (void)shareLog:(id)sender { NSFileManager *fileManager = [NSFileManager defaultManager]; NSArray *urls = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]; if (urls.count > 0) { NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"yyyy-MM-dd'T'HH-mm-ss"; // Save the log to a file (which also allows it to be retrieved in iTunes/Xcode). NSString *logName = [NSString stringWithFormat:@"walt_%@.log", [formatter stringFromDate:[NSDate date]]]; NSURL *logURL = [urls.firstObject URLByAppendingPathComponent:logName]; WALTLogger *logger = [WALTLogger sessionLogger]; NSError *error = nil; if ([logger writeToURL:logURL error:&error]) { // Open a share sheet for the URL. UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:@[logURL] applicationActivities:nil]; [self presentViewController:activityController animated:YES completion:NULL]; } else { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Log Write Error" error:error]; [alert show]; } } else { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Log Write Error" message:@"Could not locate document directory." delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil]; [alert show]; } } #pragma mark - UITableView Delegate - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.section == 1) { // Show/hide the disclosure indicator on the "Measure Latency" cells. cell.accessoryType = (_client.isConnected ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone); } } - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.section == 0 && indexPath.row == 0) { // "Clock Sync" NSError *error = nil; if (![_client checkConnectionWithError:&error] || ![_client syncClocksWithError:&error]) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"WALT Connection Error" error:error]; [alert show]; } [[WALTLogger sessionLogger] appendFormat:@"SYNC\t%lld\t%lld\n", _client.minError, _client.maxError]; return nil; } else if (indexPath.section == 1 && !_client.isConnected) { // "Measure Latency" return nil; } return indexPath; } @end