JXTalkViewController.m 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619
  1. //
  2. // JXTalkViewController.m
  3. // shiku_im
  4. //
  5. // Created by p on 2019/6/18.
  6. // Copyright © 2019年 Reese. All rights reserved.
  7. //
  8. #import "JXTalkViewController.h"
  9. #import "UIImage+Color.h"
  10. #import "JXTalkCell.h"
  11. #import "JXTalkModel.h"
  12. #import "JXTalkDetailView.h"
  13. @interface JXTalkViewController ()<UITableViewDelegate, UITableViewDataSource,UICollectionViewDelegate, UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>
  14. @property (nonatomic, strong) UIImageView *headImage;
  15. @property (nonatomic, strong) UILabel *name;
  16. @property (nonatomic, strong) UIButton *talkBtn;
  17. @property (nonatomic, strong) UITableView *tableView;
  18. @property (nonatomic, assign) BOOL isSpeak;
  19. @property (nonatomic, strong) NSTimer *timer;
  20. @property (nonatomic, assign) int timerNum;
  21. @property (nonatomic, strong) NSTimer *pingTimer;
  22. @property (nonatomic, assign) int pingTimerNum;
  23. @property (nonatomic, copy) NSString *currentUserId;
  24. @property (nonatomic, strong) NSMutableArray *talkArray;
  25. @property (nonatomic, strong) UIImageView *idleImageView;
  26. @property (nonatomic, strong) UIImageView *aniImageView;
  27. @property (nonatomic, strong) UIImageView *freeIcon;
  28. @property (nonatomic, strong) UIImageView *holdIcon;
  29. @property (nonatomic, strong) UILabel *talkBtnLabel;
  30. @property (nonatomic, strong) UICollectionView *collectionView;
  31. @property (nonatomic, strong) JXTalkDetailView *talkView;
  32. @end
  33. @implementation JXTalkViewController
  34. - (void)viewDidLoad {
  35. [super viewDidLoad];
  36. // Do any additional setup after loading the view.
  37. self.isGotoBack = YES;
  38. self.heightHeader = 0;
  39. self.heightFooter = 0;
  40. self.view.frame = g_window.bounds;
  41. [self createHeadAndFoot];
  42. self.talkArray = [NSMutableArray array];
  43. JXTalkModel *model = [[JXTalkModel alloc] init];
  44. model.userId = g_myself.userId;
  45. model.userName = g_myself.userNickname;
  46. model.lastTime = 0;
  47. model.talkTime = 0;
  48. [self.talkArray addObject:model];
  49. [self customView];
  50. [g_notify addObserver:self selector:@selector(newMsgCome:) name:kXMPPNewMsgNotifaction object:nil];
  51. [g_notify addObserver:self selector:@selector(refreshTalkList:) name:kRefreshTalkListNotification object:nil];
  52. }
  53. - (void)dealloc {
  54. [g_notify removeObserver:self];
  55. [_timer invalidate];
  56. _timer = nil;
  57. [_pingTimer invalidate];
  58. _pingTimer = nil;
  59. }
  60. - (JXTalkDetailView *)talkView {
  61. if (!_talkView) {
  62. _talkView = [[JXTalkDetailView alloc] initWithFrame:self.view.bounds];
  63. [self.view addSubview:_talkView];
  64. }
  65. return _talkView;
  66. }
  67. - (void)refreshTalkList:(NSNotification *)notif {
  68. [_collectionView reloadData];
  69. }
  70. - (void)customView {
  71. self.tableBody.backgroundColor = [UIColor whiteColor];
  72. self.tableBody.contentSize = CGSizeMake(0, 0);
  73. UIImageView *backImageView = [[UIImageView alloc] initWithFrame:CGRectMake(15, 24, JX_SCREEN_WIDTH - 30, JX_SCREEN_HEIGHT - 48)];
  74. backImageView.image = [UIImage imageNamed:@"Talk_BackImage"];
  75. backImageView.userInteractionEnabled = YES;
  76. [self.tableBody addSubview:backImageView];
  77. UIButton *close = [[UIButton alloc] initWithFrame:CGRectMake(JX_SCREEN_WIDTH - 47, 24, 32, 32)];
  78. [close setImage:[UIImage imageNamed:@"Talk_sign_out_icon"] forState:UIControlStateNormal];
  79. [close addTarget:self action:@selector(talkClose) forControlEvents:UIControlEventTouchUpInside];
  80. [self.tableBody addSubview:close];
  81. UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(24, 118, backImageView.frame.size.width - 48, backImageView.frame.size.height - 271)];
  82. contentView.backgroundColor = [UIColor whiteColor];
  83. contentView.layer.cornerRadius = 20.0;
  84. contentView.layer.masksToBounds = YES;
  85. [backImageView addSubview:contentView];
  86. _aniImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 40, 119, 119)];
  87. _aniImageView.center = CGPointMake(contentView.frame.size.width / 2, _aniImageView.center.y);
  88. _aniImageView.animationDuration = 1.5;
  89. _aniImageView.hidden = YES;
  90. [contentView addSubview:_aniImageView];
  91. NSMutableArray *aniArr = [[NSMutableArray alloc] init];
  92. [aniArr addObject:[UIImage imageNamed:@"Talk_Animation_1"]];
  93. [aniArr addObject:[UIImage imageNamed:@"Talk_Animation_2"]];
  94. [aniArr addObject:[UIImage imageNamed:@"Talk_Animation_3"]];
  95. _aniImageView.animationImages = aniArr;
  96. _idleImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 54, 91, 91)];
  97. _idleImageView.center = CGPointMake(contentView.frame.size.width / 2, _idleImageView.center.y);
  98. _idleImageView.image = [UIImage imageNamed:@"Talk_Idle_circle"];
  99. _idleImageView.backgroundColor = [UIColor clearColor];
  100. [contentView addSubview:_idleImageView];
  101. _headImage = [[UIImageView alloc] initWithFrame:CGRectMake(4, 4, 83, 83)];
  102. _headImage.image = [UIImage imageNamed:@"Talk_BackBtnImage"];
  103. _headImage.layer.cornerRadius = _headImage.frame.size.width / 2;
  104. _headImage.layer.masksToBounds = YES;
  105. [_idleImageView addSubview:_headImage];
  106. _freeIcon = [[UIImageView alloc] initWithFrame:CGRectMake(0, 19, 29, 29)];
  107. _freeIcon.center = CGPointMake(_idleImageView.frame.size.width / 2, _freeIcon.center.y);
  108. _freeIcon.image = [UIImage imageNamed:@"Talk_free"];
  109. [_idleImageView addSubview:_freeIcon];
  110. _name = [[UILabel alloc] initWithFrame:CGRectMake(4, 56, _headImage.frame.size.width, 13)];
  111. _name.font = [UIFont systemFontOfSize:13.0];
  112. _name.textColor = HEXCOLOR(0x333333);
  113. _name.text = Localized(@"JX_InterphoneIdle");
  114. _name.textAlignment = NSTextAlignmentCenter;
  115. [_idleImageView addSubview:_name];
  116. // _headImage = [[UIImageView alloc] initWithFrame:CGRectMake((JX_SCREEN_WIDTH - 150) /2, THE_DEVICE_HAVE_HEAD ? 40 : 20, 150, 150)];
  117. // _headImage.image = [UIImage imageNamed:@"Talk_BackBtnImage"];
  118. // _headImage.layer.cornerRadius = _headImage.frame.size.width / 2;
  119. // _headImage.layer.masksToBounds = YES;
  120. // [self.tableBody addSubview:_headImage];
  121. UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
  122. layout.sectionInset =UIEdgeInsetsMake(0,0, 0, 0);
  123. _collectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(0,199,contentView.frame.size.width,contentView.frame.size.height - 229) collectionViewLayout:layout];
  124. _collectionView.backgroundColor = UIColor.whiteColor;
  125. _collectionView.dataSource = self;
  126. _collectionView.delegate = self;
  127. _collectionView.showsHorizontalScrollIndicator = NO;
  128. _collectionView.showsVerticalScrollIndicator = YES;
  129. [_collectionView registerClass:[JXTalkCell class] forCellWithReuseIdentifier:NSStringFromClass([JXTalkCell class])];
  130. [contentView addSubview:_collectionView];
  131. _tableView = [[UITableView alloc] initWithFrame:CGRectMake(backImageView.frame.origin.x - 24, backImageView.frame.origin.y - 118, backImageView.frame.size.width - 48, backImageView.frame.size.height - 170) style:UITableViewStylePlain];
  132. _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
  133. _tableView.backgroundColor = [UIColor whiteColor];
  134. _tableView.layer.cornerRadius = 20;
  135. _tableView.layer.masksToBounds = YES;
  136. // _tableView.tableHeaderView = headerView;
  137. _tableView.delegate = self;
  138. _tableView.dataSource = self;
  139. // [self.tableBody addSubview:_tableView];
  140. _talkBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, backImageView.frame.size.height - 91 - 31, 91, 91)];
  141. _talkBtn.center = CGPointMake(backImageView.frame.size.width / 2, _talkBtn.center.y);
  142. [_talkBtn setBackgroundImage:[UIImage createImageWithColor:[UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:0.2]] forState:UIControlStateNormal];
  143. [_talkBtn setBackgroundImage:[UIImage createImageWithColor:[UIColor colorWithRed:255/255.0 green:101/255.0 blue:101/255.0 alpha:0.2]] forState:UIControlStateHighlighted];
  144. [_talkBtn addTarget:self action:@selector(talkStart:) forControlEvents:UIControlEventTouchDown];
  145. [_talkBtn addTarget:self action:@selector(talkStop:) forControlEvents:UIControlEventTouchUpInside];
  146. [_talkBtn addTarget:self action:@selector(talkCancel:) forControlEvents:UIControlEventTouchUpOutside];
  147. _talkBtn.layer.cornerRadius = _talkBtn.frame.size.width / 2;
  148. _talkBtn.layer.masksToBounds = YES;
  149. // [_talkBtn setImage:[UIImage imageNamed:@"Talk_Idle_circle"] forState:UIControlStateNormal];
  150. [backImageView addSubview:_talkBtn];
  151. UIImageView *whiteImageView = [[UIImageView alloc] initWithFrame:CGRectMake(4, 4, 83, 83)];
  152. whiteImageView.image = [UIImage imageNamed:@"Talk_BackBtnImage"];
  153. [_talkBtn addSubview:whiteImageView];
  154. _holdIcon = [[UIImageView alloc] initWithFrame:CGRectMake(0, 15, 29, 29)];
  155. _holdIcon.center = CGPointMake(whiteImageView.frame.size.width / 2, _holdIcon.center.y);
  156. _holdIcon.image = [UIImage imageNamed:@"Talk_hold"];
  157. [whiteImageView addSubview:_holdIcon];
  158. _talkBtnLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 52, whiteImageView.frame.size.width, 13)];
  159. _talkBtnLabel.font = [UIFont systemFontOfSize:13.0];
  160. _talkBtnLabel.textColor = HEXCOLOR(0x333333);
  161. _talkBtnLabel.text = Localized(@"JXChatVC_TouchTalk");
  162. _talkBtnLabel.textAlignment = NSTextAlignmentCenter;
  163. [whiteImageView addSubview:_talkBtnLabel];
  164. // UILabel *talkBtnLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, _talkBtn.frame.size.width, 60)];
  165. // talkBtnLabel.textColor = [UIColor whiteColor];
  166. // talkBtnLabel.textAlignment = NSTextAlignmentCenter;
  167. // talkBtnLabel.text = Localized(@"JXChatVC_TouchTalk");
  168. // [_talkBtn addSubview:talkBtnLabel];
  169. //
  170. // UIImageView *talkBtnImage = [[UIImageView alloc] initWithFrame:CGRectMake((_talkBtn.frame.size.width - 50) / 2, CGRectGetMaxY(talkBtnLabel.frame), 50, 50)];
  171. // talkBtnImage.image = [UIImage imageNamed:@"talk_microphone"];
  172. // [_talkBtn addSubview:talkBtnImage];
  173. // UIView *tipView = [[UIView alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(_name.frame), JX_SCREEN_WIDTH, 40)];
  174. // tipView.backgroundColor = HEXCOLOR(0xCBE2FF);
  175. // [self.tableBody addSubview:tipView];
  176. //
  177. // UILabel *tipLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 0, tipView.frame.size.width - 20, tipView.frame.size.height)];
  178. // tipLabel.text = Localized(@"JX_ConversationPersonnel");
  179. // [tipView addSubview:tipLabel];
  180. }
  181. - (void)talkStart:(UIButton *)btn {
  182. if (!self.isSpeak) {
  183. if ([self.delegate respondsToSelector:@selector(talkVCTalkStart)]) {
  184. [self.delegate talkVCTalkStart];
  185. }
  186. NSInteger index = 0;
  187. JXTalkModel *talkModel = [[JXTalkModel alloc] init];
  188. for (NSInteger i = 0; i < self.talkArray.count; i ++) {
  189. JXTalkModel *model = self.talkArray[i];
  190. if ([model.userId isEqualToString:g_myself.userId]) {
  191. index = i;
  192. talkModel.userId = model.userId;
  193. talkModel.userName = model.userName;
  194. talkModel.lastTime = model.lastTime;
  195. talkModel.talkTime = model.talkTime;
  196. break;
  197. }
  198. }
  199. [self.talkArray removeObjectAtIndex:index];
  200. [self.talkArray insertObject:talkModel atIndex:0];
  201. [_collectionView reloadData];
  202. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  203. [g_server getHeadImageLarge:g_myself.userId userName:g_myself.userNickname imageView:_headImage];
  204. _name.hidden = YES;
  205. _freeIcon.hidden = YES;
  206. _idleImageView.image = nil;
  207. _aniImageView.hidden = NO;
  208. [_aniImageView startAnimating];
  209. _talkBtnLabel.textColor = HEXCOLOR(0xFF6565);
  210. _holdIcon.image = [UIImage imageNamed:@"Talk_hold_h"];
  211. [g_notify postNotificationName:@"TalkActionNotfi" object:@{@"type":@"1", @"userId":g_myself.userId}];
  212. });
  213. [self sendSetSpeakerMsg];
  214. [self sendOnlineMsg:nil];
  215. _timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(onlineTimerAction:) userInfo:nil repeats:YES];
  216. }
  217. }
  218. - (void)onlineTimerAction:(NSTimer *)timer {
  219. self.timerNum ++;
  220. if (self.timerNum % 5 == 0) {
  221. [self sendOnlineMsg:nil];
  222. }
  223. }
  224. - (void)talkStop:(UIButton *)btn {
  225. if ([self.delegate respondsToSelector:@selector(talkVCTalkStop)]) {
  226. [self.delegate talkVCTalkStop];
  227. }
  228. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.7 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  229. _headImage.image = [UIImage imageNamed:@"Talk_BackBtnImage"];
  230. _name.hidden = NO;
  231. _freeIcon.hidden = NO;
  232. [_aniImageView stopAnimating];
  233. _aniImageView.hidden = YES;
  234. _idleImageView.image = [UIImage imageNamed:@"Talk_Idle_circle"];
  235. _talkBtnLabel.textColor = HEXCOLOR(0x333333);
  236. _holdIcon.image = [UIImage imageNamed:@"Talk_hold"];
  237. [g_notify postNotificationName:@"TalkActionNotfi" object:@{@"type":@"0", @"userId":g_myself.userId}];
  238. });
  239. [self sendAllSpeakerMsg];
  240. [_timer invalidate];
  241. _timer = nil;
  242. }
  243. - (void)talkCancel:(UIButton *)btn {
  244. [self talkStop:btn];
  245. // _talkBtn.state = UIControlStateNormal;
  246. }
  247. - (void)sendOnlineMsg:(JXMessageObject *)msg1 {
  248. JXMessageObject *msg=[[JXMessageObject alloc]init];
  249. msg.content = nil;
  250. msg.timeSend = [NSDate date];
  251. msg.fromUserId = MY_USER_ID;
  252. msg.fromUserName = MY_USER_NAME;
  253. msg.toUserId = self.roomNum;
  254. msg.isGroup = YES;
  255. msg.type = [NSNumber numberWithInt:kWCMessageTypeTalkOnline];
  256. msg.isSend = [NSNumber numberWithInt:transfer_status_ing];
  257. msg.isRead = [NSNumber numberWithBool:NO];
  258. msg.isReadDel = [NSNumber numberWithInt:NO];
  259. msg.sendCount = 1;
  260. msg.objectId = self.roomNum;
  261. [msg insert:nil];
  262. [g_xmpp sendMessage:msg roomName:self.roomNum];//发送消息
  263. }
  264. - (void)talkClose {
  265. if ([self.delegate respondsToSelector:@selector(talkVCCloseBtnAction)]) {
  266. [self.delegate talkVCCloseBtnAction];
  267. }
  268. [self sendQuitTalkMsg];
  269. JXTalkModel *model = self.talkArray.firstObject;
  270. model.lastTime = 0;
  271. model.talkTime = 0;
  272. }
  273. // 发送轮麦消息
  274. - (void)sendSetSpeakerMsg {
  275. JXMessageObject *msg = [[JXMessageObject alloc] init];
  276. msg.content = nil;
  277. msg.timeSend = [NSDate date];
  278. msg.fromUserId = MY_USER_ID;
  279. msg.fromUserName = MY_USER_NAME;
  280. msg.toUserId = self.roomNum;
  281. msg.isGroup = YES;
  282. msg.type = [NSNumber numberWithInt:kWCMessageTypeAudioMeetingSetSpeaker];
  283. msg.isSend = [NSNumber numberWithInt:transfer_status_ing];
  284. msg.isRead = [NSNumber numberWithBool:NO];
  285. msg.isReadDel = [NSNumber numberWithInt:NO];
  286. msg.sendCount = 1;
  287. msg.objectId = self.roomNum;
  288. [msg insert:nil];
  289. [g_xmpp sendMessage:msg roomName:self.roomNum];//发送消息
  290. }
  291. // 发送取消轮麦消息
  292. - (void)sendAllSpeakerMsg {
  293. JXMessageObject *msg = [[JXMessageObject alloc] init];
  294. msg.content = nil;
  295. msg.timeSend = [NSDate date];
  296. msg.fromUserId = MY_USER_ID;
  297. msg.fromUserName = MY_USER_NAME;
  298. msg.toUserId = self.roomNum;
  299. msg.isGroup = YES;
  300. msg.type = [NSNumber numberWithInt:kWCMessageTypeAudioMeetingAllSpeaker];
  301. msg.isSend = [NSNumber numberWithInt:transfer_status_ing];
  302. msg.isRead = [NSNumber numberWithBool:NO];
  303. msg.isReadDel = [NSNumber numberWithInt:NO];
  304. msg.sendCount = 1;
  305. msg.objectId = self.roomNum;
  306. [msg insert:nil];
  307. [g_xmpp sendMessage:msg roomName:self.roomNum];//发送消息
  308. }
  309. - (void)newMsgCome:(NSNotification *)notif {
  310. JXMessageObject *msg = notif.object;
  311. if ([msg.fromUserId isEqualToString:g_myself.userId]) {
  312. return;
  313. }
  314. if ([msg.type intValue] == kWCMessageTypeAudioMeetingSetSpeaker) {
  315. if (!self.isSpeak) {
  316. self.isSpeak = YES;
  317. _talkBtn.enabled = NO;
  318. _currentUserId = msg.fromUserId;
  319. NSInteger index = 0;
  320. JXTalkModel *talkModel = [[JXTalkModel alloc] init];
  321. for (NSInteger i = 0; i < self.talkArray.count; i ++) {
  322. JXTalkModel *model = self.talkArray[i];
  323. if ([model.userId isEqualToString:msg.fromUserId]) {
  324. index = i;
  325. talkModel.userId = model.userId;
  326. talkModel.userName = model.userName;
  327. talkModel.lastTime = model.lastTime;
  328. talkModel.talkTime = model.talkTime;
  329. break;
  330. }
  331. }
  332. [self.talkArray removeObjectAtIndex:index];
  333. [self.talkArray insertObject:talkModel atIndex:0];
  334. [_collectionView reloadData];
  335. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  336. [g_server getHeadImageLarge:msg.fromUserId userName:msg.fromUserName imageView:_headImage];
  337. _name.hidden = YES;
  338. _freeIcon.hidden = YES;
  339. _idleImageView.image = nil;
  340. _aniImageView.hidden = NO;
  341. [_aniImageView startAnimating];
  342. [g_notify postNotificationName:@"TalkActionNotfi" object:@{@"type":@"1", @"userId":msg.fromUserId}];
  343. });
  344. _pingTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(pingTimerAction:) userInfo:nil repeats:YES];
  345. }
  346. }
  347. if ([msg.type intValue] == kWCMessageTypeAudioMeetingAllSpeaker) {
  348. self.isSpeak = NO;
  349. _talkBtn.enabled = YES;
  350. _headImage.image = [UIImage imageNamed:@"Talk_BackBtnImage"];
  351. _name.hidden = NO;
  352. _freeIcon.hidden = NO;
  353. [_aniImageView stopAnimating];
  354. _aniImageView.hidden = YES;
  355. _idleImageView.image = [UIImage imageNamed:@"Talk_Idle_circle"];
  356. [g_notify postNotificationName:@"TalkActionNotfi" object:@{@"type":@"0", @"userId":msg.fromUserId}];
  357. [_pingTimer invalidate];
  358. _pingTimer = nil;
  359. }
  360. if ([msg.type intValue] == kWCMessageTypeTalkJoin || [msg.type intValue] == kWCMessageTypeTalkOnline) {
  361. BOOL flag = NO;
  362. for (JXTalkModel *model in self.talkArray) {
  363. if ([model.userId isEqualToString:msg.fromUserId]) {
  364. flag = YES;
  365. break;
  366. }
  367. }
  368. if (!flag) {
  369. JXTalkModel *model = [[JXTalkModel alloc] init];
  370. model.userId = msg.fromUserId;
  371. model.userName = msg.fromUserName;
  372. model.lastTime = 0;
  373. model.talkTime = 0;
  374. [self.talkArray addObject:model];
  375. [_collectionView reloadData];
  376. }
  377. if ([msg.type intValue] == kWCMessageTypeTalkOnline) {
  378. self.pingTimerNum = 0;
  379. }
  380. if ([msg.type intValue] == kWCMessageTypeTalkJoin) {
  381. [self sendOnlineMsg:msg];
  382. }
  383. }
  384. if ([msg.type intValue] == kWCMessageTypeTalkQuit) {
  385. NSInteger index = -1;
  386. for (NSInteger i = 0; i < self.talkArray.count; i ++) {
  387. JXTalkModel *model = self.talkArray[i];
  388. if ([model.userId isEqualToString:msg.fromUserId]) {
  389. index = i;
  390. break;
  391. }
  392. }
  393. if (index >= 0) {
  394. [self.talkArray removeObjectAtIndex:index];
  395. [_collectionView reloadData];
  396. }
  397. }
  398. }
  399. - (void)pingTimerAction:(NSTimer *)timer {
  400. self.pingTimerNum ++;
  401. if (self.pingTimerNum > 10) {
  402. _name.text = Localized(@"JX_NetWorkError");
  403. }
  404. if (self.pingTimerNum > 15) {
  405. self.isSpeak = NO;
  406. _talkBtn.enabled = YES;
  407. _headImage.image = [UIImage imageNamed:@"avatar_normal"];
  408. _name.text = Localized(@"JX_InterphoneIdle");
  409. [g_notify postNotificationName:@"TalkActionNotfi" object:@{@"type":@"0", @"userId":_currentUserId}];
  410. [_pingTimer invalidate];
  411. _pingTimer = nil;
  412. }
  413. }
  414. - (void)sendQuitTalkMsg {
  415. JXMessageObject *msg=[[JXMessageObject alloc]init];
  416. msg.content = nil;
  417. msg.timeSend = [NSDate date];
  418. msg.fromUserId = MY_USER_ID;
  419. msg.fromUserName = MY_USER_NAME;
  420. msg.toUserId = self.roomNum;
  421. msg.isGroup = YES;
  422. msg.type = [NSNumber numberWithInt:kWCMessageTypeTalkQuit];
  423. msg.isSend = [NSNumber numberWithInt:transfer_status_ing];
  424. msg.isRead = [NSNumber numberWithBool:NO];
  425. msg.isReadDel = [NSNumber numberWithInt:NO];
  426. msg.sendCount = 1;
  427. msg.objectId = self.roomNum;
  428. [msg insert:nil];
  429. [g_xmpp sendMessage:msg roomName:self.roomNum];//发送消息
  430. }
  431. //- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  432. //
  433. // return self.talkArray.count;
  434. //}
  435. //
  436. //- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  437. //
  438. // JXTalkCell *cell = [tableView dequeueReusableCellWithIdentifier:@"JXTalkCell"];
  439. //
  440. // if (!cell) {
  441. // cell = [[JXTalkCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"JXTalkCell"];
  442. // }
  443. // JXTalkModel *model = [self.talkArray objectAtIndex:indexPath.row];
  444. // cell.talkModel = model;
  445. // return cell;
  446. //}
  447. //
  448. //- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  449. //
  450. // return 60;
  451. //}
  452. #pragma mark UICollectionView delegate
  453. #pragma mark-----多少组
  454. - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
  455. return 1;
  456. }
  457. #pragma mark-----多少个
  458. - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
  459. return self.talkArray.count;
  460. }
  461. #pragma mark-----每一个的大小
  462. - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
  463. {
  464. return CGSizeMake(92, 93);
  465. }
  466. #pragma mark-----每一个边缘留白
  467. - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
  468. return UIEdgeInsetsMake(0, 0, 0, 0);
  469. }
  470. #pragma mark-----最小行间距
  471. - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{
  472. return 0;
  473. }
  474. #pragma mark-----最小竖间距
  475. - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section{
  476. return 0;
  477. }
  478. #pragma mark-----返回每个单元格是否可以被选择
  479. - (BOOL)collectionView:(UICollectionView *)collectionView shouldShowMenuForItemAtIndexPath:(NSIndexPath *)indexPath{
  480. return YES;
  481. }
  482. #pragma mark-----创建单元格
  483. - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
  484. JXTalkCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([JXTalkCell class]) forIndexPath:indexPath];
  485. cell.backgroundColor = [UIColor whiteColor];
  486. JXTalkModel *model = [self.talkArray objectAtIndex:indexPath.row];
  487. cell.talkModel = model;
  488. return cell;
  489. }
  490. #pragma mark-----点击单元格
  491. - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
  492. JXTalkModel *model = [self.talkArray objectAtIndex:indexPath.row];
  493. self.talkView.hidden = NO;
  494. [g_server getHeadImageLarge:model.userId userName:model.userName imageView:self.talkView.headImageView];
  495. self.talkView.nameLabel.text = model.userName;
  496. if (model.lastTime > 0) {
  497. self.talkView.lastLabel.text = [NSString stringWithFormat:@"上次抢麦:%@", [TimeUtil formatDate:[NSDate dateWithTimeIntervalSince1970:model.lastTime] format:@"HH:mm:ss"]];
  498. }else {
  499. self.talkView.lastLabel.text = [NSString stringWithFormat:@"上次抢麦:"];
  500. }
  501. if (model.talkTime > 0) {
  502. self.talkView.talkLable.text = [NSString stringWithFormat:@"发言时间:%@",[TimeUtil getTimeShort1:model.talkTime]];
  503. }else {
  504. self.talkView.talkLable.text = [NSString stringWithFormat:@"发言时间:"];
  505. }
  506. }
  507. /*
  508. #pragma mark - Navigation
  509. // In a storyboard-based application, you will often want to do a little preparation before navigation
  510. - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
  511. // Get the new view controller using [segue destinationViewController].
  512. // Pass the selected object to the new view controller.
  513. }
  514. */
  515. @end