123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900 |
- //
- // JXAVCallViewController.m
- // shiku_im
- //
- // Created by p on 2017/12/26.
- // Copyright © 2017年 Reese. All rights reserved.
- //
- #import "JXAVCallViewController.h"
- #import "JXMediaObject.h"
- //#import <ReplayKit/ReplayKit.h>
- #import <AssetsLibrary/AssetsLibrary.h>
- #import "JXSelectFriendsVC.h"
- #ifdef Live_Version
- #import "JXLiveJidManager.h"
- #endif
- #import "JXTalkViewController.h"
- #import "JXTalkModel.h"
- #import "AppleReachability.h"
- #import <JitsiMeet/JitsiMeetUserInfo.h>
- @interface JXAVCallViewController ()<UIAlertViewDelegate, JXTalkViewControllerDelegate>
- @property (nonatomic, assign) NSTimeInterval startTime;
- @property (nonatomic, strong) UIView *localVideoView;
- @property (nonatomic, strong) AVCaptureSession *session;
- @property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer;
- @property (nonatomic, strong) UIButton *suspensionBtn;
- @property (nonatomic, strong) UILabel *suspensionLabel;
- @property (nonatomic, assign) CGRect subWindowFrame;
- @property (nonatomic, strong) NSTimer *timer;
- @property (nonatomic, assign) int timerIndex;
- @property (nonatomic, strong) UIButton *recorderBtn;
- //@property (nonatomic, strong) RPPreviewViewController *previewVC;
- @property (nonatomic, assign) BOOL isRecording;
- @property (nonatomic, strong) NSTimer *pingTimer;
- @property (nonatomic, assign) int pingTimerIndex;
- @property (nonatomic, assign) int pingCount;
- @property (nonatomic, assign) BOOL isOldVersion;
- @property (nonatomic, strong) JXSelectFriendsVC *selVC;
- @property (nonatomic, strong) JXTalkViewController *talkVC;
- @property (nonatomic, assign) BOOL isMuted;
- @end
- @implementation JXAVCallViewController
- - (void)viewDidLoad {
- [super viewDidLoad];
- // Do any additional setup after loading the view from its nib.
-
- if (_pSelf) {
- return;
- }
- #if TARGET_IPHONE_SIMULATOR
-
- [self actionQuit];
- [JXMyTools showTipView:@"模拟器不支持音视频通话"];
- return;
-
- #endif
- g_meeting.isMeeting = YES;
- _pSelf = self;
- [self createSuspensionView];
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- // [self creatLocalVideoView];
- JitsiMeetView *view = (JitsiMeetView *)self.view;
- view.delegate = self;
- // view.welcomePageEnabled = NO;
- // [view loadURL:nil];
-
- // NSString *url = [NSString stringWithFormat:@"https://www.pinba.co/%@",self.roomNum];
- BOOL audioMuted = NO;
- BOOL videoMuted = NO;
- NSString *serverStr;
- if (self.isGroup) {
- serverStr = g_config.jitsiServer;
- }else {
- if ([g_config.isOpenCluster integerValue] == 1 && [self.meetUrl length] > 0) {
- serverStr = self.meetUrl;
- }else {
- serverStr = g_config.jitsiServer;
- }
- }
- g_meeting.roomNum = self.roomNum;
- // NSString *url = [NSString stringWithFormat:@"%@%@",serverStr,self.roomNum];
- NSString *room;
- if (self.isAudio && self.isGroup) {
- // url = [NSString stringWithFormat:@"%@audio%@",serverStr,self.roomNum];
- if (self.isGroup) {
- room = [NSString stringWithFormat:@"audio%@",self.roomNum];
- }else{
- room = self.roomNum;
- }
- videoMuted = YES;
- }
- if (self.isTalk) {
- // url = [NSString stringWithFormat:@"%@talk%@",serverStr,self.roomNum];
- room = [NSString stringWithFormat:@"talk%@",self.roomNum];
- audioMuted = YES;
- }
- if (!room) {
- room = self.roomNum;
- }
- if (self.isAudio) {
- videoMuted = YES;
- }
- if (!_toUserName) {
- _toUserName = self.roomNum;
- }
- JitsiMeetUserInfo *userInfo = [[JitsiMeetUserInfo alloc] init];
- userInfo.displayName = _toUserName;
- NSString *avatarURL = [self getMyHeadUrl];
- if (avatarURL) {
- // view.avatarURL = avatarURL;
- userInfo.avatar = [NSURL URLWithString:avatarURL];
- }
- // [view loadURLObject:@{
- // @"config": @{
- // @"startWithAudioMuted": [NSNumber numberWithBool:audioMuted],
- // @"startWithVideoMuted": [NSNumber numberWithBool:videoMuted]
- // },
- // @"nickName" : _toUserName,
- // @"isCallKit" : g_App.uuid ? @NO : @YES,
- // @"url": url
- // /*@"url" : @"https://192.168.0.47/123"*/
- //
- // }];
- JitsiMeetConferenceOptions *options = [JitsiMeetConferenceOptions fromBuilder:^(JitsiMeetConferenceOptionsBuilder *builder) {
- builder.welcomePageEnabled = NO;
- builder.serverURL = [NSURL URLWithString:serverStr];;
- builder.room = room;
- builder.audioOnly = NO;
- builder.audioMuted = audioMuted;
- builder.videoMuted = videoMuted;
- builder.userInfo = userInfo;
- builder.subject = _toUserName;
- [builder setFeatureFlag:@"chat.enabled" withBoolean:false];
- }];
- [view join:options];
-
- UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(20, 30, 38, 38)];
- [btn setImage:[UIImage imageNamed:@"callHide"] forState:UIControlStateNormal];
- [btn addTarget:self action:@selector(hideAudioView) forControlEvents:UIControlEventTouchUpInside];
- [self.view addSubview:btn];
-
- _recorderBtn = [[UIButton alloc] initWithFrame:CGRectMake(JX_SCREEN_WIDTH - 20 - 38, 30, 30, 30)];
- // [_recorderBtn setTitle:Localized(@"JX_Recording") forState:UIControlStateNormal];
- // [_recorderBtn setTitle:Localized(@"STOP_IT") forState:UIControlStateSelected];
- [_recorderBtn setImage:[UIImage imageNamed:@"audio_invite"] forState:UIControlStateNormal];
- // [_recorderBtn setImage:[UIImage imageNamed:@"stoped"] forState:UIControlStateSelected];
- // [_recorderBtn setImageEdgeInsets:UIEdgeInsetsMake(0, 0, 22, 0)];
- // [_recorderBtn setTitleEdgeInsets:UIEdgeInsetsMake(30, -60, 0, 0)];
- [_recorderBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
- [_recorderBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateSelected];
- [_recorderBtn setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
- _recorderBtn.titleLabel.font = [UIFont systemFontOfSize:15.0];
- [_recorderBtn addTarget:self action:@selector(onInvite) forControlEvents:UIControlEventTouchUpInside];
- [self.view addSubview:_recorderBtn];
- if (self.isGroup) {
- _recorderBtn.hidden = NO;
- }else {
- _recorderBtn.hidden = YES;
- }
-
- if (self.isTalk) {
- [self createTalkView];
- }
- });
-
- [g_notify addObserver:self selector:@selector(newMsgCome:) name:kXMPPNewMsgNotifaction object:nil];
- [g_notify addObserver:self selector:@selector(callEndNotification:) name:kCallEndNotification object:nil];
-
- _startTime = 0;
- [self networkStatusChange];
- self.isOldVersion = YES;
- if (!self.isGroup) {
- self.pingCount = 0;
- [self sendPing];
- self.pingTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(pingTimerAction:) userInfo:nil repeats:YES];
- }
-
- }
- - (void)createTalkView {
-
- _talkVC = [[JXTalkViewController alloc] init];
- _talkVC.delegate = self;
- _talkVC.roomNum = self.roomNum;
- [self.view addSubview:_talkVC.view];
-
-
- JXMessageObject *msg=[[JXMessageObject alloc]init];
- msg.content = nil;
- msg.timeSend = [NSDate date];
- msg.fromUserId = MY_USER_ID;
- msg.fromUserName = MY_USER_NAME;
- msg.toUserId = self.roomNum;
- msg.isGroup = YES;
- msg.type = [NSNumber numberWithInt:kWCMessageTypeTalkJoin];
- msg.isSend = [NSNumber numberWithInt:transfer_status_ing];
- msg.isRead = [NSNumber numberWithBool:NO];
- msg.isReadDel = [NSNumber numberWithInt:NO];
- msg.sendCount = 1;
- msg.objectId = self.roomNum;
- [msg insert:nil];
- [g_xmpp sendMessage:msg roomName:self.roomNum];//发送消息
-
- }
- - (void)talkVCCloseBtnAction {
- [self.pingTimer invalidate];
- self.pingTimer = nil;
-
- [_talkVC actionQuit];
- [self actionQuit];
- }
- - (void)talkVCTalkStart {
-
- JitsiMeetView *view = (JitsiMeetView *)self.view;
- [view setAudioMuted:NO];
- }
- - (void)talkVCTalkStop {
-
- JitsiMeetView *view = (JitsiMeetView *)self.view;
- [view setAudioMuted:YES];
- }
- - (NSString *)getMyHeadUrl {
-
- NSString* s;
- if([MY_USER_ID isKindOfClass:[NSNumber class]])
- s = [(NSNumber*)MY_USER_ID stringValue];
- else
- s = MY_USER_ID;
- if([s length]<=0)
- return nil;
- NSString* dir = [NSString stringWithFormat:@"%d",[s intValue] % 10000];
- NSString* url = [NSString stringWithFormat:@"%@avatar/o/%@/%@.jpg",g_config.downloadAvatarUrl,dir,s];
-
- return url;
- }
- - (void)pingTimerAction:(NSTimer *)timer {
-
- self.pingTimerIndex ++;
- if (self.pingTimerIndex >= 3) {
- self.pingTimerIndex = 0;
- [self sendPing];
- if (self.pingCount >= 0) {
- self.pingCount ++;
- }else {
- [timer invalidate];
- timer = nil;
- return;
- }
- NSLog(@"timerPingCount = %d", self.pingCount);
- if (self.pingCount >= 10) {
- self.pingCount = -1;
- [timer invalidate];
- timer = nil;
- if (self.isOldVersion) {
- return;
- }
- if (g_xmpp.isLogined == login_status_yes) {
- if (!self.isGroup) {
- // int n = [[NSDate date] timeIntervalSince1970]-_startTime;
- int type = kWCMessageTypeVideoChatEnd;
- if (self.isAudio) {
- type = kWCMessageTypeAudioChatEnd;
- }
- [g_meeting sendEnd:type toUserId:self.toUserId toUserName:self.toUserName timeLen:self.timerIndex];
- }
- [self actionQuit];
- [g_App showAlert:Localized(@"JX_AVAbnormalDisconnection") delegate:self tag:2457 onlyConfirm:YES];
- }else {
- [self actionQuit];
- }
- }
- }
-
- }
- - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
- dispatch_async(dispatch_get_main_queue(), ^{
- // if (!self.isGroup) {
- // // int n = [[NSDate date] timeIntervalSince1970]-_startTime;
- // int type = kWCMessageTypeVideoChatEnd;
- // if (self.isAudio) {
- // type = kWCMessageTypeAudioChatEnd;
- // }
- // [g_meeting sendEnd:type toUserId:self.toUserId toUserName:self.toUserName timeLen:self.timerIndex];
- // }
- [self actionQuit];
- });
- }
- - (void)sendPing {
- JXMessageObject *msg=[[JXMessageObject alloc]init];
- msg.timeSend = [NSDate date];
- msg.fromUserId = MY_USER_ID;
- msg.fromUserName = MY_USER_NAME;
- msg.toUserName = self.toUserName;
- msg.toUserId = self.toUserId;
- msg.isGroup = NO;
- msg.type = [NSNumber numberWithInt:kWCMessageTypeAVPing];
- msg.isSend = [NSNumber numberWithInt:transfer_status_ing];
- msg.isRead = [NSNumber numberWithBool:NO];
- [g_xmpp sendMessage:msg roomName:nil];//发送消息
-
- }
- -(void)onInvite{
-
- JXUserObject *user = [[JXUserObject sharedInstance] getUserById:self.roomNum];
-
- NSDictionary * groupDict = [user toDictionary];
- roomData * roomdata = [[roomData alloc] init];
- [roomdata getDataFromDict:groupDict];
-
- NSMutableSet* p = [[NSMutableSet alloc]init];
-
- _selVC = [JXSelectFriendsVC alloc];
- _selVC.isAddWindow = YES;
- _selVC.isNewRoom = NO;
- _selVC.isShowMySelf = NO;
- if (self.isGroup && [self.roomNum isEqualToString:MY_USER_ID]) {
-
- _selVC.type = JXSelectFriendTypeSelFriends;
- }else {
- _selVC.type = JXSelectFriendTypeSelMembers;
- }
- _selVC.room = roomdata;
- _selVC.existSet = p;
- _selVC.delegate = self;
- _selVC.didSelect = @selector(meetingAddMember:);
- _selVC = [_selVC init];
- [g_window addSubview:_selVC.view];
- // [g_navigation pushViewController:vc animated:YES];
- }
- -(void)meetingAddMember:(JXSelectFriendsVC*)vc{
- int type;
- if (self.isAudio) {
- type = kWCMessageTypeAudioMeetingInvite;
- }else {
- type = kWCMessageTypeVideoMeetingInvite;
- }
- for(NSNumber* n in vc.set){
- if (self.isGroup && [self.roomNum isEqualToString:MY_USER_ID]) {
-
- JXUserObject *user;
- if (vc.seekTextField.text.length > 0) {
- user = vc.searchArray[[n intValue] % 100000-1];
- }else{
- user = [[vc.letterResultArr objectAtIndex:[n intValue] / 100000-1] objectAtIndex:[n intValue] % 100000-1];
- }
- NSString* s = [NSString stringWithFormat:@"%@",user.userId];
- [g_meeting sendMeetingInvite:s toUserName:user.userNickname roomJid:self.roomNum callId:@"0" type:type];
- }else {
- memberData *user;
- if (vc.seekTextField.text.length > 0) {
- user = vc.searchArray[[n intValue] % 100000-1];
- }else{
- user = [[vc.letterResultArr objectAtIndex:[n intValue] / 100000-1] objectAtIndex:[n intValue] % 100000-1];
- }
- NSString* s = [NSString stringWithFormat:@"%ld",user.userId];
- [g_meeting sendMeetingInvite:s toUserName:user.userName roomJid:self.roomNum callId:@"0" type:type];
- }
- }
- }
- //- (void)recorderBtnAction:(UIButton *)btn {
- //
- // if (!btn.selected) {
- // self.isRecording = NO;
- // //如果还没有开始录制,判断系统是否支持
- // if ([RPScreenRecorder sharedRecorder].isAvailable && [[UIDevice currentDevice].systemVersion floatValue] > 9.0) {
- // //如果支持,就使用下面的方法可以启动录制回放
- // [btn setTitle:Localized(@"JX_Opening") forState:UIControlStateDisabled];
- // btn.enabled = NO;
- // [self startRecord];
- //
- // } else {
- // [JXMyTools showTipView:Localized(@"JX_NotScreenRecording")];
- // }
- // }else {
- // [btn setTitle:Localized(@"JX_Stopping") forState:UIControlStateDisabled];
- // btn.enabled = NO;
- // [self stopRecord];
- // }
- //}
- //- (void)startRecord {
- // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- // if (!self.isRecording) {
- //
- // [self startRecord];
- // }
- // });
- // NSLog(@"recorder -- OK");
- // [[RPScreenRecorder sharedRecorder] startRecordingWithMicrophoneEnabled:YES handler:^(NSError * _Nullable error) {
- // NSLog(@"%@", error);
- // if (!error) {
- // NSLog(@"recorder -- 已开启");
- // self.isRecording = YES;
- // dispatch_async(dispatch_get_main_queue(), ^{
- // _recorderBtn.enabled = YES;
- // _recorderBtn.selected = YES;
- // });
- // }
- // //处理发生的错误,如设用户权限原因无法开始录制等
- // }];
- //}
- //- (void)stopRecord {
- // dispatch_async(dispatch_get_main_queue(), ^{
- //
- // NSLog(@"stopRecord");
- //
- // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- // if (self.isRecording) {
- //
- // dispatch_async(dispatch_get_main_queue(), ^{
- // _recorderBtn.enabled = YES;
- // _recorderBtn.selected = NO;
- // });
- //
- // [JXMyTools showTipView:@"录屏失败,请重新录制"];
- //
- //// [self stopRecord];
- // }
- // });
- //
- // //停止录制回放,并显示回放的预览,在预览中用户可以选择保存视频到相册中、放弃、或者分享出去
- // [[RPScreenRecorder sharedRecorder] stopRecordingWithHandler:^(RPPreviewViewController * _Nullable previewViewController, NSError * _Nullable error) {
- // _previewVC = previewViewController;
- //
- // self.isRecording = NO;
- // dispatch_async(dispatch_get_main_queue(), ^{
- // _recorderBtn.enabled = YES;
- // _recorderBtn.selected = NO;
- // });
- //
- // NSLog(@"recorder -- stop");
- // if (error) {
- // NSLog(@"recorder -- errro:%@", error);
- // //处理发生的错误,如磁盘空间不足而停止等
- // }else {
- // NSURL *url = [_previewVC valueForKey:@"movieURL"];
- //
- //
- //// [[NSFileManager defaultManager] copyItemAtURL:url toURL:[NSURL URLWithString:str] error:nil];
- ////// [[NSFileManager defaultManager] moveItemAtURL:url toURL:[NSURL URLWithString:str] error:nil];
- ////
- //// NSString *str = [FileInfo getUUIDFileName:@"mp4"];
- //// JXMediaObject* p = [[JXMediaObject alloc]init];
- //// p.userId = g_server.myself.userId;
- //// p.fileName = str;
- //// p.isVideo = [NSNumber numberWithBool:YES];
- //// // p.timeLen = [NSNumber numberWithInteger:timeLen];
- //// [p insert];
- //
- // ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
- // [library writeVideoAtPathToSavedPhotosAlbum:url completionBlock:^(NSURL *assetURL, NSError *error) {
- //
- // if (error) {
- // [JXMyTools showTipView:Localized(@"JX_SaveFiled")];
- // }else {
- // [JXMyTools showTipView:Localized(@"JX_SaveSuessed")];
- // }
- // }];
- //
- //// if (_previewVC) {
- //// //设置预览页面到代理
- //// _previewVC.previewControllerDelegate = self;
- ////
- //// [g_window addSubview:_previewVC.view];
- //// [g_navigation.subViews.lastObject presentViewController:previewViewController animated:YES completion:nil];
- //// }
- //
- // }
- //
- // }];
- // });
- //}
- //- (void)previewControllerDidFinish:(RPPreviewViewController *)previewController {
- // [_previewVC dismissViewControllerAnimated:YES completion:nil];
- //}
- - (void)creatLocalVideoView {
-
- self.localVideoView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
- self.localVideoView.backgroundColor = HEXCOLOR(0x1F2025);
- [g_window addSubview:self.localVideoView];
-
- // 获取需要的设备
- AVCaptureDevice *device = [self cameraWithPosition:AVCaptureDevicePositionFront];
- if (self.isAudio || !device) {
-
- UIImageView *headImage = [[UIImageView alloc] initWithFrame:CGRectMake(JX_SCREEN_WIDTH / 2 - 50, JX_SCREEN_HEIGHT / 2 - 110, 100, 100)];
- headImage.layer.cornerRadius = headImage.frame.size.width / 2;
- headImage.layer.masksToBounds = YES;
- headImage.image = [UIImage imageNamed:@"ALOGO_1200"];
- [self.localVideoView addSubview:headImage];
-
- }else {
- NSError *error = nil;
-
- // 初始化会话
- _session = [[AVCaptureSession alloc] init];
-
- AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device
- error:&error];
- [_session addInput:input];
- [_session startRunning];
-
- //预览层的生成,实时获取摄像头数据
- self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_session];
- self.previewLayer.frame = [UIScreen mainScreen].bounds;
- self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
- [self.localVideoView.layer addSublayer:self.previewLayer];
- }
-
- UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, JX_SCREEN_HEIGHT / 2, JX_SCREEN_WIDTH, 20)];
- label.font = g_factory.font17;
- label.text = Localized(@"JX_Connection");
- label.textColor = [UIColor whiteColor];
- label.textAlignment = NSTextAlignmentCenter;
- [self.localVideoView addSubview:label];
- }
- - (AVCaptureDevice *)cameraWithPosition:(AVCaptureDevicePosition)position
- {
- NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
- for ( AVCaptureDevice *device in devices )
- if ( device.position == position )
- return device;
- return nil;
- }
- - (void)createSuspensionView {
- _suspensionBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 80, 100)];
- _suspensionBtn.backgroundColor = [UIColor whiteColor];
- _suspensionBtn.layer.cornerRadius = 2.0;
- _suspensionBtn.layer.masksToBounds = YES;
- _suspensionBtn.layer.borderWidth = 0.5;
- _suspensionBtn.layer.borderColor = [[UIColor grayColor] CGColor];
- [_suspensionBtn addTarget:self action:@selector(showAudioView) forControlEvents:UIControlEventTouchUpInside];
- g_subWindow.frame = CGRectMake(JX_SCREEN_WIDTH - 80 - 10, 50, _suspensionBtn.frame.size.width, _suspensionBtn.frame.size.height);
- g_subWindow.backgroundColor = [UIColor cyanColor];
- [g_subWindow addSubview:_suspensionBtn];
- g_subWindow.hidden = YES;
-
- UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)];
- [g_subWindow addGestureRecognizer:pan];
-
- UIImageView *suspensionImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
- suspensionImage.image = [UIImage imageNamed:@"callShow"];
- suspensionImage.center = CGPointMake(_suspensionBtn.frame.size.width / 2, _suspensionBtn.frame.size.height / 2 - 10);
- [_suspensionBtn addSubview:suspensionImage];
-
- _suspensionLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(suspensionImage.frame) + 5, _suspensionBtn.frame.size.width, 20)];
- _suspensionLabel.textColor = THEMECOLOR;
- _suspensionLabel.textAlignment = NSTextAlignmentCenter;
- _suspensionLabel.font = g_factory.font13;
- _suspensionLabel.text = @"00:00";
- [_suspensionBtn addSubview:_suspensionLabel];
- }
- - (void)panAction:(UIPanGestureRecognizer *)pan {
- if (pan.state == UIGestureRecognizerStateBegan) {
- self.subWindowFrame = g_subWindow.frame;
- }
- CGPoint offset = [pan translationInView:g_App.window];
- CGPoint offset1 = [pan translationInView:g_subWindow];
- NSLog(@"pan - offset = %@, offset1 = %@", NSStringFromCGPoint(offset), NSStringFromCGPoint(offset1));
-
- CGRect frame = self.subWindowFrame;
- frame.origin.x += offset.x;
- frame.origin.y += offset.y;
- g_subWindow.frame = frame;
-
- if (pan.state == UIGestureRecognizerStateEnded || pan.state == UIGestureRecognizerStateCancelled) {
- if (frame.origin.x <= JX_SCREEN_WIDTH / 2) {
- frame.origin.x = 10;
- }else {
- frame.origin.x = JX_SCREEN_WIDTH - frame.size.width - 10;
- }
- if (frame.origin.y < 0) {
- frame.origin.y = 10;
- }
- if ((frame.origin.y + frame.size.height) > JX_SCREEN_HEIGHT) {
- frame.origin.y = JX_SCREEN_HEIGHT - frame.size.height - 10;
- }
- [UIView animateWithDuration:0.5 animations:^{
-
- g_subWindow.frame = frame;
- }];
- }
- }
- - (void)callTimerAction:(NSTimer *)timer {
- self.timerIndex ++;
- NSString *str = [NSString stringWithFormat:@"%.2d:%.2d", self.timerIndex / 60,self.timerIndex % 60];
- self.suspensionLabel.text = str;
- }
- - (void)hideAudioView {
- [UIView animateWithDuration:0.5 animations:^{
- self.view.frame = CGRectMake(JX_SCREEN_WIDTH, 0, self.view.frame.size.width, 0);
- } completion:^(BOOL finished) {
- g_subWindow.hidden = NO;
- self.view.hidden = YES;
- [[UIApplication sharedApplication] setStatusBarHidden:NO];
- }];
- }
- - (void)showAudioView {
- g_subWindow.hidden = YES;
- self.view.hidden = NO;
- self.view.frame = CGRectMake(JX_SCREEN_WIDTH, 0, self.view.frame.size.width, 0);
-
- [UIView animateWithDuration:0.5 animations:^{
- self.view.frame = CGRectMake(0, 0, JX_SCREEN_WIDTH, JX_SCREEN_HEIGHT);
- } completion:^(BOOL finished) {
- [[UIApplication sharedApplication] setStatusBarHidden:YES];
- }];
- }
- -(void)newMsgCome:(NSNotification *)notifacation{
-
- JXMessageObject *msg = (JXMessageObject *)notifacation.object;
- if ([msg.type intValue] == kWCMessageTypeVideoChatEnd || [msg.type intValue] == kWCMessageTypeAudioChatEnd || [msg.type intValue] == kWCMessageTypeAudioChatCancel || [msg.type intValue] == kWCMessageTypeVideoChatCancel) {
- if ([msg.fromUserId isEqualToString:self.toUserId]) {
- [self actionQuit];
- }
- }
-
- if ([msg.type intValue] == kWCMessageTypeAVPing) {
- if ([msg.fromUserId isEqualToString:self.toUserId]) {
- self.isOldVersion = NO;
- self.pingCount = 0;
- NSLog(@"timerPingCountNew = %d",self.pingCount);
- }
- }
-
- if ([msg.fromUserId isEqualToString:MY_USER_ID]) {
- if ([msg.type intValue] == kWCMessageTypeAudioChatAsk || [msg.type intValue] == kWCMessageTypeVideoChatAsk || [msg.type intValue] == kWCMessageTypeVideoMeetingInvite || [msg.type intValue] == kWCMessageTypeAudioMeetingInvite || [msg.type intValue] == kWCMessageTypeAudioChatAccept || [msg.type intValue] == kWCMessageTypeVideoChatAccept) {
- return;
- }
- }
- if(msg==nil)
- return;
- #ifdef Live_Version
- if([[JXLiveJidManager shareArray] contains:msg.toUserId] || [[JXLiveJidManager shareArray] contains:msg.fromUserId])
- return;
- #endif
-
- if([msg.toUserId isEqualToString:MY_USER_ID] && [g_meeting.roomNum isEqualToString:msg.fromUserId]){
- if([msg.type intValue] == kWCMessageTypeVideoChatAsk || [msg.type intValue] == kWCMessageTypeAudioChatAsk){
- [self actionQuit];
- }
- }
- }
- // 监听网络状态
- - (void)networkStatusChange {
- AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
- [manager startMonitoring];
- [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
- if (status == AFNetworkReachabilityStatusNotReachable) {
-
- [self performSelector:@selector(networkNotReachable) withObject:nil afterDelay:8];
-
- }
- }];
- }
- - (void)networkNotReachable {
-
- AppleReachability *reach = [AppleReachability reachabilityWithHostName:@"www.apple.com"];
- NetworkStatus internetStatus = [reach currentReachabilityStatus];
- switch (internetStatus) {
- case NotReachable:{
- [self actionQuit];
- }
- break;
-
- default:
-
- break;
- }
- }
- -(void)callEndNotification:(NSNotification *)notifacation{
- if (self.timerIndex == 5) {
- return;
- }
- if (!self.isGroup) {
- // int n = [[NSDate date] timeIntervalSince1970]-_startTime;
- int type = kWCMessageTypeVideoChatEnd;
- if (self.isAudio) {
- type = kWCMessageTypeAudioChatEnd;
- }
- [g_meeting sendEnd:type toUserId:self.toUserId toUserName:self.toUserName timeLen:self.timerIndex];
- }
- [self actionQuit];
- }
- void _onJitsiMeetViewDelegateEvent(NSString *name, NSDictionary *data) {
- NSLog(
- @"[%s:%d] JitsiMeetViewDelegate %@ %@",
- __FILE__, __LINE__, name, data);
- }
- - (void)_onJitsiMeetViewDelegateEvent:(NSString *)name
- withData:(NSDictionary *)data {
- NSLog(
- @"[%s:%d] JitsiMeetViewDelegate %@ %@",
- __FILE__, __LINE__, name, data);
-
- NSAssert(
- [NSThread isMainThread],
- @"JitsiMeetViewDelegate %@ method invoked on a non-main thread",
- name);
- }
- //- (void)conferenceFailed:(NSDictionary *)data {
- // _onJitsiMeetViewDelegateEvent(@"CONFERENCE_FAILED", data);
- //
- // dispatch_async(dispatch_get_main_queue(), ^{
- //// _startTime = [[NSDate date] timeIntervalSince1970];
- // self.session = nil;
- // self.localVideoView.hidden = YES;
- // [self.previewLayer removeFromSuperlayer];
- // [self.localVideoView removeFromSuperview];
- // self.localVideoView = nil;
- // });
- //}
- - (void)conferenceJoined:(NSDictionary *)data {
- _onJitsiMeetViewDelegateEvent(@"CONFERENCE_JOINED", data);
-
- dispatch_async(dispatch_get_main_queue(), ^{
-
- if (!g_meeting.isMeeting) {
- [self actionQuit];
- return;
- }
-
- _startTime = [[NSDate date] timeIntervalSince1970];
-
- self.timerIndex = 0;
- // 通话计时
- self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(callTimerAction:) userInfo:nil repeats:YES];
- self.session = nil;
- self.localVideoView.hidden = YES;
- [self.previewLayer removeFromSuperlayer];
- [self.localVideoView removeFromSuperview];
- self.localVideoView = nil;
- });
- }
- //- (void)conferenceLeft:(NSDictionary *)data {
- // _onJitsiMeetViewDelegateEvent(@"CONFERENCE_LEFT", data);
- //
- //
- //}
- - (void)conferenceWillJoin:(NSDictionary *)data {
- _onJitsiMeetViewDelegateEvent(@"CONFERENCE_WILL_JOIN", data);
- }
- //- (void)conferenceWillLeave:(NSDictionary *)data {
- // _onJitsiMeetViewDelegateEvent(@"CONFERENCE_WILL_LEAVE", data);
- //
- // [self _onJitsiMeetViewDelegateEvent:@"CONFERENCE_JOINED" withData:data];
- //
- // dispatch_async(dispatch_get_main_queue(), ^{
- //
- // [self.pingTimer invalidate];
- // self.pingTimer = nil;
- //
- // if (!self.isGroup) {
- //// int n = [[NSDate date] timeIntervalSince1970]-_startTime;
- // int type = kWCMessageTypeVideoChatEnd;
- // if (self.isAudio) {
- // type = kWCMessageTypeAudioChatEnd;
- // }
- // [g_meeting sendEnd:type toUserId:self.toUserId toUserName:self.toUserName timeLen:self.timerIndex];
- // }
- // [self actionQuit];
- // });
- //}
- - (void)conferenceTerminated:(NSDictionary *)data{
- id error = [data objectForKey:@"error"];
- if (error) {
- _onJitsiMeetViewDelegateEvent(@"LOAD_CONFIG_ERROR", data);
- dispatch_async(dispatch_get_main_queue(), ^{
- // _startTime = [[NSDate date] timeIntervalSince1970];
- self.session = nil;
- self.localVideoView.hidden = YES;
- [self.previewLayer removeFromSuperlayer];
- [self.localVideoView removeFromSuperview];
- self.localVideoView = nil;
- });
- }else{
- _onJitsiMeetViewDelegateEvent(@"CONFERENCE_WILL_LEAVE", data);
-
- [self _onJitsiMeetViewDelegateEvent:@"CONFERENCE_JOINED" withData:data];
-
- dispatch_async(dispatch_get_main_queue(), ^{
-
- [self.pingTimer invalidate];
- self.pingTimer = nil;
-
- if (!self.isGroup) {
- // int n = [[NSDate date] timeIntervalSince1970]-_startTime;
- int type = kWCMessageTypeVideoChatEnd;
- if (self.isAudio) {
- type = kWCMessageTypeAudioChatEnd;
- }
- [g_meeting sendEnd:type toUserId:self.toUserId toUserName:self.toUserName timeLen:self.timerIndex];
- }
- [self actionQuit];
- });
- }
- }
- - (void)loadConfigError:(NSDictionary *)data {
- _onJitsiMeetViewDelegateEvent(@"LOAD_CONFIG_ERROR", data);
- }
- - (void)didReceiveMemoryWarning {
- [super didReceiveMemoryWarning];
- // Dispose of any resources that can be recreated.
- }
- - (void)actionQuit {
-
- // if (_recorderBtn.selected) {
- // [self stopRecord];
- // }
- #if !TARGET_IPHONE_SIMULATOR
- JitsiMeetView *view = (JitsiMeetView *)self.view;
- [view leave];
- #endif
-
- g_meeting.roomNum = nil;
- [self.pingTimer invalidate];
- self.pingTimer = nil;
-
- [g_App endCall];
- [self.timer invalidate];
- self.timer = nil;
- g_meeting.isMeeting = NO;
- // [self dismissViewControllerAnimated:YES completion:nil];
- [g_notify removeObserver:self];
- [g_subWindow removeFromSuperview];
- g_subWindow = nil;
- [self.view removeFromSuperview];
- self.view = nil;
- _pSelf = nil;
-
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- g_meeting.isMeeting = NO;
- [UIApplication sharedApplication].statusBarHidden = NO;
- [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
- });
- }
- - (void)dealloc {
- NSLog(@"%@ -- dealloc",NSStringFromClass([self class]));
- [g_notify removeObserver:self];
- }
- /*
- #pragma mark - Navigation
- // In a storyboard-based application, you will often want to do a little preparation before navigation
- - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
- // Get the new view controller using [segue destinationViewController].
- // Pass the selected object to the new view controller.
- }
- */
- @end
|