352 lines
11 KiB
Objective-C
Executable File
352 lines
11 KiB
Objective-C
Executable File
//
|
|
// NTESAudioChatViewController.m
|
|
// NIM
|
|
//
|
|
// Created by chris on 15/5/12.
|
|
// Copyright (c) 2015年 Netease. All rights reserved.
|
|
//
|
|
|
|
#import "NTESAudioChatViewController.h"
|
|
#import "NTESVideoChatViewController.h"
|
|
#import "NTESTimerHolder.h"
|
|
#import "NetCallChatInfo.h"
|
|
|
|
#import "NTESSessionUtil.h"
|
|
#import "Toast+UIView.h"
|
|
#import "UIAlertView+NTESBlock.h"
|
|
#import "NTESVideoChatNetStatusView.h"
|
|
#import "NTESRecordSelectView.h"
|
|
#import "UIView+NTES.h"
|
|
|
|
@interface NTESAudioChatViewController ()
|
|
@end
|
|
|
|
@implementation NTESAudioChatViewController
|
|
- (instancetype)initWithCallInfo:(NetCallChatInfo *)callInfo{
|
|
self = [self initWithNibName:nil bundle:nil];
|
|
if (self) {
|
|
self.callInfo = callInfo;
|
|
self.callInfo.isMute = NO;
|
|
self.callInfo.disableCammera = NO;
|
|
self.callInfo.useSpeaker = NO;
|
|
[[NIMAVChatSDK sharedSDK].netCallManager switchType:NIMNetCallMediaTypeAudio];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
|
|
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
|
|
if (self) {
|
|
self.callInfo.callType = NIMNetCallTypeAudio;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)viewDidLoad {
|
|
[super viewDidLoad];
|
|
[self initUI];
|
|
}
|
|
|
|
- (void)initUI {
|
|
self.localRecordingView.layer.cornerRadius = 10.0;
|
|
self.localRecordingRedPoint.layer.cornerRadius = 4.0;
|
|
self.lowMemoryView.layer.cornerRadius = 10.0;
|
|
self.lowMemoryRedPoint.layer.cornerRadius = 4.0;
|
|
self.refuseBtn.exclusiveTouch = YES;
|
|
self.acceptBtn.exclusiveTouch = YES;
|
|
}
|
|
|
|
#pragma mark - Call Life
|
|
- (void)startByCaller{
|
|
[super startByCaller];
|
|
[self startInterface];
|
|
}
|
|
|
|
- (void)startByCallee{
|
|
[super startByCallee];
|
|
[self waitToCallInterface];
|
|
}
|
|
|
|
- (void)onCalling{
|
|
[super onCalling];
|
|
[self audioCallingInterface];
|
|
}
|
|
|
|
- (void)waitForConnectiong{
|
|
[super onCalling];
|
|
[self connectingInterface];
|
|
}
|
|
|
|
#pragma mark - Interface
|
|
//正在接听中界面
|
|
- (void)startInterface{
|
|
self.hangUpBtn.hidden = NO;
|
|
self.muteBtn.hidden = YES;
|
|
self.speakerBtn.hidden = YES;
|
|
self.localRecordBtn.hidden = YES;
|
|
self.localRecordingView.hidden = YES;
|
|
self.lowMemoryView.hidden = YES;
|
|
self.durationLabel.hidden = YES;
|
|
self.switchVideoBtn.hidden = YES;
|
|
self.connectingLabel.hidden = NO;
|
|
self.connectingLabel.text = @"正在呼叫,请稍候...";
|
|
self.refuseBtn.hidden = YES;
|
|
self.acceptBtn.hidden = YES;
|
|
}
|
|
|
|
//选择是否接听界面
|
|
- (void)waitToCallInterface{
|
|
self.hangUpBtn.hidden = YES;
|
|
self.muteBtn.hidden = YES;
|
|
self.speakerBtn.hidden = YES;
|
|
self.localRecordBtn.hidden = YES;
|
|
self.localRecordingView.hidden = YES;
|
|
self.lowMemoryView.hidden = YES;
|
|
self.durationLabel.hidden = YES;
|
|
self.switchVideoBtn.hidden = YES;
|
|
self.connectingLabel.hidden = NO;
|
|
NSString *nick = [NTESSessionUtil showNick:self.callInfo.caller inSession:nil];
|
|
self.connectingLabel.text = [nick stringByAppendingString:@"的来电"];
|
|
self.refuseBtn.hidden = NO;
|
|
self.acceptBtn.hidden = NO;
|
|
}
|
|
|
|
//连接对方界面
|
|
- (void)connectingInterface{
|
|
self.hangUpBtn.hidden = NO;
|
|
self.muteBtn.hidden = YES;
|
|
self.speakerBtn.hidden = YES;
|
|
self.localRecordBtn.hidden = YES;
|
|
self.localRecordingView.hidden = YES;
|
|
self.lowMemoryView.hidden = YES;
|
|
self.durationLabel.hidden = YES;
|
|
self.switchVideoBtn.hidden = YES;
|
|
self.connectingLabel.hidden = NO;
|
|
self.connectingLabel.text = @"正在连接对方...请稍后...";
|
|
self.refuseBtn.hidden = YES;
|
|
self.acceptBtn.hidden = YES;
|
|
}
|
|
|
|
//接听中界面(音频)
|
|
- (void)audioCallingInterface{
|
|
|
|
NSString *peerUid = ([[NIMSDK sharedSDK].loginManager currentAccount] == self.callInfo.caller) ? self.callInfo.callee : self.callInfo.caller;
|
|
|
|
NIMNetCallNetStatus status = [[NIMAVChatSDK sharedSDK].netCallManager netStatus:peerUid];
|
|
[self.netStatusView refreshWithNetState:status];
|
|
self.hangUpBtn.hidden = NO;
|
|
self.muteBtn.hidden = NO;
|
|
self.localRecordBtn.hidden = NO;
|
|
self.speakerBtn.hidden = NO;
|
|
self.durationLabel.hidden = NO;
|
|
self.switchVideoBtn.hidden = NO;
|
|
self.connectingLabel.hidden = YES;
|
|
self.refuseBtn.hidden = YES;
|
|
self.acceptBtn.hidden = YES;
|
|
self.muteBtn.selected = self.callInfo.isMute;
|
|
self.speakerBtn.selected = self.callInfo.useSpeaker;
|
|
self.localRecordBtn.selected =![self allRecordsStopped];
|
|
self.localRecordingView.hidden = [self allRecordsStopped];
|
|
self.lowMemoryView.hidden = YES;
|
|
}
|
|
|
|
//切换接听中界面(视频)
|
|
- (void)videoCallingInterface{
|
|
NTESVideoChatViewController *vc = [[NTESVideoChatViewController alloc] initWithCallInfo:self.callInfo];
|
|
[UIView beginAnimations:nil context:NULL];
|
|
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
|
|
[UIView setAnimationDuration:0.75];
|
|
[self.navigationController pushViewController:vc animated:NO];
|
|
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.navigationController.view cache:NO];
|
|
[UIView commitAnimations];
|
|
NSMutableArray * vcs = [self.navigationController.viewControllers mutableCopy];
|
|
[vcs removeObject:self];
|
|
self.navigationController.viewControllers = vcs;
|
|
}
|
|
|
|
- (void)udpateLowSpaceWarning:(BOOL)show {
|
|
self.lowMemoryView.hidden = !show;
|
|
self.localRecordingView.hidden = show;
|
|
}
|
|
|
|
|
|
#pragma mark - IBAction
|
|
- (IBAction)hangup:(id)sender{
|
|
[self hangup];
|
|
}
|
|
|
|
- (IBAction)acceptToCall:(id)sender{
|
|
BOOL accept = (sender == self.acceptBtn);
|
|
[self response:accept];
|
|
}
|
|
|
|
- (IBAction)mute:(id)sender{
|
|
self.callInfo.isMute = !self.callInfo.isMute;
|
|
self.muteBtn.selected = self.callInfo.isMute;
|
|
[[NIMAVChatSDK sharedSDK].netCallManager setMute:self.callInfo.isMute];
|
|
}
|
|
|
|
- (IBAction)userSpeaker:(id)sender{
|
|
self.callInfo.useSpeaker = !self.callInfo.useSpeaker;
|
|
self.speakerBtn.selected = self.callInfo.useSpeaker;
|
|
[[NIMAVChatSDK sharedSDK].netCallManager setSpeaker:self.callInfo.useSpeaker];
|
|
}
|
|
|
|
- (IBAction)switchToVideoMode:(id)sender {
|
|
[self.view makeToast:@"已发送转换请求,请等待对方应答..."
|
|
];
|
|
[[NIMAVChatSDK sharedSDK].netCallManager control:self.callInfo.callID type:NIMNetCallControlTypeToVideo];
|
|
}
|
|
|
|
- (IBAction)localRecord:(id)sender {
|
|
//出现录制选择框
|
|
if ([self allRecordsStopped]) {
|
|
[self showRecordSelectView:NO];
|
|
}
|
|
//同时停止所有录制
|
|
else
|
|
{
|
|
if (self.callInfo.audioConversation) {
|
|
[self stopAudioRecording];
|
|
if([self allRecordsStopped])
|
|
{
|
|
self.localRecordBtn.selected = NO;
|
|
self.localRecordingView.hidden = YES;
|
|
self.lowMemoryView.hidden = YES;
|
|
}
|
|
}
|
|
[self stopRecordTaskWithVideo:NO];
|
|
}
|
|
}
|
|
|
|
#pragma mark - NTESRecordSelectViewDelegate
|
|
-(void)onRecordWithAudioConversation:(BOOL)audioConversationOn myMedia:(BOOL)myMediaOn otherSideMedia:(BOOL)otherSideMediaOn
|
|
{
|
|
if (audioConversationOn) {
|
|
//开始语音对话
|
|
if ([self startAudioRecording]) {
|
|
self.callInfo.audioConversation = YES;
|
|
self.localRecordBtn.selected = YES;
|
|
self.localRecordingView.hidden = NO;
|
|
self.lowMemoryView.hidden = YES;
|
|
}
|
|
}
|
|
[self recordWithAudioConversation:audioConversationOn myMedia:myMediaOn otherSideMedia:otherSideMediaOn video:NO];
|
|
}
|
|
|
|
#pragma mark - NIMNetCallManagerDelegate
|
|
|
|
- (void)onControl:(UInt64)callID
|
|
from:(NSString *)user
|
|
type:(NIMNetCallControlType)control{
|
|
[super onControl:callID from:user type:control];
|
|
switch (control) {
|
|
case NIMNetCallControlTypeToVideo:
|
|
[self onResponseVideoMode];
|
|
break;
|
|
case NIMNetCallControlTypeAgreeToVideo:
|
|
[self videoCallingInterface];
|
|
break;
|
|
case NIMNetCallControlTypeRejectToVideo:
|
|
[self.view makeToast:@"对方拒绝切换到视频模式"
|
|
];
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
-(void)onCallEstablished:(UInt64)callID
|
|
{
|
|
if (self.callInfo.callID == callID) {
|
|
[super onCallEstablished:callID];
|
|
|
|
self.durationLabel.hidden = NO;
|
|
self.durationLabel.text = self.durationDesc;
|
|
}
|
|
}
|
|
|
|
|
|
- (void)onNetStatus:(NIMNetCallNetStatus)status user:(NSString *)user
|
|
{
|
|
if ([user isEqualToString:self.peerUid]) {
|
|
[self.netStatusView refreshWithNetState:status];
|
|
}
|
|
}
|
|
|
|
- (void)onRecordStarted:(UInt64)callID fileURL:(NSURL *)fileURL uid:(NSString *)userId;
|
|
{
|
|
[super onRecordStarted:callID fileURL:fileURL uid:userId];
|
|
if (self.callInfo.callID == callID) {
|
|
self.localRecordBtn.selected = YES;
|
|
self.localRecordingView.hidden = NO;
|
|
self.lowMemoryView.hidden = YES;
|
|
}
|
|
}
|
|
|
|
|
|
- (void)onRecordError:(NSError *)error
|
|
callID:(UInt64)callID
|
|
uid:(NSString *)userId;
|
|
{
|
|
[super onRecordError:error callID:callID uid:userId];
|
|
if (self.callInfo.callID == callID && !self.callInfo.localRecording&&!self.callInfo.otherSideRecording) {
|
|
self.localRecordBtn.selected = NO;
|
|
self.localRecordingView.hidden = YES;
|
|
self.lowMemoryView.hidden = YES;
|
|
}
|
|
}
|
|
|
|
- (void)onRecordStopped:(UInt64)callID
|
|
fileURL:(NSURL *)fileURL
|
|
uid:(NSString *)userId;
|
|
{
|
|
[super onRecordStopped:callID fileURL:fileURL uid:userId];
|
|
if (self.callInfo.callID == callID&&!self.callInfo.localRecording&& !self.callInfo.otherSideRecording) {
|
|
self.localRecordBtn.selected = NO;
|
|
self.localRecordingView.hidden = YES;
|
|
self.lowMemoryView.hidden = YES;
|
|
}
|
|
}
|
|
|
|
|
|
#pragma mark - M80TimerHolderDelegate
|
|
- (void)onNTESTimerFired:(NTESTimerHolder *)holder{
|
|
[super onNTESTimerFired:holder];
|
|
self.durationLabel.text = self.durationDesc;
|
|
}
|
|
|
|
#pragma mark - Misc
|
|
- (NSString*)durationDesc{
|
|
if (!self.callInfo.startTime) {
|
|
return @"";
|
|
}
|
|
NSTimeInterval time = [NSDate date].timeIntervalSince1970;
|
|
NSTimeInterval duration = time - self.callInfo.startTime;
|
|
return [NSString stringWithFormat:@"%02d:%02d",(int)duration/60,(int)duration%60];
|
|
}
|
|
|
|
|
|
- (void)onResponseVideoMode{
|
|
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"对方请求切换为视频模式" delegate:nil cancelButtonTitle:@"拒绝" otherButtonTitles:@"接受", nil];
|
|
[alert showAlertWithCompletionHandler:^(NSInteger idx) {
|
|
switch (idx) {
|
|
case 0:
|
|
[[NIMAVChatSDK sharedSDK].netCallManager control:self.callInfo.callID type:NIMNetCallControlTypeRejectToVideo];
|
|
[self.view makeToast:@"已拒绝"
|
|
];
|
|
break;
|
|
case 1:
|
|
[[NIMAVChatSDK sharedSDK].netCallManager control:self.callInfo.callID type:NIMNetCallControlTypeAgreeToVideo];
|
|
[self videoCallingInterface];
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}];
|
|
}
|
|
|
|
|
|
@end
|