blob: 98b84e988ef0f5f02e86472b12f72830f8a3f547 [file] [log] [blame]
/*
* 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