// // SignalsNavigationController.m // Signal // // Created by Dylan Bourgeois on 18/11/14. // Copyright (c) 2014 Open Whisper Systems. All rights reserved. // #import "SignalsNavigationController.h" #import "UIUtil.h" @interface SignalsNavigationController () @end static double const STALLED_PROGRESS = 0.9; @implementation SignalsNavigationController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self initializeObserver]; [TSSocketManager sendNotification]; } - (void)initializeSocketStatusBar { if (!_socketStatusView) { _socketStatusView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault]; } CGRect bar = self.navigationBar.frame; _socketStatusView.frame = CGRectMake(0, bar.size.height - 1.0f, self.view.frame.size.width, 1.0f); _socketStatusView.progress = 0.0f; _socketStatusView.progressTintColor = [UIColor ows_fadedBlueColor]; if (![_socketStatusView superview]) { [self.navigationBar addSubview:_socketStatusView]; } } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } #pragma mark - Socket Status Notifications - (void)initializeObserver { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(socketDidOpen) name:SocketOpenedNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(socketDidClose) name:SocketClosedNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(socketIsConnecting) name:SocketConnectingNotification object:nil]; } - (void)socketDidOpen { dispatch_async(dispatch_get_main_queue(), ^{ [_updateStatusTimer invalidate]; for (UIView *view in self.navigationBar.subviews) { if ([view isKindOfClass:[UIProgressView class]]) { [view removeFromSuperview]; _socketStatusView = nil; } } }); } - (void)socketDidClose { dispatch_async(dispatch_get_main_queue(), ^{ if (_socketStatusView == nil) { [self initializeSocketStatusBar]; _updateStatusTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateSocketConnecting) userInfo:nil repeats:YES]; } else if (_socketStatusView.progress >= STALLED_PROGRESS) { [_updateStatusTimer invalidate]; } }); } - (void)updateSocketConnecting { dispatch_async(dispatch_get_main_queue(), ^{ double progress = _socketStatusView.progress + 0.05; _socketStatusView.progress = (float)MIN(progress, STALLED_PROGRESS); }); } - (void)socketIsConnecting { // Nothing to see here currently } @end