/* * Copyright 2015 The WebRTC Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #import "ARDMainView.h" #import "UIImage+ARDUtilities.h" static CGFloat const kRoomTextFieldHeight = 40; static CGFloat const kRoomTextFieldMargin = 8; static CGFloat const kCallControlMargin = 8; // Helper view that contains a text field and a clear button. @interface ARDRoomTextField : UIView @property(nonatomic, readonly) NSString *roomText; @end @implementation ARDRoomTextField { UITextField *_roomText; } - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { _roomText = [[UITextField alloc] initWithFrame:CGRectZero]; _roomText.borderStyle = UITextBorderStyleNone; _roomText.font = [UIFont systemFontOfSize:12]; _roomText.placeholder = @"Room name"; _roomText.autocorrectionType = UITextAutocorrectionTypeNo; _roomText.autocapitalizationType = UITextAutocapitalizationTypeNone; _roomText.clearButtonMode = UITextFieldViewModeAlways; _roomText.delegate = self; [self addSubview:_roomText]; // Give rounded corners and a light gray border. self.layer.borderWidth = 1; self.layer.borderColor = [[UIColor lightGrayColor] CGColor]; self.layer.cornerRadius = 2; } return self; } - (void)layoutSubviews { _roomText.frame = CGRectMake(kRoomTextFieldMargin, 0, CGRectGetWidth(self.bounds) - kRoomTextFieldMargin, kRoomTextFieldHeight); } - (CGSize)sizeThatFits:(CGSize)size { size.height = kRoomTextFieldHeight; return size; } - (NSString *)roomText { return _roomText.text; } #pragma mark - UITextFieldDelegate - (BOOL)textFieldShouldReturn:(UITextField *)textField { // There is no other control that can take focus, so manually resign focus // when return (Join) is pressed to trigger `textFieldDidEndEditing`. [textField resignFirstResponder]; return YES; } @end @implementation ARDMainView { ARDRoomTextField *_roomText; UIButton *_startRegularCallButton; UIButton *_startLoopbackCallButton; UIButton *_audioLoopButton; } @synthesize delegate = _delegate; @synthesize isAudioLoopPlaying = _isAudioLoopPlaying; - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { _roomText = [[ARDRoomTextField alloc] initWithFrame:CGRectZero]; [self addSubview:_roomText]; UIFont *controlFont = [UIFont boldSystemFontOfSize:18.0]; UIColor *controlFontColor = [UIColor whiteColor]; _startRegularCallButton = [UIButton buttonWithType:UIButtonTypeSystem]; _startRegularCallButton.titleLabel.font = controlFont; [_startRegularCallButton setTitleColor:controlFontColor forState:UIControlStateNormal]; _startRegularCallButton.backgroundColor = [UIColor colorWithRed:66.0/255.0 green:200.0/255.0 blue:90.0/255.0 alpha:1.0]; [_startRegularCallButton setTitle:@"Call room" forState:UIControlStateNormal]; [_startRegularCallButton addTarget:self action:@selector(onStartRegularCall:) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:_startRegularCallButton]; _startLoopbackCallButton = [UIButton buttonWithType:UIButtonTypeSystem]; _startLoopbackCallButton.titleLabel.font = controlFont; [_startLoopbackCallButton setTitleColor:controlFontColor forState:UIControlStateNormal]; _startLoopbackCallButton.backgroundColor = [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0]; [_startLoopbackCallButton setTitle:@"Loopback call" forState:UIControlStateNormal]; [_startLoopbackCallButton addTarget:self action:@selector(onStartLoopbackCall:) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:_startLoopbackCallButton]; // Used to test what happens to sounds when calls are in progress. _audioLoopButton = [UIButton buttonWithType:UIButtonTypeSystem]; _audioLoopButton.titleLabel.font = controlFont; [_audioLoopButton setTitleColor:controlFontColor forState:UIControlStateNormal]; _audioLoopButton.backgroundColor = [UIColor colorWithRed:1.0 green:149.0/255.0 blue:0.0 alpha:1.0]; [self updateAudioLoopButton]; [_audioLoopButton addTarget:self action:@selector(onToggleAudioLoop:) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:_audioLoopButton]; self.backgroundColor = [UIColor whiteColor]; } return self; } - (void)setIsAudioLoopPlaying:(BOOL)isAudioLoopPlaying { if (_isAudioLoopPlaying == isAudioLoopPlaying) { return; } _isAudioLoopPlaying = isAudioLoopPlaying; [self updateAudioLoopButton]; } - (void)layoutSubviews { CGRect bounds = self.bounds; CGFloat roomTextWidth = bounds.size.width - 2 * kRoomTextFieldMargin; CGFloat roomTextHeight = [_roomText sizeThatFits:bounds.size].height; _roomText.frame = CGRectMake(kRoomTextFieldMargin, kRoomTextFieldMargin, roomTextWidth, roomTextHeight); CGFloat buttonHeight = (CGRectGetMaxY(self.bounds) - CGRectGetMaxY(_roomText.frame) - kCallControlMargin * 4) / 3; CGFloat regularCallFrameTop = CGRectGetMaxY(_roomText.frame) + kCallControlMargin; CGRect regularCallFrame = CGRectMake(kCallControlMargin, regularCallFrameTop, bounds.size.width - 2*kCallControlMargin, buttonHeight); CGFloat loopbackCallFrameTop = CGRectGetMaxY(regularCallFrame) + kCallControlMargin; CGRect loopbackCallFrame = CGRectMake(kCallControlMargin, loopbackCallFrameTop, bounds.size.width - 2*kCallControlMargin, buttonHeight); CGFloat audioLoopTop = CGRectGetMaxY(loopbackCallFrame) + kCallControlMargin; CGRect audioLoopFrame = CGRectMake(kCallControlMargin, audioLoopTop, bounds.size.width - 2*kCallControlMargin, buttonHeight); _startRegularCallButton.frame = regularCallFrame; _startLoopbackCallButton.frame = loopbackCallFrame; _audioLoopButton.frame = audioLoopFrame; } #pragma mark - Private - (void)updateAudioLoopButton { if (_isAudioLoopPlaying) { [_audioLoopButton setTitle:@"Stop sound" forState:UIControlStateNormal]; } else { [_audioLoopButton setTitle:@"Play sound" forState:UIControlStateNormal]; } } - (void)onToggleAudioLoop:(id)sender { [_delegate mainViewDidToggleAudioLoop:self]; } - (void)onStartRegularCall:(id)sender { [_delegate mainView:self didInputRoom:_roomText.roomText isLoopback:NO]; } - (void)onStartLoopbackCall:(id)sender { [_delegate mainView:self didInputRoom:_roomText.roomText isLoopback:YES]; } @end