From 26a029d407be480d791972afb5975cf62c9360a6 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 02:47:55 +0200 Subject: Adding upstream version 124.0.1. Signed-off-by: Daniel Baumann --- .../examples/objc/AppRTCMobile/ios/ARDMainView.m | 196 +++++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 third_party/libwebrtc/examples/objc/AppRTCMobile/ios/ARDMainView.m (limited to 'third_party/libwebrtc/examples/objc/AppRTCMobile/ios/ARDMainView.m') diff --git a/third_party/libwebrtc/examples/objc/AppRTCMobile/ios/ARDMainView.m b/third_party/libwebrtc/examples/objc/AppRTCMobile/ios/ARDMainView.m new file mode 100644 index 0000000000..d9521060eb --- /dev/null +++ b/third_party/libwebrtc/examples/objc/AppRTCMobile/ios/ARDMainView.m @@ -0,0 +1,196 @@ +/* + * 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 -- cgit v1.2.3