197 lines
7.1 KiB
Objective-C
197 lines
7.1 KiB
Objective-C
/*
|
|
* 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 <UITextFieldDelegate>
|
|
@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
|