| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #import "ARDMainView.h" | 11 #import "ARDMainView.h" |
| 12 | 12 |
| 13 #import "UIImage+ARDUtilities.h" | 13 #import "UIImage+ARDUtilities.h" |
| 14 | 14 |
| 15 // TODO(tkchin): retrieve status bar height dynamically. | |
| 16 static CGFloat const kStatusBarHeight = 20; | |
| 17 | |
| 18 static CGFloat const kRoomTextButtonSize = 40; | |
| 19 static CGFloat const kRoomTextFieldHeight = 40; | 15 static CGFloat const kRoomTextFieldHeight = 40; |
| 20 static CGFloat const kRoomTextFieldMargin = 8; | 16 static CGFloat const kRoomTextFieldMargin = 8; |
| 21 static CGFloat const kCallControlMargin = 8; | 17 static CGFloat const kCallControlMargin = 8; |
| 22 | 18 |
| 23 // Helper view that contains a text field and a clear button. | 19 // Helper view that contains a text field and a clear button. |
| 24 @interface ARDRoomTextField : UIView <UITextFieldDelegate> | 20 @interface ARDRoomTextField : UIView <UITextFieldDelegate> |
| 25 @property(nonatomic, readonly) NSString *roomText; | 21 @property(nonatomic, readonly) NSString *roomText; |
| 26 @end | 22 @end |
| 27 | 23 |
| 28 @implementation ARDRoomTextField { | 24 @implementation ARDRoomTextField { |
| 29 UITextField *_roomText; | 25 UITextField *_roomText; |
| 30 UIButton *_clearButton; | |
| 31 } | 26 } |
| 32 | 27 |
| 33 - (instancetype)initWithFrame:(CGRect)frame { | 28 - (instancetype)initWithFrame:(CGRect)frame { |
| 34 if (self = [super initWithFrame:frame]) { | 29 if (self = [super initWithFrame:frame]) { |
| 35 _roomText = [[UITextField alloc] initWithFrame:CGRectZero]; | 30 _roomText = [[UITextField alloc] initWithFrame:CGRectZero]; |
| 36 _roomText.borderStyle = UITextBorderStyleNone; | 31 _roomText.borderStyle = UITextBorderStyleNone; |
| 37 _roomText.font = [UIFont fontWithName:@"Roboto" size:12]; | 32 _roomText.font = [UIFont fontWithName:@"Roboto" size:12]; |
| 38 _roomText.placeholder = @"Room name"; | 33 _roomText.placeholder = @"Room name"; |
| 39 _roomText.autocorrectionType = UITextAutocorrectionTypeNo; | 34 _roomText.autocorrectionType = UITextAutocorrectionTypeNo; |
| 40 _roomText.autocapitalizationType = UITextAutocapitalizationTypeNone; | 35 _roomText.autocapitalizationType = UITextAutocapitalizationTypeNone; |
| 36 _roomText.clearButtonMode = UITextFieldViewModeAlways; |
| 41 _roomText.delegate = self; | 37 _roomText.delegate = self; |
| 42 [_roomText addTarget:self | |
| 43 action:@selector(textFieldDidChange:) | |
| 44 forControlEvents:UIControlEventEditingChanged]; | |
| 45 [self addSubview:_roomText]; | 38 [self addSubview:_roomText]; |
| 46 | 39 |
| 47 _clearButton = [UIButton buttonWithType:UIButtonTypeCustom]; | |
| 48 UIImage *image = [UIImage imageForName:@"ic_clear_black_24dp.png" | |
| 49 color:[UIColor colorWithWhite:0 alpha:.4]]; | |
| 50 | |
| 51 [_clearButton setImage:image forState:UIControlStateNormal]; | |
| 52 [_clearButton addTarget:self | |
| 53 action:@selector(onClear:) | |
| 54 forControlEvents:UIControlEventTouchUpInside]; | |
| 55 _clearButton.hidden = YES; | |
| 56 [self addSubview:_clearButton]; | |
| 57 | |
| 58 // Give rounded corners and a light gray border. | 40 // Give rounded corners and a light gray border. |
| 59 self.layer.borderWidth = 1; | 41 self.layer.borderWidth = 1; |
| 60 self.layer.borderColor = [[UIColor lightGrayColor] CGColor]; | 42 self.layer.borderColor = [[UIColor lightGrayColor] CGColor]; |
| 61 self.layer.cornerRadius = 2; | 43 self.layer.cornerRadius = 2; |
| 62 } | 44 } |
| 63 return self; | 45 return self; |
| 64 } | 46 } |
| 65 | 47 |
| 66 - (void)layoutSubviews { | 48 - (void)layoutSubviews { |
| 67 CGRect bounds = self.bounds; | 49 _roomText.frame = |
| 68 _clearButton.frame = CGRectMake(CGRectGetMaxX(bounds) - kRoomTextButtonSize, | 50 CGRectMake(kRoomTextFieldMargin, 0, CGRectGetWidth(self.bounds) - kRoomTex
tFieldMargin, |
| 69 CGRectGetMinY(bounds), | 51 kRoomTextFieldHeight); |
| 70 kRoomTextButtonSize, | |
| 71 kRoomTextButtonSize); | |
| 72 _roomText.frame = CGRectMake( | |
| 73 CGRectGetMinX(bounds) + kRoomTextFieldMargin, | |
| 74 CGRectGetMinY(bounds), | |
| 75 CGRectGetMinX(_clearButton.frame) - CGRectGetMinX(bounds) - | |
| 76 kRoomTextFieldMargin, | |
| 77 kRoomTextFieldHeight); | |
| 78 } | 52 } |
| 79 | 53 |
| 80 - (CGSize)sizeThatFits:(CGSize)size { | 54 - (CGSize)sizeThatFits:(CGSize)size { |
| 81 size.height = kRoomTextFieldHeight; | 55 size.height = kRoomTextFieldHeight; |
| 82 return size; | 56 return size; |
| 83 } | 57 } |
| 84 | 58 |
| 85 - (NSString *)roomText { | 59 - (NSString *)roomText { |
| 86 return _roomText.text; | 60 return _roomText.text; |
| 87 } | 61 } |
| 88 | 62 |
| 89 #pragma mark - UITextFieldDelegate | 63 #pragma mark - UITextFieldDelegate |
| 90 | 64 |
| 91 - (BOOL)textFieldShouldReturn:(UITextField *)textField { | 65 - (BOOL)textFieldShouldReturn:(UITextField *)textField { |
| 92 // There is no other control that can take focus, so manually resign focus | 66 // There is no other control that can take focus, so manually resign focus |
| 93 // when return (Join) is pressed to trigger |textFieldDidEndEditing|. | 67 // when return (Join) is pressed to trigger |textFieldDidEndEditing|. |
| 94 [textField resignFirstResponder]; | 68 [textField resignFirstResponder]; |
| 95 return YES; | 69 return YES; |
| 96 } | 70 } |
| 97 | 71 |
| 98 #pragma mark - Private | |
| 99 | |
| 100 - (void)textFieldDidChange:(id)sender { | |
| 101 [self updateClearButton]; | |
| 102 } | |
| 103 | |
| 104 - (void)onClear:(id)sender { | |
| 105 _roomText.text = @""; | |
| 106 [self updateClearButton]; | |
| 107 [_roomText resignFirstResponder]; | |
| 108 } | |
| 109 | |
| 110 - (void)updateClearButton { | |
| 111 _clearButton.hidden = _roomText.text.length == 0; | |
| 112 } | |
| 113 | |
| 114 @end | 72 @end |
| 115 | 73 |
| 116 @implementation ARDMainView { | 74 @implementation ARDMainView { |
| 117 ARDRoomTextField *_roomText; | 75 ARDRoomTextField *_roomText; |
| 118 UILabel *_callOptionsLabel; | 76 UILabel *_callOptionsLabel; |
| 119 UISwitch *_audioOnlySwitch; | 77 UISwitch *_audioOnlySwitch; |
| 120 UILabel *_audioOnlyLabel; | 78 UILabel *_audioOnlyLabel; |
| 121 UISwitch *_aecdumpSwitch; | 79 UISwitch *_aecdumpSwitch; |
| 122 UILabel *_aecdumpLabel; | 80 UILabel *_aecdumpLabel; |
| 123 UISwitch *_levelControlSwitch; | 81 UISwitch *_levelControlSwitch; |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 [self addSubview:_useManualAudioSwitch]; | 156 [self addSubview:_useManualAudioSwitch]; |
| 199 | 157 |
| 200 _useManualAudioLabel = [[UILabel alloc] initWithFrame:CGRectZero]; | 158 _useManualAudioLabel = [[UILabel alloc] initWithFrame:CGRectZero]; |
| 201 _useManualAudioLabel.text = @"Use manual audio config"; | 159 _useManualAudioLabel.text = @"Use manual audio config"; |
| 202 _useManualAudioLabel.font = controlFont; | 160 _useManualAudioLabel.font = controlFont; |
| 203 _useManualAudioLabel.textColor = controlFontColor; | 161 _useManualAudioLabel.textColor = controlFontColor; |
| 204 [_useManualAudioLabel sizeToFit]; | 162 [_useManualAudioLabel sizeToFit]; |
| 205 [self addSubview:_useManualAudioLabel]; | 163 [self addSubview:_useManualAudioLabel]; |
| 206 | 164 |
| 207 _startCallButton = [UIButton buttonWithType:UIButtonTypeSystem]; | 165 _startCallButton = [UIButton buttonWithType:UIButtonTypeSystem]; |
| 208 _startCallButton.backgroundColor = [UIColor blueColor]; | |
| 209 _startCallButton.layer.cornerRadius = 10; | |
| 210 _startCallButton.clipsToBounds = YES; | |
| 211 _startCallButton.contentEdgeInsets = UIEdgeInsetsMake(5, 10, 5, 10); | |
| 212 [_startCallButton setTitle:@"Start call" | 166 [_startCallButton setTitle:@"Start call" |
| 213 forState:UIControlStateNormal]; | 167 forState:UIControlStateNormal]; |
| 214 _startCallButton.titleLabel.font = controlFont; | 168 _startCallButton.titleLabel.font = controlFont; |
| 215 [_startCallButton setTitleColor:[UIColor whiteColor] | |
| 216 forState:UIControlStateNormal]; | |
| 217 [_startCallButton setTitleColor:[UIColor lightGrayColor] | |
| 218 forState:UIControlStateSelected]; | |
| 219 [_startCallButton sizeToFit]; | 169 [_startCallButton sizeToFit]; |
| 220 [_startCallButton addTarget:self | 170 [_startCallButton addTarget:self |
| 221 action:@selector(onStartCall:) | 171 action:@selector(onStartCall:) |
| 222 forControlEvents:UIControlEventTouchUpInside]; | 172 forControlEvents:UIControlEventTouchUpInside]; |
| 223 [self addSubview:_startCallButton]; | 173 [self addSubview:_startCallButton]; |
| 224 | 174 |
| 225 // Used to test what happens to sounds when calls are in progress. | 175 // Used to test what happens to sounds when calls are in progress. |
| 226 _audioLoopButton = [UIButton buttonWithType:UIButtonTypeSystem]; | 176 _audioLoopButton = [UIButton buttonWithType:UIButtonTypeSystem]; |
| 227 _audioLoopButton.layer.cornerRadius = 10; | |
| 228 _audioLoopButton.clipsToBounds = YES; | |
| 229 _audioLoopButton.contentEdgeInsets = UIEdgeInsetsMake(5, 10, 5, 10); | |
| 230 _audioLoopButton.titleLabel.font = controlFont; | 177 _audioLoopButton.titleLabel.font = controlFont; |
| 231 [_audioLoopButton setTitleColor:[UIColor whiteColor] | |
| 232 forState:UIControlStateNormal]; | |
| 233 [_audioLoopButton setTitleColor:[UIColor lightGrayColor] | |
| 234 forState:UIControlStateSelected]; | |
| 235 [self updateAudioLoopButton]; | 178 [self updateAudioLoopButton]; |
| 236 [_audioLoopButton addTarget:self | 179 [_audioLoopButton addTarget:self |
| 237 action:@selector(onToggleAudioLoop:) | 180 action:@selector(onToggleAudioLoop:) |
| 238 forControlEvents:UIControlEventTouchUpInside]; | 181 forControlEvents:UIControlEventTouchUpInside]; |
| 239 [self addSubview:_audioLoopButton]; | 182 [self addSubview:_audioLoopButton]; |
| 240 | 183 |
| 241 self.backgroundColor = [UIColor whiteColor]; | 184 self.backgroundColor = [UIColor whiteColor]; |
| 242 } | 185 } |
| 243 return self; | 186 return self; |
| 244 } | 187 } |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 _startCallButton.frame = CGRectMake(kCallControlMargin, | 282 _startCallButton.frame = CGRectMake(kCallControlMargin, |
| 340 startCallTop, | 283 startCallTop, |
| 341 _startCallButton.frame.size.width, | 284 _startCallButton.frame.size.width, |
| 342 _startCallButton.frame.size.height); | 285 _startCallButton.frame.size.height); |
| 343 } | 286 } |
| 344 | 287 |
| 345 #pragma mark - Private | 288 #pragma mark - Private |
| 346 | 289 |
| 347 - (void)updateAudioLoopButton { | 290 - (void)updateAudioLoopButton { |
| 348 if (_isAudioLoopPlaying) { | 291 if (_isAudioLoopPlaying) { |
| 349 _audioLoopButton.backgroundColor = [UIColor redColor]; | |
| 350 [_audioLoopButton setTitle:@"Stop sound" | 292 [_audioLoopButton setTitle:@"Stop sound" |
| 351 forState:UIControlStateNormal]; | 293 forState:UIControlStateNormal]; |
| 352 [_audioLoopButton sizeToFit]; | 294 [_audioLoopButton sizeToFit]; |
| 353 } else { | 295 } else { |
| 354 _audioLoopButton.backgroundColor = [UIColor greenColor]; | |
| 355 [_audioLoopButton setTitle:@"Play sound" | 296 [_audioLoopButton setTitle:@"Play sound" |
| 356 forState:UIControlStateNormal]; | 297 forState:UIControlStateNormal]; |
| 357 [_audioLoopButton sizeToFit]; | 298 [_audioLoopButton sizeToFit]; |
| 358 } | 299 } |
| 359 } | 300 } |
| 360 | 301 |
| 361 - (void)onToggleAudioLoop:(id)sender { | 302 - (void)onToggleAudioLoop:(id)sender { |
| 362 [_delegate mainViewDidToggleAudioLoop:self]; | 303 [_delegate mainViewDidToggleAudioLoop:self]; |
| 363 } | 304 } |
| 364 | 305 |
| 365 - (void)onStartCall:(id)sender { | 306 - (void)onStartCall:(id)sender { |
| 366 NSString *room = _roomText.roomText; | 307 NSString *room = _roomText.roomText; |
| 367 // If this is a loopback call, allow a generated room name. | 308 // If this is a loopback call, allow a generated room name. |
| 368 if (!room.length && _loopbackSwitch.isOn) { | 309 if (!room.length && _loopbackSwitch.isOn) { |
| 369 room = [[NSUUID UUID] UUIDString]; | 310 room = [[NSUUID UUID] UUIDString]; |
| 370 } | 311 } |
| 371 room = [room stringByReplacingOccurrencesOfString:@"-" withString:@""]; | 312 room = [room stringByReplacingOccurrencesOfString:@"-" withString:@""]; |
| 372 [_delegate mainView:self | 313 [_delegate mainView:self |
| 373 didInputRoom:room | 314 didInputRoom:room |
| 374 isLoopback:_loopbackSwitch.isOn | 315 isLoopback:_loopbackSwitch.isOn |
| 375 isAudioOnly:_audioOnlySwitch.isOn | 316 isAudioOnly:_audioOnlySwitch.isOn |
| 376 shouldMakeAecDump:_aecdumpSwitch.isOn | 317 shouldMakeAecDump:_aecdumpSwitch.isOn |
| 377 shouldUseLevelControl:_levelControlSwitch.isOn | 318 shouldUseLevelControl:_levelControlSwitch.isOn |
| 378 useManualAudio:_useManualAudioSwitch.isOn]; | 319 useManualAudio:_useManualAudioSwitch.isOn]; |
| 379 } | 320 } |
| 380 | 321 |
| 381 @end | 322 @end |
| OLD | NEW |