blob: fcce3c30159103350e66beace4c8c512fd8ee91b [file] [log] [blame]
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +00001/*
Donald E Curtisa8736442015-08-05 15:48:13 -07002 * Copyright 2015 The WebRTC Project Authors. All rights reserved.
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +00003 *
Donald E Curtisa8736442015-08-05 15:48:13 -07004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +00009 */
10
11#import "ARDMainView.h"
12
13#import "UIImage+ARDUtilities.h"
14
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +000015static CGFloat const kRoomTextFieldHeight = 40;
16static CGFloat const kRoomTextFieldMargin = 8;
haysc913e6452015-10-02 11:44:03 -070017static CGFloat const kCallControlMargin = 8;
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +000018
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +000019// Helper view that contains a text field and a clear button.
20@interface ARDRoomTextField : UIView <UITextFieldDelegate>
haysc913e6452015-10-02 11:44:03 -070021@property(nonatomic, readonly) NSString *roomText;
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +000022@end
23
24@implementation ARDRoomTextField {
25 UITextField *_roomText;
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +000026}
27
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +000028- (instancetype)initWithFrame:(CGRect)frame {
29 if (self = [super initWithFrame:frame]) {
30 _roomText = [[UITextField alloc] initWithFrame:CGRectZero];
31 _roomText.borderStyle = UITextBorderStyleNone;
32 _roomText.font = [UIFont fontWithName:@"Roboto" size:12];
33 _roomText.placeholder = @"Room name";
hayscedd8fef2015-12-08 11:08:39 -080034 _roomText.autocorrectionType = UITextAutocorrectionTypeNo;
35 _roomText.autocapitalizationType = UITextAutocapitalizationTypeNone;
denicijaae708762016-11-02 03:02:29 -070036 _roomText.clearButtonMode = UITextFieldViewModeAlways;
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +000037 _roomText.delegate = self;
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +000038 [self addSubview:_roomText];
39
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +000040 // Give rounded corners and a light gray border.
41 self.layer.borderWidth = 1;
42 self.layer.borderColor = [[UIColor lightGrayColor] CGColor];
43 self.layer.cornerRadius = 2;
44 }
45 return self;
46}
47
48- (void)layoutSubviews {
denicijaae708762016-11-02 03:02:29 -070049 _roomText.frame =
50 CGRectMake(kRoomTextFieldMargin, 0, CGRectGetWidth(self.bounds) - kRoomTextFieldMargin,
51 kRoomTextFieldHeight);
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +000052}
53
54- (CGSize)sizeThatFits:(CGSize)size {
55 size.height = kRoomTextFieldHeight;
56 return size;
57}
58
haysc913e6452015-10-02 11:44:03 -070059- (NSString *)roomText {
60 return _roomText.text;
61}
62
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +000063#pragma mark - UITextFieldDelegate
64
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +000065- (BOOL)textFieldShouldReturn:(UITextField *)textField {
66 // There is no other control that can take focus, so manually resign focus
67 // when return (Join) is pressed to trigger |textFieldDidEndEditing|.
68 [textField resignFirstResponder];
69 return YES;
70}
71
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +000072@end
73
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +000074@implementation ARDMainView {
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +000075 ARDRoomTextField *_roomText;
haysc913e6452015-10-02 11:44:03 -070076 UILabel *_callOptionsLabel;
haysc913e6452015-10-02 11:44:03 -070077 UISwitch *_loopbackSwitch;
78 UILabel *_loopbackLabel;
79 UIButton *_startCallButton;
Zeke Chin615fabb2016-02-24 10:58:52 -080080 UIButton *_audioLoopButton;
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +000081}
82
83@synthesize delegate = _delegate;
Tze Kwang Chin307a0922016-03-21 13:57:40 -070084@synthesize isAudioLoopPlaying = _isAudioLoopPlaying;
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +000085
86- (instancetype)initWithFrame:(CGRect)frame {
87 if (self = [super initWithFrame:frame]) {
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +000088 _roomText = [[ARDRoomTextField alloc] initWithFrame:CGRectZero];
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +000089 [self addSubview:_roomText];
90
haysc913e6452015-10-02 11:44:03 -070091 UIFont *controlFont = [UIFont fontWithName:@"Roboto" size:20];
92 UIColor *controlFontColor = [UIColor colorWithWhite:0 alpha:.6];
93
94 _callOptionsLabel = [[UILabel alloc] initWithFrame:CGRectZero];
95 _callOptionsLabel.text = @"Call Options";
96 _callOptionsLabel.font = controlFont;
97 _callOptionsLabel.textColor = controlFontColor;
98 [_callOptionsLabel sizeToFit];
99 [self addSubview:_callOptionsLabel];
100
haysc913e6452015-10-02 11:44:03 -0700101 _loopbackSwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
102 [_loopbackSwitch sizeToFit];
103 [self addSubview:_loopbackSwitch];
104
105 _loopbackLabel = [[UILabel alloc] initWithFrame:CGRectZero];
106 _loopbackLabel.text = @"Loopback mode";
107 _loopbackLabel.font = controlFont;
108 _loopbackLabel.textColor = controlFontColor;
109 [_loopbackLabel sizeToFit];
110 [self addSubview:_loopbackLabel];
111
haysc913e6452015-10-02 11:44:03 -0700112 _startCallButton = [UIButton buttonWithType:UIButtonTypeSystem];
haysc913e6452015-10-02 11:44:03 -0700113 [_startCallButton setTitle:@"Start call"
114 forState:UIControlStateNormal];
115 _startCallButton.titleLabel.font = controlFont;
haysc913e6452015-10-02 11:44:03 -0700116 [_startCallButton sizeToFit];
117 [_startCallButton addTarget:self
118 action:@selector(onStartCall:)
119 forControlEvents:UIControlEventTouchUpInside];
120 [self addSubview:_startCallButton];
121
Zeke Chin615fabb2016-02-24 10:58:52 -0800122 // Used to test what happens to sounds when calls are in progress.
123 _audioLoopButton = [UIButton buttonWithType:UIButtonTypeSystem];
Zeke Chin615fabb2016-02-24 10:58:52 -0800124 _audioLoopButton.titleLabel.font = controlFont;
Zeke Chin615fabb2016-02-24 10:58:52 -0800125 [self updateAudioLoopButton];
126 [_audioLoopButton addTarget:self
127 action:@selector(onToggleAudioLoop:)
128 forControlEvents:UIControlEventTouchUpInside];
129 [self addSubview:_audioLoopButton];
130
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +0000131 self.backgroundColor = [UIColor whiteColor];
132 }
133 return self;
134}
135
Tze Kwang Chin307a0922016-03-21 13:57:40 -0700136- (void)setIsAudioLoopPlaying:(BOOL)isAudioLoopPlaying {
137 if (_isAudioLoopPlaying == isAudioLoopPlaying) {
138 return;
139 }
140 _isAudioLoopPlaying = isAudioLoopPlaying;
141 [self updateAudioLoopButton];
142}
143
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +0000144- (void)layoutSubviews {
145 CGRect bounds = self.bounds;
146 CGFloat roomTextWidth = bounds.size.width - 2 * kRoomTextFieldMargin;
147 CGFloat roomTextHeight = [_roomText sizeThatFits:bounds.size].height;
denicija6d6762c2016-10-28 04:53:16 -0700148 _roomText.frame =
149 CGRectMake(kRoomTextFieldMargin, kRoomTextFieldMargin, roomTextWidth, roomTextHeight);
haysc913e6452015-10-02 11:44:03 -0700150
151 CGFloat callOptionsLabelTop =
152 CGRectGetMaxY(_roomText.frame) + kCallControlMargin * 4;
153 _callOptionsLabel.frame = CGRectMake(kCallControlMargin,
154 callOptionsLabelTop,
155 _callOptionsLabel.frame.size.width,
156 _callOptionsLabel.frame.size.height);
157
Anders Carlssone1500582017-06-15 16:05:13 +0200158 CGFloat loopbackModeTop = CGRectGetMaxY(_callOptionsLabel.frame) + kCallControlMargin * 2;
haysc913e6452015-10-02 11:44:03 -0700159 CGRect loopbackModeRect = CGRectMake(kCallControlMargin * 3,
160 loopbackModeTop,
161 _loopbackSwitch.frame.size.width,
162 _loopbackSwitch.frame.size.height);
163 _loopbackSwitch.frame = loopbackModeRect;
164 CGFloat loopbackModeLabelCenterX = CGRectGetMaxX(loopbackModeRect) +
165 kCallControlMargin + _loopbackLabel.frame.size.width / 2;
166 _loopbackLabel.center = CGPointMake(loopbackModeLabelCenterX,
167 CGRectGetMidY(loopbackModeRect));
168
Anders Carlssone1500582017-06-15 16:05:13 +0200169 CGFloat audioLoopTop = CGRectGetMaxY(loopbackModeRect) + kCallControlMargin * 3;
Zeke Chin615fabb2016-02-24 10:58:52 -0800170 _audioLoopButton.frame = CGRectMake(kCallControlMargin,
171 audioLoopTop,
172 _audioLoopButton.frame.size.width,
173 _audioLoopButton.frame.size.height);
174
175 CGFloat startCallTop =
176 CGRectGetMaxY(_audioLoopButton.frame) + kCallControlMargin * 3;
haysc913e6452015-10-02 11:44:03 -0700177 _startCallButton.frame = CGRectMake(kCallControlMargin,
178 startCallTop,
179 _startCallButton.frame.size.width,
180 _startCallButton.frame.size.height);
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +0000181}
182
haysc913e6452015-10-02 11:44:03 -0700183#pragma mark - Private
184
Zeke Chin615fabb2016-02-24 10:58:52 -0800185- (void)updateAudioLoopButton {
Tze Kwang Chin307a0922016-03-21 13:57:40 -0700186 if (_isAudioLoopPlaying) {
Zeke Chin615fabb2016-02-24 10:58:52 -0800187 [_audioLoopButton setTitle:@"Stop sound"
188 forState:UIControlStateNormal];
189 [_audioLoopButton sizeToFit];
190 } else {
Zeke Chin615fabb2016-02-24 10:58:52 -0800191 [_audioLoopButton setTitle:@"Play sound"
192 forState:UIControlStateNormal];
193 [_audioLoopButton sizeToFit];
194 }
195}
196
197- (void)onToggleAudioLoop:(id)sender {
Tze Kwang Chin307a0922016-03-21 13:57:40 -0700198 [_delegate mainViewDidToggleAudioLoop:self];
Zeke Chin615fabb2016-02-24 10:58:52 -0800199}
200
haysc913e6452015-10-02 11:44:03 -0700201- (void)onStartCall:(id)sender {
Anders Carlssone1500582017-06-15 16:05:13 +0200202 [_delegate mainView:self didInputRoom:_roomText.roomText isLoopback:_loopbackSwitch.isOn];
tkchin@webrtc.orgef2a5dd2015-01-15 22:38:21 +0000203}
204
205@end