{\rtf1\ansi\ansicpg936\cocoartf2513 \cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fnil\fcharset0 Menlo-Regular;\f1\fnil\fcharset134 PingFangSC-Regular;\f2\fnil\fcharset0 Menlo-Bold; \f3\fnil\fcharset0 HelveticaNeue;\f4\fnil\fcharset134 PingFangSC-Semibold;\f5\fnil\fcharset0 AppleColorEmoji; } {\colortbl;\red255\green255\blue255;\red93\green108\blue121;\red255\green255\blue255;\red0\green0\blue0; \red100\green56\blue32;\red196\green26\blue22;\red28\green0\blue207;\red155\green35\blue147;\red28\green70\blue74; \red57\green0\blue160;\red15\green104\blue160;\red93\green108\blue121;\red11\green79\blue121;\red108\green54\blue169; \red50\green109\blue116;\red74\green85\blue96;\red14\green14\blue255;} {\*\expandedcolortbl;;\csgenericrgb\c36526\c42188\c47515;\csgenericrgb\c100000\c100000\c100000;\csgenericrgb\c0\c0\c0\c85000; \csgenericrgb\c39147\c22031\c12446;\csgenericrgb\c77000\c10200\c8600;\csgenericrgb\c11000\c0\c81000;\csgenericrgb\c60759\c13753\c57628;\csgenericrgb\c10981\c27276\c28869; \csgenericrgb\c22454\c0\c62803;\csgenericrgb\c5882\c40784\c62745;\csgenericrgb\c36526\c42188\c47515\c35000;\csgenericrgb\c4314\c30980\c47451;\csgenericrgb\c42190\c21278\c66379; \csgenericrgb\c19418\c42935\c45455;\csgenericrgb\c29020\c33333\c37647;\csgenericrgb\c5500\c5500\c100000;} \margl1440\margr1440\vieww9000\viewh8400\viewkind0 \deftab593 \pard\tx593\pardeftab593\pardirnatural\partightenfactor0 \f0\fs24 \cf2 \cb3 //\cf4 \ \cf2 // JXChatViewC.m\cf4 \ \cf2 //\cf4 \ \cf2 // Created by Reese on 13-8-11.\cf4 \ \cf2 // Copyright (c) 2013 \f1 \'c4\'ea \f0 Reese. All rights reserved.\cf4 \ \cf2 // \f1 \'a3\'bf \f0 1111\cf4 \ \ \ \cf5 #import \cf6 "JXChatViewC.h"\cf2 //\cf4 \ \ \cf5 #import \cf6 "ChatCacheFileUtil.h"\cf4 \ \cf5 #import \cf6 "VoiceConverter.h"\cf4 \ \cf5 #import \cf6 "Photo.h"\cf4 \ \cf5 #import \cf6 "NSData+XMPP.h"\cf4 \ \cf5 #import \cf6 "AppDelegate.h"\cf4 \ \cf5 #import \cf6 "JXEmoji.h"\cf4 \ \cf5 #import \cf6 "FaceViewController.h"\cf4 \ \cf5 #import \cf6 "gifViewController.h"\cf4 \ \cf5 #import \cf6 "emojiViewController.h"\cf4 \ \cf5 #import \cf6 "SCGIFImageView.h"\cf4 \ \cf2 //#import "JXImageView.h"\cf4 \ \cf5 #import \cf6 "JXSelectImageView.h"\cf4 \ \cf5 #import \cf6 "emojiViewController.h"\cf4 \ \cf5 #import \cf6 "JXTableView.h"\cf4 \ \cf5 #import \cf6 "LXActionSheet.h"\cf4 \ \cf5 #import \cf6 "JXVolumeView.h"\cf4 \ \cf5 #import \cf6 "myMediaVC.h"\cf4 \ \cf5 #import \cf6 "JXMediaObject.h"\cf4 \ \cf5 #import \cf6 "FMDatabase.h"\cf4 \ \cf5 #import \cf6 "JXMyTools.h"\cf4 \ \cf5 #if TAR_IM\cf4 \ \cf5 #ifdef Meeting_Version\cf4 \ \cf5 #import \cf6 "JXMeetingObject.h"\cf4 \ \cf5 #import \cf6 "AskCallViewController.h"\cf4 \ \cf5 #import \cf6 "JXAVCallViewController.h"\cf4 \ \cf5 #endif\cf4 \ \cf5 #endif\cf4 \ \cf5 #ifdef Live_Version\cf4 \ \cf5 #import \cf6 "JXLiveJidManager.h"\cf4 \ \cf5 #endif\cf4 \ \cf5 #import \cf6 "JXUserInfoVC.h"\cf4 \ \cf5 #import \cf6 "JXRoomMemberVC.h"\cf4 \ \cf5 #import \cf6 "JXRoomObject.h"\cf4 \ \cf5 #import \cf6 "JXRoomRemind.h"\cf4 \ \cf5 #import \cf6 "JXSelFriendVC.h"\cf4 \ \cf5 #import \cf6 "JXMyFile.h"\cf4 \ \cf5 #import \cf6 "JXShareFileObject.h"\cf4 \ \cf5 #import \cf6 "JXFileDetailViewController.h"\cf4 \ \ \cf5 #import \cf6 "JXMapData.h"\cf4 \ \cf5 #import \cf6 "JXSendRedPacketViewController.h"\cf4 \ \ \cf5 #import \cf6 "JXredPacketDetailVC.h"\cf4 \ \cf5 #import \cf6 "JXOpenRedPacketVC.h"\cf4 \ \cf2 // \f1 \'cc\'ed\'bc\'d3 \f0 VC \f1 \'d7\'aa\'b3\'a1\'b6\'af\'bb\'ad \f0 \cf4 \ \cf5 #import \cf6 "DMScaleTransition.h"\cf4 \ \cf2 // \f1 \'b8\'f7\'d6\'d6 \f0 Cell\cf4 \ \cf5 #import \cf6 "JXBaseChatCell.h"\cf4 \ \cf5 #import \cf6 "JXMessageCell.h"\cf4 \ \cf5 #import \cf6 "JXImageCell.h"\cf4 \ \cf5 #import \cf6 "JXFileCell.h"\cf4 \ \cf5 #import \cf6 "JXVideoCell.h"\cf4 \ \cf5 #import \cf6 "JXAudioCell.h"\cf4 \ \cf5 #import \cf6 "JXLocationCell.h"\cf4 \ \cf5 #import \cf6 "JXCardCell.h"\cf4 \ \cf5 #import \cf6 "JXRedPacketCell.h"\cf4 \ \cf5 #import \cf6 "JXRemindCell.h"\cf4 \ \cf5 #import \cf6 "JXGifCell.h"\cf4 \ \cf5 #import \cf6 "JXSystemImage1Cell.h"\cf4 \ \cf5 #import \cf6 "JXSystemImage2Cell.h"\cf4 \ \cf5 #import \cf6 "JXAVCallCell.h"\cf4 \ \cf5 #import \cf6 "JXLinkCell.h"\cf4 \ \cf5 #import \cf6 "JXShakeCell.h"\cf4 \ \cf5 #import \cf6 "JXNewShakeCell.h"\cf4 \ \cf5 #import \cf6 "JXMergeRelayCell.h"\cf4 \ \cf5 #import \cf6 "JXShareCell.h"\cf4 \ \cf5 #import \cf6 "JXTransferCell.h"\cf4 \ \cf5 #import \cf6 "JXReplyCell.h"\cf4 \ \ \cf5 #import \cf6 "EmojiTextAttachment.h"\cf4 \ \cf5 #import \cf6 "NSAttributedString+EmojiExtension.h"\cf4 \ \ \cf5 #import \cf6 "ImageBrowserViewController.h"\cf4 \ \cf5 #import \cf6 "JXRelayVC.h"\cf4 \ \cf5 #import \cf6 "webpageVC.h"\cf4 \ \cf5 #import \cf6 "JX_DownListView.h"\cf4 \ \cf5 #import \cf6 "JXReadListVC.h"\cf4 \ \cf5 #import \cf6 \cf4 \ \cf5 #import \cf6 "UIImageView+WebCache.h"\cf4 \ \cf5 #import \cf6 "JXCameraVC.h"\cf4 \ \cf5 #import \cf6 "JXChatSettingVC.h"\cf4 \ \cf5 #import \cf6 "JXVerifyDetailVC.h"\cf4 \ \cf5 #import \cf6 "JXDevice.h"\cf4 \ \cf5 #import \cf6 "JXChatLogVC.h"\cf4 \ \cf5 #import \cf6 "JXSelectFriendsVC.h"\cf4 \ \cf5 #import \cf6 "JXMsgViewController.h"\cf4 \ \cf5 #import \cf6 "WeiboViewControlle.h"\cf4 \ \cf5 #import \cf6 "ObjUrlData.h"\cf4 \ \cf5 #import \cf6 "JXSynTask.h"\cf4 \ \cf5 #import \cf6 "JXGoogleMapVC.h"\cf4 \ \cf5 #import \cf6 "RITLPhotosViewController.h"\cf4 \ \cf5 #import \cf6 "RITLPhotosDataManager.h"\cf4 \ \cf5 #import \cf6 "JXActionSheetVC.h"\cf4 \ \cf5 #import \cf6 "JXInputVC.h"\cf4 \ \cf5 #import \cf6 "JXRoomPool.h"\cf4 \ \cf5 #import \cf6 "KKImageEditorViewController.h"\cf4 \ \cf5 #import \cf6 "JXTransferViewController.h"\cf4 \ \cf5 #import \cf6 "JXTransferDeatilVC.h"\cf4 \ \cf5 #import \cf6 "JXSelectAddressBookVC.h"\cf4 \ \cf5 #import \cf6 "JXInputMoneyVC.h"\cf4 \ \cf5 #import \cf6 "JXGroupHelperListVC.h"\cf4 \ \cf5 #import \cf6 "JXGroupHeplerModel.h"\cf4 \ \cf5 #import \cf6 "JXAutoReplyAideVC.h"\cf4 \ \cf5 #import \cf6 "JXLabelObject.h"\cf4 \ \cf5 #import \cf6 "JXEmojiCell.h"\cf4 \ \cf5 #import \cf6 "JXFaceCustomCell.h"\cf4 \ \cf5 #import \cf6 "CYGroupSendHelperViewController.h"\cf4 \ \cf5 #import \cf6 "DYAdAlertView.h"\cf4 \ \cf5 #import \cf6 "DYWKWebVC.h"\cf4 \ \cf5 #import \cf6 "DYAdModel.h"\cf4 \ \cf5 #import \cf6 "STAlertView.h"\cf4 \ \cf5 #import \cf6 "XLsn0wInputBox.h"\cf4 \ \cf5 #import \cf6 "JLGroupActivityModel.h"\cf4 \ \cf5 #import \cf6 "DSHPopupContainer.h"\cf4 \ \cf5 #import \cf6 "JLSelectView.h"\cf4 \ \cf5 #import \cf6 "MISFloatingBall.h"\cf4 \ \cf5 #import \cf6 "CYWebCustomerServiceVC.h"\cf4 \ \cf5 #import \cf6 "JXUserDetialVc.h"\cf4 \ \cf5 #import \cf6 "JXtopShowVIew.h"\cf4 \ \cf5 #import \cf6 "JxChatGetNoticePersonVc.h"\cf4 \ \cf5 #import \cf6 "JxChatGetNoticePersonGVc.h"\cf4 \ \cf5 #import \cf6 "JXSiDaiWebView.h"\cf4 \ \cf5 #import \cf6 "JXBigReelVc.h"\cf4 \ \cf5 #import \cf6 "JXLuckRescueFundVc.h"\cf4 \ \cf5 #import \cf6 "JXApplyViewController.h"\cf4 \ \cf5 #import \cf6 "JXGoldMangVc.h"\cf4 \ \ \cf5 #define faceHeight (THE_DEVICE_HAVE_HEAD ? \cf7 253\cf5 : \cf7 218\cf5 )\cf4 \ \cf5 #define PAGECOUNT \cf7 50\cf4 \ \cf5 #define NOTICE_WIDTH \cf7 120\cf5 \cf2 // \f1 \'b5\'f7\'d5\'fb\'c1\'bd\'cc\'f5\'b9\'ab\'b8\'e6\'bc\'e4\'b5\'c4\'be\'e0\'c0\'eb \f0 \cf4 \ \ \cf5 #define UpdateAcceptCallMsg @\cf6 "UpdateAcceptCallMsg"\cf4 \ \ \cf5 #define groupsend_msgType_text \cf7 1\cf4 \ \cf5 #define groupsend_msgType_image \cf7 2\cf4 \ \cf5 #define groupsend_msgType_video \cf7 3\cf4 \ \cf5 #define groupsend_msgType_audio \cf7 4\cf4 \ \cf5 #define groupsend_msgType_file \cf7 5\cf4 \ \cf5 #define groupsend_msgType_shake \cf7 6\cf4 \ \cf5 #define groupsend_msgType_addressbook \cf7 7\cf4 \ \cf5 #define groupsend_msgType_card \cf7 8\cf4 \ \cf5 #define groupsend_msgType_collect \cf7 9\cf4 \ \cf5 #define groupsend_msgType_imagesAndVideos \cf7 10\cf4 \ \cf5 #define groupsend_msgType_location \cf7 11\cf4 \ \ \f2\b \cf8 @interface \f0\b0 \cf4 \cf9 JXChatViewC\cf4 ()<\cf9 FaceViewControllerDelegate\cf4 ,\cf9 gifViewControllerDelegate\cf4 ,\cf9 FavoritesVCDelegate\cf4 ,\cf9 JXChatCellDelegate\cf4 ,\cf9 JXRoomMemberVCDelegate\cf4 ,\cf9 SendRedPacketVCDelegate\cf4 ,\cf10 UIAlertViewDelegate\cf4 ,\cf9 JXRelayVCDelegate\cf4 ,\cf9 JXCameraVCDelegate\cf4 ,\cf9 ImageBrowserVCDelegate\cf4 ,\cf9 weiboVCDelegate\cf4 ,\cf9 RITLPhotosViewControllerDelegate\cf4 ,\cf9 JXVideoCellDelegate\cf4 ,\cf9 JXActionSheetVCDelegate\cf4 ,\cf10 UINavigationControllerDelegate\cf4 ,\cf9 KKImageEditorDelegate\cf4 ,\cf9 transferVCDelegate\cf4 ,\cf9 JXSelectAddressBookVCDelegate\cf4 ,\cf9 JXRoomObjectDelegate\cf4 >\{\ \ \cf10 CGRect\cf4 _lastFrame;\ \}\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIButton\cf4 *\cf11 selectButton\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf9 DSHPopupContainer\cf4 *\cf11 container\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 )\cf9 JLGroupActivityModel\cf4 *\cf11 activityModel\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \cf10 CGFloat\cf4 \cf11 deltaY\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \cf10 CGFloat\cf4 \cf11 deltaHeight\cf4 ;\ \cf2 //@property (nonatomic, strong) DMAlphaTransition *alphaTransition;\cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf9 DMScaleTransition\cf4 *\cf11 scaleTransition\cf4 ;\ \cf2 //@property (nonatomic, strong) DMSlideTransition *slideTransition;\cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSArray\cf4 *\cf11 allChatImageArr\cf4 ;\cf2 // \f1 \'cf\'fb\'cf\'a2\'bc\'c7\'c2\'bc\'c0\'ef\'cb\'f9\'d3\'d0\'cd\'bc\'c6\'ac \f0 \cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isReadDelete\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 copy \f0\b0 \cf4 ) \cf10 NSMutableString\cf4 *\cf11 sendText\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSMutableString\cf4 *\cf11 names\cf4 ; \cf2 // \f1 \'c8\'ba\'b7\'a2\'d6\'fa\'ca\'d6\'b1\'ea\'c7\'a9\'c6\'b4\'bd\'d3\'d7\'d6\'b7\'fb\'b4\'ae \f0 \cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSMutableString\cf4 *\cf11 names2\cf4 ; \cf2 // \f1 \'c8\'ba\'b7\'a2\'d6\'fa\'ca\'d6\'c8\'ba\'d7\'e9\'c6\'b4\'bd\'d3\'d7\'d6\'b7\'fb\'b4\'ae \f0 \cf4 \ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSTimer\cf4 *\cf11 timer\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 loginStatus\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSTimer\cf4 *\cf11 enteringTimer\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSTimer\cf4 *\cf11 noEnteringTimer\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isSendEntering\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isGetServerMsg\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 int \f0\b0 \cf4 \cf11 serverMsgPage\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSMutableArray\cf4 * \cf11 atMemberArray\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 copy \f0\b0 \cf4 ) \cf10 NSString\cf4 *\cf11 userNickName\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 firstGetUser\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 onlinestate\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIView\cf4 *\cf11 publicMenuBar\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSArray\cf4 *\cf11 menuList\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \cf10 NSInteger\cf4 \cf11 selMenuIndex\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \cf10 NSInteger\cf4 \cf11 withdrawIndex\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSMutableArray\cf4 *\cf11 recordArray\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 copy \f0\b0 \cf4 ) \cf10 NSString\cf4 *\cf11 recordName\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isRecording\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \cf10 NSInteger\cf4 \cf11 recordStarNum\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf9 ATMHud\cf4 *\cf11 chatWait\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 int \f0\b0 \cf4 \cf11 sendIndex\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf9 JXLocationVC\cf4 *\cf11 locVC\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf9 JXGoogleMapVC\cf4 *\cf11 gooMap\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 int \f0\b0 \cf4 \cf11 isBeenBlack\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 int \f0\b0 \cf4 \cf11 friendStatus\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 copy \f0\b0 \cf4 ) \cf10 NSString\cf4 *\cf11 meetingNo\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isAudioMeeting\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isTalkMeeting\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 int \f0\b0 \cf4 \cf11 groupMessagesIndex\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf9 JXMessageObject\cf4 *\cf11 shakeMsg\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIView\cf4 *\cf11 screenShotView\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIImageView\cf4 *\cf11 screenShotImageView\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIImageView\cf4 *\cf11 backGroundImageView\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isSelectMore\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSMutableArray\cf4 *\cf11 selectMoreArr\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIView\cf4 *\cf11 selectMoreView\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 int \f0\b0 \cf4 \cf11 readDelNum\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isAdmin\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIButton\cf4 *\cf11 shareMore\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UILabel\cf4 *\cf11 talkTimeLabel\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIButton\cf4 *\cf11 jumpNewMsgBtn\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf9 WeiboData\cf4 *\cf11 collectionData\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSMutableArray\cf4 *\cf11 taskList\cf4 ; \cf2 // \f1 \'c8\'ce\'ce\'f1\'c1\'d0\'b1\'ed \f0 \cf4 \ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSArray\cf4 *\cf11 imgDataArr\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 int \f0\b0 \cf4 \cf11 indexNum\cf4 ; \cf2 // \f1 \'cf\'fb\'cf\'a2\'d6\'d8\'b7\'a2\'b4\'ab\'c0\'b4\'b5\'c4 \f0 cell.tag\cf4 \ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSDictionary\cf4 *\cf11 dataDict\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isMapMsg\cf4 ; \cf2 // \f1 \'b7\'a2\'cb\'cd\'b5\'c4\'ca\'c7\'b2\'bb\'ca\'c7\'b5\'d8\'cd\'bc\'cf\'fb\'cf\'a2 \f0 \cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf9 JXMapData\cf4 *\cf11 mapData\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSString\cf4 *\cf11 objToMsg\cf4 ;\cf2 // \f1 \'bb\'d8\'b8\'b4\'cb\'ad\'b5\'c4\'cf\'fb\'cf\'a2\'a3\'ac\'b4\'e6 \f0 json \f1 \'ca\'fd\'be\'dd \f0 \cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSString\cf4 *\cf11 hisReplyMsg\cf4 ; \cf2 // \f1 \'bb\'d8\'b8\'b4\'c0\'fa\'ca\'b7\'cb\'ae\'d3\'a1 \f0 \cf4 \ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 copy \f0\b0 \cf4 ) \cf10 NSString\cf4 *\cf11 meetUrl\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIView\cf4 *\cf11 shareView\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIView\cf4 *\cf11 noticeView\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIImageView\cf4 *\cf11 noticeImgV\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UILabel\cf4 *\cf11 noticeLabel\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIView\cf4 *\cf11 showNoticeView\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UILabel\cf4 *\cf11 leftLabel\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UILabel\cf4 *\cf11 rightLabel\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSTimer\cf4 *\cf11 noticeTimer\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSString\cf4 *\cf11 noticeStr\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \cf10 CGFloat\cf4 \cf11 leftW\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \cf10 CGFloat\cf4 \cf11 rightW\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \cf10 CGFloat\cf4 \cf11 noticeStrW\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 int \f0\b0 \cf4 \cf11 noticeHeight\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIButton\cf4 *\cf11 textViewBtn\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIView\cf4 *\cf11 noticeView2\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIImageView\cf4 *\cf11 noticeImgV2\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UILabel\cf4 *\cf11 noticeLabel2\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIView\cf4 *\cf11 showNoticeView2\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UILabel\cf4 *\cf11 leftLabel2\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UILabel\cf4 *\cf11 rightLabel2\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSTimer\cf4 *\cf11 noticeTimer2\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSString\cf4 *\cf11 noticeStr2\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \cf10 CGFloat\cf4 \cf11 leftW2\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \cf10 CGFloat\cf4 \cf11 rightW2\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \cf10 CGFloat\cf4 \cf11 noticeStrW2\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 int \f0\b0 \cf4 \cf11 noticeHeight2\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 scrollBottom\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isGotoLast\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isSyncMsg\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isFirst\cf4 ; \cf2 // \f1 \'b5\'da\'d2\'bb\'b4\'ce\'b5\'f7\'d3\'c3 \f0 GetRoom\cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isDisable\cf4 ; \cf2 // \f1 \'c8\'ba\'d7\'e9\'ca\'c7\'b7\'f1\'bd\'fb\'d3\'c3 \f0 \cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIImage\cf4 *\cf11 screenImage\cf4 ; \cf2 // \f1 \'bc\'c7\'c2\'bc\'d2\'bb\'cf\'c2\'c6\'c1\'c4\'bb\'bf\'ec\'d5\'d5 \f0 \cf4 \ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSArray\cf4 *\cf11 helperArr\cf4 ;\cf2 // \f1 \'c8\'ba\'d6\'fa\'ca\'d6\'ca\'fd\'be\'dd \f0 \cf4 \ \ \cf2 // \f1 \'ba\'ec\'b0\'fc\'b5\'e3\'bb\'f7\'ba\'f3\'b5\'c4\'bd\'e7\'c3\'e6 \f0 \cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIView\cf4 *\cf11 redBaseView\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIImageView\cf4 *\cf11 openImgV\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIImageView\cf4 *\cf11 redBackV\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSDictionary\cf4 *\cf11 redPacketDict\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isDidRedPacketRemind\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UILabel\cf4 *\cf11 tintLab\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UILabel\cf4 *\cf11 seeLab\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \cf10 CGFloat\cf4 \cf11 lastY\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isRefresh\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIImageView\cf4 *\cf11 audioIcon\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isShowAT\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isSendRedPacket\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isRefreshing\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIView\cf4 *\cf11 waitGroupSendView\cf4 ; \cf2 // \f1 \'c8\'ba\'b7\'a2\'cc\'e1\'ca\'be\'b4\'b0\'bf\'da \f0 \cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UILabel\cf4 *\cf11 waitGroupSendLable\cf4 ; \cf2 // \f1 \'c8\'ba\'b7\'a2\'ca\'b5\'ca\'b1\'b8\'fc\'d0\'c2\'d2\'d1\'b7\'a2\'cb\'cd\'ca\'fd\'c1\'bf \f0 \cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \cf10 NSInteger\cf4 \cf11 sendedNum\cf4 ; \cf2 // \f1 \'c8\'ba\'b7\'a2\'d2\'d1\'b7\'a2\'cb\'cd\'ca\'fd\'c1\'bf \f0 \cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSMutableArray\cf4 *\cf11 groupUploadObjArray\cf4 ; \cf2 // \f1 \'c8\'ba\'b7\'a2\'d0\'e8\'d2\'aa\'c9\'cf\'b4\'ab\'b5\'c4\'ca\'fd\'be\'dd \f0 \cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \cf10 NSInteger\cf4 \cf11 onceSendNum\cf4 ; \cf2 // \f1 \'c8\'ba\'b7\'a2\'c3\'bf\'d7\'e9\'b7\'a2\'cb\'cd\'b5\'c4\'cf\'fb\'cf\'a2\'ca\'fd\'c1\'bf \f0 \cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isOriginal\cf4 ; \cf2 // \f1 \'ca\'c7\'b7\'f1\'b1\'a3\'b4\'e6\'b1\'be\'b5\'d8 \f0 \cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \cf10 NSInteger\cf4 \cf11 groupSendType\cf4 ; \cf2 // \f1 \'c8\'ba\'b7\'a2\'cf\'fb\'cf\'a2\'c0\'e0\'d0\'cd \f0 \cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSMutableArray\cf4 *\cf11 groupSendMsgArray\cf4 ; \cf2 // \f1 \'c8\'ba\'b7\'a2\'b5\'c4\'c4\'da\'c8\'dd \f0 \cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \cf10 NSInteger\cf4 \cf11 groupSendAllNum\cf4 ; \cf2 // \f1 \'c8\'ba\'b7\'a2\'cf\'fb\'cf\'a2\'d7\'dc\'ca\'fd \f0 \cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 assign \f0\b0 \cf4 ) \f2\b \cf8 BOOL \f0\b0 \cf4 \cf11 isGroupSendCancel\cf4 ; \cf2 // \f1 \'c8\'a1\'cf\'fb\'c8\'ba\'b7\'a2 \f0 \cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSDictionary\cf4 *\cf11 imgsAndVideosDic\cf4 ;\cf2 // \f1 \'c8\'ba\'b7\'a2\'cd\'bc\'b2\'e1\'d1\'a1\'d6\'d0\'b5\'c4\'cd\'bc\'c6\'ac\'ba\'cd\'ca\'d3\'c6\'b5 \f0 \cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSMutableArray\cf4 *\cf11 imgArr\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIButton\cf4 *\cf11 showBtn\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf9 STAlertView\cf4 *\cf11 alert\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf9 MISFloatingBall\cf4 *\cf11 floating\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 weak \f0\b0 \cf4 ) \cf9 JXtopShowVIew\cf4 *\cf11 showTopView\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSMutableArray\cf4 *\cf11 dataArrGetGroundPersonArr\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIScrollView\cf4 *\cf11 dataArr\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 NSMutableArray\cf4 *\cf11 tempArrMM\cf4 ;\ \cf12 /** \f1 \cf2 \'c3\'bb\'d3\'d0\'b2\'ca\'c7\'f2\'b5\'c4\'cc\'d8\'b1\'f0\'b9\'d8\'d0\'c4 \f3 */ \f0 \cf4 \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIScrollView\cf4 *\cf11 noticeViewScrollView\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 strong \f0\b0 \cf4 ) \cf10 UIButton\cf4 *\cf11 attioPersonBtn\cf4 ;\ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 weak \f0\b0 \cf4 ) \cf9 DYAdAlertView\cf4 *\cf11 showLongViewc\cf4 ;\ \ \f2\b \cf8 @property \f0\b0 \cf4 ( \f2\b \cf8 nonatomic \f0\b0 \cf4 , \f2\b \cf8 copy \f0\b0 \cf4 ) \cf10 NSString\cf4 *\cf11 strURLGoback\cf4 ;\ \f2\b \cf8 @end \f0\b0 \cf4 \ \ \f2\b \cf8 @implementation \f0\b0 \cf4 \cf13 JXChatViewC\cf4 \ \f2\b \cf8 @synthesize \f0\b0 \cf4 \cf11 chatPerson\cf4 ,\cf11 roomId\cf4 ,\cf11 chatRoom\cf4 ;\ \ - ( \f2\b \cf8 id \f0\b0 \cf4 )\cf11 init\cf4 \ \{\ \f2\b \cf8 self \f0\b0 \cf4 = [ \f2\b \cf8 super \f0\b0 \cf4 \cf14 init\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 (!\cf15 _room\cf4 ) \{\ \cf15 _room\cf4 = [[\cf9 roomData\cf4 \cf14 alloc\cf4 ] \cf14 init\cf4 ];\ \}\ \cf15 _dataArrGetGroundPersonArr\cf4 =[\cf10 NSMutableArray\cf4 \cf14 array\cf4 ];\ \cf15 _userNickName\cf4 = \cf5 g_myself\cf4 .\cf15 userNickname\cf4 ;\ \ \cf15 _strURLGoback\cf4 =\cf6 @"1000"\cf4 ;\ \cf15 _tempArrMM\cf4 =[\cf10 NSMutableArray\cf4 \cf14 array\cf4 ];\ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightHeader\cf4 = \cf5 JX_SCREEN_TOP\cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 = \cf7 48\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 courseId\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 = \cf5 THE_DEVICE_HAVE_HEAD\cf4 ? \cf5 JX_SCREEN_BOTTOM\cf4 : \cf7 56\cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isHiddenFooter\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 = \cf7 0\cf4 ;\ \}\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isGotoBack\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isGotoLast\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf15 _orderRedPacketArray\cf4 = [[\cf10 NSMutableArray\cf4 \cf14 alloc\cf4 ]\cf14 init\cf4 ];\ \cf15 _atMemberArray\cf4 = [[\cf10 NSMutableArray\cf4 \cf14 alloc\cf4 ] \cf14 init\cf4 ];\ \cf15 _selectMoreArr\cf4 = [\cf10 NSMutableArray\cf4 \cf14 array\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ) \{\ \cf15 _taskList\cf4 = [\cf10 NSMutableArray\cf4 \cf14 array\cf4 ];\ \cf10 NSMutableArray\cf4 *list = [[\cf9 JXSynTask\cf4 \cf15 sharedInstance\cf4 ] \cf15 getTaskWithUserId\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ];\ \f2\b \cf8 for \f0\b0 \cf4 (\cf10 NSInteger\cf4 i = \cf7 0\cf4 ; i < list.\cf14 count\cf4 ; i ++) \{\ \cf9 JXSynTask\cf4 *task = list[i];\ \f2\b \cf8 if \f0\b0 \cf4 (task.\cf15 endTime\cf4 ) \{\ [\cf15 _taskList\cf4 \cf14 addObject\cf4 :task];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [task \f2\b \cf8 delete \f0\b0 \cf4 ];\ \}\ \}\ \ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 newMsgCount\cf4 > \cf7 100\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 newMsgCount\cf4 = \cf7 100\cf4 ;\ \}\ \cf2 //self.view.frame = CGRectMake(0, 0, JX_SCREEN_WIDTH, JX_SCREEN_HEIGHT);\cf4 \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 groupMessagesIndex\cf4 = \cf7 0\cf4 ;\ \cf15 _disableSay\cf4 = \cf7 0\cf4 ;\ \cf15 _serverMsgPage\cf4 = \cf7 0\cf4 ;\ \cf15 _isRecording\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \cf15 _recordStarNum\cf4 = \cf7 0\cf4 ;\ \ \cf15 _pool\cf4 = [[\cf10 NSMutableArray\cf4 \cf14 alloc\cf4 ]\cf14 init\cf4 ];\ \cf15 _array\cf4 = [[\cf10 NSMutableArray\cf4 \cf14 alloc\cf4 ]\cf14 init\cf4 ];\ \ \cf15 _isReadDelete\cf4 = [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatPerson\cf4 .\cf15 isOpenReadDel\cf4 \cf14 boolValue\cf4 ];\ \ \cf15 _recordArray\cf4 = [\cf10 NSMutableArray\cf4 \cf14 array\cf4 ];\ \cf15 _chatWait\cf4 = [[\cf9 ATMHud\cf4 \cf14 alloc\cf4 ] \cf14 init\cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 current_chat_userId\cf4 )\ [\cf5 g_xmpp\cf4 .\cf15 chatingUserIds\cf4 \cf14 addObject\cf4 :\cf15 current_chat_userId\cf4 ];\ \ \}\ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (roomGroupActivityRefresh:) \cf14 name\cf4 :\cf5 kRoomGroupActivityRefresh\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ]; \cf2 // \f1 \'b7\'c0\'b3\'b7\'bb\'d8\'d0\'de\'b8\'c4 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (roomIsisAttritionRecall:) \cf14 name\cf4 :\cf5 kroomIsAttritionRecallRefresh\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ]; \cf2 // \f1 \'b7\'c0\'b3\'b7\'bb\'d8\'d0\'de\'b8\'c4 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (groupLevelNameRefresh:) \cf14 name\cf4 :\cf5 kgroupLevelNameRefresh\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ]; \cf2 // \f1 \'c8\'ba\'cd\'b7\'cf\'ce\'d0\'de\'b8\'c4 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (roomIsOpenIntegral:) \cf14 name\cf4 :\cf5 kisOpenIntegralRefresh\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ]; \cf2 // \f1 \'c8\'ba\'cd\'b7\'cf\'ce\'bf\'aa\'b9\'d8\'d0\'de\'b8\'c4 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (audioPlayEnd:) \cf14 name\cf4 :\cf5 kCellVoiceStartNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\cf2 // \f1 \'bf\'aa\'ca\'bc\'c2\'bc\'d2\'f4 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (cardCellClick:) \cf14 name\cf4 :\cf5 kCellShowCardNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (locationCellClick:) \cf14 name\cf4 :\cf5 kCellLocationNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onDidImage:) \cf14 name\cf4 :\cf5 kCellImageNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\cf2 // \f1 \'d5\'d5\'c6\'ac \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onDidRedPacket:) \cf14 name\cf4 :\cf5 kcellRedPacketDidTouchNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\cf2 // \f1 \'c6\'d5\'cd\'a8\'ba\'ec\'b0\'fc\'b5\'e3\'bb\'f7 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onDidTransfer:) \cf14 name\cf4 :\cf5 kcellTransferDidTouchNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\cf2 // \f1 \'d7\'aa\'d5\'cb\'b5\'e3\'bb\'f7 \f0 \cf4 \ \cf2 // [g_notify addObserver:self selector:@selector(onDidHeadImage:) name:kCellHeadImageNotification object:nil];\cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (longGesHeadImageNotification:) \cf14 name\cf4 :\cf5 kCellLongGesHeadImageNotification\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (resendMsgNotif:) \cf14 name\cf4 :\cf5 kCellResendMsgNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\cf2 // \f1 \'d6\'d8\'b7\'a2\'cf\'fb\'cf\'a2 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (deleteMsgNotif:) \cf14 name\cf4 :\cf5 kCellDeleteMsgNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\cf2 // \f1 \'c9\'be\'b3\'fd\'cf\'fb\'cf\'a2 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (showReadPersons:) \cf14 name\cf4 :\cf5 kCellShowReadPersonsNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ]; \cf2 // \f1 \'b2\'e9\'bf\'b4\'d2\'d1\'b6\'c1\'c1\'d0\'b1\'ed \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (hideKeyboard:) \cf14 name\cf4 :\cf5 kHiddenKeyboardNotification\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onDidSystemImage1:) \cf14 name\cf4 :\cf5 kCellSystemImage1DidTouchNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ]; \cf2 // \f1 \'b5\'a5\'cc\'f5\'cd\'bc\'ce\'c4\'cf\'fb\'cf\'a2\'b5\'e3\'bb\'f7 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onDidSystemImage2:) \cf14 name\cf4 :\cf5 kCellSystemImage2DidTouchNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ]; \cf2 // \f1 \'b6\'e0\'cc\'f5\'cd\'bc\'ce\'c4\'cf\'fb\'cf\'a2\'b5\'e3\'bb\'f7 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onDidAVCall:) \cf14 name\cf4 :\cf5 kCellSystemAVCallNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ]; \cf2 // \f1 \'d2\'f4\'ca\'d3\'c6\'b5\'cd\'a8\'bb\'b0 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onDidFile:) \cf14 name\cf4 :\cf5 kCellSystemFileNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ]; \cf2 // \f1 \'ce\'c4\'bc\'fe\'b5\'e3\'bb\'f7 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onDidLink:) \cf14 name\cf4 :\cf5 kCellSystemLinkNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ]; \cf2 // \f1 \'c1\'b4\'bd\'d3\'b5\'e3\'bb\'f7 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onDidShake:) \cf14 name\cf4 :\cf5 kCellSystemShakeNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ]; \cf2 // \f1 \'b4\'c1\'d2\'bb\'b4\'c1\'b5\'e3\'bb\'f7 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onDidMergeRelay:) \cf14 name\cf4 :\cf5 kCellSystemMergeRelayNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ]; \cf2 // \f1 \'ba\'cf\'b2\'a2\'d7\'aa\'b7\'a2\'b5\'e3\'bb\'f7 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onDidShare:) \cf14 name\cf4 :\cf5 kCellShareNotification\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ]; \cf2 // \f1 \'b7\'d6\'cf\'ed \f0 cell \f1 \'b5\'e3\'bb\'f7 \f0 \cf4 \ \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onDidRemind:) \cf14 name\cf4 :\cf5 kCellRemindNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ]; \cf2 // \f1 \'bf\'d8\'d6\'c6\'cf\'fb\'cf\'a2\'b5\'e3\'bb\'f7 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onDidReply:) \cf14 name\cf4 :\cf5 kCellReplyNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ]; \cf2 // \f1 \'bb\'d8\'b8\'b4\'cf\'fb\'cf\'a2\'b5\'e3\'bb\'f7 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onDidMessageReadDel:) \cf14 name\cf4 :\cf5 kCellMessageReadDelNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ]; \cf2 // \f1 \'ce\'c4\'b1\'be\'cf\'fb\'cf\'a2\'d4\'c4\'ba\'f3\'bc\'b4\'b7\'d9\'b5\'e3\'bb\'f7 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (openReadDelNotif:) \cf14 name\cf4 :\cf5 kOpenReadDelNotif\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ]; \cf2 // \f1 \'d4\'c4\'ba\'f3\'bc\'b4\'b7\'d9\'bf\'aa\'b9\'d8 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (refreshChatLogNotif:) \cf14 name\cf4 :\cf5 kRefreshChatLogNotif\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (reloadNotif:) \cf14 name\cf4 :\cf5 kChatVCReloadNotif\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onLoginChanged:) \cf14 name\cf4 :\cf5 kXmppLoginNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf2 // \f1 \'bc\'e0\'cc\'fd\'cf\'b5\'cd\'b3\'bd\'d8\'c6\'c1 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (userDidTakeScreenshot:) \cf14 name\cf4 :\cf14 UIApplicationUserDidTakeScreenshotNotification\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onGroupHelper) \cf14 name\cf4 :\cf5 kUpdateChatVCGroupHelperData\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\cf2 // \f1 \'b8\'fc\'d0\'c2\'c8\'ba\'d6\'fa\'ca\'d6 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (updateMsgSynTaskNotif:) \cf14 name\cf4 :\cf5 kUpdateMsgSynTask\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (chatVCMessageSync:) \cf14 name\cf4 :\cf5 kChatVCMessageSync\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf14 NSLog\cf4 (\cf6 @"timetime6 -- %f"\cf4 , [[\cf10 NSDate\cf4 \cf14 date\cf4 ] \cf14 timeIntervalSince1970\cf4 ]);\ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (updateTransferMsgFileSize:) \cf14 name\cf4 :\cf5 kUpdateTransferMsgFileSize\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (keepOnGroupSend:) \cf14 name\cf4 :\cf5 kKeepOnSendGroupSendMessage\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (applicationWillEnterForeground) \cf14 name\cf4 :\cf5 kApplicationWillEnterForeground\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 self \f0\b0 \cf4 ;\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 applicationWillEnterForeground\cf4 \{\ \cf2 // \f1 \'bb\'f1\'c8\'a1\'b7\'fe\'ce\'f1\'c6\'f7\'ca\'b1\'bc\'e4 \f0 \cf4 \ \cf2 // [g_server getCurrentTimeToView:self];\cf4 \ \cf2 // [g_server tigaseMucMsgsWithRoomId:<#(NSString *)#> StartTime:<#(long)#> EndTime:<#(long)#> PageIndex:<#(int)#> PageSize:<#(int)#> toView:<#(id)#>];\cf4 \ \cf2 // [self messageSync];\cf4 \ \}\ \ \ \cf2 // \f1 \'c9\'e8\'d6\'c3\'b5\'a5\'c1\'c4 \f0 title\cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 setChatTitle\cf4 :(\cf10 NSString\cf4 *)userName \{\ \ \cf10 NSString\cf4 *str = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 onlinestate\cf4 ? \cf5 Localized\cf4 (\cf6 @"JX_OnLine"\cf4 ) : \cf5 Localized\cf4 (\cf6 @"JX_OffLine"\cf4 );\ \ \f2\b \cf8 if \f0\b0 \cf4 ([\cf5 g_config\cf4 .\cf15 isOpenOnlineStatus\cf4 \cf14 boolValue\cf4 ]) \{\ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _useInfoTempChat\cf4 ==\cf7 11\cf4 ) \{\ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 title\cf4 = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%@ \f1 \'c1\'d9\'ca\'b1\'bb\'e1\'bb\'b0 \f0 (%@) "\cf4 ,userName, str];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _useInfoTempChat\cf4 ==\cf7 11\cf4 ) \{\ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 title\cf4 =[\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%@(%@)"\cf4 ,userName, \cf6 @" \f1 \'c1\'d9\'ca\'b1\'bb\'e1\'bb\'b0 \f0 "\cf4 ] ;\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 title\cf4 = userName;\ \}\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _customerPush\cf4 .\cf14 length\cf4 >\cf7 0\cf4 ) \{\ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 title\cf4 =[\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%@"\cf4 ,\cf15 _customerPush\cf4 ] ;\ \ \}\ \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 setAudioIconFrame\cf4 ];\ \}\ \ \cf2 // \f1 \'b8\'fc\'d0\'c2\'c0\'eb\'cf\'df\'cf\'fb\'cf\'a2\'c8\'ce\'ce\'f1 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 updateMsgSynTaskNotif\cf4 :(\cf10 NSNotification\cf4 *)notif \{\ \ \cf10 NSString\cf4 *userId = notif.\cf14 object\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([userId \cf14 isEqualToString\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatPerson\cf4 .\cf15 userId\cf4 ]) \{\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ) \{\ \cf15 _taskList\cf4 = [[\cf9 JXSynTask\cf4 \cf15 sharedInstance\cf4 ] \cf15 getTaskWithUserId\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ];\ \}\ \}\ \}\ \ \cf5 #pragma mark \f2\b \cf16 - \f4 \'d3\'c3\'bb\'a7\'bd\'d8\'c6\'c1\'cd\'a8\'d6\'aa\'ca\'c2\'bc\'fe \f0\b0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 userDidTakeScreenshot\cf4 :(\cf10 NSNotification\cf4 *)notification \{\ \cf2 // \f1 \'c8\'e7\'b9\'fb\'b5\'b1\'c7\'b0\'bd\'e7\'c3\'e6\'b4\'e6\'d4\'da\'d4\'c4\'ba\'f3\'bc\'b4\'b7\'d9\'cf\'fb\'cf\'a2\'a3\'ac\'bd\'f8\'d0\'d0\'bd\'d8\'c6\'c1\'b2\'d9\'d7\'f7\'a3\'ac\'b1\'e3\'bb\'e1\'cd\'a8\'d6\'aa\'b6\'d4\'b7\'bd \f0 \cf4 \ \cf10 NSArray\cf4 *allDelMsg = [[\cf9 JXMessageObject\cf4 \cf15 sharedInstance\cf4 ] \cf15 fetchDelMessageWithUserId\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatPerson\cf4 .\cf15 userId\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (allDelMsg.\cf14 count\cf4 > \cf7 0\cf4 ) \{\ \cf9 JXMessageObject\cf4 *msg = [[\cf9 JXMessageObject\cf4 \cf14 alloc\cf4 ] \cf14 init\cf4 ];\ msg.\cf15 type\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 :\cf15 kWCMessageTypeDelMsgScreenshots\cf4 ];\ msg.\cf15 timeSend\cf4 = [\cf10 NSDate\cf4 \cf14 date\cf4 ];\ msg.\cf15 toUserId\cf4 = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatPerson\cf4 .\cf15 userId\cf4 ;\ msg.\cf15 fromUserId\cf4 = \cf5 MY_USER_ID\cf4 ;\ msg.\cf15 content\cf4 = \cf5 Localized\cf4 (\cf6 @"JX_TheOtherTookAScreenshotOfTheConversation"\cf4 );\ [msg \cf15 insert\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_xmpp\cf4 \cf15 sendMessage\cf4 :msg \cf15 roomName\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onLoginChanged\cf4 :(\cf10 NSNotification\cf4 *)notifacation\{\ \ \f2\b \cf8 switch \f0\b0 \cf4 ([\cf9 JXXMPP\cf4 \cf15 sharedInstance\cf4 ].\cf15 isLogined\cf4 )\{\ \f2\b \cf8 case \f0\b0 \cf4 \cf5 login_status_ing\cf4 :\{\ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf5 login_status_no\cf4 :\{\ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf5 login_status_yes\cf4 :\{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 .\cf14 length\cf4 > \cf7 0\cf4 && [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 groupStatus\cf4 \cf14 integerValue\cf4 ] == \cf7 0\cf4 ) \{\ [\cf5 g_xmpp\cf4 .\cf15 roomPool\cf4 .\cf15 pool\cf4 \cf14 removeObjectForKey\cf4 :\cf15 chatPerson\cf4 .\cf15 userId\cf4 ];\ [\cf5 g_xmpp\cf4 .\cf15 roomPool\cf4 \cf15 joinRoom\cf4 :\cf15 chatPerson\cf4 .\cf15 userId\cf4 \cf15 title\cf4 :\cf15 chatPerson\cf4 .\cf15 userNickname\cf4 \cf15 lastDate\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 \cf15 isNew\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ \cf15 chatRoom\cf4 = [[\cf9 JXXMPP\cf4 \cf15 sharedInstance\cf4 ].\cf15 roomPool\cf4 \cf15 joinRoom\cf4 :\cf15 chatPerson\cf4 .\cf15 userId\cf4 \cf15 title\cf4 :\cf15 chatPerson\cf4 .\cf15 userNickname\cf4 \cf15 lastDate\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 \cf15 isNew\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \}\ \ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 actionTitle\cf4 :(\cf9 JXLabel\cf4 *)sender \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isRecording\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 chatCell\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 \cf15 stopRecordIndexNum\cf4 :( \f2\b \cf8 int \f0\b0 \cf4 )\cf15 _array\cf4 .\cf14 count\cf4 - \cf7 1\cf4 ];\ \}\ \}\ \ \cf2 // \f1 \'d4\'c4\'ba\'f3\'bc\'b4\'b7\'d9\'cd\'a8\'d6\'aa \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 openReadDelNotif\cf4 :(\cf10 NSNotification\cf4 *)notif \{\ \ \f2\b \cf8 BOOL \f0\b0 \cf4 isOpen = [notif.\cf14 object\cf4 \cf14 boolValue\cf4 ];\ \cf15 _isReadDelete\cf4 = isOpen;\ \}\ \ \cf5 #pragma mark \f2\b \cf16 ---- \f4 \'d4\'c4\'ba\'f3\'bc\'b4\'b7\'d9\'bf\'aa\'b9\'d8 \f0\b0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 switchValueChange\cf4 :(\cf10 UIButton\cf4 *)but\{\ \ \f2\b \cf8 if \f0\b0 \cf4 (but.\cf14 tag\cf4 == \cf7 2000\cf4 ) \{\ but.\cf14 tag\cf4 = \cf7 1000\cf4 ;\ but.\cf14 selected\cf4 = !but.\cf14 selected\cf4 ;\ \cf15 _isReadDelete\cf4 = !\cf15 _isReadDelete\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _isReadDelete\cf4 ) \{\ but.\cf14 backgroundColor\cf4 = [\cf10 UIColor\cf4 \cf14 lightGrayColor\cf4 ];\ [\cf5 g_App\cf4 \cf15 showAlert\cf4 :\cf5 Localized\cf4 (\cf6 @"JX_ReadDeleteTip"\cf4 )];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ but.\cf14 backgroundColor\cf4 = [\cf10 UIColor\cf4 \cf14 clearColor\cf4 ];\ \}\ \cf14 dispatch_after\cf4 (\cf14 dispatch_time\cf4 (\cf5 DISPATCH_TIME_NOW\cf4 , (\cf10 int64_t\cf4 )(\cf7 1\cf4 * \cf5 NSEC_PER_SEC\cf4 )), \cf14 dispatch_get_main_queue\cf4 (), ^\{\ but.\cf14 tag\cf4 = \cf7 2000\cf4 ;\ \});\ \}\ \}\ \ \cf2 // \f1 \'d6\'d8\'d0\'c2\'bc\'d3\'d4\'d8 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 refreshChatLogNotif\cf4 :(\cf10 NSNotification\cf4 *)notif \{\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isGetServerMsg\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [\cf15 _array\cf4 \cf14 removeAllObjects\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 refresh\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableView\cf4 \cf14 reloadData\cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 reloadNotif\cf4 :(\cf10 NSNotification\cf4 *)notif \{\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isGetServerMsg\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [\cf15 _array\cf4 \cf14 removeAllObjects\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableView\cf4 \cf14 reloadData\cf4 ];\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 cardCellClick\cf4 :(\cf10 NSNotification\cf4 *) notification\{\ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 recording\cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \cf9 JXMessageObject\cf4 *msg = notification.\cf14 object\cf4 ;\ \cf10 NSString\cf4 * objectId = msg.\cf15 objectId\cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 firstGetUser\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf2 // [g_server getUser:objectId toView:self];\cf4 \ \cf9 JXUserInfoVC\cf4 * vc = [\cf9 JXUserInfoVC\cf4 \cf14 alloc\cf4 ];\ vc.\cf15 userId\cf4 = objectId;\ vc.\cf15 isJustShow\cf4 = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 courseId\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ;\ vc.\cf15 fromAddType\cf4 = \cf7 2\cf4 ;\ vc = [vc \cf14 init\cf4 ];\ [\cf5 g_navigation\cf4 \cf15 pushViewController\cf4 :vc \cf15 animated\cf4 : \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 locationCellClick\cf4 :(\cf10 NSNotification\cf4 *)notification\{\ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 recording\cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \cf9 JXMessageObject\cf4 *msg = notification.\cf14 object\cf4 ;\ \f2\b \cf8 double \f0\b0 \cf4 location_x = [msg.\cf15 location_x\cf4 \cf14 doubleValue\cf4 ];\ \f2\b \cf8 double \f0\b0 \cf4 location_y = [msg.\cf15 location_y\cf4 \cf14 doubleValue\cf4 ];\ \ \cf9 JXMapData\cf4 * mapData = [[\cf9 JXMapData\cf4 \cf14 alloc\cf4 ] \cf14 init\cf4 ];\ mapData.\cf15 latitude\cf4 = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%f"\cf4 ,location_x];\ mapData.\cf15 longitude\cf4 = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%f"\cf4 ,location_y];\ \cf10 NSArray\cf4 * locations = \cf7 @[\cf4 mapData\cf7 ]\cf4 ;\ mapData.\cf15 title\cf4 = msg.\cf15 objectId\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (\cf5 g_config\cf4 .\cf15 isChina\cf4 ) \{\ \cf9 JXLocationVC\cf4 * vc = [\cf9 JXLocationVC\cf4 \cf14 alloc\cf4 ];\ vc.\cf15 placeNames\cf4 = msg.\cf15 objectId\cf4 ;\ vc.\cf15 locations\cf4 = [\cf10 NSMutableArray\cf4 \cf14 arrayWithArray\cf4 :locations];\ vc.\cf15 locationType\cf4 = \cf15 JXLocationTypeShowStaticLocation\cf4 ;\ vc = [vc \cf14 init\cf4 ];\ [\cf5 g_navigation\cf4 \cf15 pushViewController\cf4 :vc \cf15 animated\cf4 : \f2\b \cf8 YES \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf15 _gooMap\cf4 = [\cf9 JXGoogleMapVC\cf4 \cf14 alloc\cf4 ] ;\ \cf15 _gooMap\cf4 .\cf15 locations\cf4 = [\cf10 NSMutableArray\cf4 \cf14 arrayWithArray\cf4 :locations];\ \cf15 _gooMap\cf4 .\cf15 locationType\cf4 = \cf15 JXGooLocationTypeShowStaticLocation\cf4 ;\ \cf15 _gooMap\cf4 .\cf15 placeNames\cf4 = msg.\cf15 objectId\cf4 ;\ \cf15 _gooMap\cf4 = [\cf15 _gooMap\cf4 \cf14 init\cf4 ];\ [\cf5 g_navigation\cf4 \cf15 pushViewController\cf4 :\cf15 _gooMap\cf4 \cf15 animated\cf4 : \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 viewDidAppear\cf4 :( \f2\b \cf8 BOOL \f0\b0 \cf4 )animated\{\ [ \f2\b \cf8 super \f0\b0 \cf4 \cf14 viewDidAppear\cf4 :animated];\ \f2\b \cf8 for \f0\b0 \cf4 (\cf10 UIGestureRecognizer\cf4 *gesture \f2\b \cf8 in \f0\b0 \cf4 \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 .\cf14 window\cf4 .\cf14 gestureRecognizers\cf4 ) \{\ \cf14 NSLog\cf4 (\cf6 @"gesture = %@"\cf4 ,gesture);\ gesture.\cf14 delaysTouchesBegan\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \cf14 NSLog\cf4 (\cf6 @"delaysTouchesBegan = %@"\cf4 ,gesture.\cf14 delaysTouchesBegan\cf4 ?\cf6 @"YES"\cf4 :\cf6 @"NO"\cf4 );\ \cf14 NSLog\cf4 (\cf6 @"delaysTouchesEnded = %@"\cf4 ,gesture.\cf14 delaysTouchesEnded\cf4 ?\cf6 @"YES"\cf4 :\cf6 @"NO"\cf4 );\ \}\ [\cf15 _wait\cf4 \cf15 stop\cf4 ];\ \ \ \ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _yunGoldtigerPush\cf4 ==\cf7 10\cf4 ||\cf15 _yunGoldtigerPush\cf4 ==\cf7 20\cf4 ||\cf15 _yunGoldtigerPush\cf4 ==\cf7 30\cf4 ||\cf15 _yunGoldtigerPush\cf4 ==\cf7 40\cf4 ) \{\ \ \cf14 dispatch_after\cf4 (\cf14 dispatch_time\cf4 (\cf5 DISPATCH_TIME_NOW\cf4 , (\cf10 int64_t\cf4 )(\cf7 1\cf4 * \cf5 NSEC_PER_SEC\cf4 )), \cf14 dispatch_get_main_queue\cf4 (), ^\{\ [\cf5 g_notify\cf4 \cf14 postNotificationName\cf4 :\cf6 @"tongyong"\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_navigation\cf4 \cf15 dismissViewController\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf15 animated\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ \ \ \}); \ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 getEmojsData\cf4 \{\ \cf2 // [g_server faceClollectListType:@"0" View:self];\cf4 \ \cf2 // [g_server getFaceList:@"0" View:self];\cf4 \ [\cf5 g_server\cf4 \cf15 getFaceListByGradeToView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ \cf2 // JXUserObject *user = [[JXUserObject sharedInstance] getUserById:];\cf4 \ [\cf5 g_server\cf4 \cf15 roomMemberGetMemberListByPageWithRoomId\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomId\cf4 \cf15 joinTime\cf4 :\cf7 1555649346\cf4 \cf15 toView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ [\cf5 g_server\cf4 \cf15 getbubbleFontByUserId\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 \cf15 ToView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 activityView\cf4 \{\ \cf2 // [self.view addSubview:self.showBtn];\cf4 \ \cf15 _imgArr\cf4 = [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 setImgArr\cf4 ];\ \}\ -(\cf10 NSMutableArray\cf4 *)\cf11 setImgArr\cf4 \{\ \cf10 NSMutableArray\cf4 *arr = [[\cf10 NSMutableArray\cf4 \cf14 alloc\cf4 ]\cf14 initWithCapacity\cf4 :\cf7 0\cf4 ];\ \cf2 // for (int i = 1; i<=5; i++) \{\cf4 \ \cf9 DYAdModel\cf4 *adModel = [[\cf9 DYAdModel\cf4 \cf14 alloc\cf4 ]\cf14 init\cf4 ];\ adModel.\cf15 imgStr\cf4 = \cf6 @" \f1 \'c0\'f1\'ce\'ef \f0 "\cf4 ;\ adModel.\cf15 linkUrl\cf4 = \cf6 @"http://www.baidu.com"\cf4 ;\ [arr \cf14 addObject\cf4 :adModel];\ \cf2 // \}\cf4 \ \f2\b \cf8 return \f0\b0 \cf4 arr;\ \}\ \ -(\cf10 UIButton\cf4 *)\cf11 showBtn\cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 (!\cf15 _showBtn\cf4 ) \{\ \cf15 _showBtn\cf4 = [\cf10 UIButton\cf4 \cf14 buttonWithType\cf4 :\cf14 UIButtonTypeCustom\cf4 ];\ \cf15 _showBtn\cf4 .\cf14 center\cf4 = \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 .\cf14 center\cf4 ;\ \cf15 _showBtn\cf4 .\cf14 bounds\cf4 = \cf14 CGRectMake\cf4 (\cf7 0\cf4 , \cf7 0\cf4 , \cf7 100\cf4 , \cf7 60\cf4 );\ [\cf15 _showBtn\cf4 \cf14 setTitle\cf4 :\cf6 @" \f1 \'b5\'af\'a1\'a2\'b5\'af\'a1\'a2\'b5\'af \f0 "\cf4 forState:\cf14 UIControlStateNormal\cf4 ];\ [\cf15 _showBtn\cf4 \cf14 setTitleColor\cf4 :[\cf10 UIColor\cf4 \cf14 orangeColor\cf4 ] \cf14 forState\cf4 :\cf14 UIControlStateNormal\cf4 ];\ [\cf15 _showBtn\cf4 \cf14 addTarget\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 action\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (showAdAlertView) \cf14 forControlEvents\cf4 :\cf14 UIControlEventTouchUpInside\cf4 ];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 \cf15 _showBtn\cf4 ;\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 showAdAlertView\cf4 \{\ [\cf9 DYAdAlertView\cf4 \cf15 showInView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 \cf15 theDelegate\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf15 theADInfo\cf4 :\cf15 _imgArr\cf4 \cf15 placeHolderImage\cf4 :\cf6 @"1"\cf4 ];\ \}\ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 showAdAlertViewImageString\cf4 :(\cf10 NSString\cf4 *)image \cf11 linkUrl\cf4 :(\cf10 NSString\cf4 *)linkUrl \cf11 audio\cf4 :(\cf10 NSString\cf4 *)audio \cf11 duration\cf4 :(\cf10 NSTimeInterval\cf4 )duration \cf11 content\cf4 :(\cf10 NSString\cf4 *)content \cf11 showCancelButton\cf4 :( \f2\b \cf8 BOOL \f0\b0 \cf4 )showCancelButton \cf11 type\cf4 :(\cf9 DYAdModelType\cf4 )type \cf11 success\cf4 :( \f2\b \cf8 BOOL \f0\b0 \cf4 )success\{\ \cf10 NSMutableArray\cf4 *arr = [[\cf10 NSMutableArray\cf4 \cf14 alloc\cf4 ]\cf14 initWithCapacity\cf4 :\cf7 0\cf4 ];\ \cf9 DYAdModel\cf4 *adModel = [[\cf9 DYAdModel\cf4 \cf14 alloc\cf4 ]\cf14 init\cf4 ];\ adModel.\cf15 imgStr\cf4 = image;\ adModel.\cf15 linkUrl\cf4 = linkUrl;\ adModel.\cf15 audio\cf4 = audio;\ adModel.\cf15 duration\cf4 = duration;\ adModel.\cf15 content\cf4 = content;\ adModel.\cf15 showCancelButton\cf4 = showCancelButton;\ adModel.\cf15 type\cf4 = type;\ adModel.\cf15 success\cf4 = success;\ [arr \cf14 addObject\cf4 :adModel];\ \cf15 _imgArr\cf4 = arr;\ \ \ [\cf15 _showLongViewc\cf4 \cf14 removeFromSuperview\cf4 ];\ \cf9 DYAdAlertView\cf4 *showLongView= [\cf9 DYAdAlertView\cf4 \cf15 showInView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 \cf15 theDelegate\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf15 theADInfo\cf4 :arr \cf15 placeHolderImage\cf4 :\cf6 @"1"\cf4 ];\ \ \ showLongView.\cf14 userInteractionEnabled\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _lastMsg\cf4 .\cf15 fromUserId\cf4 .\cf14 length\cf4 >\cf7 0\cf4 ) \{\ [[[\cf10 UIApplication\cf4 \cf14 sharedApplication\cf4 ].\cf14 windows\cf4 \cf14 objectAtIndex\cf4 :\cf7 0\cf4 ] \cf14 addSubview\cf4 :showLongView];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 \cf14 addSubview\cf4 :showLongView];\ \}\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 showLongViewc\cf4 =showLongView;\ \ \cf2 // [showLongView.titleLong addTarget:self action:@selector(gotoGouCaiBtb) forControlEvents:UIControlStateNormal];\cf4 \ \ \cf2 // [DYAdAlertView showInView:self.view theDelegate:self theADInfo:arr placeHolderImage:@"1"];\cf4 \ \}\ \ \cf2 // \f1 \'d7\'ee\'d0\'c2\'c8\'ba\'b9\'ab\'b8\'e6 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 showLatestBroadcastTitle\cf4 :(\cf10 NSString\cf4 *)title \cf11 message\cf4 :(\cf10 NSString\cf4 *)message \{\ \cf10 NSArray\cf4 *buttons = \cf7 @[\cf6 @" \f1 \'d6\'aa\'b5\'c0\'c1\'cb \f0 "\cf7 ]\cf4 ;\ \cf10 NSData\cf4 * data = [\cf10 NSData\cf4 \cf14 dataWithContentsOfURL\cf4 :[\cf10 NSURL\cf4 \cf14 URLWithString\cf4 :\cf6 @""\cf4 ]];\ \cf10 UIImage\cf4 *image = [\cf10 UIImage\cf4 \cf14 imageWithData\cf4 :data];\ [\cf15 _alert\cf4 \cf15 hide\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ \cf9 STAlertView\cf4 *alert = [[\cf9 STAlertView\cf4 \cf14 alloc\cf4 ] \cf15 initWithTitle\cf4 :title\ \cf15 image\cf4 :image\ \cf15 message\cf4 :message\ \cf15 buttonTitles\cf4 :buttons];\ \cf15 _alert\cf4 = alert;\ alert.\cf15 hideWhenTapOutside\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [alert \cf15 setDidShowHandler\cf4 :^\{\ \cf14 NSLog\cf4 (\cf6 @" \f1 \'cf\'d4\'ca\'be\'c1\'cb \f0 "\cf4 );\ \}];\ [alert \cf15 setDidHideHandler\cf4 :^\{\ \cf14 NSLog\cf4 (\cf6 @" \f1 \'cf\'fb\'ca\'a7\'c1\'cb \f0 "\cf4 );\ \}];\ [alert \cf15 setActionHandler\cf4 :^(\cf10 NSInteger\cf4 index) \{\ \f2\b \cf8 switch \f0\b0 \cf4 (index) \{\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 0\cf4 :\ \{\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 default \f0\b0 \cf4 :\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}];\ [alert \cf15 show\cf4 : \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ \cf2 // \f1 \'b5\'e3\'bb\'f7\'ba\'f3\'cc\'f8\'cd\'f8\'d2\'b3 \f0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 clickAlertViewAtIndex\cf4 :(\cf10 NSInteger\cf4 )index\{\ \cf9 DYAdModel\cf4 *adModel = [\cf15 _imgArr\cf4 \cf14 objectAtIndex\cf4 :index];\ \f2\b \cf8 switch \f0\b0 \cf4 (adModel.\cf15 type\cf4 ) \{\ \f2\b \cf8 case \f0\b0 \cf4 \cf15 DYAdModelTypeLongAnimation\cf4 :\ \{\ \cf2 // webpageVC *webVC = [webpageVC alloc];\cf4 \ \cf2 // webVC.isGotoBack= YES;\cf4 \ \cf2 // webVC.isSend = NO;\cf4 \ \cf2 // webVC.url = adModel.linkUrl;\cf4 \ \cf2 // webVC = [webVC init];\cf4 \ \cf2 // [g_navigation.navigationView addSubview:webVC.view];\cf4 \ [\cf5 g_App\cf4 .\cf15 navigation\cf4 \cf15 popToRootViewController\cf4 ];\ \ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf15 DYAdModelTypeGiftOpen\cf4 :\ \{\ \cf2 // \f1 \'b7\'a2\'cd\'f8\'c2\'e7\'c7\'eb\'c7\'f3 \f0 \cf4 \ [\cf5 g_server\cf4 \cf15 getRroomActivity\cf4 :\cf15 _activityModel\cf4 . \f2\b \cf8 id \f0\b0 \cf4 \cf15 ToView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ \ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf15 DYAdModelTypeGifttOpenAnimation\cf4 :\ \{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 showAdAlertViewImageString\cf4 :\cf6 @" \f1 \'bb\'f1\'b5\'c3\'bd\'b1\'c0\'f8\'bd\'e7\'c3\'e6 \f0 .png"\cf4 linkUrl:\cf15 _activityModel\cf4 .imageUrl \cf15 audio\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 \cf15 duration\cf4 :\cf7 0\cf4 \cf15 content\cf4 :\cf15 _activityModel\cf4 .success?\cf15 _activityModel\cf4 .giftName:\cf6 @" \f1 \'c0\'f1\'ce\'ef\'d2\'d1\'c7\'c0\'cd\'ea \f0 !"\cf4 showCancelButton: \f2\b \cf8 NO \f0\b0 \cf4 \cf15 type\cf4 :(\cf15 DYAdModelTypeGiftAfterOpen\cf4 ) success:_activityModel.success];\ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf15 DYAdModelTypeGiftAfterOpen\cf4 :\ \{\ \cf2 // \f1 \'c7\'eb\'c7\'f3\'b7\'fe\'ce\'f1\'c6\'f7 \f0 \cf4 \ [\cf5 g_server\cf4 \cf15 getRoomActivityRecordToView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \ \f2\b \cf8 default \f0\b0 \cf4 :\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 setupFloating\cf4 \{\ \cf15 _floating\cf4 = [[\cf9 MISFloatingBall\cf4 \cf14 alloc\cf4 ] \cf15 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf5 JX_SCREEN_WIDTH\cf4 -\cf7 60\cf4 , \cf5 JX_SCREEN_HEIGHT\cf4 /\cf7 3\cf4 , \cf7 60\cf4 , \cf7 60\cf4 ) \cf15 inSpecifiedView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 \cf15 effectiveEdgeInsets\cf4 :(\cf14 UIEdgeInsetsZero\cf4 )];\ \cf2 // \f1 \'d7\'d4\'b6\'af\'bf\'bf\'b1\'df \f0 \cf4 \ \cf15 _floating\cf4 .\cf15 autoCloseEdge\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [\cf15 _floating\cf4 \cf15 setContent\cf4 :[\cf10 UIImage\cf4 \cf14 imageNamed\cf4 :\cf6 @"sidaiDD"\cf4 ] \cf15 contentType\cf4 :\cf15 MISFloatingBallContentTypeImage\cf4 ];\ \cf15 _floating\cf4 .\cf15 edgePolicy\cf4 = \cf15 MISFloatingBallEdgePolicyLeftRight\cf4 ;\ [\cf15 _floating\cf4 \cf15 show\cf4 ];\ \f2\b \cf8 __weak \f0\b0 \cf4 \f2\b \cf8 __typeof \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 )weakSelf = \f2\b \cf8 self \f0\b0 \cf4 ;\ \cf15 _floating\cf4 .\cf15 clickHandler\cf4 = ^(\cf9 MISFloatingBall\cf4 * \f2\b \cf8 _Nonnull \f0\b0 \cf4 floatingBall) \{\ \cf2 //[g_server getAppResource:@"5" ToView:weakSelf];\cf4 \ \ \f2\b \cf8 long \f0\b0 \cf4 time = ( \f2\b \cf8 long \f0\b0 \cf4 )[[\cf10 NSDate\cf4 \cf14 date\cf4 ] \cf14 timeIntervalSince1970\cf4 ];\ time = (time *\cf7 1000\cf4 + \cf5 g_server\cf4 .\cf15 timeDifference\cf4 );\ \cf10 NSString\cf4 *salt = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%ld"\cf4 , time];\ \cf10 NSString\cf4 *jid_room=[[\cf10 NSUserDefaults\cf4 \cf14 standardUserDefaults\cf4 ] \cf14 objectForKey\cf4 :\cf6 @"jid_roomJid"\cf4 ];\ [\cf5 g_server\cf4 \cf15 getact_act_act_SilkPlanallByJidlist\cf4 :salt \cf15 jid\cf4 :jid_room \cf15 andToView\cf4 :weakSelf];\ \};\ \}\ \ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 viewDidLoad\cf4 \ \{\ [ \f2\b \cf8 super \f0\b0 \cf4 \cf14 viewDidLoad\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 getEmojsData\cf4 ];\ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (getEmojsData) \cf14 name\cf4 :\cf5 kEmojiRefresh\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 .\cf14 backgroundColor\cf4 = \cf5 HEXCOLOR\cf4 (\cf7 0xF9F9F9\cf4 );\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 friendStatus\cf4 = [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatPerson\cf4 .\cf15 status\cf4 \cf14 intValue\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 customView\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatRoom\cf4 .\cf15 roomJid\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 setupFloating\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 setupNotice\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 setupNotice2nd\cf4 ];\ \cf5 #ifdef DEBUG\cf4 \ \ \cf10 UILabel\cf4 *lable = [[\cf10 UILabel\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 100\cf4 , \cf5 JX_SCREEN_HEIGHT\cf4 -\cf7 200\cf4 , \cf5 JX_SCREEN_WIDTH\cf4 , \cf7 50\cf4 )];\ lable.\cf14 text\cf4 = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"roomId = %@"\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomId\cf4 ];\ lable.\cf14 font\cf4 = [\cf10 UIFont\cf4 \cf14 systemFontOfSize\cf4 :\cf7 10\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 \cf14 addSubview\cf4 :lable];\ [lable \cf14 sizeToFit\cf4 ];\ \ \cf10 UILabel\cf4 *lable1 = [[\cf10 UILabel\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 100\cf4 , \cf5 JX_SCREEN_HEIGHT\cf4 -\cf7 150\cf4 , \cf5 JX_SCREEN_WIDTH\cf4 , \cf7 50\cf4 )];\ lable1.\cf14 text\cf4 = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"roomJid = %@"\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatRoom\cf4 .\cf15 roomJid\cf4 ];\ lable1.\cf14 font\cf4 = [\cf10 UIFont\cf4 \cf14 systemFontOfSize\cf4 :\cf7 10\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 \cf14 addSubview\cf4 :lable1];\ [lable1 \cf14 sizeToFit\cf4 ];\ \cf5 #else\cf4 \ \ \cf2 // Release \f1 \'c4\'a3\'ca\'bd\'b5\'c4\'b4\'fa\'c2\'eb \f0 ...\cf4 \ \ \cf5 #endif\cf4 \ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 courseId\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ) \{\ \cf10 UIButton\cf4 *btn = [[\cf10 UIButton\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 71\cf4 , \cf5 THE_DEVICE_HAVE_HEAD\cf4 ? \cf7 13\cf4 : \cf7 10\cf4 , \cf5 JX_SCREEN_WIDTH\cf4 -\cf7 71\cf4 *\cf7 2\cf4 , \cf7 36\cf4 )];\ btn.\cf14 backgroundColor\cf4 = \cf5 THEMECOLOR\cf4 ;\ [btn \cf14 setTitle\cf4 :\cf5 Localized\cf4 (\cf6 @"JXUserInfoVC_SendMseeage"\cf4 ) \cf14 forState\cf4 :\cf14 UIControlStateNormal\cf4 ];\ [btn \cf14 setTitleColor\cf4 :[\cf10 UIColor\cf4 \cf14 whiteColor\cf4 ] \cf14 forState\cf4 :\cf14 UIControlStateNormal\cf4 ];\ btn.\cf14 titleLabel\cf4 .\cf14 font\cf4 = \cf5 g_factory\cf4 .\cf15 font16\cf4 ;\ btn.\cf14 layer\cf4 .\cf14 masksToBounds\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ btn.\cf14 layer\cf4 .\cf14 cornerRadius\cf4 = btn.\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 /\cf7 2\cf4 ;\ [btn \cf14 addTarget\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 action\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (sendCourseAction) \cf14 forControlEvents\cf4 :\cf14 UIControlEventTouchUpInside\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableFooter\cf4 \cf14 addSubview\cf4 :btn];\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 createFooterSubViews\cf4 ];\ \}\ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 frame\cf4 = \cf14 CGRectMake\cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 x\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableFooter\cf4 .\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 y\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 - \cf7 10\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 );\ \ \ \f2\b \cf8 if \f0\b0 \cf4 (! \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ) \{\ \cf2 // \f1 \'c8\'e7\'b9\'fb\'ca\'c7\'d7\'d4\'bc\'ba\'b5\'c4\'c6\'e4\'cb\'fb\'b6\'cb\'a3\'ac\'b2\'bb\'b5\'f7\'d3\'c3\'bd\'d3\'bf\'da \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 chatPerson\cf4 && [\cf15 chatPerson\cf4 .\cf15 userId\cf4 \cf14 rangeOfString\cf4 :\cf5 MY_USER_ID\cf4 ].\cf14 location\cf4 != \cf14 NSNotFound\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 friendStatus\cf4 = \cf7 10\cf4 ;\ \f2\b \cf8 for \f0\b0 \cf4 (\cf9 JXDevice\cf4 *device \f2\b \cf8 in \f0\b0 \cf4 \cf5 g_multipleLogin\cf4 .\cf15 deviceArr\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([device.\cf15 userId\cf4 \cf14 isEqualToString\cf4 :\cf15 chatPerson\cf4 .\cf15 userId\cf4 ]) \{\ \cf2 // NSString *str = [device.isOnLine intValue] == 1 ? Localized(@"JX_OnLine") : Localized(@"JX_OffLine");\cf4 \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 onlinestate\cf4 = [device.\cf15 isOnLine\cf4 \cf14 boolValue\cf4 ];\ \cf2 // self.title = [NSString stringWithFormat:@"%@(%@)",chatPerson.remarkName.length > 0 ? chatPerson.remarkName : chatPerson.userNickname,str];\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 setChatTitle\cf4 :\cf15 chatPerson\cf4 .\cf15 remarkName\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ? \cf15 chatPerson\cf4 .\cf15 remarkName\cf4 : \cf15 chatPerson\cf4 .\cf15 userNickname\cf4 ];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \ \cf2 // if ([chatPerson.userId rangeOfString:@"android"].location != NSNotFound) \{\cf4 \ \cf2 //\cf4 \ \cf2 // NSString *str = [g_multipleLogin.androidUser.isOnLine intValue] == 1 ? Localized(@"JX_OnLine") : Localized(@"JX_OffLine");\cf4 \ \cf2 // self.title = [NSString stringWithFormat:@"%@(%@)",chatPerson.userNickname,str];\cf4 \ \cf2 // \}\cf4 \ \cf2 // if ([chatPerson.userId rangeOfString:@"pc"].location != NSNotFound) \{\cf4 \ \cf2 // NSString *str = [g_multipleLogin.pcUser.isOnLine intValue] == 1 ? Localized(@"JX_OnLine") : Localized(@"JX_OffLine");\cf4 \ \cf2 // self.title = [NSString stringWithFormat:@"%@(%@)",chatPerson.userNickname,str];\cf4 \ \cf2 // \}\cf4 \ \cf2 // if ([chatPerson.userId rangeOfString:@"mac"].location != NSNotFound) \{\cf4 \ \cf2 // NSString *str = [g_multipleLogin.macUser.isOnLine intValue] == 1 ? Localized(@"JX_OnLine") : Localized(@"JX_OffLine");\cf4 \ \cf2 // self.title = [NSString stringWithFormat:@"%@(%@)",chatPerson.userNickname,str];\cf4 \ \cf2 // \}\cf4 \ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isGroupMessages\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 title\cf4 = \cf5 Localized\cf4 (\cf6 @"JX_GroupHair"\cf4 );\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 setAudioIconFrame\cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [\cf5 g_server\cf4 \cf15 getUser\cf4 :\cf15 chatPerson\cf4 .\cf15 userId\cf4 \cf15 toView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ [\cf5 g_server\cf4 \cf15 getUser\cf4 :\cf5 MY_USER_ID\cf4 \cf15 toView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [\cf5 g_server\cf4 \cf15 roomGetRoom\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomId\cf4 \cf15 toView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ \ \cf5 #if IS_AUTO_JOIN_ROOM\cf4 \ \cf2 // \f1 \'bd\'f8\'c8\'ba\'d7\'e9 \f0 \f1 \'c8\'e7\'b9\'fb\'c3\'bb\'d3\'d0\'c1\'ac\'bd\'d3\'a3\'ac\'cf\'c8\'c1\'ac\'bd\'d3\'d2\'bb\'b4\'ce \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (![g_xmpp.roomPool getRoom: \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.userId] && [ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.groupStatus intValue] == \cf7 0\cf4 ) \{\ [g_xmpp.roomPool joinRoom:chatPerson.userId title:chatPerson.userNickname lastDate: \f2\b \cf8 nil \f0\b0 \cf4 isNew: \f2\b \cf8 NO \f0\b0 \cf4 ];\ chatRoom = [[JXXMPP sharedInstance].roomPool joinRoom:chatPerson.userId title:chatPerson.userNickname lastDate: \f2\b \cf8 nil \f0\b0 \cf4 isNew: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \cf5 #endif\cf4 \ \}\ \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 refresh\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 (! \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 || \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 .\cf14 length\cf4 <= \cf7 0\cf4 ) \{\ \cf2 // \f1 \'cd\'ac\'b2\'bd\'cf\'fb\'cf\'a2 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 messageSync\cf4 ];\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 chatPerson\cf4 .\cf15 lastInput\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ) \{\ \ \cf14 dispatch_after\cf4 (\cf14 dispatch_time\cf4 (\cf5 DISPATCH_TIME_NOW\cf4 , (\cf10 int64_t\cf4 )(\cf7 0.5\cf4 * \cf5 NSEC_PER_SEC\cf4 )), \cf14 dispatch_get_main_queue\cf4 (), ^\{\ \ \cf15 _messageText\cf4 .\cf14 inputView\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ [\cf15 _messageText\cf4 \cf14 reloadInputViews\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 doBeginEdit\cf4 ];\ [\cf15 _messageText\cf4 \cf14 becomeFirstResponder\cf4 ];\ [\cf15 _faceView\cf4 \cf14 removeFromSuperview\cf4 ];\ \});\ \}\ \ \f2\b \cf8 long \f0\b0 \cf4 time = ( \f2\b \cf8 long \f0\b0 \cf4 )[[\cf10 NSDate\cf4 \cf14 date\cf4 ] \cf14 timeIntervalSince1970\cf4 ];\ time = (time *\cf7 1000\cf4 + \cf5 g_server\cf4 .\cf15 timeDifference\cf4 );\ \cf10 NSString\cf4 *salt = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%ld"\cf4 , time];\ [\cf5 g_server\cf4 \cf15 UserRoomAttentionattentionLastInfo\cf4 :salt \cf15 userId\cf4 :\cf5 g_server\cf4 .\cf15 myself\cf4 .\cf15 userId\cf4 \cf15 jid\cf4 :\cf15 _roomJid\cf4 \cf15 andToView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 chatVCMessageSync\cf4 :(\cf10 NSNotification\cf4 *)noti \{\ \f2\b \cf8 long \f0\b0 \cf4 \f2\b \cf8 long \f0\b0 \cf4 timeSend = [noti.\cf14 object\cf4 \cf14 longLongValue\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatPerson\cf4 .\cf15 timeSend\cf4 = [\cf10 NSDate\cf4 \cf14 dateWithTimeIntervalSince1970\cf4 :timeSend];\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 messageSync\cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 messageSync\cf4 \{\ \ \f2\b \cf8 double \f0\b0 \cf4 syncTimeLen = \cf7 0\cf4 ;\ \cf10 NSString\cf4 * s;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 \cf14 length\cf4 ]>\cf7 0\cf4 )\{\ s = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ;\ \cf2 // syncTimeLen = [g_myself.groupChatSyncTimeLen doubleValue];\cf4 \ \cf2 // syncTimeLen = 0;\cf4 \ syncTimeLen = [\cf5 g_myself\cf4 .\cf15 chatSyncTimeLen\cf4 \cf14 doubleValue\cf4 ];\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ s = \cf15 chatPerson\cf4 .\cf15 userId\cf4 ;\ syncTimeLen = [\cf5 g_myself\cf4 .\cf15 chatSyncTimeLen\cf4 \cf14 doubleValue\cf4 ];\ \}\ \ \cf2 // \f1 \'cd\'ac\'b2\'bd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatPerson\cf4 .\cf15 downloadTime\cf4 \cf14 timeIntervalSince1970\cf4 ] < [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatPerson\cf4 .\cf15 timeSend\cf4 \cf14 timeIntervalSince1970\cf4 ] && \cf15 _taskList\cf4 .\cf14 count\cf4 <=\cf7 0\cf4 && syncTimeLen != -\cf7 2\cf4 ) \{\ \f2\b \cf8 long \f0\b0 \cf4 \f2\b \cf8 long \f0\b0 \cf4 chatSyncTimeLen = \cf7 0\cf4 ;\ \f2\b \cf8 switch \f0\b0 \cf4 ([\cf5 g_myself\cf4 .\cf15 chatSyncTimeLen\cf4 \cf14 integerValue\cf4 ]) \{\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 0\cf4 : \cf2 // 0.04 1 \f1 \'d0\'a1\'ca\'b1 \f0 \cf4 \ chatSyncTimeLen = \cf7 3600000\cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 1\cf4 : \cf2 // 1 \f1 \'cc\'ec \f0 \cf4 \ chatSyncTimeLen = \cf7 86400000\cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 7\cf4 : \cf2 // 7 \f1 \'cc\'ec \f0 \cf4 \ chatSyncTimeLen = \cf7 604800017\cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 30\cf4 : \cf2 // 30 \f1 \'cc\'ec \f0 \cf4 \ chatSyncTimeLen = \cf7 2629800000\cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 90\cf4 : \cf2 // 90 \f1 \'cc\'ec \f0 \cf4 \ chatSyncTimeLen = \cf7 7889400000\cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 365\cf4 : \cf2 //365 \f1 \'cc\'ec \f0 \cf4 \ chatSyncTimeLen = \cf7 31557600000\cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 -\cf7 1\cf4 : \cf2 // \f1 \'d3\'c0\'be\'c3 \f0 (20 \f1 \'c4\'ea \f0 )\cf4 \ chatSyncTimeLen = \cf7 631152000000\cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 default \f0\b0 \cf4 :\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 long \f0\b0 \cf4 endTime = [[\cf10 NSDate\cf4 \cf14 date\cf4 ] \cf14 timeIntervalSince1970\cf4 ] * \cf7 1000\cf4 ;\ \f2\b \cf8 long \f0\b0 \cf4 starTime = endTime - chatSyncTimeLen;\ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isSyncMsg\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 \cf14 length\cf4 ]>\cf7 0\cf4 )\{\ \cf2 // \f1 \'bb\'f1\'c8\'a1\'bd\'f8\'c8\'ba\'ca\'b1\'bc\'e4 \f0 \cf4 \ \cf10 NSString\cf4 * myUserId = \cf5 MY_USER_ID\cf4 ;\ \f2\b \cf8 double \f0\b0 \cf4 createTime = \cf7 0\cf4 ;\ \cf10 NSArray\cf4 *array = [\cf9 memberData\cf4 \cf15 getSelfMember\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomId\cf4 ];\ \f2\b \cf8 for \f0\b0 \cf4 (\cf9 memberData\cf4 *mdata \f2\b \cf8 in \f0\b0 \cf4 array) \{\ \cf10 NSString\cf4 *userId = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%ld"\cf4 , mdata.\cf15 userId\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ([userId \cf14 isEqualToString\cf4 :myUserId])\{\ createTime = mdata.\cf15 createTime\cf4 * \cf7 1000\cf4 ;\ \}\ \}\ \cf2 // \f1 \'c8\'ba\'d7\'e9\'c9\'be\'b3\'fd\'c1\'c4\'cc\'ec\'bc\'c7\'c2\'bc\'ca\'b1\'bc\'e4 \f0 \cf4 \ \cf10 NSInteger\cf4 time1 = \cf7 0\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([\cf5 g_default\cf4 \cf14 valueForKey\cf4 :s] && ([ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 \cf14 length\cf4 ]>\cf7 0\cf4 )) \{\ time1 = [[\cf5 g_default\cf4 \cf14 valueForKey\cf4 :s] \cf14 integerValue\cf4 ];\ \}\ \cf10 NSNumber\cf4 *lastClearRecordTime = [\cf10 NSNumber\cf4 \cf14 numberWithInteger\cf4 :time1];\ \cf2 // \f1 \'c9\'e8\'d6\'c3\'c9\'be\'b3\'fd\'cb\'f9\'d3\'d0\'c1\'c4\'cc\'ec\'bc\'c7\'c2\'bc\'ca\'b1\'bc\'e4 \f0 \cf4 \ \cf10 NSInteger\cf4 time2 = \cf7 0\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([\cf5 g_default\cf4 \cf14 valueForKey\cf4 :\cf6 @"CLEARALLMSGRECORDTIME"\cf4 ] && ([ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 \cf14 length\cf4 ]>\cf7 0\cf4 )) \{\ time2 = [[\cf5 g_default\cf4 \cf14 valueForKey\cf4 :\cf6 @"CLEARALLMSGRECORDTIME"\cf4 ] \cf14 integerValue\cf4 ];\ \}\ \cf10 NSNumber\cf4 *CLEARALLMSGRECORDTIME = [\cf10 NSNumber\cf4 \cf14 numberWithInteger\cf4 :time2];\ \cf2 // \f1 \'c9\'e8\'d6\'c3\'c2\'fe\'d3\'ce\'b5\'c4\'ca\'b1\'bc\'e4 \f0 \cf4 \ \cf10 NSNumber\cf4 *synTime = [\cf10 NSNumber\cf4 \cf14 numberWithLong\cf4 :starTime];\ \ \ \cf2 // \f1 \'c8\'eb\'c8\'ba\'ca\'b1\'bc\'e4 \f0 \cf4 \ \cf10 NSInteger\cf4 time3 = \cf7 0\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (createTime > \cf7 0\cf4 )\{\ time3 = [[\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%f"\cf4 , createTime] \cf14 integerValue\cf4 ];\ \}\ \cf10 NSNumber\cf4 *joinTime = [\cf10 NSNumber\cf4 \cf14 numberWithInteger\cf4 :time3];\ \cf2 // \f1 \'c5\'c5\'d0\'f2\'cb\'c4\'b8\'f6\'ca\'b1\'bc\'e4 \f0 \f1 \'c8\'eb\'c8\'ba\'ca\'b1\'bc\'e4 \f0 , \f1 \'c8\'ba\'d7\'e9\'c9\'be\'b3\'fd\'c1\'c4\'cc\'ec\'bc\'c7\'c2\'bc\'ca\'b1\'bc\'e4 \f0 , \f1 \'c9\'e8\'d6\'c3\'c9\'be\'b3\'fd\'cb\'f9\'d3\'d0\'c1\'c4\'cc\'ec\'bc\'c7\'c2\'bc\'ca\'b1\'bc\'e4 \f0 , \f1 \'c9\'e8\'d6\'c3\'c2\'fe\'d3\'ce\'b5\'c4\'ca\'b1\'bc\'e4 \f0 \cf4 \ \cf10 NSArray\cf4 *sortedArray = [\cf7 @[\cf4 joinTime,lastClearRecordTime,synTime,CLEARALLMSGRECORDTIME\cf7 ]\cf4 \cf14 sortedArrayUsingComparator\cf4 :^\cf10 NSComparisonResult\cf4 ( \f2\b \cf8 id \f0\b0 \cf4 \f2\b \cf8 _Nonnull \f0\b0 \cf4 obj1, \f2\b \cf8 id \f0\b0 \cf4 \f2\b \cf8 _Nonnull \f0\b0 \cf4 obj2) \{\ \cf10 NSComparisonResult\cf4 result = [obj1 \cf14 compare\cf4 : obj2];\ \f2\b \cf8 return \f0\b0 \cf4 result;\ \}];\ \cf10 NSNumber\cf4 *time = [sortedArray \cf14 lastObject\cf4 ];\ starTime = [time \cf14 longValue\cf4 ];\ \cf2 // p = [[JXMessageObject sharedInstance] fetchMessageListWithUser:s byAllNum:_array.count pageCount:pageCount startTime:[NSDate dateWithTimeIntervalSince1970:createTime]];\cf4 \ [\cf5 g_server\cf4 \cf15 tigaseMucMsgsWithRoomId\cf4 :s \cf15 StartTime\cf4 :starTime \cf15 EndTime\cf4 :endTime \cf15 PageIndex\cf4 :\cf7 0\cf4 \cf15 PageSize\cf4 :\cf5 PAGECOUNT\cf4 \cf15 toView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \ [\cf5 g_server\cf4 \cf15 tigaseMsgsWithReceiver\cf4 :s \cf15 StartTime\cf4 :starTime \cf15 EndTime\cf4 :endTime \cf15 PageIndex\cf4 :\cf7 0\cf4 \cf15 toView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatPerson\cf4 .\cf15 downloadTime\cf4 = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatPerson\cf4 .\cf15 timeSend\cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatPerson\cf4 \cf15 update\cf4 ];\ \}\ \ \f2\b \cf8 else \f0\b0 \cf4 \{\ \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 refresh\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 ) \cf11 customView\cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 createHeadAndFoot\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableFooter\cf4 .\cf14 clipsToBounds\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf2 // \f1 \'c9\'e8\'d6\'c3\'c1\'c4\'cc\'ec\'b1\'b3\'be\'b0\'cd\'bc\'c6\'ac \f0 \cf4 \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 backGroundImageView\cf4 = [[\cf10 UIImageView\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 0\cf4 , \cf7 0\cf4 , \cf5 JX_SCREEN_WIDTH\cf4 , \cf5 JX_SCREEN_HEIGHT\cf4 - \cf5 JX_SCREEN_BOTTOM\cf4 )];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 backGroundImageView\cf4 .\cf14 contentMode\cf4 = \cf14 UIViewContentModeScaleAspectFill\cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 \cf14 insertSubview\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 backGroundImageView\cf4 \cf14 belowSubview\cf4 :\cf15 _table\cf4 ];\ \ \cf10 NSData\cf4 *imageData = [\cf5 g_constant\cf4 .\cf15 userBackGroundImage\cf4 \cf14 objectForKey\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatPerson\cf4 .\cf15 userId\cf4 ];\ \cf10 UIImage\cf4 *backGroundImage = [\cf10 UIImage\cf4 \cf14 imageWithContentsOfFile\cf4 :\cf5 kChatBackgroundImagePath\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (imageData) \{\ \cf15 _table\cf4 .\cf14 backgroundColor\cf4 = [\cf10 UIColor\cf4 \cf14 clearColor\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 backGroundImageView\cf4 .\cf14 image\cf4 = [\cf10 UIImage\cf4 \cf14 imageWithData\cf4 :imageData];\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (backGroundImage) \{\ \cf15 _table\cf4 .\cf14 backgroundColor\cf4 = [\cf10 UIColor\cf4 \cf14 clearColor\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 backGroundImageView\cf4 .\cf14 image\cf4 = backGroundImage;\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf15 _table\cf4 .\cf14 backgroundColor\cf4 = \cf5 HEXCOLOR\cf4 (\cf7 0xF2F2F2\cf4 );\ \}\ \cf2 // _table.allowsSelection = NO;\cf4 \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isShowFooterPull\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isShowHeaderPull\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf2 // self.tableFooter.backgroundColor = HEXCOLOR(0xD0D0D0);\cf4 \ \ \cf10 CGFloat\cf4 width = \cf7 120\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([\cf5 g_constant\cf4 .\cf15 sysLanguage\cf4 \cf14 isEqualToString\cf4 :\cf6 @"zh"\cf4 ]) \{\ width = \cf7 80\cf4 ;\ \}\ \cf2 // if (!self.ished) \{\cf4 \ \ \cf2 // NSString *str = [NSString stringWithFormat:@"%@(%@)",chatPerson.userNickname,Localized(@"JX_OffLine")];\cf4 \ \cf2 // CGSize size = [str boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@\{NSFontAttributeName:self.headerTitle.font\} context:nil].size;\cf4 \ \cf2 // CGFloat n = JX_SCREEN_WIDTH / 2 + size.width / 2;\cf4 \ \cf2 // CGFloat x = ((JX_SCREEN_WIDTH - n - (JX_SCREEN_WIDTH - btn.frame.origin.x)) / 2) - (width / 2) + n;\cf4 \ \ \cf2 // UIButton *readDelBut = [UIFactory createButtonWithImage:@"im_destroy"\cf4 \ \cf2 // highlight:nil\cf4 \ \cf2 // target:self\cf4 \ \cf2 // selector:@selector(switchValueChange:)];\cf4 \ \cf2 // readDelBut.custom_acceptEventInterval = .25f;\cf4 \ \cf2 // readDelBut.tag = 2000;\cf4 \ \cf2 // readDelBut.frame = CGRectMake(JX_SCREEN_WIDTH - 42 - 32, JX_SCREEN_TOP - 33, 22, 22);\cf4 \ \cf2 // readDelBut.layer.cornerRadius = readDelBut.frame.size.width / 2;\cf4 \ \cf2 // readDelBut.layer.masksToBounds = YES;\cf4 \ \cf2 // readDelBut.layer.borderWidth = 1;\cf4 \ \cf2 // readDelBut.layer.borderColor = [UIColor whiteColor].CGColor;\cf4 \ \cf2 // [self.tableHeader addSubview:readDelBut];\cf4 \ \ \cf14 NSLog\cf4 (\cf6 @"timetime203 -- %f"\cf4 , [[\cf10 NSDate\cf4 \cf14 date\cf4 ] \cf14 timeIntervalSince1970\cf4 ]);\ \cf14 dispatch_after\cf4 (\cf14 dispatch_time\cf4 (\cf5 DISPATCH_TIME_NOW\cf4 , (\cf10 int64_t\cf4 )(\cf7 0.3\cf4 * \cf5 NSEC_PER_SEC\cf4 )), \cf14 dispatch_get_main_queue\cf4 (), ^\{\ \cf9 memberData\cf4 *data = [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 room\cf4 \cf15 getMember\cf4 :\cf5 g_myself\cf4 .\cf15 userId\cf4 ];\ \ \cf15 _moreView\cf4 =[\cf9 JXSelectImageView\cf4 \cf14 alloc\cf4 ];\ \cf15 _moreView\cf4 .\cf15 isDevice\cf4 = [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatPerson\cf4 .\cf15 userId\cf4 \cf14 rangeOfString\cf4 :\cf5 MY_USER_ID\cf4 ].\cf14 location\cf4 != \cf14 NSNotFound\cf4 ;\ \cf15 _moreView\cf4 .\cf15 delegate\cf4 = \f2\b \cf8 self \f0\b0 \cf4 ;\ \cf15 _moreView\cf4 .\cf15 isGroupMessages\cf4 = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isGroupMessages\cf4 ;\ \cf15 _moreView\cf4 .\cf15 isGroup\cf4 = \cf15 _roomJid\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ;\ \cf15 _moreView\cf4 .\cf15 isWin\cf4 = [data.\cf15 role\cf4 \cf14 intValue\cf4 ] == \cf7 1\cf4 ;\ \cf15 _moreView\cf4 .\cf15 onImage\cf4 = \f2\b \cf8 @selector \f0\b0 \cf4 (pickPhoto);\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ) \{\cf2 // \f1 \'c8\'e7\'b9\'fb\'ca\'c7\'c8\'ba\'c1\'c4 \f0 \cf4 \ \cf15 _moreView\cf4 .\cf15 onGift\cf4 = \f2\b \cf8 @selector \f0\b0 \cf4 (sendGiftToRoom);\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf15 _moreView\cf4 .\cf15 onGift\cf4 = \f2\b \cf8 @selector \f0\b0 \cf4 (sendGift);\ \cf15 _moreView\cf4 .\cf15 onTransfer\cf4 = \f2\b \cf8 @selector \f0\b0 \cf4 (onTransfer);\ \}\ \ \cf15 _moreView\cf4 .\cf15 onAudioChat\cf4 = \f2\b \cf8 @selector \f0\b0 \cf4 (onChatSip);\ \cf15 _moreView\cf4 .\cf15 onVideo\cf4 = \f2\b \cf8 @selector \f0\b0 \cf4 (pickVideo);\ \cf15 _moreView\cf4 .\cf15 onCard\cf4 = \f2\b \cf8 @selector \f0\b0 \cf4 (onCard);\ \cf15 _moreView\cf4 .\cf15 onFile\cf4 = \f2\b \cf8 @selector \f0\b0 \cf4 (onFile);\ \cf15 _moreView\cf4 .\cf15 onLocation\cf4 = \f2\b \cf8 @selector \f0\b0 \cf4 (onLocation);\ \cf15 _moreView\cf4 .\cf15 onCamera\cf4 = \f2\b \cf8 @selector \f0\b0 \cf4 (onCamera);\ \cf15 _moreView\cf4 .\cf15 onShake\cf4 = \f2\b \cf8 @selector \f0\b0 \cf4 (onShake);\ \cf15 _moreView\cf4 .\cf15 onCollection\cf4 = \f2\b \cf8 @selector \f0\b0 \cf4 (onCollection);\ \cf15 _moreView\cf4 .\cf15 onAddressBook\cf4 = \f2\b \cf8 @selector \f0\b0 \cf4 (onAddressBook);\ \cf15 _moreView\cf4 .\cf15 onGroupHelper\cf4 = \f2\b \cf8 @selector \f0\b0 \cf4 (onGroupHelper);\ \ \cf15 _moreView\cf4 = [\cf15 _moreView\cf4 \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 0\cf4 , \cf7 0\cf4 , \cf5 JX_SCREEN_WIDTH\cf4 , \cf5 faceHeight\cf4 )];\ \ \cf15 _voice\cf4 = [[\cf9 JXVolumeView\cf4 \cf14 alloc\cf4 ]\cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 0\cf4 , \cf7 0\cf4 , \cf7 160\cf4 , \cf7 150\cf4 )];\ \cf15 _voice\cf4 .\cf14 center\cf4 = \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 .\cf14 center\cf4 ;\ \});\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 initAudio\cf4 ];\ \ \cf10 UIButton\cf4 * btn;\ \cf10 UIButton\cf4 *btn1;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 )\{\ btn1 = [[\cf10 UIButton\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf5 JX_SCREEN_WIDTH\cf4 -\cf7 18\cf4 -\cf5 BTN_RANG_UP\cf4 *\cf7 2\cf4 , \cf5 JX_SCREEN_TOP\cf4 -\cf7 18\cf4 -\cf5 BTN_RANG_UP\cf4 *\cf7 2\cf4 , \cf7 18\cf4 +\cf5 BTN_RANG_UP\cf4 *\cf7 2\cf4 , \cf7 18\cf4 +\cf5 BTN_RANG_UP\cf4 *\cf7 2\cf4 )];\ [btn1 \cf14 addTarget\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 action\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onMember) \cf14 forControlEvents\cf4 :\cf14 UIControlEventTouchUpInside\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableHeader\cf4 \cf14 addSubview\cf4 :btn1];\ \ \ btn = [\cf9 UIFactory\cf4 \cf15 createButtonWithImage\cf4 :\cf6 @"chat_more_black"\cf4 \cf15 highlight\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 \cf15 target\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf15 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onMember)];\ btn.\cf15 custom_acceptEventInterval\cf4 = \cf7 1.0f\cf4 ;\ btn.\cf14 frame\cf4 = \cf14 CGRectMake\cf4 (\cf5 BTN_RANG_UP\cf4 , \cf5 BTN_RANG_UP\cf4 , \cf7 18\cf4 , \cf7 18\cf4 );\ [btn1 \cf14 addSubview\cf4 :btn];\ \ [\cf5 g_server\cf4 \cf15 getRoomMember\cf4 :\cf15 roomId\cf4 \cf15 userId\cf4 :[\cf5 g_myself\cf4 .\cf15 userId\cf4 \cf14 intValue\cf4 ] \cf15 toView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ \cf2 // \f1 \'bb\'f1\'c8\'a1\'c8\'ba\'b3\'c9\'d4\'b1\'a3\'ba \f0 \cf4 \ \cf10 NSArray\cf4 * memberArray = [\cf9 memberData\cf4 \cf15 fetchAllMembers\cf4 :\cf15 _room\cf4 .\cf15 roomId\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 title\cf4 = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%@(%ld)"\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatPerson\cf4 .\cf15 userNickname\cf4 , memberArray.\cf14 count\cf4 ];\ \ \cf15 _dataArrGetGroundPersonArr\cf4 =[memberArray \cf14 mutableCopy\cf4 ];\ \ \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 setAudioIconFrame\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (memberArray.\cf14 count\cf4 > \cf7 0\cf4 ) \{\cf2 // \f1 \'b1\'be\'b5\'d8\'d3\'d0 \f0 \cf4 \ \cf15 _room\cf4 .\cf15 roomId\cf4 = \cf15 roomId\cf4 ;\ \cf15 _room\cf4 .\cf15 members\cf4 = [memberArray \cf14 mutableCopy\cf4 ];\ \ \cf9 memberData\cf4 *data = [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 room\cf4 \cf15 getMember\cf4 :\cf5 g_myself\cf4 .\cf15 userId\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ([data.\cf15 role\cf4 \cf14 intValue\cf4 ] == \cf7 1\cf4 || [data.\cf15 role\cf4 \cf14 intValue\cf4 ] == \cf7 2\cf4 ) \{\ \cf15 _isAdmin\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf15 _isAdmin\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isFirst\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [\cf5 g_server\cf4 \cf15 getRoom\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 room\cf4 .\cf15 roomId\cf4 \cf15 toView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ \cf2 // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^\{\cf4 \ [\cf5 g_server\cf4 \cf15 listRoomMember\cf4 :\cf15 roomId\cf4 \cf15 page\cf4 :\cf7 0\cf4 \cf15 toView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ \cf2 // \});\cf4 \ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ btn1 = [[\cf10 UIButton\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf5 JX_SCREEN_WIDTH\cf4 -\cf7 18\cf4 -\cf5 BTN_RANG_UP\cf4 *\cf7 2\cf4 , \cf5 JX_SCREEN_TOP\cf4 -\cf7 18\cf4 -\cf5 BTN_RANG_UP\cf4 *\cf7 2\cf4 , \cf7 18\cf4 +\cf5 BTN_RANG_UP\cf4 *\cf7 2\cf4 , \cf7 18\cf4 +\cf5 BTN_RANG_UP\cf4 *\cf7 2\cf4 )];\ [btn1 \cf14 addTarget\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 action\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (createRoom) \cf14 forControlEvents\cf4 :\cf14 UIControlEventTouchUpInside\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableHeader\cf4 \cf14 addSubview\cf4 :btn1];\ \ btn = [\cf9 UIFactory\cf4 \cf15 createButtonWithImage\cf4 :\cf6 @"chat_more_black"\cf4 \ \cf15 highlight\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 \ \cf15 target\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \ \cf15 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (createRoom)];\ btn.\cf15 custom_acceptEventInterval\cf4 = \cf7 1.0f\cf4 ;\ btn.\cf14 frame\cf4 = \cf14 CGRectMake\cf4 (\cf5 BTN_RANG_UP\cf4 , \cf5 BTN_RANG_UP\cf4 , \cf7 18\cf4 , \cf7 18\cf4 );\ [btn1 \cf14 addSubview\cf4 :btn];\ \ \}\ \ \cf15 _audioIcon\cf4 = [[\cf10 UIImageView\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 0\cf4 , \cf5 JX_SCREEN_TOP\cf4 - \cf7 30\cf4 , \cf7 16\cf4 , \cf7 16\cf4 )];\ \cf15 _audioIcon\cf4 .\cf14 image\cf4 = [\cf10 UIImage\cf4 \cf14 imageNamed\cf4 :\cf6 @"audioIcon"\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableHeader\cf4 \cf14 addSubview\cf4 :\cf15 _audioIcon\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 setAudioIconFrame\cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 courseId\cf4 .\cf14 length\cf4 > \cf7 0\cf4 || [\cf15 chatPerson\cf4 .\cf15 userId\cf4 \cf14 rangeOfString\cf4 :\cf5 MY_USER_ID\cf4 ].\cf14 location\cf4 != \cf14 NSNotFound\cf4 || \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isGroupMessages\cf4 || \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isHiddenFooter\cf4 ) \{\ \cf2 // readDelBut.hidden = YES;\cf4 \ btn.\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ btn1.\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ \cf2 /*\cf4 \ \cf2 if (self.isGroupMessages) \{\cf4 \ \cf2 self.isShowHeaderPull = NO;\cf4 \ \cf2 UIView *friendNamesView = [[UIView alloc] initWithFrame:CGRectMake(0, self.tableView.frame.origin.y, JX_SCREEN_WIDTH, 0)];\cf4 \ \cf2 friendNamesView.backgroundColor = [UIColor whiteColor];\cf4 \ \cf2 [self.view addSubview:friendNamesView];\cf4 \ \cf2 \cf4 \ \cf2 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(15, 15, 300, 20)];\cf4 \ \cf2 label.font = [UIFont systemFontOfSize:15.0];\cf4 \ \cf2 label.textColor = [UIColor lightGrayColor];\cf4 \ \cf2 label.text = [NSString stringWithFormat:Localized(@"JX_YouWillSendMessagesToFriends"),_userIds.count];\cf4 \ \cf2 [friendNamesView addSubview:label];\cf4 \ \cf2 \cf4 \ \cf2 NSMutableString *names = [NSMutableString string];\cf4 \ \cf2 for (NSInteger i = 0; i < _userNames.count; i ++) \{\cf4 \ \cf2 NSString *str = _userNames[i];\cf4 \ \cf2 if (i == 0) \{\cf4 \ \cf2 [names appendString:[NSString stringWithFormat:@"[\\"%@",str]];\cf4 \ \cf2 \}\cf4 \ \cf2 else if (i == _userNames.count - 1) \{\cf4 \ \cf2 [names appendString:[NSString stringWithFormat:@",%@\\"]", str]];\cf4 \ \cf2 \}\cf4 \ \cf2 else \{\cf4 \ \cf2 [names appendString:[NSString stringWithFormat:@",%@", str]];\cf4 \ \cf2 \}\cf4 \ \cf2 if (_userNames.count == 1) \{\cf4 \ \cf2 [names appendString:@"\\"]"];\cf4 \ \cf2 \}\cf4 \ \cf2 \}\cf4 \ \cf2 \cf4 \ \cf2 CGSize size = [names boundingRectWithSize:CGSizeMake(friendNamesView.frame.size.width - 30, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@\{NSFontAttributeName : [UIFont systemFontOfSize:17.0]\} context:nil].size;\cf4 \ \cf2 \cf4 \ \cf2 CGFloat height = 0;\cf4 \ \cf2 if (size.height > 200) \{\cf4 \ \cf2 height = 200;\cf4 \ \cf2 \}else \{\cf4 \ \cf2 height = size.height;\cf4 \ \cf2 \}\cf4 \ \cf2 UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame: CGRectMake(15, CGRectGetMaxY(label.frame) + 10, friendNamesView.frame.size.width - 30, height)];\cf4 \ \cf2 [friendNamesView addSubview:scrollView];\cf4 \ \cf2 \cf4 \ \cf2 UILabel *namesLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 0, friendNamesView.frame.size.width - 30, size.height)];\cf4 \ \cf2 namesLabel.font = [UIFont systemFontOfSize:17.0];\cf4 \ \cf2 namesLabel.textColor = [UIColor blackColor];\cf4 \ \cf2 namesLabel.numberOfLines = 0;\cf4 \ \cf2 namesLabel.text = names;\cf4 \ \cf2 [scrollView addSubview:namesLabel];\cf4 \ \cf2 scrollView.contentSize = CGSizeMake(namesLabel.frame.size.width, size.height);\cf4 \ \cf2 \cf4 \ \cf2 friendNamesView.frame = CGRectMake(friendNamesView.frame.origin.x, friendNamesView.frame.origin.y, friendNamesView.frame.size.width, scrollView.frame.origin.y + scrollView.frame.size.height + 15);\cf4 \ \cf2 NSLog(@"%@", friendNamesView);\cf4 \ \cf2 \}\cf4 \ \cf2 */\cf4 \ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isGroupMessages\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isShowHeaderPull\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \cf10 UIView\cf4 *friendNamesView = [[\cf10 UIView\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 0\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableView\cf4 .\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 y\cf4 , \cf5 JX_SCREEN_WIDTH\cf4 , \cf7 0\cf4 )];\ friendNamesView.\cf14 backgroundColor\cf4 = [\cf10 UIColor\cf4 \cf14 whiteColor\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 \cf14 addSubview\cf4 :friendNamesView];\ \ \cf10 UILabel\cf4 *label = [[\cf10 UILabel\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 15\cf4 , \cf7 15\cf4 , \cf7 300\cf4 , \cf7 20\cf4 )];\ label.\cf14 font\cf4 = [\cf10 UIFont\cf4 \cf14 systemFontOfSize\cf4 :\cf7 15.0\cf4 ];\ label.\cf14 textColor\cf4 = [\cf10 UIColor\cf4 \cf14 lightGrayColor\cf4 ];\ label.\cf14 text\cf4 = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf5 Localized\cf4 (\cf6 @"JX_YouWillSendMessagesToFriends"\cf4 ),\cf15 _userIds\cf4 .\cf14 count\cf4 ];\ [friendNamesView \cf14 addSubview\cf4 :label];\ \ \cf15 _names\cf4 = [\cf10 NSMutableString\cf4 \cf14 string\cf4 ];\ \f2\b \cf8 for \f0\b0 \cf4 (\cf10 NSInteger\cf4 i = \cf7 0\cf4 ; i < \cf15 _userNames\cf4 .\cf14 count\cf4 ; i ++) \{\ \cf10 NSString\cf4 *str = \cf15 _userNames\cf4 [i];\ \f2\b \cf8 if \f0\b0 \cf4 (i == \cf7 0\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isCYMSGgroupANDFriendy\cf4 ) \{\ [\cf15 _names\cf4 \cf14 appendString\cf4 :\cf6 @" \f1 \'ba\'c3\'d3\'d1 \f0 : "\cf4 ];\ \}\ [\cf15 _names\cf4 \cf14 appendString\cf4 :[\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"[\\"%@"\cf4 ,str]];\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (i == \cf15 _userNames\cf4 .\cf14 count\cf4 - \cf7 1\cf4 ) \{\ [\cf15 _names\cf4 \cf14 appendString\cf4 :[\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @",%@\\"]"\cf4 , str]];\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ [\cf15 _names\cf4 \cf14 appendString\cf4 :[\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @",%@"\cf4 , str]];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _userNames\cf4 .\cf14 count\cf4 == \cf7 1\cf4 ) \{\ [\cf15 _names\cf4 \cf14 appendString\cf4 :\cf6 @"\\"]"\cf4 ];\ \}\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isCYMSGgroupANDFriendy\cf4 ) \{\ label.\cf14 text\cf4 = \cf6 @" \f1 \'c4\'e3\'bd\'ab\'b7\'a2\'cf\'fb\'cf\'a2\'b8\'f8\'a3\'ba \f0 "\cf4 ;\ \cf10 NSMutableString\cf4 *nameStr = [\cf10 NSMutableString\cf4 \cf14 string\cf4 ];\ \f2\b \cf8 for \f0\b0 \cf4 (\cf10 NSInteger\cf4 i = \cf7 0\cf4 ; i < \cf15 _userNmaesWithFriend\cf4 .\cf14 count\cf4 ; i ++) \{\ \cf10 NSString\cf4 *str = \cf15 _userNmaesWithFriend\cf4 [i];\ \f2\b \cf8 if \f0\b0 \cf4 (i == \cf7 0\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isCYMSGgroupANDFriendy\cf4 ) \{\ [nameStr \cf14 appendString\cf4 :\cf6 @" \f1 \'b1\'ea\'c7\'a9 \f0 : "\cf4 ];\ \}\ [nameStr \cf14 appendString\cf4 :[\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"[\\"%@"\cf4 ,str]];\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (i == \cf15 _userNmaesWithFriend\cf4 .\cf14 count\cf4 - \cf7 1\cf4 ) \{\ [nameStr \cf14 appendString\cf4 :[\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @",%@\\"]"\cf4 , str]];\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ [nameStr \cf14 appendString\cf4 :[\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @",%@"\cf4 , str]];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _userNmaesWithFriend\cf4 .\cf14 count\cf4 == \cf7 1\cf4 ) \{\ [nameStr \cf14 appendString\cf4 :\cf6 @"\\"]"\cf4 ];\ \}\ \}\ \cf15 _names\cf4 = nameStr;\ \}\ \ \cf10 CGSize\cf4 size = [\cf15 _names\cf4 \cf14 boundingRectWithSize\cf4 :\cf14 CGSizeMake\cf4 (friendNamesView.\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 - \cf7 30\cf4 , \cf5 MAXFLOAT\cf4 ) \cf14 options\cf4 :\cf14 NSStringDrawingUsesLineFragmentOrigin\cf4 \cf14 attributes\cf4 :\cf7 @\{\cf14 NSFontAttributeName\cf4 : [\cf10 UIFont\cf4 \cf14 systemFontOfSize\cf4 :\cf7 17.0\cf4 ]\cf7 \}\cf4 \cf14 context\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ].\cf14 size\cf4 ;\ \ \cf10 CGFloat\cf4 height = \cf7 0\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (size.\cf14 height\cf4 > \cf7 200\cf4 ) \{\ height = \cf7 200\cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ height = size.\cf14 height\cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isCYMSGgroupANDFriendy\cf4 ) \{\ height += \cf7 40\cf4 ;\ \}\ \ \cf10 UIScrollView\cf4 *scrollView;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isCYMSGgroupANDFriendy\cf4 ) \{\ scrollView = [[\cf10 UIScrollView\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 : \cf14 CGRectMake\cf4 (\cf7 15\cf4 , \cf14 CGRectGetMaxY\cf4 (label.\cf14 frame\cf4 ) + \cf7 10\cf4 , friendNamesView.\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 - \cf7 30\cf4 , \cf7 70\cf4 )];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ scrollView = [[\cf10 UIScrollView\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 : \cf14 CGRectMake\cf4 (\cf7 15\cf4 , \cf14 CGRectGetMaxY\cf4 (label.\cf14 frame\cf4 ) + \cf7 10\cf4 , friendNamesView.\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 - \cf7 30\cf4 , height)];\ \}\ \ \cf2 // UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame: CGRectMake(15, CGRectGetMaxY(label.frame) + 10, friendNamesView.frame.size.width - 30, height)];\cf4 \ [friendNamesView \cf14 addSubview\cf4 :scrollView];\ \ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isCYMSGgroupANDFriendy\cf4 ) \{\ size.\cf14 height\cf4 = \cf7 30\cf4 ;\ \}\ \cf10 UILabel\cf4 *namesLabel = [[\cf10 UILabel\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 15\cf4 , \cf7 0\cf4 , friendNamesView.\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 - \cf7 30\cf4 , size.\cf14 height\cf4 )];\ \ namesLabel.\cf14 font\cf4 = [\cf10 UIFont\cf4 \cf14 systemFontOfSize\cf4 :\cf7 17.0\cf4 ];\ namesLabel.\cf14 textColor\cf4 = [\cf10 UIColor\cf4 \cf14 blackColor\cf4 ];\ namesLabel.\cf14 numberOfLines\cf4 = \cf7 0\cf4 ;\ namesLabel.\cf14 text\cf4 = \cf15 _names\cf4 ;\ [scrollView \cf14 addSubview\cf4 :namesLabel];\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isCYMSGgroupANDFriendy\cf4 ) \{\ \cf15 _names2\cf4 = [\cf10 NSMutableString\cf4 \cf14 string\cf4 ];\ \f2\b \cf8 for \f0\b0 \cf4 (\cf10 NSInteger\cf4 i = \cf7 0\cf4 ; i < \cf15 _userNamesWithGroup\cf4 .\cf14 count\cf4 ; i ++) \{\ \cf10 NSString\cf4 *str = \cf15 _userNamesWithGroup\cf4 [i];\ \f2\b \cf8 if \f0\b0 \cf4 (i == \cf7 0\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isCYMSGgroupANDFriendy\cf4 ) \{\ [\cf15 _names2\cf4 \cf14 appendString\cf4 :\cf6 @" \f1 \'c8\'ba\'d7\'e9 \f0 : "\cf4 ];\ \}\ [\cf15 _names2\cf4 \cf14 appendString\cf4 :[\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"[\\"%@"\cf4 ,str]];\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (i == \cf15 _userNamesWithGroup\cf4 .\cf14 count\cf4 - \cf7 1\cf4 ) \{\ [\cf15 _names2\cf4 \cf14 appendString\cf4 :[\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @",%@\\"]"\cf4 , str]];\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ [\cf15 _names2\cf4 \cf14 appendString\cf4 :[\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @",%@"\cf4 , str]];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _userNamesWithGroup\cf4 .\cf14 count\cf4 == \cf7 1\cf4 ) \{\ [\cf15 _names2\cf4 \cf14 appendString\cf4 :\cf6 @"\\"]"\cf4 ];\ \}\ \}\ \ \ \ \cf10 UILabel\cf4 *namesLabel2 = [[\cf10 UILabel\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 15\cf4 , namesLabel.\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 y\cf4 + size.\cf14 height\cf4 , friendNamesView.\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 - \cf7 30\cf4 , \cf7 30\cf4 )];\ namesLabel2.\cf14 font\cf4 = [\cf10 UIFont\cf4 \cf14 systemFontOfSize\cf4 :\cf7 17.0\cf4 ];\ namesLabel2.\cf14 textColor\cf4 = [\cf10 UIColor\cf4 \cf14 blackColor\cf4 ];\ namesLabel2.\cf14 numberOfLines\cf4 = \cf7 0\cf4 ;\ namesLabel2.\cf14 text\cf4 = \cf15 _names2\cf4 ;\ [scrollView \cf14 addSubview\cf4 :namesLabel2];\ \ size.\cf14 height\cf4 = \cf7 400\cf4 ;\ \}\ \ scrollView.\cf14 contentSize\cf4 = \cf14 CGSizeMake\cf4 (namesLabel.\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 , size.\cf14 height\cf4 );\ \ friendNamesView.\cf14 frame\cf4 = \cf14 CGRectMake\cf4 (friendNamesView.\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 x\cf4 , friendNamesView.\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 y\cf4 , friendNamesView.\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 , scrollView.\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 y\cf4 + scrollView.\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 + \cf7 15\cf4 );\ \cf14 NSLog\cf4 (\cf6 @"%@"\cf4 , friendNamesView);\ \}\ \ \cf2 // \f1 \'bd\'d8\'c6\'c1 \f0 \cf4 \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 = [[\cf10 UIView\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf5 JX_SCREEN_WIDTH\cf4 - \cf7 80\cf4 - \cf7 10\cf4 , \cf7 100\cf4 , \cf7 80\cf4 , \cf7 130\cf4 )];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 backgroundColor\cf4 = [\cf10 UIColor\cf4 \cf14 whiteColor\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 layer\cf4 .\cf14 cornerRadius\cf4 = \cf7 5.0\cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 layer\cf4 .\cf14 masksToBounds\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 \cf14 addSubview\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 ];\ \ \cf10 UITapGestureRecognizer\cf4 *tap = [[\cf10 UITapGestureRecognizer\cf4 \cf14 alloc\cf4 ] \cf14 initWithTarget\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 action\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (screenShotViewAction:)];\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 \cf14 addGestureRecognizer\cf4 :tap];\ \ \cf10 UILabel\cf4 *screenShotLabel = [[\cf10 UILabel\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 5\cf4 , \cf7 0\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 - \cf7 10\cf4 , \cf7 40\cf4 )];\ screenShotLabel.\cf14 font\cf4 = [\cf10 UIFont\cf4 \cf14 systemFontOfSize\cf4 :\cf7 11.0\cf4 ];\ screenShotLabel.\cf14 numberOfLines\cf4 = \cf7 0\cf4 ;\ screenShotLabel.\cf14 text\cf4 = \cf5 Localized\cf4 (\cf6 @"JX_ThePhotosYouMightWantToSend"\cf4 );\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 \cf14 addSubview\cf4 :screenShotLabel];\ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotImageView\cf4 = [[\cf10 UIImageView\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 5\cf4 , \cf14 CGRectGetMaxY\cf4 (screenShotLabel.\cf14 frame\cf4 ), \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 - \cf7 10\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 - screenShotLabel.\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 - \cf7 5\cf4 )];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotImageView\cf4 .\cf14 layer\cf4 .\cf14 cornerRadius\cf4 = \cf7 5.0\cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotImageView\cf4 .\cf14 layer\cf4 .\cf14 masksToBounds\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf2 // self.screenShotImageView.image = [UIImage imageWithContentsOfFile:ScreenShotImage];\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 \cf14 addSubview\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotImageView\cf4 ];\ \ \cf2 // \f1 \'d0\'c2\'cf\'fb\'cf\'a2\'cc\'f8\'d7\'aa \f0 \cf4 \ \cf15 _jumpNewMsgBtn\cf4 = [[\cf10 UIButton\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf5 JX_SCREEN_WIDTH\cf4 - \cf7 105\cf4 , \cf5 JX_SCREEN_TOP\cf4 + \cf7 20\cf4 , \cf7 120\cf4 , \cf7 30\cf4 )];\ \cf15 _jumpNewMsgBtn\cf4 .\cf14 backgroundColor\cf4 = [\cf10 UIColor\cf4 \cf14 whiteColor\cf4 ];\ \cf15 _jumpNewMsgBtn\cf4 .\cf14 layer\cf4 .\cf14 cornerRadius\cf4 = \cf15 _jumpNewMsgBtn\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 / \cf7 2\cf4 ;\ \cf15 _jumpNewMsgBtn\cf4 .\cf14 layer\cf4 .\cf14 masksToBounds\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [\cf15 _jumpNewMsgBtn\cf4 \cf14 addTarget\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 action\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (jumpNewMsgBtnAction) \cf14 forControlEvents\cf4 :\cf14 UIControlEventTouchUpInside\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 \cf14 addSubview\cf4 :\cf15 _jumpNewMsgBtn\cf4 ];\ \ \cf10 UILabel\cf4 *newMsgLabel = [[\cf10 UILabel\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf15 _jumpNewMsgBtn\cf4 .\cf14 bounds\cf4 ];\ newMsgLabel.\cf14 text\cf4 = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%d%@"\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 newMsgCount\cf4 ,\cf5 Localized\cf4 (\cf6 @"JX_NewMessages"\cf4 )];\ newMsgLabel.\cf14 font\cf4 = [\cf10 UIFont\cf4 \cf14 systemFontOfSize\cf4 :\cf7 13.0\cf4 ];\ newMsgLabel.\cf14 textAlignment\cf4 = \cf14 NSTextAlignmentCenter\cf4 ;\ newMsgLabel.\cf14 textColor\cf4 = \cf5 HEXCOLOR\cf4 (\cf7 0x4FC557\cf4 );\ [\cf15 _jumpNewMsgBtn\cf4 \cf14 addSubview\cf4 :newMsgLabel];\ \ \cf10 UIImageView\cf4 *imageView = [[\cf10 UIImageView\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 10\cf4 , \cf7 10\cf4 , \cf7 10\cf4 , \cf7 10\cf4 )];\ imageView.\cf14 image\cf4 = [\cf10 UIImage\cf4 \cf14 imageNamed\cf4 :\cf6 @"doubleArrow_up"\cf4 ];\ [\cf15 _jumpNewMsgBtn\cf4 \cf14 addSubview\cf4 :imageView];\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 newMsgCount\cf4 > \cf7 20\cf4 ) \{\ \cf15 _jumpNewMsgBtn\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf15 _jumpNewMsgBtn\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 setAudioIconFrame\cf4 \{\ \ \cf10 CGSize\cf4 size = [ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 title\cf4 \cf14 boundingRectWithSize\cf4 :\cf14 CGSizeMake\cf4 (\cf5 MAXFLOAT\cf4 , \cf5 MAXFLOAT\cf4 ) \cf14 options\cf4 :\cf14 NSStringDrawingUsesLineFragmentOrigin\cf4 \cf14 attributes\cf4 :\cf7 @\{\cf14 NSFontAttributeName\cf4 :[\cf10 UIFont\cf4 \cf14 systemFontOfSize\cf4 :\cf7 18.0\cf4 ]\cf7 \}\cf4 \cf14 context\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ].\cf14 size\cf4 ;\ \cf10 CGFloat\cf4 x = \cf5 JX_SCREEN_WIDTH\cf4 /\cf7 2\cf4 + size.\cf14 width\cf4 /\cf7 2\cf4 + \cf7 2\cf4 ;\ \cf15 _audioIcon\cf4 .\cf14 frame\cf4 = \cf14 CGRectMake\cf4 (x, \cf15 _audioIcon\cf4 .\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 y\cf4 , \cf15 _audioIcon\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 , \cf15 _audioIcon\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 );\ \ \f2\b \cf8 BOOL \f0\b0 \cf4 flag = [\cf5 g_default\cf4 \cf14 boolForKey\cf4 :\cf5 kChatVCMessageAudioIsNotPlayback\cf4 ];\ \cf15 _audioIcon\cf4 .\cf14 hidden\cf4 = !flag;\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 setupMoreView\cf4 :(\cf10 NSArray\cf4 *)array \{\ \f2\b \cf8 if \f0\b0 \cf4 (array != \f2\b \cf8 nil \f0\b0 \cf4 ) \{\ [\cf15 _recordBtnLeft\cf4 \cf14 setBackgroundImage\cf4 :[\cf10 UIImage\cf4 \cf14 imageNamed\cf4 :\cf6 @"chat_back_reply"\cf4 ] \cf14 forState\cf4 :\cf14 UIControlStateNormal\cf4 ];\ [\cf15 _recordBtnLeft\cf4 \cf14 removeTarget\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 action\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (recordSwitch:) \cf14 forControlEvents\cf4 :\cf14 UIControlEventTouchUpInside\cf4 ];\ [\cf15 _recordBtnLeft\cf4 \cf14 addTarget\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 action\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onBackToDefault) \cf14 forControlEvents\cf4 :\cf14 UIControlEventTouchUpInside\cf4 ];\ \ \cf15 _helperArr\cf4 = array;\ \cf2 // \f1 \'c8\'ba\'d6\'fa\'ca\'d6\'ca\'c2\'bc\'fe \f0 \cf4 \ \cf15 _moreView\cf4 .\cf15 onGroupHelperList\cf4 = \f2\b \cf8 @selector \f0\b0 \cf4 (onGroupHelperList);\ \cf15 _moreView\cf4 .\cf15 onDidView\cf4 = \f2\b \cf8 @selector \f0\b0 \cf4 (onDidView:);\ \cf15 _moreView\cf4 .\cf15 helpers\cf4 = array;\ \cf15 _moreView\cf4 .\cf15 scrollView\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf15 _moreView\cf4 .\cf15 helperScrollV\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ [\cf15 _recordBtnLeft\cf4 \cf14 setBackgroundImage\cf4 :[\cf10 UIImage\cf4 \cf14 imageNamed\cf4 :\cf6 @"im_input_ptt_normal"\cf4 ] \cf14 forState\cf4 :\cf14 UIControlStateNormal\cf4 ];\ [\cf15 _recordBtnLeft\cf4 \cf14 setBackgroundImage\cf4 :[\cf10 UIImage\cf4 \cf14 imageNamed\cf4 :\cf6 @"im_input_keyboard_normal"\cf4 ] \cf14 forState\cf4 :\cf14 UIControlStateSelected\cf4 ];\ [\cf15 _recordBtnLeft\cf4 \cf14 removeTarget\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 action\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onBackToDefault) \cf14 forControlEvents\cf4 :\cf14 UIControlEventTouchUpInside\cf4 ];\ [\cf15 _recordBtnLeft\cf4 \cf14 addTarget\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 action\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (recordSwitch:) \cf14 forControlEvents\cf4 :\cf14 UIControlEventTouchUpInside\cf4 ];\ \ \cf15 _moreView\cf4 .\cf15 scrollView\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \cf15 _moreView\cf4 .\cf15 helperScrollV\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [\cf15 _moreView\cf4 \cf15 resetPageControl\cf4 ];\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onBackToDefault\cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 setupMoreView\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onDidView\cf4 :(\cf9 JXSelectImageView\cf4 *)moreView \{\ \cf9 JXGroupHeplerModel\cf4 *model = \cf15 _helperArr\cf4 [moreView.\cf15 viewIndex\cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 (moreView.\cf15 isDidSet\cf4 ) \{\ \cf9 JXAutoReplyAideVC\cf4 *vc = [[\cf9 JXAutoReplyAideVC\cf4 \cf14 alloc\cf4 ] \cf14 init\cf4 ];\ vc.\cf15 model\cf4 = model.\cf15 helperModel\cf4 ;\ vc.\cf15 roomId\cf4 = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomId\cf4 ;\ vc.\cf15 roomJid\cf4 = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ;\ \ [\cf5 g_navigation\cf4 \cf15 pushViewController\cf4 :vc \cf15 animated\cf4 : \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ \f2\b \cf8 if \f0\b0 \cf4 (model.\cf15 helperModel\cf4 .\cf15 urlScheme\cf4 && model.\cf15 helperModel\cf4 .\cf15 urlScheme\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ) \{\ \cf10 NSString\cf4 *url = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%@://roomId=%@&userId=%@"\cf4 ,model.\cf15 helperModel\cf4 .\cf15 urlScheme\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomId\cf4 ,\cf5 g_myself\cf4 .\cf15 userId\cf4 ];\ \ [[\cf10 UIApplication\cf4 \cf14 sharedApplication\cf4 ] \cf14 openURL\cf4 :[\cf10 NSURL\cf4 \cf14 URLWithString\cf4 :url] \cf14 options\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 \cf14 completionHandler\cf4 :^( \f2\b \cf8 BOOL \f0\b0 \cf4 success) \{\ \ \f2\b \cf8 if \f0\b0 \cf4 (!success) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 didViewActionWithModel\cf4 :model];\ \}\ \}];\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 didViewActionWithModel\cf4 :model];\ \}\ \ \ \}\ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 didViewActionWithModel\cf4 :(\cf9 JXGroupHeplerModel\cf4 *)model \{\ \f2\b \cf8 if \f0\b0 \cf4 (model.\cf15 helperModel\cf4 .\cf15 type\cf4 == \cf7 1\cf4 ) \{ \cf2 // \f1 \'d7\'d4\'b6\'af\'bb\'d8\'b8\'b4 \f0 \cf4 \ \}\ \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (model.\cf15 helperModel\cf4 .\cf15 type\cf4 == \cf7 2\cf4 ) \{\cf2 // \f1 \'cd\'f8\'d2\'b3 \f0 \cf4 \ \ \cf10 NSDictionary\cf4 *dict = \cf7 @\{\cf4 \ \cf6 @"roomId"\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomId\cf4 ,\ \cf6 @"roomJid"\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ,\ \cf6 @"userId"\cf4 : \cf5 g_myself\cf4 .\cf15 userId\cf4 \ \cf7 \}\cf4 ;\ \cf10 NSData\cf4 *jsonData = [\cf10 NSJSONSerialization\cf4 \cf14 dataWithJSONObject\cf4 :dict \cf14 options\cf4 :\cf14 NSJSONWritingPrettyPrinted\cf4 \cf14 error\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf10 NSString\cf4 *json = [[\cf10 NSString\cf4 \cf14 alloc\cf4 ]\cf14 initWithData\cf4 :jsonData \cf14 encoding\cf4 :\cf14 NSUTF8StringEncoding\cf4 ];\ \ \cf9 webpageVC\cf4 *webVC = [\cf9 webpageVC\cf4 \cf14 alloc\cf4 ];\ webVC.\cf15 isGotoBack\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ webVC.\cf15 isSend\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ webVC.\cf15 shareParam\cf4 = json;\ webVC.\cf14 title\cf4 = model.\cf15 helperModel\cf4 .\cf15 name\cf4 ;\ \cf10 NSString\cf4 * url = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%@"\cf4 ,model.\cf15 helperModel\cf4 .\cf15 link\cf4 ];\ url = [url \cf14 stringByReplacingOccurrencesOfString\cf4 :\cf6 @" "\cf4 \cf14 withString\cf4 :\cf6 @""\cf4 ];\ url = [url \cf14 stringByReplacingOccurrencesOfString\cf4 :\cf6 @"\\t"\cf4 \cf14 withString\cf4 :\cf6 @""\cf4 ];\ webVC.\cf15 url\cf4 = url;\ webVC = [webVC \cf14 init\cf4 ];\ [\cf5 g_navigation\cf4 .\cf15 navigationView\cf4 \cf14 addSubview\cf4 :webVC.\cf14 view\cf4 ];\ \ \}\ \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (model.\cf15 helperModel\cf4 .\cf15 type\cf4 == \cf7 3\cf4 ) \{\cf2 // \f1 \'b5\'e3\'bb\'f7\'b7\'a2\'cb\'cd \f0 \cf4 \ \cf10 NSMutableDictionary\cf4 *dict = \cf7 @\{\cf6 @"url"\cf4 :model.\cf15 helperModel\cf4 .\cf15 url\cf4 ,\ \cf6 @"appName"\cf4 :model.\cf15 helperModel\cf4 .\cf15 appName\cf4 ,\ \cf6 @"subTitle"\cf4 :model.\cf15 helperModel\cf4 .\cf15 subTitle\cf4 ,\ \cf7 \}\cf4 .\cf14 mutableCopy\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (model.\cf15 helperModel\cf4 .\cf15 imageUrl\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ) \{\ [dict \cf14 addEntriesFromDictionary\cf4 :\cf7 @\{\cf6 @"imageUrl"\cf4 :model.\cf15 helperModel\cf4 .\cf15 imageUrl\cf7 \}\cf4 ];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (model.\cf15 helperModel\cf4 .\cf15 appIcon\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ) \{\ [dict \cf14 addEntriesFromDictionary\cf4 :\cf7 @\{\cf6 @"appIcon"\cf4 :model.\cf15 helperModel\cf4 .\cf15 appIcon\cf7 \}\cf4 ];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (model.\cf15 helperModel\cf4 .\cf15 downloadUrl\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ) \{\ [dict \cf14 addEntriesFromDictionary\cf4 :\cf7 @\{\cf6 @"downloadUrl"\cf4 :model.\cf15 helperModel\cf4 .\cf15 downloadUrl\cf7 \}\cf4 ];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (model.\cf15 helperModel\cf4 .\cf15 title\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ) \{\ [dict \cf14 addEntriesFromDictionary\cf4 :\cf7 @\{\cf6 @"title"\cf4 :model.\cf15 helperModel\cf4 .\cf15 title\cf7 \}\cf4 ];\ \}\ \ \cf9 SBJsonWriter\cf4 *writer = [[\cf9 SBJsonWriter\cf4 \cf14 alloc\cf4 ] \cf14 init\cf4 ];\ \cf10 NSString\cf4 *content = [writer \cf15 stringWithObject\cf4 :dict];\ \ \cf2 // JXMessageObject *msg = [[JXMessageObject alloc] init];\cf4 \ \cf2 // msg.timeSend = [NSDate date];\cf4 \ \cf2 // msg.fromUserId = g_myself.userId;\cf4 \ \cf2 // msg.toUserId = model.roomJid;\cf4 \ \cf2 // msg.objectId = content;\cf4 \ \cf2 // msg.type = [NSNumber numberWithInt:kWCMessageTypeShare];\cf4 \ \cf2 // [msg insert:model.roomJid];\cf4 \ \cf2 // [self showOneMsg:msg];\cf4 \ \cf2 // [g_xmpp sendMessage:msg roomName:model.roomId];\cf4 \ \ \ \cf9 JXMessageObject\cf4 *msg=[[\cf9 JXMessageObject\cf4 \cf14 alloc\cf4 ]\cf14 init\cf4 ];\ msg.\cf15 timeSend\cf4 = [\cf10 NSDate\cf4 \cf14 date\cf4 ];\ msg.\cf15 fromUserId\cf4 = \cf5 MY_USER_ID\cf4 ;\ msg.\cf15 toUserId\cf4 = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ;\ msg.\cf15 isGroup\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.\cf15 fromUserName\cf4 = \cf15 _userNickName\cf4 ;\ \ msg.\cf15 objectId\cf4 = content;\ msg.\cf15 type\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 :\cf15 kWCMessageTypeShare\cf4 ];\ msg.\cf15 isSend\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 :\cf5 transfer_status_ing\cf4 ];\ msg.\cf15 isRead\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithBool\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.\cf15 isReadDel\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ \ \cf2 // \f1 \'b7\'a2\'cd\'f9\'c4\'c4\'c0\'ef \f0 \cf4 \ [msg \cf15 insert\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ];\ [\cf5 g_xmpp\cf4 \cf15 sendMessage\cf4 :msg \cf15 roomName\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 showOneMsg\cf4 :msg];\ \}\ \}\ \ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 viewWillAppear\cf4 :( \f2\b \cf8 BOOL \f0\b0 \cf4 )animated\{\ [ \f2\b \cf8 super \f0\b0 \cf4 \cf14 viewWillAppear\cf4 :animated];\ \cf2 // \f1 \'bd\'f8\'c8\'eb\'bd\'e7\'c3\'e6\'bc\'b4\'bf\'aa\'c6\'f4\'b6\'a8\'ca\'b1\'c6\'f7 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 noticeTimer\cf4 \cf14 setFireDate\cf4 :[\cf10 NSDate\cf4 \cf14 distantPast\cf4 ]];\ \cf15 _strURLGoback\cf4 =\cf6 @"1000"\cf4 ;\ \cf14 dispatch_after\cf4 (\cf14 dispatch_time\cf4 (\cf5 DISPATCH_TIME_NOW\cf4 , (\cf10 int64_t\cf4 )(\cf7 2\cf4 * \cf5 NSEC_PER_SEC\cf4 )), \cf14 dispatch_get_main_queue\cf4 (), ^\{\ \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 refresh\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \});\ \ \f2\b \cf8 BOOL \f0\b0 \cf4 isOpen = [\cf5 g_default\cf4 \cf14 boolForKey\cf4 :\cf5 kgoucaiComePush\cf4 ];\ \ \f2\b \cf8 BOOL \f0\b0 \cf4 isOpen2 = [\cf5 g_default\cf4 \cf14 boolForKey\cf4 :\cf5 kGuanXinComePush\cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 (isOpen==\cf7 1\cf4 && isOpen2==\cf7 1\cf4 ) \{\ \cf15 _noticeView2\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf15 _noticeViewScrollView\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (isOpen==\cf7 1\cf4 && isOpen2==\cf7 0\cf4 ) \{\ \ \cf2 // _table.contentInset = UIEdgeInsetsMake(38, 0, 0, 0);\cf4 \ \cf15 _noticeViewScrollView\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \cf15 _noticeViewScrollView\cf4 .\cf14 frame\cf4 =\cf14 CGRectMake\cf4 (\cf7 0\cf4 , \cf5 JX_SCREEN_TOP\cf4 , \cf5 JX_SCREEN_WIDTH\cf4 , \cf7 37\cf4 );\ \cf15 _noticeView2\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (isOpen==\cf7 0\cf4 && isOpen2==\cf7 1\cf4 )\{\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \cf15 _biaotishifoBC\cf4 ==\cf7 1111\cf4 ) \{\ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 showTopView\cf4 .\cf15 xiaLineView\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \cf15 _noticeView2\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 showTopView\cf4 .\cf15 xiaLineView\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ \cf15 _noticeView2\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ \cf15 _noticeViewScrollView\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (isOpen==\cf7 0\cf4 && isOpen2==\cf7 0\cf4 ) \{\ \cf15 _noticeViewScrollView\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 showTopView\cf4 .\cf15 xiaLineView\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \cf15 _noticeView2\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \cf15 _noticeViewScrollView\cf4 .\cf14 frame\cf4 =\cf14 CGRectMake\cf4 (\cf7 0\cf4 , \cf7 37\cf4 +\cf5 JX_SCREEN_TOP\cf4 , \cf5 JX_SCREEN_WIDTH\cf4 , \cf7 37\cf4 );\ \cf2 //_table.contentInset = UIEdgeInsetsMake(73, 0, 0, 0);\cf4 \ \}\ \cf2 // [g_notify removeObserver:self];\cf4 \ \ \ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 viewDidDisappear\cf4 :( \f2\b \cf8 BOOL \f0\b0 \cf4 )animated \{\ [ \f2\b \cf8 super \f0\b0 \cf4 \cf14 viewDidDisappear\cf4 :animated];\ \cf2 // \f1 \'cd\'cb\'b3\'f6\'bd\'e7\'c3\'e6\'bc\'b4\'b9\'d8\'b1\'d5\'b6\'a8\'ca\'b1\'c6\'f7 \f0 \cf4 \ [\cf15 _wait\cf4 \cf15 stop\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 noticeTimer\cf4 \cf14 setFireDate\cf4 :[\cf10 NSDate\cf4 \cf14 distantFuture\cf4 ]];\ \cf15 _strURLGoback\cf4 =\cf6 @""\cf4 ;\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 viewWillDisappear\cf4 :( \f2\b \cf8 BOOL \f0\b0 \cf4 )animated \{\ [ \f2\b \cf8 super \f0\b0 \cf4 \cf14 viewWillDisappear\cf4 :animated];\ [[\cf10 UIApplication\cf4 \cf14 sharedApplication\cf4 ] \cf14 setStatusBarHidden\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ \cf2 // [_floating hide];\cf4 \ [\cf15 _wait\cf4 \cf15 stop\cf4 ];\ \cf15 _strURLGoback\cf4 =\cf6 @""\cf4 ;\ \}\ \ \cf2 // \f1 \'bb\'f1\'c8\'a1\'b9\'d8\'d0\'c4\'c8\'cb\'b5\'c4\'d7\'ee\'ba\'f3\'d2\'bb\'cc\'f5 \f0 cell\cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 attioPersonBtnX\cf4 \{\ \ \cf9 memberData\cf4 *modelXXX=[\cf15 _tempArrMM\cf4 \cf14 firstObject\cf4 ];\ \ \f2\b \cf8 long \f0\b0 \cf4 time = ( \f2\b \cf8 long \f0\b0 \cf4 )[[\cf10 NSDate\cf4 \cf14 date\cf4 ] \cf14 timeIntervalSince1970\cf4 ];\ time = (time *\cf7 1000\cf4 + \cf5 g_server\cf4 .\cf15 timeDifference\cf4 );\ \cf10 NSString\cf4 *salt = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%ld"\cf4 , time];\ \cf10 NSString\cf4 *jid_room=[[\cf10 NSUserDefaults\cf4 \cf14 standardUserDefaults\cf4 ] \cf14 objectForKey\cf4 :\cf6 @"jid_roomJid"\cf4 ];\ \ [\cf5 g_server\cf4 \cf15 getUserRoomAttentionattentionLastInfo\cf4 :salt \cf15 userId\cf4 :[\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%ld"\cf4 ,modelXXX.\cf15 userId\cf4 ] \cf15 jid\cf4 :\cf15 _roomJid\cf4 \cf15 andToView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \cf2 // \f1 \'cc\'d8\'b1\'f0\'b9\'d8\'d0\'c4 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 attionBtnCLick\cf4 \{\ \ \f2\b \cf8 __weak \f0\b0 \cf4 \f2\b \cf8 __typeof \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 )weakSelf = \f2\b \cf8 self \f0\b0 \cf4 ;\ \cf9 JxChatGetNoticePersonGVc\cf4 *pervc=[[\cf9 JxChatGetNoticePersonGVc\cf4 \cf14 alloc\cf4 ]\cf14 init\cf4 ];\ pervc.\cf15 block\cf4 = ^(\cf9 memberData\cf4 * \f2\b \cf8 _Nonnull \f0\b0 \cf4 responseObject) \{\ \ \cf15 _backUserId\cf4 =[\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%ld"\cf4 ,responseObject.\cf15 userId\cf4 ];\ [weakSelf.\cf15 attioPersonBtn\cf4 \cf14 setTitle\cf4 :responseObject.\cf15 userNickName\cf4 \cf14 forState\cf4 :\cf14 UIControlStateNormal\cf4 ];\ \ \};\ pervc.\cf15 dataArr\cf4 =\cf15 _dataArrGetGroundPersonArr\cf4 ;\ pervc.\cf15 roomID\cf4 = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ;\ [\cf5 g_navigation\cf4 \cf15 pushViewController\cf4 :pervc \cf15 animated\cf4 : \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \}\ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 setupNotice\cf4 \{\ \cf10 CGFloat\cf4 noticHHH=\cf7 37\cf4 ;\ \ \f2\b \cf8 BOOL \f0\b0 \cf4 isOpen = [\cf5 g_default\cf4 \cf14 boolForKey\cf4 :\cf5 kgoucaiComePush\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (isOpen==\cf7 1\cf4 ) \{\ noticHHH=\cf7 0\cf4 ;\ \}\ \cf15 _noticeViewScrollView\cf4 = [[\cf10 UIScrollView\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 0\cf4 , noticHHH+\cf5 JX_SCREEN_TOP\cf4 , \cf5 JX_SCREEN_WIDTH\cf4 , \cf7 37\cf4 )];\ \ \cf15 _noticeViewScrollView\cf4 .\cf14 backgroundColor\cf4 =\cf5 kRGBColor\cf4 (\cf7 246\cf4 , \cf7 246\cf4 , \cf7 246\cf4 );\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 \cf14 addSubview\cf4 :\cf15 _noticeViewScrollView\cf4 ];\ \ \cf10 UIView\cf4 *lineView1 = [[\cf10 UIView\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 0\cf4 , \cf7 0\cf4 , \cf5 JX_SCREEN_WIDTH\cf4 , \cf7 1\cf4 )];\ lineView1.\cf14 backgroundColor\cf4 =[\cf10 UIColor\cf4 \cf14 whiteColor\cf4 ];\ [\cf15 _noticeViewScrollView\cf4 \cf14 addSubview\cf4 :lineView1];\ \ \ \cf10 UIView\cf4 *lineView = [[\cf10 UIView\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 0\cf4 , \cf7 36\cf4 , \cf5 JX_SCREEN_WIDTH\cf4 , \cf7 1\cf4 )];\ lineView.\cf14 backgroundColor\cf4 =[\cf10 UIColor\cf4 \cf14 grayColor\cf4 ];\ [\cf15 _noticeViewScrollView\cf4 \cf14 addSubview\cf4 :lineView];\ \ \cf10 UIButton\cf4 *attionBtn=[[\cf10 UIButton\cf4 \cf14 alloc\cf4 ]\cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 10\cf4 , \cf7 7\cf4 , \cf7 80\cf4 , \cf7 24\cf4 )];\ [attionBtn \cf14 setTitle\cf4 :\cf6 @" \f1 \'d1\'a1\'d4\'f1\'ba\'c3\'d3\'d1 \f0 "\cf4 forState:\cf14 UIControlStateNormal\cf4 ];\ attionBtn.\cf14 layer\cf4 .\cf14 cornerRadius\cf4 =\cf7 8\cf4 ;\ attionBtn.\cf14 layer\cf4 .\cf14 masksToBounds\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ attionBtn.\cf14 backgroundColor\cf4 =[\cf10 UIColor\cf4 \cf14 whiteColor\cf4 ];\ [attionBtn \cf14 setTitleColor\cf4 :\cf5 kRGBColor51\cf4 \cf14 forState\cf4 :\cf14 UIControlStateNormal\cf4 ];\ attionBtn.\cf14 titleLabel\cf4 .\cf14 font\cf4 =[\cf10 UIFont\cf4 \cf14 systemFontOfSize\cf4 :\cf7 15\cf4 \cf14 weight\cf4 :\cf14 UIFontWeightMedium\cf4 ];\ attionBtn.\cf14 showsTouchWhenHighlighted\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [\cf15 _noticeViewScrollView\cf4 \cf14 addSubview\cf4 :attionBtn];\ [attionBtn \cf14 addTarget\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 action\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (attionBtnCLick) \cf14 forControlEvents\cf4 :\cf14 UIControlEventTouchUpInside\cf4 ];\ \ \ \cf15 _attioPersonBtn\cf4 =[[\cf10 UIButton\cf4 \cf14 alloc\cf4 ]\cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 100\cf4 , \cf7 7\cf4 , \cf7 80\cf4 , \cf7 24\cf4 )];\ [\cf15 _attioPersonBtn\cf4 \cf14 setTitle\cf4 :\cf6 @""\cf4 \cf14 forState\cf4 :\cf14 UIControlStateNormal\cf4 ];\ \cf15 _attioPersonBtn\cf4 .\cf14 layer\cf4 .\cf14 cornerRadius\cf4 =\cf7 8\cf4 ;\ \cf15 _attioPersonBtn\cf4 .\cf14 layer\cf4 .\cf14 masksToBounds\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf15 _attioPersonBtn\cf4 .\cf14 backgroundColor\cf4 =[\cf10 UIColor\cf4 \cf14 whiteColor\cf4 ];\ [\cf15 _attioPersonBtn\cf4 \cf14 setTitleColor\cf4 :\cf5 kRGBColor51\cf4 \cf14 forState\cf4 :\cf14 UIControlStateNormal\cf4 ];\ \cf15 _attioPersonBtn\cf4 .\cf14 titleLabel\cf4 .\cf14 font\cf4 =[\cf10 UIFont\cf4 \cf14 systemFontOfSize\cf4 :\cf7 15\cf4 \cf14 weight\cf4 :\cf14 UIFontWeightMedium\cf4 ];\ [\cf15 _noticeViewScrollView\cf4 \cf14 addSubview\cf4 :\cf15 _attioPersonBtn\cf4 ];\ [\cf15 _attioPersonBtn\cf4 \cf14 addTarget\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 action\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (attioPersonBtnX) \cf14 forControlEvents\cf4 :\cf14 UIControlEventTouchUpInside\cf4 ];\ \ \ \ \f2\b \cf8 return \f0\b0 \cf4 ;\ _noticeView = [[UIView alloc] initWithFrame:CGRectMake(\cf7 0\cf4 , JX_SCREEN_TOP, JX_SCREEN_WIDTH, \cf7 36\cf4 )];\ _noticeView.backgroundColor = [UIColor whiteColor];\ _noticeView.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 .view addSubview:_noticeView];\ \ \cf2 // UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideNoticeView:)];\cf4 \ \cf2 // [_noticeView addGestureRecognizer:tap];\cf4 \ \ _noticeImgV = [[UIImageView alloc] initWithFrame:CGRectMake(\cf7 15\cf4 , \cf7 10\cf4 , \cf7 16\cf4 , \cf7 16\cf4 )];\ _noticeImgV.image = [UIImage imageNamed:\cf6 @"chat_notice"\cf4 ];\ [_noticeView addSubview:_noticeImgV];\ \ _noticeLabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(_noticeImgV.frame)+\cf7 4\cf4 , \cf7 0\cf4 , \cf7 64\cf4 , \cf7 36\cf4 )];\ _noticeLabel.text = Localized(\cf6 @"JX_LatestAnnouncement:"\cf4 );\ _noticeLabel.textColor = HEXCOLOR(\cf7 0x323232\cf4 );\ _noticeLabel.font = SYSFONT(\cf7 13\cf4 );\ [_noticeView addSubview:_noticeLabel];\ \ _showNoticeView = [[UIView alloc] initWithFrame:CGRectMake(CGRectGetMaxX(_noticeLabel.frame)+\cf7 5\cf4 , \cf7 0\cf4 , JX_SCREEN_WIDTH-\cf7 125\cf4 , \cf7 36\cf4 )];\ _showNoticeView.backgroundColor = [UIColor whiteColor];\ _showNoticeView.clipsToBounds = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [_noticeView addSubview:_showNoticeView];\ \ _leftLabel = [[UILabel alloc] initWithFrame:_showNoticeView.bounds];\ _leftLabel.textColor = HEXCOLOR(\cf7 0x323232\cf4 );\ _leftLabel.textAlignment = NSTextAlignmentLeft;\ _leftLabel.lineBreakMode = NSLineBreakByCharWrapping;\ _leftLabel.font = SYSFONT(\cf7 13\cf4 );\ [_showNoticeView addSubview:_leftLabel];\ \ _rightLabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(_leftLabel.frame), \cf7 0\cf4 , JX_SCREEN_WIDTH-\cf7 130\cf4 , \cf7 36\cf4 )];\ _rightLabel.textColor = HEXCOLOR(\cf7 0x323232\cf4 );\ _rightLabel.font = SYSFONT(\cf7 13\cf4 );\ _rightLabel.textAlignment = NSTextAlignmentLeft;\ _rightLabel.lineBreakMode = NSLineBreakByCharWrapping;\ [_showNoticeView addSubview:_rightLabel];\ \ \}\ \ \cf2 //json \f1 \'b8\'f1\'ca\'bd\'d7\'d6\'b7\'fb\'b4\'ae\'d7\'aa\'d7\'d6\'b5\'e4\'a3\'ba \f0 \cf4 \ \ - (NSArray *)\cf11 dictionaryWithJsonString\cf4 :(NSString *)jsonString \{\ \ \f2\b \cf8 if \f0\b0 \cf4 (jsonString == \f2\b \cf8 nil \f0\b0 \cf4 ) \{\ \ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 nil \f0\b0 \cf4 ;\ \ \}\ \ NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];\ \ NSError *err;\ \ NSArray *dic = [NSJSONSerialization JSONObjectWithData:jsonData\ \ options:NSJSONReadingMutableContainers\ \ error:&err];\ \ \f2\b \cf8 if \f0\b0 \cf4 (err) \{\ \ NSLog(\cf6 @"json \f1 \'bd\'e2\'ce\'f6\'ca\'a7\'b0\'dc\'a3\'ba \f0 %@"\cf4 ,err);\ \ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 nil \f0\b0 \cf4 ;\ \ \}\ \ \f2\b \cf8 return \f0\b0 \cf4 dic;\ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 notice2ndClick\cf4 \{\ JLSelectView *customView = [[JLSelectView alloc] init];\ \f2\b \cf8 __weak \f0\b0 \cf4 \f2\b \cf8 __typeof \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 )weakSelf = \f2\b \cf8 self \f0\b0 \cf4 ;\ customView.returnModelBlock = ^(JLSelectModel *model, NSIndexPath *indexPath) \{\ NSLog(\cf6 @" \f1 \'d1\'a1\'d4\'f1\'c1\'cb \f0 %@-%@"\cf4 , model.name,model.data[indexPath.row].content);\ \cf2 //NSString *title = [NSString stringWithFormat:@"%@%@:", model.name, model.data[indexPath.row].subName];\cf4 \ \cf2 //[weakSelf.selectButton setTitle:title forState:(UIControlStateNormal)];\cf4 \ [weakSelf.container dismiss];\ \cf2 // \f1 \'b1\'a3\'b4\'e6 \f0 key\cf4 \ \cf2 // [g_default set];\cf4 \ JXLabelObject *obj = [JXLabelObject sharedInstance];\ obj.roomJid = weakSelf.roomJid;\ obj.selectItem = [NSString stringWithFormat:\cf6 @"%@-%@"\cf4 , model.name, model.data[indexPath.row].subName];\ [obj updateRecordGroupAnnouncementSelectItem];\ \cf2 // \f1 \'b8\'fc\'d0\'c2 \f0 UI\cf4 \ \cf2 //weakSelf.leftLabel2.text = model.data[indexPath.row].content;\cf4 \ \ \ JLSelectItemModel *selectItemModel = model.data[indexPath.row];\ [_showTopView.caizongBtn setTitle:selectItemModel.subName forState:UIControlStateNormal];\ _showTopView.selectItemModel=selectItemModel;\ \};\ \ JXLabelObject *obj = [JXLabelObject sharedInstance];\ obj.roomJid = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ NSString *groupAnnouncement = [obj fetchAllGroupAnnouncementFromLocal];\ NSArray *response = [ \f2\b \cf8 self \f0\b0 \cf4 dictionaryWithJsonString: groupAnnouncement];\ \ customView.dataArray = response.copy;\ \cf2 // customView.dataArray = @[\cf4 \ \cf2 // @\{\cf4 \ \cf2 // @"name":@" \f1 \'b9\'d9\'b7\'bd \f0 ",\cf4 \ \cf2 // @"data":@[\cf4 \ \cf2 // @\{@"subName":@" \f1 \'d2\'bb\'b7\'d6\'c8\'fc\'b3\'b5 \f0 111111111111111111",@"content":@" \f1 \'d2\'bb\'b7\'d6\'c8\'fc\'b3\'b5 \f5 1\uc0\u65039 \u8419 2\u65039 \u8419 3\u65039 \u8419 \f0 "\},\cf4 \ \cf2 // @\{@"subName":@" \f1 \'b6\'fe\'b7\'d6\'c8\'fc\'b3\'b5 \f0 ",@"content":@" \f1 \'b6\'fe\'b7\'d6\'c8\'fc\'b3\'b5 \f5 1\uc0\u65039 \u8419 2\u65039 \u8419 3\u65039 \u8419 \f0 "\},\cf4 \ \cf2 // @\{@"subName":@" \f1 \'c8\'fd\'b7\'d6\'c8\'fc\'b3\'b5 \f0 ",@"content":@" \f1 \'c8\'fd\'b7\'d6\'c8\'fc\'b3\'b5 \f5 1\uc0\u65039 \u8419 2\u65039 \u8419 3\u65039 \u8419 \f0 "\},\cf4 \ \cf2 // @\{@"subName":@" \f1 \'cb\'c4\'b7\'d6\'c8\'fc\'b3\'b5 \f0 ",@"content":@" \f1 \'cb\'c4\'b7\'d6\'c8\'fc\'b3\'b5 \f5 1\uc0\u65039 \u8419 2\u65039 \u8419 3\u65039 \u8419 \f0 "\},\cf4 \ \cf2 // @\{@"subName":@" \f1 \'d2\'bb\'b7\'d6\'c8\'fc\'b3\'b5 \f0 ",@"content":@" \f1 \'d2\'bb\'b7\'d6\'c8\'fc\'b3\'b5 \f5 1\uc0\u65039 \u8419 2\u65039 \u8419 3\u65039 \u8419 \f0 "\},\cf4 \ \cf2 // @\{@"subName":@" \f1 \'b6\'fe\'b7\'d6\'c8\'fc\'b3\'b5 \f0 ",@"content":@" \f1 \'b6\'fe\'b7\'d6\'c8\'fc\'b3\'b5 \f5 1\uc0\u65039 \u8419 2\u65039 \u8419 3\u65039 \u8419 \f0 "\},\cf4 \ \cf2 // @\{@"subName":@" \f1 \'c8\'fd\'b7\'d6\'c8\'fc\'b3\'b5 \f0 ",@"content":@" \f1 \'c8\'fd\'b7\'d6\'c8\'fc\'b3\'b5 \f5 1\uc0\u65039 \u8419 2\u65039 \u8419 3\u65039 \u8419 \f0 "\},\cf4 \ \cf2 // @\{@"subName":@" \f1 \'cb\'c4\'b7\'d6\'c8\'fc\'b3\'b5 \f0 ",@"content":@" \f1 \'cb\'c4\'b7\'d6\'c8\'fc\'b3\'b5 \f5 1\uc0\u65039 \u8419 2\u65039 \u8419 3\u65039 \u8419 \f0 "\},\cf4 \ \cf2 // ]\cf4 \ \cf2 // \},\cf4 \ \cf2 // @\{\cf4 \ \cf2 // @"name":@" \f1 \'b4\'ab\'cd\'b3 \f0 ",\cf4 \ \cf2 // @"data":@[\cf4 \ \cf2 // @\{@"subName":@" \f1 \'d2\'bb\'b7\'d6\'c8\'fc\'b3\'b5 \f0 ",@"content":@" \f1 \'d2\'bb\'b7\'d6\'c8\'fc\'b3\'b5 \f5 1\uc0\u65039 \u8419 2\u65039 \u8419 3\u65039 \u8419 \f0 "\},\cf4 \ \cf2 // @\{@"subName":@" \f1 \'b6\'fe\'b7\'d6\'c8\'fc\'b3\'b5 \f0 ",@"content":@" \f1 \'b6\'fe\'b7\'d6\'c8\'fc\'b3\'b5 \f5 1\uc0\u65039 \u8419 2\u65039 \u8419 3\u65039 \u8419 \f0 "\},\cf4 \ \cf2 // @\{@"subName":@" \f1 \'c8\'fd\'b7\'d6\'c8\'fc\'b3\'b5 \f0 ",@"content":@" \f1 \'c8\'fd\'b7\'d6\'c8\'fc\'b3\'b5 \f5 1\uc0\u65039 \u8419 2\u65039 \u8419 3\u65039 \u8419 \f0 "\}\cf4 \ \cf2 // ]\cf4 \ \cf2 // \}];\cf4 \ _container = [[DSHPopupContainer alloc] initWithCustomPopupView:customView];\ _container.maskColor = [[UIColor blackColor] colorWithAlphaComponent:\cf7 .5\cf4 ];\ [_container show];\ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 tebieBtnClickXX\cf4 \{\ \ \f2\b \cf8 long \f0\b0 \cf4 time = ( \f2\b \cf8 long \f0\b0 \cf4 )[[NSDate date] timeIntervalSince1970];\ time = (time *\cf7 1000\cf4 + g_server.timeDifference);\ NSString *salt = [NSString stringWithFormat:\cf6 @"%ld"\cf4 , time];\ [g_server getUserRoomAttentionattentionLastInfo:salt userId:_backUserId jid:_roomJid andToView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \ \}\ \cf2 // \f1 \'cc\'d8\'b1\'f0\'b9\'d8\'d0\'c4 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 tebieBtnClick\cf4 \{\ \ \f2\b \cf8 __weak \f0\b0 \cf4 \f2\b \cf8 __typeof \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 )weakSelf = \f2\b \cf8 self \f0\b0 \cf4 ;\ JxChatGetNoticePersonGVc *pervc=[[JxChatGetNoticePersonGVc alloc]init];\ pervc.block = ^(memberData * \f2\b \cf8 _Nonnull \f0\b0 \cf4 responseObject) \{\ \ \ _backUserId=[NSString stringWithFormat:\cf6 @"%ld"\cf4 ,responseObject.userId];\ [weakSelf.showTopView.tebieGuanXin setTitle:responseObject.userNickName forState:UIControlStateNormal];\ \ \};\ pervc.dataArr=_dataArrGetGroundPersonArr;\ pervc.roomID= \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ \ \ [g_navigation pushViewController:pervc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 setupNotice2nd\cf4 \{\ _noticeView2 = [[UIView alloc] initWithFrame:CGRectMake(\cf7 0\cf4 , JX_SCREEN_TOP, JX_SCREEN_WIDTH, \cf7 38\cf4 )];\ _noticeView2.backgroundColor = [UIColor whiteColor];\ [ \f2\b \cf8 self \f0\b0 \cf4 .view addSubview:_noticeView2];\ \ \ JXtopShowVIew *showTopView=[JXtopShowVIew xibJXtopShowVIew];\ showTopView.frame= _noticeView2.bounds;\ [_noticeView2 addSubview:showTopView];\ \f2\b \cf8 self \f0\b0 \cf4 .showTopView=showTopView;\ [showTopView.tebieGuanXin addTarget: \f2\b \cf8 self \f0\b0 \cf4 action: \f2\b \cf8 @selector \f0\b0 \cf4 (tebieBtnClickXX) forControlEvents:UIControlEventTouchUpInside];\ [showTopView.tebieBtn addTarget: \f2\b \cf8 self \f0\b0 \cf4 action: \f2\b \cf8 @selector \f0\b0 \cf4 (tebieBtnClick) forControlEvents:UIControlEventTouchUpInside];\ \ \ showTopView.jxGuanXinBlockBtn = ^(UIButton *btn) \{\ \ memberData *modelXXX=_tempArrMM[btn.tag];\ \ \f2\b \cf8 long \f0\b0 \cf4 time = ( \f2\b \cf8 long \f0\b0 \cf4 )[[NSDate date] timeIntervalSince1970];\ time = (time *\cf7 1000\cf4 + g_server.timeDifference);\ NSString *salt = [NSString stringWithFormat:\cf6 @"%ld"\cf4 , time];\ \ [g_server getUserRoomAttentionattentionLastInfo:salt userId:[NSString stringWithFormat:\cf6 @"%ld"\cf4 ,modelXXX.userId] jid:_roomJid andToView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \};\ \ \ JXLabelObject *obj = [JXLabelObject sharedInstance];\ obj.roomJid = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ NSString *selectItem = [obj fetchGroupAnnouncementSelectItemFromLocal];\ \cf2 // if (selectItem) \{\cf4 \ \cf2 // NSArray *temp = [selectItem componentsSeparatedByString:@"-"];\cf4 \ \cf2 // //NSString *first = temp.firstObject;\cf4 \ \cf2 // NSString *last = temp.lastObject;\cf4 \ \cf2 // [showTopView.caizongBtn setTitle:[NSString stringWithFormat:@"%@:",last] forState:(UIControlStateNormal)];\cf4 \ \cf2 // \}else \{\cf4 \ \cf2 // [showTopView.caizongBtn setTitle:@" \f1 \'bf\'aa\'bd\'b1\'bd\'e1\'b9\'fb \f0 " forState:(UIControlStateNormal)];\cf4 \ \cf2 // \}\cf4 \ [showTopView.caizongBtn addTarget: \f2\b \cf8 self \f0\b0 \cf4 action: \f2\b \cf8 @selector \f0\b0 \cf4 (notice2ndClick) forControlEvents:(UIControlEventTouchUpInside)];\ \ \ \f2\b \cf8 if \f0\b0 \cf4 (selectItem) \{\ \cf2 //_table.contentInset = UIEdgeInsetsMake(73, 0, 0, 0);\cf4 \ _noticeView2.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _noticeViewScrollView.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ NSArray *temp = [selectItem componentsSeparatedByString:\cf6 @"-"\cf4 ];\ \cf2 //NSString *first = temp.firstObject;\cf4 \ NSString *last = temp.lastObject;\ \ \cf2 //NSString *ganF=[temp.firstObject stringByReplacingOccurrencesOfString:@" \f1 \'b2\'ca \f0 " withString:@""];\cf4 \ NSString *titleName = [NSString stringWithFormat:\cf6 @"%@"\cf4 ,last];\ \ [showTopView.caizongBtn setTitle:[NSString stringWithFormat:\cf6 @"%@:"\cf4 ,titleName] forState:(UIControlStateNormal)];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ _table.contentInset = UIEdgeInsetsMake(\cf7 40\cf4 , \cf7 0\cf4 , \cf7 0\cf4 , \cf7 0\cf4 );\ _noticeViewScrollView.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _noticeView2.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \ [showTopView.caizongBtn setTitle:\cf6 @" \f1 \'bf\'aa\'bd\'b1\'bd\'e1\'b9\'fb \f0 "\cf4 forState:(UIControlStateNormal)];\ \}\ \ \ \ NSString *groupAnnouncement = [obj fetchAllGroupAnnouncementFromLocal];\ NSArray *response = [ \f2\b \cf8 self \f0\b0 \cf4 dictionaryWithJsonString: groupAnnouncement];\ NSMutableArray *modelArray = [NSMutableArray array];\ \f2\b \cf8 for \f0\b0 \cf4 (NSDictionary *dict \f2\b \cf8 in \f0\b0 \cf4 response) \{\ [JLSelectModel mj_setupObjectClassInArray:^NSDictionary *\{\ \f2\b \cf8 return \f0\b0 \cf4 \cf7 @\{\cf4 \ \cf6 @"data"\cf4 : \cf6 @"JLSelectItemModel"\cf4 \ \cf7 \}\cf4 ;\ \}];\ JLSelectModel *model = [JLSelectModel mj_objectWithKeyValues:dict];\ [modelArray addObject:model];\ \}\ \ \cf2 // \f1 \'b2\'f0\'b7\'d6 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (selectItem) \{\ NSArray *temp = [selectItem componentsSeparatedByString:\cf6 @"-"\cf4 ];\ NSString *first = temp.firstObject;\ NSString *last = temp.lastObject;\ \ \f2\b \cf8 for \f0\b0 \cf4 (JLSelectModel *model \f2\b \cf8 in \f0\b0 \cf4 modelArray) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([model.name isEqualToString:first]) \{\ \f2\b \cf8 for \f0\b0 \cf4 (JLSelectItemModel *selectItemModel \f2\b \cf8 in \f0\b0 \cf4 model.data) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([selectItemModel.subName isEqualToString:last]) \{\ groupAnnouncement = selectItemModel.content;\ \cf2 //_leftLabel2.text = groupAnnouncement;\cf4 \ \ showTopView.selectItemModel=selectItemModel;\ \}\ \}\ \}\ \}\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // groupAnnouncement = @"";\cf4 \ \}\ \ NSString *allGroupAnnouncement = [obj fetchAllGroupAnnouncementFromLocal];\ \ \ \f2\b \cf8 if \f0\b0 \cf4 (allGroupAnnouncement == \f2\b \cf8 nil \f0\b0 \cf4 ) \{\ _noticeView2.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ _noticeView2.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ \ \cf2 /*\cf4 \ \cf2 // _leftLabel2.text = (groupAnnouncement.length>1)?groupAnnouncement:@"";\cf4 \ \cf2 _leftLabel2.textColor = HEXCOLOR(0x323232);\cf4 \ \cf2 _leftLabel2.textAlignment = NSTextAlignmentLeft;\cf4 \ \cf2 _leftLabel2.lineBreakMode = NSLineBreakByCharWrapping;\cf4 \ \cf2 _leftLabel2.font = SYSFONT(13);\cf4 \ \cf2 [_showNoticeView2 addSubview:_leftLabel2];\cf4 \ \ \cf2 _rightLabel2 = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(_leftLabel2.frame), 0, JX_SCREEN_WIDTH-130, 36)];\cf4 \ \cf2 _rightLabel2.text = @"";\cf4 \ \cf2 _rightLabel2.textColor = HEXCOLOR(0x323232);\cf4 \ \cf2 _rightLabel2.font = SYSFONT(13);\cf4 \ \cf2 _rightLabel2.textAlignment = NSTextAlignmentLeft;\cf4 \ \cf2 _rightLabel2.lineBreakMode = NSLineBreakByCharWrapping;\cf4 \ \cf2 [_showNoticeView2 addSubview:_rightLabel2];*/\cf4 \ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 hideNoticeView\cf4 :(UITapGestureRecognizer *)tap \{\ _noticeView.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _noticeHeight = \cf7 0\cf4 ;\ _table.frame = CGRectMake(\cf7 0\cf4 , JX_SCREEN_TOP, JX_SCREEN_WIDTH, JX_SCREEN_HEIGHT-JX_SCREEN_TOP-JX_SCREEN_BOTTOM);\ _jumpNewMsgBtn.frame = CGRectMake(JX_SCREEN_WIDTH - \cf7 105\cf4 , JX_SCREEN_TOP + \cf7 20\cf4 +_noticeHeight, \cf7 120\cf4 , \cf7 30\cf4 );\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 startNoticeTimer\cf4 \{\ _leftW = \cf7 0\cf4 ;\ _rightW = _noticeStrW+NOTICE_WIDTH;\ _noticeTimer = [NSTimer scheduledTimerWithTimeInterval:\cf7 0.04f\cf4 target: \f2\b \cf8 self \f0\b0 \cf4 selector: \f2\b \cf8 @selector \f0\b0 \cf4 (updateNoticeTimer:) userInfo: \f2\b \cf8 nil \f0\b0 \cf4 repeats: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ [ \f2\b \cf8 self \f0\b0 \cf4 .noticeTimer setFireDate:[NSDate distantPast]];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 stopNoticeTimer\cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 .timer setFireDate:[NSDate distantFuture]];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 updateNoticeTimer\cf4 :(NSTimer *)timer \{\ \f2\b \cf8 self \f0\b0 \cf4 .leftW --;\ \f2\b \cf8 self \f0\b0 \cf4 .rightW --;\ \f2\b \cf8 self \f0\b0 \cf4 .leftLabel.frame = CGRectMake( \f2\b \cf8 self \f0\b0 \cf4 .leftW, \cf7 0\cf4 , _noticeStrW+NOTICE_WIDTH, \cf7 36\cf4 );\ \f2\b \cf8 self \f0\b0 \cf4 .rightLabel.frame = CGRectMake( \f2\b \cf8 self \f0\b0 \cf4 .rightW, \cf7 0\cf4 , _noticeStrW+NOTICE_WIDTH, \cf7 36\cf4 );\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .leftW <= -_noticeStrW-NOTICE_WIDTH) \{\ \f2\b \cf8 self \f0\b0 \cf4 .leftW = _noticeStrW+NOTICE_WIDTH;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .rightW <= -_noticeStrW-NOTICE_WIDTH) \{\ \f2\b \cf8 self \f0\b0 \cf4 .rightW = _noticeStrW+NOTICE_WIDTH;\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 setupNoticeWithContent\cf4 :(NSString *)noticeStr \cf11 time\cf4 :(NSString *)noticeTime \{\ CGSize size = [noticeStr sizeWithAttributes:\cf7 @\{\cf4 NSFontAttributeName:SYSFONT(\cf7 13\cf4 )\cf7 \}\cf4 ];\ _leftLabel.frame = CGRectMake(\cf7 0\cf4 , \cf7 0\cf4 , size.width, \cf7 36\cf4 );\ _leftLabel.text = noticeStr;\ _rightLabel.frame = CGRectMake(CGRectGetMaxX(_leftLabel.frame), \cf7 0\cf4 , size.width, \cf7 36\cf4 );\ _rightLabel.text = noticeStr;\ _noticeStrW = size.width;\ \f2\b \cf8 if \f0\b0 \cf4 (_noticeStrW > _showNoticeView.frame.size.width) \{\ _rightLabel.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 startNoticeTimer];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ _rightLabel.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 stopNoticeTimer];\ [ \f2\b \cf8 self \f0\b0 \cf4 .noticeTimer invalidate];\ \f2\b \cf8 self \f0\b0 \cf4 .noticeTimer = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (noticeStr.length > \cf7 0\cf4 ) \{\ NSTimeInterval time = [[NSDate date] timeIntervalSince1970];\ \cf2 // \f1 \'b9\'ab\'b8\'e6\'ca\'b1\'bc\'e4\'b3\'ac\'b9\'fd\'d2\'bb\'d6\'dc\'bc\'b4\'b2\'bb\'d4\'d9\'cf\'d4\'ca\'be \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (time >= \cf7 60\cf4 *\cf7 60\cf4 *\cf7 24\cf4 *\cf7 7\cf4 +[noticeTime intValue]) \{\ _noticeView.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \cf2 // _noticeHeight = 36*2;\cf4 \ _noticeHeight = \cf7 0\cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ _noticeView.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \cf2 //_noticeHeight = 36*2;\cf4 \ _noticeHeight = \cf7 0\cf4 ;\ _table.frame = CGRectMake(\cf7 0\cf4 , JX_SCREEN_TOP+_noticeHeight, JX_SCREEN_WIDTH, JX_SCREEN_HEIGHT-JX_SCREEN_TOP-JX_SCREEN_BOTTOM - _noticeHeight);\ [_table gotoLastRow: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ _noticeView.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \cf2 //_noticeHeight = 36*2;\cf4 \ _noticeHeight = \cf7 0\cf4 ;\ \}\ _jumpNewMsgBtn.frame = CGRectMake(JX_SCREEN_WIDTH - \cf7 105\cf4 , JX_SCREEN_TOP + \cf7 20\cf4 +_noticeHeight, \cf7 120\cf4 , \cf7 30\cf4 );\ \}\ \ \ \ \cf2 // \f1 \'cc\'f8\'d7\'aa\'b5\'bd\'d0\'c2\'cf\'fb\'cf\'a2 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 jumpNewMsgBtnAction\cf4 \{\ NSIndexPath* indexPat = [NSIndexPath indexPathForRow:\cf7 0\cf4 inSection:\cf7 0\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 .tableView scrollToRowAtIndexPath:indexPat atScrollPosition:UITableViewScrollPositionBottom animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ _jumpNewMsgBtn.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 screenShotViewAction\cf4 :(UITapGestureRecognizer *)tap \{\ \ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 showDisableSay])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 sendMsgCheck])\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ KKImageEditorViewController *editor = [[KKImageEditorViewController alloc] initWithImage: \f2\b \cf8 self \f0\b0 \cf4 .screenImage delegate: \f2\b \cf8 self \f0\b0 \cf4 ];\ \ UINavigationController *vc = [[UINavigationController alloc] initWithRootViewController:editor];\ [ \f2\b \cf8 self \f0\b0 \cf4 presentViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 completion: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ \}\ \ \cf5 #pragma mark \f2\b \cf16 - \f4 \'d5\'d5\'c6\'ac\'b1\'e0\'bc\'ad\'ba\'f3\'b5\'c4\'bb\'d8\'b5\'f7 \f0\b0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 imageDidFinishEdittingWithImage\cf4 :(UIImage *)image \cf11 asset\cf4 :(PHAsset *)asset\ \{\ \f2\b \cf8 self \f0\b0 \cf4 .screenShotImageView.image = image;\ UIImage *chosedImage = \f2\b \cf8 self \f0\b0 \cf4 .screenShotImageView.image;\ \cf2 // \f1 \'bb\'f1\'c8\'a1 \f0 image \f1 \'b5\'c4\'b3\'a4\'bf\'ed \f0 \cf4 \ \f2\b \cf8 int \f0\b0 \cf4 imageWidth = chosedImage.size.width;\ \f2\b \cf8 int \f0\b0 \cf4 imageHeight = chosedImage.size.height;\ \ \f2\b \cf8 self \f0\b0 \cf4 .view.frame = CGRectMake(\cf7 0\cf4 , \cf7 0\cf4 , JX_SCREEN_WIDTH, JX_SCREEN_HEIGHT);\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \ NSString *name = \cf6 @"jpg"\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \cf2 // for (NSInteger i = 0; i < self.userIds.count; i ++) \{\cf4 \ \cf2 // NSString *userId = self.userIds[i];\cf4 \ \cf2 //\cf4 \ \cf2 // NSString *file = [FileInfo getUUIDFileName:name];\cf4 \ \cf2 // [g_server saveImageToFile:chosedImage file:file isOriginal:NO];\cf4 \ \cf2 // [self sendImage:file withWidth:imageWidth andHeight:imageHeight userId:userId];\cf4 \ \cf12 /// \f3 \cf2 / [g_server uploadFile:file validTime:self.chatPerson.chatRecordTimeOut messageId:nil toView:self]; \f0 \cf4 \ \cf2 // \}\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 addWaitGroupSendViewWithMsgNum\cf4 :\cf7 1\cf4 \cf15 withType\cf4 :\cf5 groupsend_msgType_image\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 groupUploadObjArray\cf4 = [\cf10 NSMutableArray\cf4 \cf14 arrayWithObject\cf4 :chosedImage];\ \cf15 _onceSendNum\cf4 = \cf7 10\cf4 ;\ \cf15 _isOriginal\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 sendPhotos\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 groupUploadObjArray\cf4 \cf15 withOriginal\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf10 NSString\cf4 *file = [\cf9 FileInfo\cf4 \cf15 getUUIDFileName\cf4 :name];\ [\cf5 g_server\cf4 \cf15 saveImageToFile\cf4 :chosedImage \cf15 file\cf4 :file \cf15 isOriginal\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 sendImage\cf4 :file \cf15 withWidth\cf4 :imageWidth \cf15 andHeight\cf4 :imageHeight \cf15 userId\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf2 // [g_server uploadFile:file validTime:self.chatPerson.chatRecordTimeOut messageId:nil toView:self];\cf4 \ \}\ \cf2 // NSString* file = [FileInfo getUUIDFileName:name];\cf4 \ \cf2 //\cf4 \ \cf2 // file = [FileInfo getUUIDFileName:name];\cf4 \ \cf2 // [g_server saveImageToFile:chosedImage file:file isOriginal:NO];\cf4 \ \cf12 /// \f3 \cf2 / [self sendImage:file withWidth:imageWidth andHeight:imageHeight]; \f0 \cf4 \ \cf2 // [g_server uploadFile:file validTime:self.chatPerson.chatRecordTimeOut toView:self];\cf4 \ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf2 // NSFileManager* fileManager=[NSFileManager defaultManager];\cf4 \ \cf2 // BOOL blDele= [fileManager removeItemAtPath:ScreenShotImage error:nil];\cf4 \ \cf2 // if (blDele) \{\cf4 \ \cf2 // NSLog(@"dele success");\cf4 \ \cf2 // \}else \{\cf4 \ \cf2 // NSLog(@"dele fail");\cf4 \ \cf2 // \}\cf4 \ \}\ \ \ - ( \f2\b \cf8 void \f0\b0 \cf4 ) \cf11 createFooterSubViews\cf4 \{\ \ [\cf15 inputBar\cf4 \cf14 removeFromSuperview\cf4 ];\ [\cf15 _publicMenuBar\cf4 \cf14 removeFromSuperview\cf4 ];\ [\cf15 _selectMoreView\cf4 \cf14 removeFromSuperview\cf4 ];\ \ \cf2 // \f1 \'ca\'e4\'c8\'eb\'cc\'f5 \f0 \cf4 \ \cf15 inputBar\cf4 = [[\cf10 UIImageView\cf4 \cf14 alloc\cf4 ] \cf14 initWithImage\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf15 inputBar\cf4 .\cf14 frame\cf4 = \cf14 CGRectMake\cf4 (\cf7 0\cf4 , \cf7 0\cf4 , \cf5 JX_SCREEN_WIDTH\cf4 , \cf7 49\cf4 );\ \cf15 inputBar\cf4 .\cf14 backgroundColor\cf4 = \cf5 HEXCOLOR\cf4 (\cf7 0xF9F9F9\cf4 );\ \cf15 inputBar\cf4 .\cf14 userInteractionEnabled\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf15 inputBar\cf4 .\cf14 clipsToBounds\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableFooter\cf4 \cf14 addSubview\cf4 :\cf15 inputBar\cf4 ];\ \cf2 // [inputBar release];\cf4 \ \ \cf2 // UIView* line = [[UIView alloc]initWithFrame:CGRectMake(0,0,JX_SCREEN_WIDTH,0.5)];\cf4 \ \cf2 // line.backgroundColor = [UIColor colorWithRed:0.9 green:0.9 blue:0.9 alpha:1];\cf4 \ \cf2 // [inputBar addSubview:line];\cf4 \ \cf2 // [line release];\cf4 \ \ \cf2 // \f1 \'a3\'ab \f0 \cf4 \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 shareMore\cf4 = [\cf9 UIFactory\cf4 \cf15 createButtonWithImage\cf4 :\cf6 @"im_show_one_icon"\cf4 \cf15 highlight\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 \cf15 target\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf15 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (shareMore:)];\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 shareMore\cf4 \cf14 setImage\cf4 :[\cf10 UIImage\cf4 \cf14 imageNamed\cf4 :\cf6 @"im_input_more_normal"\cf4 ] \cf14 forState\cf4 :\cf14 UIControlStateSelected\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 shareMore\cf4 .\cf14 frame\cf4 = \cf14 CGRectMake\cf4 (\cf5 JX_SCREEN_WIDTH\cf4 - \cf7 25\cf4 -\cf7 15\cf4 , \cf7 15\cf4 , \cf7 25\cf4 , \cf7 25\cf4 );\ [\cf15 inputBar\cf4 \cf14 addSubview\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 shareMore\cf4 ];\ \cf10 CGFloat\cf4 firstX;\ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _menuList\cf4 .\cf14 count\cf4 > \cf7 0\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 .\cf14 backgroundColor\cf4 = [\cf10 UIColor\cf4 \cf14 whiteColor\cf4 ];\ \cf10 UIButton\cf4 *btn = [\cf9 UIFactory\cf4 \cf15 createButtonWithImage\cf4 :\cf6 @"lashang"\cf4 \cf15 selected\cf4 :\cf6 @"lashang"\cf4 \cf15 target\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf15 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (inputBarSwitch:)];\ btn.\cf14 frame\cf4 = \cf14 CGRectMake\cf4 (\cf7 10\cf4 , \cf7 8\cf4 +\cf7 2\cf4 , \cf7 32\cf4 , \cf7 32\cf4 );\ btn.\cf14 selected\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [\cf15 inputBar\cf4 \cf14 addSubview\cf4 :btn];\ \ \cf10 UIView\cf4 *v = [[\cf10 UIView\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 47\cf4 , \cf7 0\cf4 , \cf5 LINE_WH\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 )];\ v.\cf14 backgroundColor\cf4 = \cf5 THE_LINE_COLOR\cf4 ;\ [\cf15 inputBar\cf4 \cf14 addSubview\cf4 :v];\ \ firstX = \cf7 52\cf4 ;\ \ \cf15 inputBar\cf4 .\cf14 frame\cf4 = \cf14 CGRectMake\cf4 (\cf15 inputBar\cf4 .\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 x\cf4 , \cf15 inputBar\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 , \cf15 inputBar\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 , \cf15 inputBar\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 );\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ firstX = \cf7 10\cf4 ;\ inputBar.frame = CGRectMake(inputBar.frame.origin.x, \cf7 0\cf4 , inputBar.frame.size.width, inputBar.frame.size.height);\ \}\ \ UIButton *btn = [UIFactory createButtonWithImage:\cf6 @"im_input_ptt_normal"\cf4 selected:\cf6 @"im_input_keyboard_normal"\cf4 target: \f2\b \cf8 self \f0\b0 \cf4 selector: \f2\b \cf8 @selector \f0\b0 \cf4 (recordSwitch:)];\ btn.frame = CGRectMake(firstX, \cf7 15\cf4 , \cf7 25\cf4 , \cf7 25\cf4 );\ btn.selected = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [inputBar addSubview:btn];\ _recordBtnLeft = btn;\ \ \cf2 //eomoj\cf4 \ btn = [UIFactory createButtonWithImage:\cf6 @"im_input_expression_normal"\cf4 selected:\cf6 @"im_input_keyboard_normal"\cf4 target: \f2\b \cf8 self \f0\b0 \cf4 selector: \f2\b \cf8 @selector \f0\b0 \cf4 (actionFace:)];\ btn.frame = CGRectMake(JX_SCREEN_WIDTH -\cf7 15\cf4 -\cf7 25\cf4 -\cf7 18\cf4 -\cf7 25\cf4 , \cf7 15\cf4 , \cf7 25\cf4 , \cf7 25\cf4 );\ btn.selected = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [inputBar addSubview:btn];\ _btnFace = btn;\ \ _messageText = [[UITextView alloc] initWithFrame:CGRectMake(firstX + \cf7 35\cf4 , \cf7 8\cf4 , JX_SCREEN_WIDTH-firstX - \cf7 35\cf4 -\cf7 15\cf4 -\cf7 25\cf4 -\cf7 18\cf4 -\cf7 25\cf4 -\cf7 20\cf4 , \cf7 33\cf4 )];\ _messageText.font = SYSFONT(\cf7 18\cf4 );\ _messageText.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ _messageText.layer.cornerRadius = \cf7 2.0\cf4 ;\ _messageText.layer.masksToBounds = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _messageText.enablesReturnKeyAutomatically = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _messageText.returnKeyType = UIReturnKeySend;\ \f2\b \cf8 if \f0\b0 \cf4 (![ \f2\b \cf8 self \f0\b0 \cf4 changeEmjoyText:chatPerson.lastInput textColor:[UIColor blackColor]]) \{\ _messageText.text = chatPerson.lastInput;\ \}\ [inputBar addSubview:_messageText];\ [ \f2\b \cf8 self \f0\b0 \cf4 setTableFooterFrame:_messageText];\ \ \cf2 // \f1 \'c9\'e8\'d6\'c3\'b2\'cb\'b5\'a5 \f0 \cf4 \ UIMenuItem *menuItem = [[UIMenuItem alloc]initWithTitle:Localized(\cf6 @"JX_Newline"\cf4 ) action: \f2\b \cf8 @selector \f0\b0 \cf4 (selfMenu:)];\ UIMenuController *menuController = [UIMenuController sharedMenuController];\ [menuController setMenuItems:[NSArray arrayWithObject:menuItem]];\ \ _textViewBtn = [[UIButton alloc] initWithFrame:CGRectMake(\cf7 0\cf4 , \cf7 10\cf4 , _messageText.frame.size.width, \cf7 12\cf4 )];\ _textViewBtn.backgroundColor = [UIColor clearColor];\ [_textViewBtn addTarget: \f2\b \cf8 self \f0\b0 \cf4 action: \f2\b \cf8 @selector \f0\b0 \cf4 (textViewBtnAction:) forControlEvents:UIControlEventTouchUpInside];\ _textViewBtn.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [_messageText addSubview:_textViewBtn];\ \ _talkTimeLabel = [[UILabel alloc] initWithFrame:CGRectMake(\cf7 0\cf4 , \cf7 0\cf4 , _messageText.frame.size.width, _messageText.frame.size.height)];\ _talkTimeLabel.font = [UIFont systemFontOfSize:\cf7 15.0\cf4 ];\ _talkTimeLabel.text = Localized(\cf6 @"JX_TotalSilence"\cf4 );\ _talkTimeLabel.textColor = [UIColor lightGrayColor];\ _talkTimeLabel.textAlignment = NSTextAlignmentCenter;\ [_messageText addSubview:_talkTimeLabel];\ _talkTimeLabel.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \ memberData *roomD = [[memberData alloc] init];\ roomD.roomId = \f2\b \cf8 self \f0\b0 \cf4 .room.roomId;\ memberData *roomData = [roomD getCardNameById:MY_USER_ID];\ \ \f2\b \cf8 if \f0\b0 \cf4 (([ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.talkTime longLongValue] > \cf7 0\cf4 && !_isAdmin) || [roomData.role intValue] == \cf7 4\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([roomData.role intValue] == \cf7 4\cf4 ) \{\ _talkTimeLabel.text = Localized(\cf6 @"JX_ProhibitToSpeak"\cf4 );\ \}\ _messageText.userInteractionEnabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _shareMore.enabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _recordBtnLeft.enabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _btnFace.enabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \cf15 _messageText\cf4 .\cf14 text\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf15 _talkTimeLabel\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf15 _shareMore\cf4 .\cf14 enabled\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf15 _recordBtnLeft\cf4 .\cf14 enabled\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf15 _btnFace\cf4 .\cf14 enabled\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf15 _messageText\cf4 .\cf14 userInteractionEnabled\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ \cf2 // \f1 \'b5\'e3\'bb\'f7\'d3\'ef\'d2\'f4\'cd\'bc\'c6\'ac\'ba\'f3\'b3\'f6\'cf\'d6\'b5\'c4\'c2\'bc\'d6\'c6\'d3\'ef\'d2\'f4\'b0\'b4\'c5\'a5 \f0 \cf4 \ btn = [\cf10 UIButton\cf4 \cf14 buttonWithType\cf4 :\cf14 UIButtonTypeRoundedRect\cf4 ];\ btn.\cf14 frame\cf4 = \cf14 CGRectMake\cf4 (\cf15 _messageText\cf4 .\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 x\cf4 , \cf7 8\cf4 , \cf15 _messageText\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 , \cf7 32\cf4 +\cf7 5.5\cf4 );\ btn.\cf14 backgroundColor\cf4 = \cf5 HEXCOLOR\cf4 (\cf7 0xFEFEFE\cf4 );\ btn.\cf14 layer\cf4 .\cf14 borderWidth\cf4 = \cf7 0.5\cf4 ;\ btn.\cf14 layer\cf4 .\cf14 borderColor\cf4 = [[\cf10 UIColor\cf4 \cf14 grayColor\cf4 ] \cf14 CGColor\cf4 ];\ [btn \cf14 setTitle\cf4 :\cf5 Localized\cf4 (\cf6 @"JXChatVC_TouchTalk"\cf4 ) \cf14 forState\cf4 :\cf14 UIControlStateNormal\cf4 ];\ [btn \cf14 setTitle\cf4 :\cf5 Localized\cf4 (\cf6 @"JXChatVC_ReleaseEnd"\cf4 ) \cf14 forState\cf4 :\cf14 UIControlEventTouchDown\cf4 ];\ \cf2 // [btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];\cf4 \ [btn \cf14 setTitleColor\cf4 :[\cf10 UIColor\cf4 \cf14 grayColor\cf4 ] \cf14 forState\cf4 :\cf14 UIControlStateNormal\cf4 ];\ btn.\cf14 titleLabel\cf4 .\cf14 font\cf4 = \cf5 g_factory\cf4 .\cf15 font15b\cf4 ;\ \cf2 // [btn setTitleShadowColor:[UIColor blackColor] forState:UIControlStateNormal];\cf4 \ \cf2 // [btn setTitleShadowOffset:CGSizeMake(1, 1)];\cf4 \ btn.\cf14 layer\cf4 .\cf14 cornerRadius\cf4 = \cf7 5\cf4 ;\ btn.\cf14 layer\cf4 .\cf14 masksToBounds\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [\cf15 inputBar\cf4 \cf14 addSubview\cf4 :btn];\ [btn \cf14 addTarget\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 action\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (recordStart:) \cf14 forControlEvents\cf4 :\cf14 UIControlEventTouchDown\cf4 ];\ [btn \cf14 addTarget\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 action\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (recordStop:) \cf14 forControlEvents\cf4 :\cf14 UIControlEventTouchUpInside\cf4 ];\ [btn \cf14 addTarget\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 action\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (recordCancel:) \cf14 forControlEvents\cf4 :\cf14 UIControlEventTouchUpOutside\cf4 ];\ \cf2 // \f1 \'ca\'d6\'d6\'b8\'d4\'da \f0 control \f1 \'b5\'c4 \f0 bounds \f1 \'b7\'b6\'ce\'a7\'c4\'da\'cd\'cf\'b6\'af\'b5\'c4\'b5\'c4\'ca\'c2\'bc\'fe \f0 \cf4 \ [btn \cf14 addTarget\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 action\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (showVoice:) \cf14 forControlEvents\cf4 :\cf14 UIControlEventTouchDragInside\cf4 ];\ \cf2 // \f1 \'b5\'b1\'ca\'d6\'d6\'b8\'cd\'cf\'b6\'af\'b8\'d5\'ba\'c3\'d4\'da \f0 control \f1 \'b5\'c4 \f0 bounds \f1 \'b7\'b6\'ce\'a7\'cd\'e2\'b5\'c4\'ca\'c2\'bc\'fe \f0 \cf4 \ [btn \cf14 addTarget\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 action\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (showCancel:) \cf14 forControlEvents\cf4 :\cf14 UIControlEventTouchDragOutside\cf4 ];\ \ btn.\cf14 selected\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \cf15 _recordBtn\cf4 = btn;\ \cf15 _recordBtn\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _menuList\cf4 .\cf14 count\cf4 > \cf7 0\cf4 ) \{\ \cf2 // \f1 \'b9\'ab\'d6\'da\'ba\'c5\'b2\'cb\'b5\'a5 \f0 \cf4 \ \cf15 _publicMenuBar\cf4 = [[\cf10 UIView\cf4 \cf14 alloc\cf4 ] \cf14 init\cf4 ];\ \cf15 _publicMenuBar\cf4 .\cf14 frame\cf4 = \cf14 CGRectMake\cf4 (\cf7 0\cf4 , \cf7 0\cf4 , \cf5 JX_SCREEN_WIDTH\cf4 , \cf15 inputBar\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 );\ \cf15 _publicMenuBar\cf4 .\cf14 backgroundColor\cf4 = [\cf10 UIColor\cf4 \cf14 whiteColor\cf4 ];\ \cf2 // _publicMenuBar.layer.borderWidth = .5;\cf4 \ \cf2 // _publicMenuBar.layer.borderColor = [HEXCOLOR(0xdcdcdc) CGColor];\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableFooter\cf4 \cf14 addSubview\cf4 :\cf15 _publicMenuBar\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 createPublicMenu\cf4 :\cf15 _menuList\cf4 ];\ \}\ \ \cf14 dispatch_after\cf4 (\cf14 dispatch_time\cf4 (\cf5 DISPATCH_TIME_NOW\cf4 , (\cf10 int64_t\cf4 )(\cf7 1\cf4 * \cf5 NSEC_PER_SEC\cf4 )), \cf14 dispatch_get_main_queue\cf4 (), ^\{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 createSelectMoreView\cf4 ];\ \});\ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 showVoice\cf4 :(\cf10 UIButton\cf4 *)button \{\ \cf15 _voice\cf4 .\cf15 isWillCancel\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 showCancel\cf4 :(\cf10 UIButton\cf4 *)button \{\ \cf15 _voice\cf4 .\cf15 isWillCancel\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ \cf2 // \f1 \'d2\'fe\'b2\'d8\'cf\'b5\'cd\'b3\'b2\'cb\'b5\'a5\'b5\'c4\'b7\'bd\'b7\'a8 \f0 \cf4 \ -( \f2\b \cf8 BOOL \f0\b0 \cf4 )\cf11 canPerformAction\cf4 :( \f2\b \cf8 SEL \f0\b0 \cf4 )action \cf11 withSender\cf4 :( \f2\b \cf8 id \f0\b0 \cf4 )sender\ \{\ \cf2 // \f1 \'d4\'ca\'d0\'ed\'cf\'d4\'ca\'be \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (action == \f2\b \cf8 @selector \f0\b0 \cf4 (selfMenu:)) \{\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \cf2 // \f1 \'c6\'e4\'cb\'fb\'b2\'bb\'d4\'ca\'d0\'ed\'cf\'d4\'ca\'be \f0 \cf4 \ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 selfMenu\cf4 :( \f2\b \cf8 id \f0\b0 \cf4 )sender \{\ \cf15 _messageText\cf4 .\cf14 text\cf4 = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%@\\r"\cf4 ,\cf15 _messageText\cf4 .\cf14 text\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf14 textViewDidChange\cf4 :\cf15 _messageText\cf4 ];\ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 textViewBtnAction\cf4 :(UIButton *)btn \{\ \ _messageText.inputView = \f2\b \cf8 nil \f0\b0 \cf4 ;\ [_messageText reloadInputViews];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 ) \cf11 createPublicMenu\cf4 :(\cf10 NSArray\cf4 *) array \{\ \ \cf10 UIButton\cf4 *btn = [\cf9 UIFactory\cf4 \cf15 createButtonWithImage\cf4 :\cf6 @"jiangp"\cf4 \cf15 selected\cf4 :\cf6 @"jiangp"\cf4 \cf15 target\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf15 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (publicMenuSwitch:)];\ btn.\cf14 frame\cf4 = \cf14 CGRectMake\cf4 (\cf7 10\cf4 , \cf7 8\cf4 , \cf7 32\cf4 , \cf7 32\cf4 );\ btn.\cf14 selected\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [\cf15 _publicMenuBar\cf4 \cf14 addSubview\cf4 :btn];\ \ \ \cf10 CGFloat\cf4 btnWidth = (\cf5 JX_SCREEN_WIDTH\cf4 - \cf7 52\cf4 ) / array.\cf14 count\cf4 ;\ \f2\b \cf8 for \f0\b0 \cf4 (\cf10 NSInteger\cf4 i = \cf7 0\cf4 ; i < array.\cf14 count\cf4 ; i ++) \{\ \cf10 NSDictionary\cf4 *dict = array[i];\ \cf10 NSString\cf4 *name = dict[\cf6 @"name"\cf4 ];\ btn = [[\cf10 UIButton\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf14 CGRectGetMaxX\cf4 (btn.\cf14 frame\cf4 ), \cf7 0\cf4 , btnWidth, \cf15 _publicMenuBar\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 )];\ btn.\cf14 tag\cf4 = i;\ [btn \cf14 addTarget\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 action\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (publicMenuBtnAction:) \cf14 forControlEvents\cf4 :\cf14 UIControlEventTouchUpInside\cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 (i == \cf7 0\cf4 ) \{\ \cf10 CGRect\cf4 frame = btn.\cf14 frame\cf4 ;\ frame.\cf14 origin\cf4 .\cf14 x\cf4 = \cf7 52\cf4 ;\ btn.\cf14 frame\cf4 = frame;\ \}\ btn.\cf14 titleLabel\cf4 .\cf14 font\cf4 = \cf5 SYSFONT\cf4 (\cf7 15.0\cf4 );\ [btn \cf14 setTitleColor\cf4 :[\cf10 UIColor\cf4 \cf14 darkGrayColor\cf4 ] \cf14 forState\cf4 :\cf14 UIControlStateNormal\cf4 ];\ [btn \cf14 setTitle\cf4 :name \cf14 forState\cf4 :\cf14 UIControlStateNormal\cf4 ];\ [\cf15 _publicMenuBar\cf4 \cf14 addSubview\cf4 :btn];\ \ \cf10 UIView\cf4 *v = [[\cf10 UIView\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (btn.\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 x\cf4 , \cf7 0\cf4 , \cf5 LINE_WH\cf4 , \cf15 _publicMenuBar\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 )];\ v.\cf14 backgroundColor\cf4 = \cf5 THE_LINE_COLOR\cf4 ;\ [\cf15 _publicMenuBar\cf4 \cf14 addSubview\cf4 :v];\ \ \cf10 CGSize\cf4 size = [name \cf14 boundingRectWithSize\cf4 :\cf14 CGSizeMake\cf4 (\cf5 MAXFLOAT\cf4 , \cf5 MAXFLOAT\cf4 ) \cf14 options\cf4 :\cf14 NSStringDrawingUsesLineFragmentOrigin\cf4 \cf14 attributes\cf4 :\cf7 @\{\cf14 NSFontAttributeName\cf4 :\cf5 SYSFONT\cf4 (\cf7 15.0\cf4 )\cf7 \}\cf4 \cf14 context\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ].\cf14 size\cf4 ;\ \cf10 CGFloat\cf4 imageX = (btnWidth - size.\cf14 width\cf4 ) / \cf7 2\cf4 - \cf7 20\cf4 ;\ \cf10 UIImageView\cf4 *imageView = [[\cf10 UIImageView\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (imageX, (btn.\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 - \cf7 16\cf4 ) / \cf7 2\cf4 , \cf7 15\cf4 , \cf7 15\cf4 )];\ imageView.\cf14 image\cf4 = [\cf10 UIImage\cf4 \cf14 imageNamed\cf4 :\cf6 @"public_menu"\cf4 ];\ [btn \cf14 addSubview\cf4 :imageView];\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 createSelectMoreView\cf4 \{\ \ \cf15 _selectMoreView\cf4 = [[\cf10 UIView\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableFooter\cf4 .\cf14 bounds\cf4 ];\ \cf15 _selectMoreView\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf15 _selectMoreView\cf4 .\cf14 backgroundColor\cf4 = [\cf10 UIColor\cf4 \cf14 whiteColor\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableFooter\cf4 \cf14 addSubview\cf4 :\cf15 _selectMoreView\cf4 ];\ \ \cf10 NSArray\cf4 *imageNames = \cf7 @[\cf6 @"msf"\cf4 , \cf6 @"msc"\cf4 , \cf6 @"msd"\cf4 , \cf6 @"mse"\cf7 ]\cf4 ;\ \cf10 CGFloat\cf4 w = \cf7 40\cf4 ;\ \cf10 CGFloat\cf4 margin = (\cf5 JX_SCREEN_WIDTH\cf4 - imageNames.\cf14 count\cf4 * w) / (imageNames.\cf14 count\cf4 + \cf7 1\cf4 );\ \cf10 CGFloat\cf4 x = margin;\ \f2\b \cf8 for \f0\b0 \cf4 (\cf10 NSInteger\cf4 i = \cf7 0\cf4 ; i < imageNames.\cf14 count\cf4 ; i ++) \{\ \cf10 NSString\cf4 *imageName = imageNames[i];\ \cf10 UIButton\cf4 *btn = [[\cf10 UIButton\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (x, \cf7 5\cf4 , w, w)];\ [btn \cf14 setBackgroundImage\cf4 :[\cf10 UIImage\cf4 \cf14 imageNamed\cf4 :imageName] \cf14 forState\cf4 :\cf14 UIControlStateNormal\cf4 ];\ btn.\cf14 tag\cf4 = i;\ [btn \cf14 addTarget\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 action\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (selectMoreViewBtnAction:) \cf14 forControlEvents\cf4 :\cf14 UIControlEventTouchUpInside\cf4 ];\ [\cf15 _selectMoreView\cf4 \cf14 addSubview\cf4 :btn];\ \ x = \cf14 CGRectGetMaxX\cf4 (btn.\cf14 frame\cf4 ) + margin;\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 selectMoreViewBtnAction\cf4 :(\cf10 UIButton\cf4 *)btn \{\ \ \f2\b \cf8 for \f0\b0 \cf4 (\cf10 NSInteger\cf4 i = \cf7 0\cf4 ; i < \f2\b \cf8 self \f0\b0 \cf4 .\cf15 selectMoreArr\cf4 .\cf14 count\cf4 ; i ++) \{\ \cf9 JXMessageObject\cf4 *msg1 = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 selectMoreArr\cf4 [i];\ \f2\b \cf8 for \f0\b0 \cf4 (\cf10 NSInteger\cf4 j = i + \cf7 1\cf4 ; j < \f2\b \cf8 self \f0\b0 \cf4 .\cf15 selectMoreArr\cf4 .\cf14 count\cf4 ; j ++) \{\ \cf9 JXMessageObject\cf4 *msg2 = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 selectMoreArr\cf4 [j];\ \f2\b \cf8 if \f0\b0 \cf4 ([msg1.\cf15 timeSend\cf4 \cf14 timeIntervalSince1970\cf4 ] > [msg2.\cf15 timeSend\cf4 \cf14 timeIntervalSince1970\cf4 ]) \{\ \cf9 JXMessageObject\cf4 *msg = msg1;\ msg1 = msg2;\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 selectMoreArr\cf4 [i] = msg2;\ msg2 = msg;\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 selectMoreArr\cf4 [j] = msg;\ \}\ \}\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 selectMoreArr\cf4 .\cf14 count\cf4 <= \cf7 0\cf4 ) \{\ [\cf5 g_App\cf4 \cf15 showAlert\cf4 :\cf5 Localized\cf4 (\cf6 @"JX_PleaseSelectTheMessageRecord"\cf4 )];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 switch \f0\b0 \cf4 (btn.\cf14 tag\cf4 ) \{\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 0\cf4 :\{ \cf2 // \f1 \'c5\'fa\'c1\'bf\'d7\'aa\'b7\'a2 \f0 \cf4 \ \ \cf9 memberData\cf4 *data = [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 room\cf4 \cf15 getMember\cf4 :\cf5 g_myself\cf4 .\cf15 userId\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ([data.\cf15 role\cf4 \cf14 integerValue\cf4 ] == \cf7 4\cf4 ) \{\ [\cf9 JXMyTools\cf4 \cf15 showTipView\cf4 :\cf6 @" \f1 \'d2\'fe\'c9\'ed\'c8\'cb\'b2\'bb\'c4\'dc\'d7\'aa\'b7\'a2\'cf\'fb\'cf\'a2 \f0 "\cf4 ];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \cf9 JXActionSheetVC\cf4 *actionVC = [[\cf9 JXActionSheetVC\cf4 \cf14 alloc\cf4 ] \cf15 initWithImages\cf4 :\cf7 @[]\cf4 \cf15 names\cf4 :\cf7 @[\cf5 Localized\cf4 (\cf6 @"JX_OneByOneForward"\cf4 ),\cf5 Localized\cf4 (\cf6 @"JX_MergeAndForward"\cf4 )\cf7 ]\cf4 ];\ actionVC.\cf15 tag\cf4 = \cf7 2457\cf4 ;\ actionVC.\cf15 delegate\cf4 = \f2\b \cf8 self \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf14 presentViewController\cf4 :actionVC \cf14 animated\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 \cf14 completion\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 1\cf4 :\{ \cf2 // \f1 \'c5\'fa\'c1\'bf\'ca\'d5\'b2\'d8 \f0 \cf4 \ \cf10 UIAlertView\cf4 *alert = [[\cf10 UIAlertView\cf4 \cf14 alloc\cf4 ] \cf14 initWithTitle\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 \cf14 message\cf4 :\cf5 Localized\cf4 (\cf6 @"JX_CollectedType"\cf4 ) \cf14 delegate\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 cancelButtonTitle\cf4 :\cf5 Localized\cf4 (\cf6 @"JX_Cencal"\cf4 ) \cf14 otherButtonTitles\cf4 :\cf5 Localized\cf4 (\cf6 @"JX_Collection"\cf4 ), \f2\b \cf8 nil \f0\b0 \cf4 ];\ alert.\cf14 tag\cf4 = \cf7 2457\cf4 ;\ [alert \cf14 show\cf4 ];\ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 2\cf4 :\{ \cf2 // \f1 \'c5\'fa\'c1\'bf\'c9\'be\'b3\'fd \f0 \cf4 \ \ \cf10 NSMutableString\cf4 *msgIds = [\cf10 NSMutableString\cf4 \cf14 string\cf4 ];\ \f2\b \cf8 for \f0\b0 \cf4 (\cf10 NSInteger\cf4 i = \cf7 0\cf4 ; i < \f2\b \cf8 self \f0\b0 \cf4 .\cf15 selectMoreArr\cf4 .\cf14 count\cf4 ; i ++) \{\ \cf9 JXMessageObject\cf4 *msg = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 selectMoreArr\cf4 [i];\ \cf10 NSInteger\cf4 indexNum = -\cf7 1\cf4 ;\ \f2\b \cf8 for \f0\b0 \cf4 (\cf10 NSInteger\cf4 j = \cf7 0\cf4 ; j < \cf15 _array\cf4 .\cf14 count\cf4 ; j ++) \{\ \cf9 JXMessageObject\cf4 *msg1 = \cf15 _array\cf4 [j];\ \f2\b \cf8 if \f0\b0 \cf4 ([msg1.\cf15 messageId\cf4 \cf14 isEqualToString\cf4 :msg.\cf15 messageId\cf4 ]) \{\ \f2\b \cf8 if \f0\b0 \cf4 (msgIds.\cf14 length\cf4 <= \cf7 0\cf4 ) \{\ [msgIds \cf14 appendString\cf4 :msg1.\cf15 messageId\cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [msgIds \cf14 appendFormat\cf4 :\cf6 @",%@"\cf4 ,msg1.\cf15 messageId\cf4 ];\ \}\ indexNum = j;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \ \cf10 NSString\cf4 * s;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 \cf14 length\cf4 ]>\cf7 0\cf4 )\ s = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ;\ \f2\b \cf8 else \f0\b0 \cf4 \ s = \cf15 chatPerson\cf4 .\cf15 userId\cf4 ;\ \ \ \f2\b \cf8 if \f0\b0 \cf4 (indexNum == \cf15 _array\cf4 .\cf14 count\cf4 - \cf7 1\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 (indexNum <= \cf7 0\cf4 ) \{\ \cf9 JXMessageObject\cf4 *lastMsg = [\cf15 _array\cf4 \cf14 firstObject\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 lastMsg\cf4 .\cf15 content\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ [lastMsg \cf15 updateLastSend\cf4 :\cf15 UpdateLastSendType_None\cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf9 JXMessageObject\cf4 *newLastMsg = \cf15 _array\cf4 [indexNum - \cf7 1\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 lastMsg\cf4 .\cf15 content\cf4 = newLastMsg.\cf15 content\cf4 ;\ [newLastMsg \cf15 updateLastSend\cf4 :\cf15 UpdateLastSendType_None\cf4 ];\ \}\ \}\ \ \cf2 // \f1 \'c9\'be\'b3\'fd\'b1\'be\'b5\'d8\'c1\'c4\'cc\'ec\'bc\'c7\'c2\'bc \f0 \cf4 \ [\cf15 _array\cf4 \cf14 removeObjectAtIndex\cf4 :indexNum];\ [msg \f2\b \cf8 delete \f0\b0 \cf4 ];\ \ [\cf15 _table\cf4 \cf15 deleteRow\cf4 :( \f2\b \cf8 int \f0\b0 \cf4 )indexNum \cf15 section\cf4 :\cf7 0\cf4 ];\ \ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (msgIds.\cf14 length\cf4 > \cf7 0\cf4 ) \{\ \f2\b \cf8 int \f0\b0 \cf4 type = \cf7 1\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ) \{\ type = \cf7 2\cf4 ;\ \}\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 withdrawIndex\cf4 = -\cf7 1\cf4 ;\ \cf2 // [g_server tigaseDeleteMsgWithMessageId:msgIds type:type deleteType:1 roomJid:self.roomJid toView:self];\cf4 \ [\cf5 g_server\cf4 \cf15 tigaseDeleteMsgWithMessageId\cf4 :msgIds \cf15 type\cf4 :type \cf15 deleteType\cf4 :\cf7 2\cf4 \cf15 roomJid\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 \cf15 deleteOrWithdraw\cf4 :\cf15 kWCMessageTypeSuperDelete\cf4 \cf15 toView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isSelectMore\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 actionQuit\cf4 ];\ \}\ \ \}\ \ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 3\cf4 :\{\ \cf9 JXActionSheetVC\cf4 *actionVC = [[\cf9 JXActionSheetVC\cf4 \cf14 alloc\cf4 ] \cf15 initWithImages\cf4 :\cf7 @[]\cf4 \cf15 names\cf4 :\cf7 @[\cf5 Localized\cf4 (\cf6 @"JX_SaveToTheAlbum"\cf4 )\cf7 ]\cf4 ];\ actionVC.\cf15 tag\cf4 = \cf7 2458\cf4 ;\ actionVC.\cf15 delegate\cf4 = \f2\b \cf8 self \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf14 presentViewController\cf4 :actionVC \cf14 animated\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 \cf14 completion\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \ \f2\b \cf8 break \f0\b0 \cf4 ;\ \ \f2\b \cf8 default \f0\b0 \cf4 :\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 inputBarSwitch\cf4 :(\cf10 UIButton\cf4 *)btn \{\ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 .\cf14 backgroundColor\cf4 = [\cf10 UIColor\cf4 \cf14 whiteColor\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 = \cf7 49\cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 hideKeyboard\cf4 : \f2\b \cf8 YES \f0\b0 \cf4 ];\ \cf15 _publicMenuBar\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \cf15 inputBar\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [\cf10 UIView\cf4 \cf14 animateWithDuration\cf4 :\cf7 .3\cf4 \cf14 animations\cf4 :^\{\ \cf15 _publicMenuBar\cf4 .\cf14 frame\cf4 = \cf14 CGRectMake\cf4 (\cf15 _publicMenuBar\cf4 .\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 x\cf4 , \cf7 0\cf4 , \cf15 _publicMenuBar\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 , \cf15 _publicMenuBar\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 );\ \cf15 inputBar\cf4 .\cf14 frame\cf4 = \cf14 CGRectMake\cf4 (\cf15 inputBar\cf4 .\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 x\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableFooter\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 , \cf15 inputBar\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 , \cf15 inputBar\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 );\ \}];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 publicMenuSwitch\cf4 :(\cf10 UIButton\cf4 *)btn \{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 setTableFooterFrame\cf4 :\cf15 _messageText\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 .\cf14 backgroundColor\cf4 = \cf5 HEXCOLOR\cf4 (\cf7 0xF9F9F9\cf4 );\ \cf15 _publicMenuBar\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf15 inputBar\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [\cf10 UIView\cf4 \cf14 animateWithDuration\cf4 :\cf7 .3\cf4 \cf14 animations\cf4 :^\{\ \cf15 _publicMenuBar\cf4 .\cf14 frame\cf4 = \cf14 CGRectMake\cf4 (\cf15 _publicMenuBar\cf4 .\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 x\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableFooter\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 , \cf15 _publicMenuBar\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 , \cf15 _publicMenuBar\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 );\ \cf15 inputBar\cf4 .\cf14 frame\cf4 = \cf14 CGRectMake\cf4 (\cf15 inputBar\cf4 .\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 x\cf4 , \cf7 0\cf4 , \cf15 inputBar\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 , \cf15 inputBar\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 );\ \}];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 publicMenuBtnAction\cf4 :(\cf10 UIButton\cf4 *)btn \{\ \cf10 UIWindow\cf4 *window = [[\cf10 UIApplication\cf4 \cf14 sharedApplication\cf4 ].\cf14 delegate\cf4 \cf14 window\cf4 ];\ \cf10 CGRect\cf4 moreFrame = [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableFooter\cf4 \cf14 convertRect\cf4 :btn.\cf14 frame\cf4 \cf14 toView\cf4 :window];\ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 selMenuIndex\cf4 = btn.\cf14 tag\cf4 ;\ \cf10 NSDictionary\cf4 *dict = \cf15 _menuList\cf4 [btn.\cf14 tag\cf4 ];\ \cf10 NSArray\cf4 *arr = dict[\cf6 @"menuList"\cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 (!arr || arr.\cf14 count\cf4 <= \cf7 0\cf4 ) \{\ \cf9 webpageVC\cf4 *webVC = [\cf9 webpageVC\cf4 \cf14 alloc\cf4 ];\ webVC.\cf15 isGotoBack\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ webVC.\cf15 isSend\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ webVC.\cf14 title\cf4 = [dict \cf14 objectForKey\cf4 :\cf6 @"name"\cf4 ];\ \cf10 NSString\cf4 * url = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%@"\cf4 ,[dict \cf14 objectForKey\cf4 :\cf6 @"url"\cf4 ]];\ url = [url \cf14 stringByReplacingOccurrencesOfString\cf4 :\cf6 @" "\cf4 \cf14 withString\cf4 :\cf6 @""\cf4 ];\ url = [url \cf14 stringByReplacingOccurrencesOfString\cf4 :\cf6 @"\\t"\cf4 \cf14 withString\cf4 :\cf6 @""\cf4 ];\ webVC.\cf15 url\cf4 = url;\ webVC = [webVC \cf14 init\cf4 ];\ [\cf5 g_navigation\cf4 .\cf15 navigationView\cf4 \cf14 addSubview\cf4 :webVC.\cf14 view\cf4 ];\ \cf2 // [g_navigation pushViewController:webVC animated:YES];\cf4 \ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \cf10 CGFloat\cf4 maxWidth = \cf7 0\cf4 ;\ \cf10 NSMutableArray\cf4 *arrM = [\cf10 NSMutableArray\cf4 \cf14 array\cf4 ];\ \f2\b \cf8 for \f0\b0 \cf4 (\cf10 NSInteger\cf4 i = \cf7 0\cf4 ; i < arr.\cf14 count\cf4 ; i ++) \{\ \cf10 NSDictionary\cf4 *dict2 = arr[i];\ [arrM \cf14 addObject\cf4 :dict2[\cf6 @"name"\cf4 ]];\ \cf10 NSString\cf4 *str = dict2[\cf6 @"name"\cf4 ];\ \cf10 CGSize\cf4 size = [str \cf14 boundingRectWithSize\cf4 :\cf14 CGSizeMake\cf4 (\cf5 MAXFLOAT\cf4 , \cf7 20\cf4 ) \cf14 options\cf4 :\cf14 NSStringDrawingUsesLineFragmentOrigin\cf4 \cf14 attributes\cf4 :\cf7 @\{\cf14 NSFontAttributeName\cf4 :\cf5 SYSFONT\cf4 (\cf7 15.0\cf4 )\cf7 \}\cf4 \cf14 context\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ].\cf14 size\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (size.\cf14 width\cf4 > maxWidth) \{\ maxWidth = size.\cf14 width\cf4 ;\ \}\ \}\ \cf9 JX_DownListView\cf4 * downListView = [[\cf9 JX_DownListView\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 .\cf14 bounds\cf4 ];\ downListView.\cf15 listContents\cf4 = arrM;\ downListView.\cf15 color\cf4 = \cf5 HEXCOLOR\cf4 (\cf7 0xf3f3f3\cf4 );\ downListView.\cf15 textColor\cf4 = [\cf10 UIColor\cf4 \cf14 darkGrayColor\cf4 ];\ downListView.\cf15 maxWidth\cf4 = maxWidth;\ downListView.\cf15 showType\cf4 = \cf15 DownListView_Center\cf4 ;\ \f2\b \cf8 __weak \f0\b0 \cf4 \f2\b \cf8 typeof \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 ) weakSelf = \f2\b \cf8 self \f0\b0 \cf4 ;\ [downListView \cf15 downlistPopOption\cf4 :^(\cf10 NSInteger\cf4 index, \cf10 NSString\cf4 *content) \{\ [weakSelf \cf15 showPublicMenuContent\cf4 :index];\ \ \} \cf15 whichFrame\cf4 :moreFrame \cf15 animate\cf4 : \f2\b \cf8 YES \f0\b0 \cf4 ];\ [downListView \cf15 show\cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 showPublicMenuContent\cf4 :(\cf10 NSInteger\cf4 )index \{\ \ \cf10 NSDictionary\cf4 *dict = \cf15 _menuList\cf4 [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 selMenuIndex\cf4 ];\ \cf10 NSArray\cf4 *arr = dict[\cf6 @"menuList"\cf4 ];\ \cf10 NSDictionary\cf4 *dict2 = arr[index];\ \ \cf10 NSString\cf4 *menuId = dict2[\cf6 @"menuId"\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (menuId.\cf14 length\cf4 > \cf7 0\cf4 ) \{\ \cf10 NSString\cf4 * url = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%@?access_token=%@"\cf4 ,menuId,\cf5 g_server\cf4 .\cf15 access_token\cf4 ];\ [\cf5 g_server\cf4 \cf15 requestWithUrl\cf4 :url \cf15 toView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf9 webpageVC\cf4 *webVC = [\cf9 webpageVC\cf4 \cf14 alloc\cf4 ];\ webVC.\cf15 isGotoBack\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ webVC.\cf15 isSend\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ webVC.\cf14 title\cf4 = [dict2 \cf14 objectForKey\cf4 :\cf6 @"name"\cf4 ];\ \cf10 NSString\cf4 * url = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%@"\cf4 ,[dict2 \cf14 objectForKey\cf4 :\cf6 @"url"\cf4 ]];\ url = [url \cf14 stringByReplacingOccurrencesOfString\cf4 :\cf6 @" "\cf4 \cf14 withString\cf4 :\cf6 @""\cf4 ];\ url = [url \cf14 stringByReplacingOccurrencesOfString\cf4 :\cf6 @"\\t"\cf4 \cf14 withString\cf4 :\cf6 @""\cf4 ];\ webVC.\cf15 url\cf4 = url;\ webVC = [webVC \cf14 init\cf4 ];\ [\cf5 g_navigation\cf4 .\cf15 navigationView\cf4 \cf14 addSubview\cf4 :webVC.\cf14 view\cf4 ];\ \cf2 // [g_navigation pushViewController:webVC animated:YES];\cf4 \ \}\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 initAudio\cf4 \{\ \cf2 // [[UIDevice currentDevice] setProximityMonitoringEnabled:YES]; // \f1 \'bd\'a8\'d2\'e9\'d4\'da\'b2\'a5\'b7\'c5\'d6\'ae\'c7\'b0\'c9\'e8\'d6\'c3 \f0 yes \f1 \'a3\'ac\'b2\'a5\'b7\'c5\'bd\'e1\'ca\'f8\'c9\'e8\'d6\'c3 \f0 NO \f1 \'a3\'ac\'d5\'e2\'b8\'f6\'b9\'a6\'c4\'dc\'ca\'c7\'bf\'aa\'c6\'f4\'ba\'ec\'cd\'e2\'b8\'d0\'d3\'a6 \f0 \cf4 \ \ \cf2 // \f1 \'cc\'ed\'bc\'d3\'bc\'e0\'cc\'fd \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (readTypeMsgCome:) \cf14 name\cf4 :\cf5 kXMPPMessageReadTypeNotification\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (readTypeMsgReceipt:) \cf14 name\cf4 :\cf5 kXMPPMessageReadTypeReceiptNotification\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (sendText:) \cf14 name\cf4 :\cf5 kSendInputNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (newMsgCome:) \cf14 name\cf4 :\cf5 kXMPPNewMsgNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (showMsg:) \cf14 name\cf4 :\cf5 kXMPPShowMsgNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (newReceipt:) \cf14 name\cf4 :\cf5 kXMPPReceiptNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onReceiveFile:) \cf14 name\cf4 :\cf5 kXMPPReceiveFileNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onSendTimeout:) \cf14 name\cf4 :\cf5 kXMPPSendTimeOutNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onQuitRoom:) \cf14 name\cf4 :\cf5 kQuitRoomNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (changeKeyBoard:) \cf14 name\cf4 :\cf14 UIKeyboardWillShowNotification\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (onReceiveRoomRemind:) \cf14 name\cf4 :\cf5 kXMPPRoomNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf2 // [g_notify addObserver:self selector:@selector(onLoginChanged:) name:kXmppLoginNotifaction object:nil];// \f1 \'b5\'c7\'c2\'bc\'d7\'b4\'cc\'ac\'b8\'c4\'b1\'e4 \f0 \cf4 \ \cf2 // \f1 \'d5\'fd\'d4\'da\'ca\'e4\'c8\'eb \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (enteringNotifi:) \cf14 name\cf4 :\cf5 kXMPPMessageEnteringNotification\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf2 // \f1 \'b3\'b7\'bb\'d8\'cf\'fb\'cf\'a2 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (withdrawNotifi:) \cf14 name\cf4 :\cf5 kXMPPMessageWithdrawNotification\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (actionQuitChatVC:) \cf14 name\cf4 :\cf5 kActionRelayQuitVC\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf2 // \f1 \'c9\'be\'b3\'fd\'ba\'c3\'d3\'d1 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (delFriend:) \cf14 name\cf4 :\cf5 kDeleteUserNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf2 // \f1 \'d5\'6e\'b3\'cc\'cf\'fb\'cf\'a2 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (sendCourseMsg:) \cf14 name\cf4 :\cf5 kSendCourseMsg\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf2 // \f1 \'d0\'de\'b8\'c4\'b1\'b8\'d7\'a2 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (friendRemarkNotifi:) \cf14 name\cf4 :\cf5 kFriendRemark\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf2 // \f1 \'c8\'ba\'b3\'c9\'d4\'b1\'b8\'fc\'d0\'c2 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (roomMembersRefreshNotifi:) \cf14 name\cf4 :\cf5 kRoomMembersRefresh\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf2 // \f1 \'c9\'e8\'d6\'c3\'c1\'c4\'cc\'ec\'b1\'b3\'be\'b0 \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (setBackGroundImageViewNotifi:) \cf14 name\cf4 :\cf5 kSetBackGroundImageView\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ [\cf5 g_notify\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (showCallMsg:) \cf14 name\cf4 :\cf5 UpdateAcceptCallMsg\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableFooter\cf4 \cf14 addObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 forKeyPath\cf4 :\cf6 @"frame"\cf4 \cf14 options\cf4 :\cf14 NSKeyValueObservingOptionNew\cf4 \cf14 context\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 unInitAudio\cf4 \{\ \cf2 // [[UIDevice currentDevice] setProximityMonitoringEnabled:NO]; // \f1 \'bd\'a8\'d2\'e9\'d4\'da\'b2\'a5\'b7\'c5\'d6\'ae\'c7\'b0\'c9\'e8\'d6\'c3 \f0 yes \f1 \'a3\'ac\'b2\'a5\'b7\'c5\'bd\'e1\'ca\'f8\'c9\'e8\'d6\'c3 \f0 NO \f1 \'a3\'ac\'d5\'e2\'b8\'f6\'b9\'a6\'c4\'dc\'ca\'c7\'bf\'aa\'c6\'f4\'ba\'ec\'cd\'e2\'b8\'d0\'d3\'a6 \f0 \cf4 \ \ \cf2 // \f1 \'d2\'c6\'b3\'fd\'bc\'e0\'cc\'fd \f0 \cf4 \ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kXMPPNewMsgNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kXMPPSendTimeOutNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kXMPPReceiptNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kSendInputNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kXMPPReceiveFileNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf14 UIKeyboardWillShowNotification\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kQuitRoomNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kXMPPRoomNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kXmppLoginNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kXMPPMessageEnteringNotification\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kXMPPMessageWithdrawNotification\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kSendCourseMsg\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kFriendRemark\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 UpdateAcceptCallMsg\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableFooter\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 forKeyPath\cf4 :\cf6 @"frame"\cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 observeValueForKeyPath\cf4 :(\cf10 NSString\cf4 *)keyPath \cf11 ofObject\cf4 :( \f2\b \cf8 id \f0\b0 \cf4 )object \cf11 change\cf4 :(\cf10 NSDictionary\cf4 <\cf10 NSKeyValueChangeKey\cf4 , \f2\b \cf8 id \f0\b0 \cf4 > *)change \cf11 context\cf4 :( \f2\b \cf8 void \f0\b0 \cf4 *)context \{\ \ \f2\b \cf8 if \f0\b0 \cf4 (\cf5 THE_DEVICE_HAVE_HEAD\cf4 ) \{\ \f2\b \cf8 id \f0\b0 \cf4 newValue = [change \cf14 objectForKey\cf4 :\cf14 NSKeyValueChangeNewKey\cf4 ];\ \cf10 CGRect\cf4 newFrame = [newValue \cf14 CGRectValue\cf4 ];\ \f2\b \cf8 int \f0\b0 \cf4 n = ( \f2\b \cf8 int \f0\b0 \cf4 )newFrame.\cf14 origin\cf4 .\cf14 y\cf4 ;\ \f2\b \cf8 int \f0\b0 \cf4 m = ( \f2\b \cf8 int \f0\b0 \cf4 )( \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 );\ \ \f2\b \cf8 if \f0\b0 \cf4 (\cf14 fabs\cf4 (n - m) < \cf7 2\cf4 ) \{\ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableFooter\cf4 .\cf14 frame\cf4 = \cf14 CGRectMake\cf4 (\cf7 0\cf4 , \cf5 JX_SCREEN_HEIGHT\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 - \cf7 35\cf4 , \cf5 JX_SCREEN_WIDTH\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 );\ \cf15 _table\cf4 .\cf14 frame\cf4 =\cf14 CGRectMake\cf4 (\cf7 0\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightHeader\cf4 +\cf15 _noticeHeight\cf4 ,\cf5 self_width\cf4 ,\cf5 JX_SCREEN_HEIGHT\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightHeader\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 - \cf7 35\cf4 -\cf15 _noticeHeight\cf4 );\ \}\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 setBackGroundImageViewNotifi\cf4 :(\cf10 NSNotification\cf4 *)notif \{\ \cf10 UIImage\cf4 *image = notif.\cf14 object\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (image) \{\ \cf15 _table\cf4 .\cf14 backgroundColor\cf4 = [\cf10 UIColor\cf4 \cf14 clearColor\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 backGroundImageView\cf4 .\cf14 image\cf4 = image;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 backGroundImageView\cf4 .\cf14 image\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \cf15 _table\cf4 .\cf14 backgroundColor\cf4 = \cf5 HEXCOLOR\cf4 (\cf7 0xF2F2F2\cf4 );\ \}\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 friendRemarkNotifi\cf4 :(\cf10 NSNotification\cf4 *)notif \{\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 courseId\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \cf9 JXUserObject\cf4 *user = notif.\cf14 object\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([user.\cf15 userId\cf4 \cf14 isEqualToString\cf4 :\cf15 chatPerson\cf4 .\cf15 userId\cf4 ]) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 setChatTitle\cf4 :user.\cf15 remarkName\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ? user.\cf15 remarkName\cf4 : user.\cf15 userNickname\cf4 ];\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 roomMembersRefreshNotifi\cf4 :(\cf10 NSNotification\cf4 *)notif \{\ \ \cf2 // NSArray * memberArray = [memberData fetchAllMembers:_room.roomId];\cf4 \ \f2\b \cf8 int \f0\b0 \cf4 userSize = [notif.\cf14 object\cf4 \cf14 intValue\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 title\cf4 = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%@(%d)"\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatPerson\cf4 .\cf15 userNickname\cf4 , userSize];\ \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 setAudioIconFrame\cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 actionQuitChatVC\cf4 :(\cf10 NSNotification\cf4 *)notif \{\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isSelectMore\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 actionQuit\cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 delFriend\cf4 :(\cf10 NSNotification\cf4 *)notif \{\ \cf9 JXUserObject\cf4 * user = (\cf9 JXUserObject\cf4 *)notif.\cf14 object\cf4 ;\ \ \f2\b \cf8 if \f0\b0 \cf4 ([\cf15 chatPerson\cf4 .\cf15 userId\cf4 \cf14 isEqualToString\cf4 :user.\cf15 userId\cf4 ]) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 actionQuit\cf4 ];\ \}\ \}\ \ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendCourseMsg\cf4 :(\cf10 NSNotification\cf4 *)notif \{\ \cf9 JXMessageObject\cf4 *msg = (\cf9 JXMessageObject\cf4 *)notif.\cf14 object\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.\cf15 toUserId\cf4 \cf14 isEqualToString\cf4 :\cf15 chatPerson\cf4 .\cf15 userId\cf4 ]) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 showOneMsg\cf4 :msg];\ \}\ \}\ \ \cf2 // \f1 \'c8\'ba\'cd\'b7\'cf\'ce\'cb\'a2\'d0\'c2 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 groupLevelNameRefresh\cf4 :(\cf10 NSNotification\cf4 *)note \{\ \cf15 _groupLevelNameArray\cf4 = note.\cf14 object\cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 refresh\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf15 _table\cf4 \cf14 reloadData\cf4 ];\ \ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 refresh\cf4 :(\cf9 JXMessageObject\cf4 *)msg\ \{\ \cf15 _isRefreshing\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 courseId\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ) \{\ \cf10 NSMutableArray\cf4 *arr = [\cf10 NSMutableArray\cf4 \cf14 array\cf4 ];\ \f2\b \cf8 for \f0\b0 \cf4 (\cf10 NSDictionary\cf4 *dict \f2\b \cf8 in \f0\b0 \cf4 \f2\b \cf8 self \f0\b0 \cf4 .\cf15 courseArray\cf4 ) \{\ [arr \cf14 addObject\cf4 :dict[\cf6 @"message"\cf4 ]];\ \}\ \cf15 _array\cf4 = arr;\ [\cf15 _table\cf4 \cf15 gotoLastRow\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isShowHeaderPull\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatLogArray\cf4 .\cf14 count\cf4 > \cf7 0\cf4 ) \{\ \cf15 _array\cf4 = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatLogArray\cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableView\cf4 \cf14 reloadData\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isShowFooterPull\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ [\cf15 _messageText\cf4 \cf14 setInputView\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf15 _messageText\cf4 \cf14 resignFirstResponder\cf4 ];\ \f2\b \cf8 BOOL \f0\b0 \cf4 b= \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 BOOL \f0\b0 \cf4 bPull= \f2\b \cf8 NO \f0\b0 \cf4 ;\ \cf10 NSInteger\cf4 firstNum = \cf7 1\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([\cf15 _array\cf4 \cf14 count\cf4 ]>\cf7 0\cf4 )\ firstNum = \cf15 _array\cf4 .\cf14 count\cf4 ;\ \ \ \cf10 CGFloat\cf4 allHeight = \cf7 0\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (msg == \f2\b \cf8 nil \f0\b0 \cf4 )\{\ \cf10 NSString\cf4 * s;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 \cf14 length\cf4 ]>\cf7 0\cf4 )\ s = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ;\ \f2\b \cf8 else \f0\b0 \cf4 \ s = \cf15 chatPerson\cf4 .\cf15 userId\cf4 ;\ \cf10 NSMutableArray\cf4 * p;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isGetServerMsg\cf4 ) \{\ \cf2 // \f1 \'bb\'f1\'c8\'a1\'c2\'fe\'d3\'ce\'c1\'c4\'cc\'ec\'bc\'c7\'c2\'bc \f0 \cf4 \ \cf2 // [_wait start];\cf4 \ \f2\b \cf8 long \f0\b0 \cf4 starTime;\ \f2\b \cf8 long \f0\b0 \cf4 endTime;\ \cf9 JXSynTask\cf4 *task = \cf15 _taskList\cf4 .\cf14 firstObject\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (task && \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ) \{\ starTime = [task.\cf15 startTime\cf4 \cf14 timeIntervalSince1970\cf4 ] * \cf7 1000\cf4 ;\ endTime = [task.\cf15 endTime\cf4 \cf14 timeIntervalSince1970\cf4 ] * \cf7 1000\cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf9 JXMessageObject\cf4 *msg = \cf15 _array\cf4 .\cf14 firstObject\cf4 ;\ \cf2 // 7 \f1 \'cc\'ec\'c7\'b0\'b5\'c4\'ca\'b1\'bc\'e4\'b4\'c1 \f0 \cf4 \ endTime = [msg.\cf15 timeSend\cf4 \cf14 timeIntervalSince1970\cf4 ] * \cf7 1000\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (endTime == \cf7 0\cf4 ) \{\ endTime = [[\cf10 NSDate\cf4 \cf14 date\cf4 ] \cf14 timeIntervalSince1970\cf4 ] * \cf7 1000\cf4 ;\ \}\ starTime = \cf7 1262275200000\cf4 ;\ \}\ \ starTime = starTime/\cf7 1000\cf4 ;\ endTime = endTime/\cf7 1000\cf4 ;\ \ \cf2 // \f1 \'d0\'c5\'cf\'a2\'b5\'c4\'b7\'a2\'cb\'cd\'ca\'b1\'bc\'e4 \f0 < starTime = endTime - chatSyncTimeLen; retren;\cf4 \ \ \f2\b \cf8 long \f0\b0 \cf4 chatSyncTimeLen = \cf7 0\cf4 ;\ \f2\b \cf8 switch \f0\b0 \cf4 ([g_myself.chatSyncTimeLen integerValue]) \{\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 0\cf4 : \cf2 // 0.04 1 \f1 \'d0\'a1\'ca\'b1 \f0 \cf4 \ chatSyncTimeLen = \cf7 3600\cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 1\cf4 : \cf2 // 1 \f1 \'cc\'ec \f0 \cf4 \ chatSyncTimeLen = \cf7 86400\cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 7\cf4 : \cf2 // 7 \f1 \'cc\'ec \f0 \cf4 \ chatSyncTimeLen = \cf7 604800\cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 30\cf4 : \cf2 // 30 \f1 \'cc\'ec \f0 \cf4 \ chatSyncTimeLen = \cf7 2629800\cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 90\cf4 : \cf2 // 90 \f1 \'cc\'ec \f0 \cf4 \ chatSyncTimeLen = \cf7 7889400\cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 365\cf4 : \cf2 //365 \f1 \'cc\'ec \f0 \cf4 \ chatSyncTimeLen = \cf7 31557600\cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 -\cf7 1\cf4 : \cf2 // \f1 \'d3\'c0\'be\'c3 \f0 (20 \f1 \'c4\'ea \f0 )\cf4 \ chatSyncTimeLen = \cf7 631152000\cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 default \f0\b0 \cf4 :\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 long \f0\b0 \cf4 currentTime = [[NSDate date] timeIntervalSince1970];\ \f2\b \cf8 long \f0\b0 \cf4 minSyncTime = currentTime - chatSyncTimeLen;\ \ \f2\b \cf8 if \f0\b0 \cf4 (endTime <= minSyncTime) \{\ starTime = minSyncTime;\ endTime = currentTime;\ \}\ endTime = endTime*\cf7 1000\cf4 ;\ starTime = starTime*\cf7 1000\cf4 ;\ \cf2 // // \f1 \'c8\'ba\'d7\'e9\'c9\'be\'b3\'fd\'c1\'c4\'cc\'ec\'bc\'c7\'c2\'bc\'ca\'b1\'bc\'e4 \f0 \cf4 \ \cf2 // NSInteger time1 = 0;\cf4 \ \cf2 // if ([g_default valueForKey:self.roomId] && ([self.roomJid length]>0)) \{\cf4 \ \cf2 // time1 = [[g_default valueForKey:self.roomId] integerValue];\cf4 \ \cf2 // \}\cf4 \ \cf2 // NSNumber *lastClearRecordTime = [NSNumber numberWithInteger:time1];\cf4 \ \cf2 // // \f1 \'c9\'e8\'d6\'c3\'c9\'be\'b3\'fd\'cb\'f9\'d3\'d0\'c1\'c4\'cc\'ec\'bc\'c7\'c2\'bc\'ca\'b1\'bc\'e4 \f0 \cf4 \ \cf2 // NSInteger time2 = 0;\cf4 \ \cf2 // if ([g_default valueForKey:@"CLEARALLMSGRECORDTIME"] && ([self.roomJid length]>0)) \{\cf4 \ \cf2 // time2 = [[g_default valueForKey:@"CLEARALLMSGRECORDTIME"] integerValue];\cf4 \ \cf2 // \}\cf4 \ \cf2 // NSNumber *CLEARALLMSGRECORDTIME = [NSNumber numberWithInteger:time2];\cf4 \ \cf2 // // \f1 \'c9\'e8\'d6\'c3\'c2\'fe\'d3\'ce\'b5\'c4\'ca\'b1\'bc\'e4 \f0 \cf4 \ \cf2 // NSNumber *synTime = [NSNumber numberWithLong:starTime];\cf4 \ \cf2 //\cf4 \ \cf2 // // \f1 \'c5\'c5\'d0\'f2\'cb\'c4\'b8\'f6\'ca\'b1\'bc\'e4 \f0 \f1 \'c8\'eb\'c8\'ba\'ca\'b1\'bc\'e4 \f0 , \f1 \'c8\'ba\'d7\'e9\'c9\'be\'b3\'fd\'c1\'c4\'cc\'ec\'bc\'c7\'c2\'bc\'ca\'b1\'bc\'e4 \f0 , \f1 \'c9\'e8\'d6\'c3\'c9\'be\'b3\'fd\'cb\'f9\'d3\'d0\'c1\'c4\'cc\'ec\'bc\'c7\'c2\'bc\'ca\'b1\'bc\'e4 \f0 , \f1 \'c9\'e8\'d6\'c3\'c2\'fe\'d3\'ce\'b5\'c4\'ca\'b1\'bc\'e4 \f0 \cf4 \ \cf2 // NSArray *sortedArray = [@[lastClearRecordTime,synTime,CLEARALLMSGRECORDTIME] sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) \{\cf4 \ \cf2 // NSComparisonResult result = [obj1 compare: obj2];\cf4 \ \cf2 // return result;\cf4 \ \cf2 // \}];\cf4 \ \cf2 // NSNumber *time = [sortedArray lastObject];\cf4 \ \cf2 // starTime = [time longValue];\cf4 \ \ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\ [g_server tigaseMucMsgsWithRoomId:s StartTime:starTime EndTime:endTime PageIndex:\cf7 0\cf4 PageSize:PAGECOUNT toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \f2\b \cf8 else \f0\b0 \cf4 \ [g_server tigaseMsgsWithReceiver:s StartTime:starTime EndTime:endTime PageIndex:\cf7 0\cf4 toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // \f1 \'bb\'f1\'c8\'a1\'b1\'be\'b5\'d8\'c1\'c4\'cc\'ec\'bc\'c7\'c2\'bc \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .scrollLine == \cf7 0\cf4 ) \{\ \f2\b \cf8 int \f0\b0 \cf4 pageCount = \cf7 20\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .newMsgCount > \cf7 20\cf4 ) \{\ pageCount = \f2\b \cf8 self \f0\b0 \cf4 .newMsgCount;\ \f2\b \cf8 self \f0\b0 \cf4 .newMsgCount = \cf7 0\cf4 ;\ \}\ \ JXSynTask *task = _taskList.firstObject;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid.length > \cf7 0\cf4 && task) \{\ \ p = [[JXMessageObject sharedInstance] fetchMessageListWithUser:s byAllNum:_array.count pageCount:pageCount startTime:task.endTime];\ \ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ NSString* myUserId = MY_USER_ID;\ \f2\b \cf8 double \f0\b0 \cf4 createTime = \cf7 0\cf4 ;\ NSArray *array = [memberData getSelfMember: \f2\b \cf8 self \f0\b0 \cf4 .roomId];\ \f2\b \cf8 for \f0\b0 \cf4 (memberData *mdata \f2\b \cf8 in \f0\b0 \cf4 array) \{\ NSString *userId = [NSString stringWithFormat:\cf6 @"%ld"\cf4 , mdata.userId];\ \f2\b \cf8 if \f0\b0 \cf4 ([userId isEqualToString:myUserId])\{\ createTime = mdata.createTime;\ \}\ \}\ p = [[JXMessageObject sharedInstance] fetchMessageListWithUser:s byAllNum:_array.count pageCount:pageCount startTime:[NSDate dateWithTimeIntervalSince1970:createTime]];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (_array.count <= \cf7 0\cf4 &&(!p || p.count <= \cf7 0\cf4 ) && (! \f2\b \cf8 self \f0\b0 \cf4 .roomJid || \f2\b \cf8 self \f0\b0 \cf4 .roomJid.length <= \cf7 0\cf4 )) \{\ \f2\b \cf8 self \f0\b0 \cf4 .isGetServerMsg = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 refresh: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ bPull = (p && p.count > \cf7 0\cf4 );\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ p = [[JXMessageObject sharedInstance] fetchAllMessageListWithUser:s];\ [_array removeAllObjects];\ bPull = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ \}\ \ \f2\b \cf8 for \f0\b0 \cf4 (JXMessageObject *msg \f2\b \cf8 in \f0\b0 \cf4 p) \{\ allHeight += [msg.chatMsgHeight floatValue];\ \}\ \ \f2\b \cf8 self \f0\b0 \cf4 .isGetServerMsg = !bPull;\ \ \cf2 // \f1 \'bb\'f1\'c8\'a1\'bf\'da\'c1\'ee\'ba\'ec\'b0\'fc\'bc\'c7\'c2\'bc \f0 \cf4 \ [_orderRedPacketArray removeAllObjects];\ [_orderRedPacketArray addObjectsFromArray:[ \f2\b \cf8 self \f0\b0 \cf4 fetchRedPacketListWithType:\cf7 3\cf4 ]];\ \ b = p.count>\cf7 0\cf4 ;\ bPull = p.count>=PAGE_SHOW_COUNT;\ \cf2 // if(_page == 0 || self.scrollLine>0)// \f1 \'c8\'e7\'b9\'fb \f0 \cf4 \ \cf2 // [_array removeAllObjects];\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (b)\{\ NSMutableArray* temp = [[NSMutableArray alloc]init];\ [temp addObjectsFromArray:p];\ [temp addObjectsFromArray:_array];\ [_array removeAllObjects];\ [_array addObjectsFromArray:temp];\ [temp removeAllObjects];\ \cf2 // [temp release];\cf4 \ \}\ [p removeAllObjects];\ \cf2 // [p release];\cf4 \ \} \f2\b \cf8 else \f0\b0 \cf4 \ [_array addObject:msg];\ \ \ JXMessageObject *lastMsg = _array.lastObject;\ \f2\b \cf8 if \f0\b0 \cf4 (lastMsg && lastMsg.isVisible) \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid.length > \cf7 0\cf4 ) \{\ lastMsg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (lastMsg.isMySend) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([lastMsg.isSend boolValue]) \{\ [lastMsg updateLastSend:UpdateLastSendType_None];\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [lastMsg updateLastSend:UpdateLastSendType_None];\ \}\ \ \f2\b \cf8 self \f0\b0 \cf4 .lastMsg.content = [lastMsg getLastContent];\ \}\ \ \ [ \f2\b \cf8 self \f0\b0 \cf4 setIsShowTime];\ \ \f2\b \cf8 if \f0\b0 \cf4 (b) \{\ [_pool removeAllObjects];\ _refreshCount++;\ \ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(\cf7 .5\cf4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^\{\ \cf2 // \f1 \'cb\'a2\'d0\'c2\'cd\'ea\'b3\'c9 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .scrollLine > \cf7 0\cf4 ) \{\ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(\cf7 0.5\cf4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^\{\ \ [_table reloadData];\ [ \f2\b \cf8 self \f0\b0 \cf4 scrollToCurrentLine];\ _isRefreshing = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \});\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 (msg || _page == \cf7 0\cf4 )\{\ \ [_table reloadData];\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isSyncMsg || \f2\b \cf8 self \f0\b0 \cf4 .isGotoLast) \{\ [_table gotoLastRow: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ([_array count]>\cf7 0\cf4 )\{\ \ [_table reloadData];\ \cf2 // [_table gotoRow: (int)(_array.count - firstNum + 2)];\cf4 \ \cf2 // [_table scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:(int)(_array.count - firstNum) inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];\cf4 \ _table.contentOffset = CGPointMake(\cf7 0\cf4 , allHeight);\ \ \}\ \}\ \ \ _isRefreshing = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ \});\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ _isRefreshing = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 ) \cf11 scrollToCurrentLine\cf4 \{\ [_table gotoRow: \f2\b \cf8 self \f0\b0 \cf4 .scrollLine];\ \cf2 // NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.scrollLine - 1 inSection:0];\cf4 \ \cf2 // [_table scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];\cf4 \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 didReceiveMemoryWarning\cf4 \ \{\ [ \f2\b \cf8 super \f0\b0 \cf4 didReceiveMemoryWarning];\ \cf2 // Dispose of any resources that can be recreated.\cf4 \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 dealloc\cf4 \{\ \ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kCellShowCardNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kCellLocationNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kCellImageNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kcellRedPacketDidTouchNotifaction\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kCellHeadImageNotification\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kHiddenKeyboardNotification\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kUpdateChatVCGroupHelperData\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ [\cf5 g_notify\cf4 \cf14 removeObserver\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 name\cf4 :\cf5 kKeepOnSendGroupSendMessage\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ \cf14 NSLog\cf4 (\cf6 @"JXChatViewController.dealloc"\cf4 );\ [\cf5 g_xmpp\cf4 .\cf15 chatingUserIds\cf4 \cf14 removeObject\cf4 :\cf15 current_chat_userId\cf4 ];\ \cf15 current_chat_userId\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 hideKeyboard\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 unInitAudio\cf4 ];\ \ [\cf15 _wait\cf4 \cf15 stop\cf4 ];\ [\cf15 _wait\cf4 \cf15 stop\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 free\cf4 :\cf15 _pool\cf4 ];\ [\cf15 _pool\cf4 \cf14 removeAllObjects\cf4 ];\ \cf2 // [_pool release];\cf4 \ \cf15 _pool\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \ [\cf15 _array\cf4 \cf14 removeAllObjects\cf4 ];\ \cf2 // [_array release];\cf4 \ \ \ \cf2 // [_messageConent release];\cf4 \ \cf15 _faceView\cf4 .\cf15 delegate\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \cf2 // [_table release];\cf4 \ \cf2 // [_moreView release];\cf4 \ \cf15 _moreView\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \ \cf2 // [_voice release];\cf4 \ \cf2 // _poolSend = nil;\cf4 \ \ \cf15 _locationVC\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatPerson\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \cf2 // [super dealloc];\cf4 \ \ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 enteringTimer\cf4 \cf14 invalidate\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 enteringTimer\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 noEnteringTimer\cf4 \cf14 invalidate\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 noEnteringTimer\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 free\cf4 :(\cf10 NSMutableArray\cf4 *)array\{\ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i=( \f2\b \cf8 int \f0\b0 \cf4 )[array \cf14 count\cf4 ]-\cf7 1\cf4 ;i>=\cf7 0\cf4 ;i--)\{\ \f2\b \cf8 id \f0\b0 \cf4 p = [array \cf14 objectAtIndex\cf4 :i];\ [array \cf14 removeObjectAtIndex\cf4 :i];\ p = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \}\ \ \cf2 // \f1 \'d5\'fd\'d4\'da\'ca\'e4\'c8\'eb \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 enteringNotifi\cf4 :(\cf10 NSNotification\cf4 *) notif \{\ \cf9 JXMessageObject\cf4 *msg = notif.\cf14 object\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([\cf15 chatPerson\cf4 .\cf15 userId\cf4 \cf14 isEqualToString\cf4 :msg.\cf15 fromUserId\cf4 ]) \{\ \f2\b \cf8 if \f0\b0 \cf4 (msg== \f2\b \cf8 nil \f0\b0 \cf4 )\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 || msg.\cf15 isGroup\cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 title\cf4 = \cf5 Localized\cf4 (\cf6 @"JX_Entering"\cf4 );\ \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 setAudioIconFrame\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 noEnteringTimer\cf4 = [\cf10 NSTimer\cf4 \cf14 scheduledTimerWithTimeInterval\cf4 :\cf7 10\cf4 \cf14 target\cf4 : \f2\b \cf8 self \f0\b0 \cf4 \cf14 selector\cf4 : \f2\b \cf8 @selector \f0\b0 \cf4 (noEnteringTimerAction:) \cf14 userInfo\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 \cf14 repeats\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 ) \cf11 noEnteringTimerAction\cf4 :(\cf10 NSNotification\cf4 *)notif \{\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 noEnteringTimer\cf4 \cf14 invalidate\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 noEnteringTimer\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 courseId\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([\cf15 chatPerson\cf4 .\cf15 userId\cf4 \cf14 intValue\cf4 ]<\cf7 10100\cf4 && [\cf15 chatPerson\cf4 .\cf15 userId\cf4 \cf14 intValue\cf4 ]>=\cf7 10000\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 title\cf4 = \cf15 chatPerson\cf4 .\cf15 userNickname\cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 setAudioIconFrame\cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // NSString *str = self.onlinestate ? Localized(@"JX_OnLine") : Localized(@"JX_OffLine");\cf4 \ \cf2 // self.title = [NSString stringWithFormat:@"%@(%@)",chatPerson.remarkName.length > 0 ? chatPerson.remarkName : chatPerson.userNickname,str];\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 setChatTitle\cf4 :\cf15 chatPerson\cf4 .\cf15 remarkName\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ? \cf15 chatPerson\cf4 .\cf15 remarkName\cf4 : \cf15 chatPerson\cf4 .\cf15 userNickname\cf4 ];\ \}\ \}\ \ \cf5 #pragma mark \f2\b \cf16 --- \f4 \'b4\'a5\'c3\'fe\'b9\'d8\'b1\'d5\'bc\'fc\'c5\'cc \f2 ---- \f0\b0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 handleTap\cf4 :(\cf10 UIGestureRecognizer\cf4 *)gesture\ \{\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 \cf14 endEditing\cf4 : \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ \ \cf5 #pragma mark \f2\b \cf16 ---- \f4 \'bc\'fc\'c5\'cc\'b8\'df\'b6\'c8\'b1\'e4\'bb\'af \f2 ------ \f0\b0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 changeKeyBoard\cf4 :(NSNotification *)aNotifacation\ \{\ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 shareMore\cf4 .\cf14 selected\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \ \f2\b \cf8 id \f0\b0 \cf4 view = \cf5 g_navigation\cf4 .\cf15 subViews\cf4 .\cf14 lastObject\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (![view \cf14 isEqual\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ]) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (!\cf15 _messageText\cf4 .\cf14 isFirstResponder\cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \cf2 // return;\cf4 \ \cf2 // \f1 \'bb\'f1\'c8\'a1\'b5\'bd\'bc\'fc\'c5\'cc \f0 frame \f1 \'b1\'e4\'bb\'af\'d6\'ae\'c7\'b0\'b5\'c4 \f0 frame\cf4 \ \cf10 NSValue\cf4 *keyboardBeginBounds=[[aNotifacation \cf14 userInfo\cf4 ]\cf14 objectForKey\cf4 :\cf14 UIKeyboardFrameBeginUserInfoKey\cf4 ];\ \cf10 CGRect\cf4 beginRect=[keyboardBeginBounds \cf14 CGRectValue\cf4 ];\ \ \cf2 // \f1 \'bb\'f1\'c8\'a1\'b5\'bd\'bc\'fc\'c5\'cc \f0 frame \f1 \'b1\'e4\'bb\'af\'d6\'ae\'ba\'f3\'b5\'c4 \f0 frame\cf4 \ \cf10 NSValue\cf4 *keyboardEndBounds=[[aNotifacation \cf14 userInfo\cf4 ]\cf14 objectForKey\cf4 :\cf14 UIKeyboardFrameEndUserInfoKey\cf4 ];\ \ \cf10 CGRect\cf4 endRect=[keyboardEndBounds \cf14 CGRectValue\cf4 ];\ \ \cf10 CGFloat\cf4 deltaY=endRect.\cf14 origin\cf4 .\cf14 y\cf4 -beginRect.\cf14 origin\cf4 .\cf14 y\cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 deltaY\cf4 = deltaY;\ \cf2 // \f1 \'c4\'c3 \f0 frame \f1 \'b1\'e4\'bb\'af\'d6\'ae\'ba\'f3\'b5\'c4 \f0 origin.y- \f1 \'b1\'e4\'bb\'af\'d6\'ae\'c7\'b0\'b5\'c4 \f0 origin.y \f1 \'a3\'ac\'c6\'e4\'b2\'ee\'d6\'b5 \f0 ( \f1 \'b4\'f8\'d5\'fd\'b8\'ba\'ba\'c5 \f0 ) \f1 \'be\'cd\'ca\'c7\'ce\'d2\'c3\'c7 \f0 self.view \f1 \'b5\'c4 \f0 y \f1 \'b7\'bd\'cf\'f2\'c9\'cf\'b5\'c4\'d4\'f6\'c1\'bf \f0 \cf4 \ deltaY=-endRect.\cf14 size\cf4 .\cf14 height\cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 deltaHeight\cf4 = deltaY;\ \cf2 // NSLog(@"deltaY:%f",deltaY);\cf4 \ [\cf10 CATransaction\cf4 \cf14 begin\cf4 ];\ [\cf10 UIView\cf4 \cf14 animateWithDuration\cf4 :\cf7 0.4f\cf4 \cf14 animations\cf4 :^\{\ \cf2 // [_table setFrame:CGRectMake(0, 0, _table.frame.size.width, self.view.frame.size.height+deltaY-self.heightFooter)];\cf4 \ \cf2 // [_table gotoLastRow:NO];\cf4 \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableFooter\cf4 .\cf14 frame\cf4 = \cf14 CGRectMake\cf4 (\cf7 0\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 +deltaY- \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 , \cf5 JX_SCREEN_WIDTH\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 );\ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 frame\cf4 = \cf14 CGRectMake\cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 x\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableFooter\cf4 .\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 y\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 - \cf7 10\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 );\ \} \cf14 completion\cf4 :^( \f2\b \cf8 BOOL \f0\b0 \cf4 finished) \{\ \}];\ [\cf10 CATransaction\cf4 \cf14 commit\cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 ((\cf15 _table\cf4 .\cf14 contentSize\cf4 .\cf14 height\cf4 > ( \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 + deltaY - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 - \cf7 64\cf4 - \cf7 40\cf4 )) || \f2\b \cf8 self \f0\b0 \cf4 .\cf15 deltaY\cf4 > \cf7 0\cf4 ) \{\ \ [\cf10 CATransaction\cf4 \cf14 begin\cf4 ];\cf2 // \f1 \'b4\'b4\'bd\'a8\'cf\'d4\'ca\'bd\'ca\'c2\'ce\'f1 \f0 \cf4 \ [\cf10 UIView\cf4 \cf14 animateWithDuration\cf4 :\cf7 0.1f\cf4 \cf14 animations\cf4 :^\{\ \cf2 // self.tableFooter.frame = CGRectMake(0, self.view.frame.size.height+deltaY-self.heightFooter, JX_SCREEN_WIDTH, self.heightFooter);\cf4 \ [\cf15 _table\cf4 \cf14 setFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 0\cf4 , \cf7 0\cf4 +\cf15 _noticeHeight\cf4 , \cf15 _table\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 +deltaY- \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 -\cf15 _noticeHeight\cf4 )];\ [\cf15 _table\cf4 \cf15 gotoLastRow\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ \} \cf14 completion\cf4 :^( \f2\b \cf8 BOOL \f0\b0 \cf4 finished) \{\ \}];\ [\cf10 CATransaction\cf4 \cf14 commit\cf4 ];\ \}\ \}\ \ - ( \f2\b \cf8 BOOL \f0\b0 \cf4 )\cf11 theTextAllSpace\cf4 :(\cf10 NSString\cf4 *)text \{\ \cf10 NSString\cf4 *string = [text \cf14 copy\cf4 ];\ string = [string \cf14 stringByReplacingOccurrencesOfString\cf4 :\cf6 @" "\cf4 \cf14 withString\cf4 :\cf6 @""\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (string.\cf14 length\cf4 <= \cf7 0\cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendIt\cf4 :( \f2\b \cf8 id \f0\b0 \cf4 )sender \{\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 \cf15 showDisableSay\cf4 ])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 \cf15 sendMsgCheck\cf4 ])\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \cf10 NSString\cf4 *userId = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 userIds\cf4 [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 groupMessagesIndex\cf4 ];\ \cf2 // NSString *userName = self.userNames[self.groupMessagesIndex];\cf4 \ \ \cf10 NSMutableArray\cf4 * tempArray = [[\cf10 NSMutableArray\cf4 \cf14 alloc\cf4 ] \cf14 init\cf4 ];\ \f2\b \cf8 for \f0\b0 \cf4 (\cf9 memberData\cf4 * member \f2\b \cf8 in \f0\b0 \cf4 \cf15 _atMemberArray\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 (member.\cf15 idStr\cf4 )\{\ [tempArray \cf14 addObject\cf4 :[\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%@"\cf4 ,member.\cf15 idStr\cf4 ]];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [tempArray \cf14 addObject\cf4 :[\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%ld"\cf4 ,member.\cf15 userId\cf4 ]];\ \}\ \}\ \cf10 NSString\cf4 * ObjectIdStr = [tempArray \cf14 componentsJoinedByString\cf4 :\cf6 @" "\cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 objToMsg\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ) \{\ ObjectIdStr = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 objToMsg\cf4 ;\ \}\ \ \cf2 // NSString *message = messageText.text;\cf4 \ \cf10 NSString\cf4 *message = [\cf15 _messageText\cf4 .\cf14 textStorage\cf4 \cf15 getPlainString\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 \cf15 theTextAllSpace\cf4 :message]) \{\ \cf2 // txt \f1 \'c8\'ab\'ca\'c7\'bf\'d5\'b8\'f1 \f0 \cf4 \ \cf15 _messageText\cf4 .\cf14 text\cf4 = \cf6 @""\cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 doEndEdit\cf4 ];\ \cf2 // \f1 \'b2\'bb\'c4\'dc\'b7\'a2\'cb\'cd\'bf\'d5\'b0\'d7\'cf\'fb\'cf\'a2 \f0 \cf4 \ [\cf5 g_App\cf4 \cf15 showAlert\cf4 :\cf5 Localized\cf4 (\cf6 @"JX_CannotSendBlankMessage"\cf4 )];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (message.\cf14 length\cf4 > \cf7 0\cf4 ) \{\ \cf9 JXMessageObject\cf4 *msg=[[\cf9 JXMessageObject\cf4 \cf14 alloc\cf4 ]\cf14 init\cf4 ];\ msg.\cf15 timeSend\cf4 = [\cf10 NSDate\cf4 \cf14 date\cf4 ];\ msg.\cf15 fromUserId\cf4 = \cf5 MY_USER_ID\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 \cf14 length\cf4 ]>\cf7 0\cf4 )\{\ msg.\cf15 toUserId\cf4 = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ;\ msg.\cf15 isGroup\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.\cf15 fromUserName\cf4 = \cf15 _userNickName\cf4 ;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 /*\cf4 \ \cf2 if (self.isGroupMessages) \{\cf4 \ \cf2 if (_isGroupSendCancel) \{\cf4 \ \cf2 return;\cf4 \ \cf2 \}\cf4 \ \cf2 msg.toUserId = userId;\cf4 \ \cf2 msg.isGroupSend = YES;\cf4 \ \cf2 if ((self.groupMessagesIndex + 1) % _onceSendNum == 0) \{\cf4 \ \cf2 msg.isLastGroupSend = YES;\cf4 \ \cf2 \}\cf4 \ \cf2 \}else \{\cf4 \ \cf2 msg.toUserId = chatPerson.userId;\cf4 \ \cf2 \}\cf4 \ \cf2 msg.isGroup = NO;\cf4 \ \cf2 */\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isGroupMessages\cf4 ) \{\ msg.\cf15 toUserId\cf4 = userId;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.\cf15 toUserId\cf4 = \cf15 chatPerson\cf4 .\cf15 userId\cf4 ;\ \}\ msg.\cf15 isGroup\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ msg.\cf15 content\cf4 = message;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 objToMsg\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ) \{\ msg.\cf15 type\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 :\cf15 kWCMessageTypeReply\cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.\cf15 type\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 :\cf15 kWCMessageTypeText\cf4 ];\ \}\ msg.\cf15 isSend\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 :\cf5 transfer_status_ing\cf4 ];\ msg.\cf15 isRead\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithBool\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.\cf15 isReadDel\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isReadDelete\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (ObjectIdStr.\cf14 length\cf4 > \cf7 0\cf4 )\{\ msg.\cf15 objectId\cf4 = ObjectIdStr;\ \}\ \cf2 // \f1 \'b7\'a2\'cd\'f9\'c4\'c4\'c0\'ef \f0 \cf4 \ \cf2 /*\cf4 \ \cf2 [msg insert:self.roomJid];\cf4 \ \cf2 [g_xmpp sendMessage:msg roomName:self.roomJid];// \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \cf2 */\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _useInfoTempChat\cf4 ==\cf7 11\cf4 ) \{\ \ msg.\cf15 tempChat\cf4 = \cf7 11\cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \ \{\ \ msg.\cf15 tempChat\cf4 = \cf7 1\cf4 ;\ \}\ \ \ \cf2 // \f1 \'b7\'a2\'cd\'f9\'c4\'c4\'c0\'ef \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isGroupMessages\cf4 ) \{\ [msg \cf15 insert\cf4 :userId];\ [\cf5 g_xmpp\cf4 \cf15 sendMessage\cf4 :msg \cf15 roomName\cf4 :userId];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [msg \cf15 insert\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ];\ [\cf5 g_xmpp\cf4 \cf15 sendMessage\cf4 :msg \cf15 roomName\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isCYMSGgroupANDFriendy\cf4 )\{\ \ \}\ \ \ \ \cf2 /*\cf4 \ \cf2 if (self.isGroupMessages) \{\cf4 \ \cf2 self.groupMessagesIndex ++;\cf4 \ \cf2 if (msg.isLastGroupSend) \{\cf4 \ \cf2 return;\cf4 \ \cf2 \}\cf4 \ \cf2 if (self.groupMessagesIndex < self.userIds.count) \{\cf4 \ \cf2 [self sendIt:nil];\cf4 \ \cf2 \}else if (self.userIds)\{\cf4 \ \cf2 self.groupMessagesIndex = 0;\cf4 \ \cf2 _messageText.text = nil;\cf4 \ \cf2 [self hideKeyboard:YES];\cf4 \ \cf2 // [g_App showAlert:Localized(@"JX_SendComplete")];\cf4 \ \cf2 return;\cf4 \ \cf2 \}\cf4 \ \cf2 return;\cf4 \ \cf2 \}\cf4 \ \cf2 */\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex ++;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex < \f2\b \cf8 self \f0\b0 \cf4 .userIds.count) \{\ [msg insert: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\ [g_xmpp sendMessage:msg roomName: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 sendIt: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .userIds)\{\ [msg insert: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\ [\cf5 g_xmpp\cf4 \cf15 sendMessage\cf4 :msg \cf15 roomName\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 groupMessagesIndex\cf4 = \cf7 0\cf4 ;\ \cf15 _messageText\cf4 .\cf14 text\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 hideKeyboard\cf4 : \f2\b \cf8 YES \f0\b0 \cf4 ];\ [\cf5 g_App\cf4 \cf15 showAlert\cf4 :\cf5 Localized\cf4 (\cf6 @"JX_SendComplete"\cf4 )];\ \ \cf2 // \f1 \'d0\'b4\'c8\'eb\'ca\'fd\'be\'dd\'bf\'e2 \f0 \cf4 \ \cf10 NSArray\cf4 *array = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 userIds\cf4 ;\ \cf10 NSString\cf4 *userIdsString = [array \cf14 componentsJoinedByString\cf4 :\cf6 @","\cf4 ];\ array = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 userNames\cf4 ;\ \cf10 NSString\cf4 *userNamesString = [array \cf14 componentsJoinedByString\cf4 :\cf6 @","\cf4 ];\ array = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 userNamesWithGroup\cf4 ;\ \cf10 NSString\cf4 *userNamesWithGroupString = [array \cf14 componentsJoinedByString\cf4 :\cf6 @","\cf4 ];\ \cf10 NSString\cf4 *sendTime = [\cf10 NSString\cf4 \cf14 stringWithFormat\cf4 :\cf6 @"%@"\cf4 , msg.\cf15 dictionary\cf4 [\cf6 @"timeSend"\cf4 ]];\ \ array = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 userNmaesWithFriend\cf4 ;\ \cf10 NSString\cf4 *userNmaesWithFriendString = [array \cf14 componentsJoinedByString\cf4 :\cf6 @","\cf4 ];\ \ \cf9 JXLabelObject\cf4 *obj = \cf15 JXLabelObject\cf4 .\cf15 sharedInstance\cf4 ;\ obj.\cf15 userId\cf4 = msg.\cf15 fromUserId\cf4 ;\ obj.\cf15 userIds\cf4 = userIdsString;\ obj.\cf15 text1\cf4 = \cf15 _names\cf4 ;\ obj.\cf15 text2\cf4 = \cf15 _names2\cf4 ;\ obj.\cf15 userNames\cf4 = userNamesString;\ obj.\cf15 userNamesWithGroup\cf4 = userNamesWithGroupString;\ obj.\cf15 message\cf4 = msg.\cf15 content\cf4 ;\ obj.\cf15 sendTime\cf4 = sendTime;\ obj.\cf15 userNmaesWithFriend\cf4 = userNmaesWithFriendString;\ \f2\b \cf8 BOOL \f0\b0 \cf4 succeed = [obj \cf15 insertRecord\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (succeed) \{\ [\cf5 g_notify\cf4 \cf14 postNotificationName\cf4 :\cf5 kGroupHelperRefreshNotif\cf4 \cf14 object\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [\cf5 g_navigation\cf4 \cf15 popToViewController\cf4 :[\cf9 CYGroupSendHelperViewController\cf4 \f2\b \cf8 class \f0\b0 \cf4 ] \cf15 animated\cf4 : \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 showOneMsg\cf4 :msg];\ \ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _table\cf4 .\cf14 contentSize\cf4 .\cf14 height\cf4 > (\cf5 JX_SCREEN_HEIGHT\cf4 + \f2\b \cf8 self \f0\b0 \cf4 .\cf15 deltaHeight\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 - \cf7 64\cf4 - \cf7 40\cf4 - \cf7 20\cf4 )) \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 deltaY\cf4 >= \cf7 0\cf4 ) \{\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableFooter\cf4 .\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 y\cf4 != \cf5 JX_SCREEN_HEIGHT\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 ) \{\ [\cf10 CATransaction\cf4 \cf14 begin\cf4 ];\ [\cf10 UIView\cf4 \cf14 animateWithDuration\cf4 :\cf7 0.1f\cf4 \cf14 animations\cf4 :^\{\ \cf2 // self.tableFooter.frame = CGRectMake(0, self.view.frame.size.height+deltaY-self.heightFooter, JX_SCREEN_WIDTH, self.heightFooter);\cf4 \ [\cf15 _table\cf4 \cf14 setFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 0\cf4 , \cf7 0\cf4 +\cf15 _noticeHeight\cf4 , \cf15 _table\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 + \f2\b \cf8 self \f0\b0 \cf4 .\cf15 deltaHeight\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 -\cf15 _noticeHeight\cf4 )];\ \cf2 // [_table gotoLastRow:NO];\cf4 \ \} \cf14 completion\cf4 :^( \f2\b \cf8 BOOL \f0\b0 \cf4 finished) \{\ \}];\ [\cf10 CATransaction\cf4 \cf14 commit\cf4 ];\ \}\ \}\ \}\ \}\ \ \cf2 // \f1 \'bc\'ec\'b2\'e9\'ca\'c7\'b7\'f1\'d3\'d0\'bf\'da\'c1\'ee\'ba\'ec\'b0\'fc \f0 \cf4 \ \f2\b \cf8 for \f0\b0 \cf4 (\cf9 JXMessageObject\cf4 * msg \f2\b \cf8 in \f0\b0 \cf4 \cf15 _orderRedPacketArray\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.\cf15 content\cf4 \cf14 caseInsensitiveCompare\cf4 :\cf15 _messageText\cf4 .\cf14 text\cf4 ] == \cf14 NSOrderedSame\cf4 &&[msg.\cf15 fileSize\cf4 \cf14 intValue\cf4 ] != \cf7 2\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 .\cf14 length\cf4 > \cf7 0\cf4 || ![msg.\cf15 fromUserId\cf4 \cf14 isEqualToString\cf4 :\cf5 MY_USER_ID\cf4 ]) \{\ [\cf5 g_server\cf4 \cf15 getRedPacket\cf4 :msg.\cf15 objectId\cf4 \cf15 toView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \}\ [\cf15 _atMemberArray\cf4 \cf14 removeAllObjects\cf4 ];\ [\cf15 _messageText\cf4 .\cf14 textStorage\cf4 \cf14 removeAttribute\cf4 :\cf14 NSBackgroundColorAttributeName\cf4 \cf14 range\cf4 :\cf14 NSMakeRange\cf4 (\cf7 0\cf4 ,\cf15 _messageText\cf4 .\cf14 text\cf4 .\cf14 length\cf4 )];\ \cf2 // [_messageText.textStorage removeAttribute:NSFontAttributeName range:NSMakeRange(0,_messageText.text.length)];\cf4 \ [_messageText setText: \f2\b \cf8 nil \f0\b0 \cf4 ];\ [_messageText setAttributedText: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ chatPerson.lastInput = _messageText.text;\ [chatPerson updateLastInput];\ \ \cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2\'ba\'f3\'d6\'d8\'d6\'c3\'b5\'d7\'b2\'bf\'bf\'d8\'bc\'fe \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 onBackForRecordBtnLeft];\ \}\ \ \cf2 // \f1 \'cd\'bc\'c6\'ac \f0 piker \f1 \'d1\'a1\'d4\'f1\'cd\'ea\'b3\'c9\'ba\'f3\'b5\'f7\'d3\'c3 \f0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendImage\cf4 :(NSString *)file \cf11 withWidth\cf4 :( \f2\b \cf8 int \f0\b0 \cf4 ) width \cf11 andHeight\cf4 :( \f2\b \cf8 int \f0\b0 \cf4 ) height \cf11 userId\cf4 :(NSString *)userId\ \{\ \ \cf2 // NSString *userId = self.userIds[self.groupMessagesIndex];\cf4 \ \cf2 // NSString *userName = self.userNames[self.groupMessagesIndex];\cf4 \ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isCYMSGgroupANDFriendy) \{\ JXMessageObject *msg=[[JXMessageObject alloc]init];\ \ \f2\b \cf8 for \f0\b0 \cf4 (NSString *userId \f2\b \cf8 in \f0\b0 \cf4 _userIds) \{\ \ \f2\b \cf8 if \f0\b0 \cf4 ([file length]>\cf7 0\cf4 ) \{\ msg.timeSend = [NSDate date];\ msg.fromUserId = MY_USER_ID;\ \f2\b \cf8 if \f0\b0 \cf4 ([userId length]>\cf7 10\cf4 )\{\ msg.toUserId = userId;\ msg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.fromUserName = _userNickName;\ \f2\b \cf8 self \f0\b0 \cf4 .roomJid = userId;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.toUserId = userId;\ \f2\b \cf8 self \f0\b0 \cf4 .roomJid = \f2\b \cf8 nil \f0\b0 \cf4 ;\ msg.isGroup = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ msg.fileName = file;\ msg.content = [[file lastPathComponent] stringByDeletingPathExtension];\ msg.type = [NSNumber numberWithInt:kWCMessageTypeImage];\ msg.isSend = [NSNumber numberWithInt:transfer_status_ing];\ msg.isRead = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.isUpload = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \cf2 // \f1 \'d0\'c2\'cc\'ed\'bc\'d3\'b5\'c4\'cd\'bc\'c6\'ac\'bf\'ed\'b8\'df \f0 \cf4 \ msg.location_x = [NSNumber numberWithInt:width];\ msg.location_y = [NSNumber numberWithInt:height];\ \ msg.isReadDel = [NSNumber numberWithInt: \f2\b \cf8 self \f0\b0 \cf4 .isReadDelete];\ \ [msg insert:userId];\ \ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \ \ \ \}\ \ \}\ [g_server uploadFile:file validTime: \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.chatRecordTimeOut messageId:msg.messageId toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \ \ \cf2 // \f1 \'d0\'b4\'c8\'eb\'ca\'fd\'be\'dd\'bf\'e2 \f0 \cf4 \ NSArray *array = \f2\b \cf8 self \f0\b0 \cf4 .userIds;\ NSString *userIdsString = [array componentsJoinedByString:\cf6 @","\cf4 ];\ array = \f2\b \cf8 self \f0\b0 \cf4 .userNames;\ NSString *userNamesString = [array componentsJoinedByString:\cf6 @","\cf4 ];\ array = \f2\b \cf8 self \f0\b0 \cf4 .userNamesWithGroup;\ NSString *userNamesWithGroupString = [array componentsJoinedByString:\cf6 @","\cf4 ];\ NSString *sendTime = [NSString stringWithFormat:\cf6 @"%@"\cf4 , msg.dictionary[\cf6 @"timeSend"\cf4 ]];\ \ array = \f2\b \cf8 self \f0\b0 \cf4 .userNmaesWithFriend;\ NSString *userNmaesWithFriendString = [array componentsJoinedByString:\cf6 @","\cf4 ];\ \ JXLabelObject *obj = JXLabelObject.sharedInstance;\ obj.userId = msg.fromUserId;\ obj.userIds = userIdsString;\ obj.text1 = _names;\ obj.text2 = _names2;\ obj.userNames = userNamesString;\ obj.userNamesWithGroup = userNamesWithGroupString;\ obj.message = \cf6 @"[ \f1 \'cd\'bc\'c6\'ac \f0 ]"\cf4 ;\ obj.sendTime = sendTime;\ obj.userNmaesWithFriend = userNmaesWithFriendString;\ \f2\b \cf8 BOOL \f0\b0 \cf4 succeed = [obj insertRecord];\ \f2\b \cf8 if \f0\b0 \cf4 (succeed) \{\ [g_notify postNotificationName:kGroupHelperRefreshNotif object: \f2\b \cf8 nil \f0\b0 \cf4 ];\ [g_navigation popToViewController:[CYGroupSendHelperViewController \f2\b \cf8 class \f0\b0 \cf4 ] animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ([file length]>\cf7 0\cf4 ) \{\ JXMessageObject *msg=[[JXMessageObject alloc]init];\ msg.timeSend = [NSDate date];\ msg.fromUserId = MY_USER_ID;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\{\ msg.toUserId = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ msg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.fromUserName = _userNickName;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ msg.toUserId = userId;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.toUserId = chatPerson.userId;\ \}\ msg.isGroup = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ msg.fileName = file;\ msg.content = [[file lastPathComponent] stringByDeletingPathExtension];\ msg.type = [NSNumber numberWithInt:kWCMessageTypeImage];\ msg.isSend = [NSNumber numberWithInt:transfer_status_ing];\ msg.isRead = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.isUpload = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \cf2 // \f1 \'d0\'c2\'cc\'ed\'bc\'d3\'b5\'c4\'cd\'bc\'c6\'ac\'bf\'ed\'b8\'df \f0 \cf4 \ msg.location_x = [NSNumber numberWithInt:width];\ msg.location_y = [NSNumber numberWithInt:height];\ \ msg.isReadDel = [NSNumber numberWithInt: \f2\b \cf8 self \f0\b0 \cf4 .isReadDelete];\ \ [msg insert: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\ \ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \cf2 // if (self.isGroupMessages) \{\cf4 \ \cf2 // self.groupMessagesIndex ++;\cf4 \ \cf2 // if (self.groupMessagesIndex < self.userIds.count) \{\cf4 \ \cf2 // [self sendImage:file withWidth:width andHeight:height];\cf4 \ \cf2 // \}else if (self.userIds)\{\cf4 \ \cf2 // self.groupMessagesIndex = 0;\cf4 \ \cf2 //\cf4 \ \cf2 // return;\cf4 \ \cf2 // \}\cf4 \ \cf2 // return;\cf4 \ \cf2 // \}\cf4 \ \cf2 // [msg release];\cf4 \ [g_server uploadFile:file validTime: \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.chatRecordTimeOut messageId:msg.messageId toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \}\ \}\ \cf2 // \f1 \'b7\'a2\'cb\'cd\'ca\'d3\'c6\'b5\'a3\'ac\'d2\'d4\'ba\'f3\'d2\'aa\'b8\'c4\'ca\'d3\'c6\'b5\'b3\'a4\'bf\'ed \f0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendMedia\cf4 :(JXMediaObject*)p \cf11 userId\cf4 :(NSString *)userId\ \{\ NSString* file = p.fileName;\ \f2\b \cf8 if \f0\b0 \cf4 ([file length]>\cf7 0\cf4 ) \{\ JXMessageObject *msg=[[JXMessageObject alloc]init];\ msg.timeSend = [NSDate date];\ msg.fromUserId = MY_USER_ID;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\{\ msg.toUserId = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ msg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.fromUserName = _userNickName;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ msg.toUserId = userId;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.toUserId = chatPerson.userId;\ \}\ msg.isGroup = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ msg.fileName = file;\ msg.content = [[file lastPathComponent] stringByDeletingPathExtension];\ \f2\b \cf8 if \f0\b0 \cf4 (p.isVideo)\ msg.type = [NSNumber numberWithInt:kWCMessageTypeVideo];\ \f2\b \cf8 else \f0\b0 \cf4 \ msg.type = [NSNumber numberWithInt:kWCMessageTypeAudio];\ msg.isSend = [NSNumber numberWithInt:transfer_status_ing];\ msg.isRead = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.isUpload = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.location_x = [NSNumber numberWithInt:\cf7 100\cf4 ];\ msg.location_y = [NSNumber numberWithInt:\cf7 100\cf4 ];\ \cf2 // NSLog(@"hh%hhd",_isReadDelete);\cf4 \ msg.isReadDel = [NSNumber numberWithInt:_isReadDelete];\ \ [msg insert: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ [g_server uploadFile:p.fileName validTime: \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.chatRecordTimeOut messageId:msg.messageId toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \cf2 // [msg release];\cf4 \ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 shareMore\cf4 :(UIButton*)sender \{\ \cf2 // [messageText setInputView:messageText.inputView?nil: _moreView];\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 showDisableSay])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (!_moreView) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \cf2 // sender.selected = !sender.selected;\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (_messageText.inputView != _moreView)\{\ _messageText.inputView = _moreView;\ [_messageText reloadInputViews];\ [_messageText becomeFirstResponder];\ _textViewBtn.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .screenShotView.hidden) \{\ ALAssetsLibrary *al = [[ALAssetsLibrary alloc] init];\ \ [al enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, \f2\b \cf8 BOOL \f0\b0 \cf4 *stop) \{\ \f2\b \cf8 if \f0\b0 \cf4 (group) \{\ [group setAssetsFilter:[ALAssetsFilter allPhotos]];\ [group enumerateAssetsWithOptions:NSEnumerationReverse\cf2 /* \f1 \'b1\'e9\'c0\'fa\'b7\'bd\'ca\'bd \f0 */\cf4 usingBlock:^(ALAsset *result, NSUInteger index, \f2\b \cf8 BOOL \f0\b0 \cf4 *stop) \{\ \f2\b \cf8 if \f0\b0 \cf4 (result) \{\ \f2\b \cf8 int \f0\b0 \cf4 photoIndex = [[g_default objectForKey:LastPhotoIndex] intValue];\ \f2\b \cf8 if \f0\b0 \cf4 (photoIndex == index) \{\ *stop = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ [g_default setObject:[NSNumber numberWithInteger:index] forKey:LastPhotoIndex];\ NSString *type = [result valueForProperty:ALAssetPropertyType];\ \f2\b \cf8 if \f0\b0 \cf4 ([type isEqual:ALAssetTypePhoto])\{\ UIImage *needImage = [UIImage imageWithCGImage:result.defaultRepresentation.fullScreenImage];\ \f2\b \cf8 if \f0\b0 \cf4 (needImage) \{\ \f2\b \cf8 self \f0\b0 \cf4 .screenImage = needImage;\ \f2\b \cf8 self \f0\b0 \cf4 .screenShotImageView.image = needImage;\ \f2\b \cf8 self \f0\b0 \cf4 .screenShotView.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(\cf7 5\cf4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^\{\ \f2\b \cf8 self \f0\b0 \cf4 .screenShotView.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \ \});\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \}\ *stop = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \}];\ *stop = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \ \}\ \} failureBlock:^(NSError *error) \{\ \f2\b \cf8 if \f0\b0 \cf4 (error) \{\ \ \}\ \}];\ \}\ \ \ \ \ \cf2 // if (self.screenShotView.hidden) \{\cf4 \ \cf2 // UIImage *image = [UIImage imageWithContentsOfFile:ScreenShotImage];\cf4 \ \cf2 // if (image) \{\cf4 \ \cf2 // self.screenShotImageView.image = image;\cf4 \ \cf2 // self.screenShotView.hidden = NO;\cf4 \ \cf2 // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^\{\cf4 \ \cf2 // self.screenShotView.hidden = YES;\cf4 \ \cf2 // NSFileManager* fileManager=[NSFileManager defaultManager];\cf4 \ \cf2 // BOOL blDele= [fileManager removeItemAtPath:ScreenShotImage error:nil];\cf4 \ \cf2 // if (blDele) \{\cf4 \ \cf2 // NSLog(@"dele success");\cf4 \ \cf2 // \}else \{\cf4 \ \cf2 // NSLog(@"dele fail");\cf4 \ \cf2 // \}\cf4 \ \cf2 // \});\cf4 \ \cf2 // \}\cf4 \ \cf2 // \}\cf4 \ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \}\ \cf2 // \f1 \'b1\'e9\'c0\'fa\'cf\'fb\'cf\'a2\'a3\'ac\'cc\'ed\'bc\'d3\'ca\'b1\'bc\'e4 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 setIsShowTime\cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ([_array count]<=\cf7 0\cf4 )\ \f2\b \cf8 return \f0\b0 \cf4 ;\ JXMessageObject *firstMsg=[_array objectAtIndex:\cf7 0\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (!firstMsg.isShowTime) \{\ \ firstMsg.isShowTime = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [firstMsg updateIsShowTime];\ firstMsg.chatMsgHeight = [NSString stringWithFormat:\cf6 @"0"\cf4 ];\ [firstMsg updateChatMsgHeight];\ \}\ \ \ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i = \cf7 0\cf4 ; i < [_array count] -\cf7 1\cf4 ; i++) \{\ JXMessageObject *firstMsg=[_array objectAtIndex:i];\ JXMessageObject *secondMsg=[_array objectAtIndex:(i+\cf7 1\cf4 )];\ \ \f2\b \cf8 if \f0\b0 \cf4 (([secondMsg.timeSend timeIntervalSince1970]-[firstMsg.timeSend timeIntervalSince1970]>\cf7 15\cf4 *\cf7 60\cf4 ))\{\ \f2\b \cf8 if \f0\b0 \cf4 (!secondMsg.isShowTime) \{\ secondMsg.isShowTime = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [secondMsg updateIsShowTime];\ secondMsg.chatMsgHeight = [NSString stringWithFormat:\cf6 @"0"\cf4 ];\ [secondMsg updateChatMsgHeight];\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 (secondMsg.isShowTime) \{\ secondMsg.isShowTime = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [secondMsg updateIsShowTime];\ secondMsg.chatMsgHeight = [NSString stringWithFormat:\cf6 @"0"\cf4 ];\ [secondMsg updateChatMsgHeight];\ \}\ \}\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 tableView\cf4 :(UITableView *)tableView \cf11 touchesEnded\cf4 :(NSSet *)touches \cf11 withEvent\cf4 :(UIEvent *)event \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \ \cf2 // \f1 \'d0\'c2\'c0\'b4\'b5\'c4\'cf\'fb\'cf\'a2\'ca\'c7\'b7\'f1\'d0\'e8\'d2\'aa\'d5\'b9\'ca\'be\'ca\'b1\'bc\'e4 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 setNewShowTime\cf4 :(JXMessageObject *)msg\{\ JXMessageObject *lastMsg=[_array lastObject];\ NSLog(\cf6 @"%f"\cf4 ,[msg.timeSend timeIntervalSince1970]-[lastMsg.timeSend timeIntervalSince1970]);\ \ \f2\b \cf8 if \f0\b0 \cf4 (([msg.timeSend timeIntervalSince1970]-[lastMsg.timeSend timeIntervalSince1970]>\cf7 15\cf4 *\cf7 60\cf4 ))\{\ \f2\b \cf8 if \f0\b0 \cf4 (!msg.isShowTime) \{\ msg.isShowTime = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [msg updateIsShowTime];\ msg.chatMsgHeight = [NSString stringWithFormat:\cf6 @"0"\cf4 ];\ [msg updateChatMsgHeight];\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 (msg.isShowTime) \{\ msg.isShowTime = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [msg updateIsShowTime];\ msg.chatMsgHeight = [NSString stringWithFormat:\cf6 @"0"\cf4 ];\ [msg updateChatMsgHeight];\ \}\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 viewDidLayoutSubviews\cf4 \{\ \ \f2\b \cf8 if \f0\b0 \cf4 (! \f2\b \cf8 self \f0\b0 \cf4 .scrollBottom) \{\ \f2\b \cf8 if \f0\b0 \cf4 (_table.contentSize.height > _table.bounds.size.height) \{\ NSLog(\cf6 @"tableScroll ----- 1"\cf4 );\ \f2\b \cf8 self \f0\b0 \cf4 .isGotoLast = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [_table setContentOffset:CGPointMake(\cf7 0\cf4 , _table.contentSize.height - _table.bounds.size.height) animated: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \}\ \ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(\cf7 1\cf4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^\{\ \ \f2\b \cf8 self \f0\b0 \cf4 .scrollBottom = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \});\ \}\ \ \cf5 #pragma mark \f2\b \cf16 ---------tableView \f4 \'d0\'ad\'d2\'e9 \f2 ---------------- \f0\b0 \cf4 \ -(NSInteger)\cf11 numberOfSectionsInTableView\cf4 :(UITableView *)tableView\ \{\ \f2\b \cf8 return \f0\b0 \cf4 \cf7 1\cf4 ;\ \}\ -(NSInteger)\cf11 tableView\cf4 :(UITableView *)tableView \cf11 numberOfRowsInSection\cf4 :(NSInteger)section\ \{\ \f2\b \cf8 return \f0\b0 \cf4 _array.count;\ \}\ \ \cf2 //-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath\{\cf4 \ \cf2 // JXMessageObject *msg=[_array objectAtIndex:indexPath.row];\cf4 \ \cf2 //\cf4 \ \cf12 /// \f3 \cf2 / bool isContent = NO; \f0 \cf4 \ \cf12 /// \f3 \cf2 / // \f1 \'c5\'d0\'b6\'cf\'cf\'fb\'cf\'a2\'b3\'d8\'c0\'ef\'c3\'e6\'ca\'c7\'b7\'f1\'ba\'ac\'d3\'d0\'b4\'cb\'cf\'fb\'cf\'a2 \f0 \cf4 \ \cf12 /// \f3 \cf2 / for (JXMessageObject * obj in g_xmpp.poolSendRead) \{ \f0 \cf4 \ \cf12 /// \f3 \cf2 / // \f1 \'ba\'ac\'d3\'d0\'a3\'ac\'d6\'b1\'bd\'d3\'cc\'f8\'b9\'fd \f0 \cf4 \ \cf12 /// \f3 \cf2 / if ([obj.content isEqualToString:msg.messageId]) \{ \f0 \cf4 \ \cf12 /// \f3 \cf2 / isContent = YES; \f0 \cf4 \ \cf12 /// \f3 \cf2 / break; \f0 \cf4 \ \cf12 /// \f3 \cf2 / \} \f0 \cf4 \ \cf12 /// \f3 \cf2 / \} \f0 \cf4 \ \cf2 //\}\cf4 \ \ -(UITableViewCell *)\cf11 tableView\cf4 :(UITableView *)tableView \cf11 cellForRowAtIndexPath\cf4 :(NSIndexPath *)indexPath\ \{\ \f2\b \cf8 if \f0\b0 \cf4 (indexPath.row >= _array.count) \{\ \f2\b \cf8 return \f0\b0 \cf4 [[JXBaseChatCell alloc] init];\ \}\ \ JXMessageObject *msg=[_array objectAtIndex:indexPath.row];\ msg.showRead = [ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.showRead boolValue];\ \ \cf2 // NSLog(@"indexPath.row:%ld,%ld",indexPath.section,indexPath.row);\cf4 \ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid)\{\ msg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf2 // msg.roomJid = self.roomJid;\cf4 \ \}\ \ \cf2 // \f1 \'c8\'e7\'b9\'fb\'ca\'c7\'d0\'c2\'c0\'b4\'b5\'c4\'ce\'b4\'b6\'c1\'cf\'fb\'cf\'a2\'a3\'ac\'bb\'d8\'d6\'b4\'cd\'a8\'d6\'aa \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] != kWCMessageTypeVoice && [msg.type intValue] != kWCMessageTypeVideo && [msg.type intValue] != kWCMessageTypeFile && [msg.type intValue] != kWCMessageTypeLocation && [msg.type intValue] != kWCMessageTypeCard && [msg.type intValue] != kWCMessageTypeLink && [msg.type intValue] != kWCMessageTypeMergeRelay && [msg.type intValue] != kWCMessageTypeShare && [msg.type intValue] != kWCMessageTypeIsRead) \{\ memberData *member = [[memberData alloc] init];\ member.roomId = roomId;\ memberData *roleM = [member getCardNameById:MY_USER_ID];\ \cf2 // \f1 \'d2\'fe\'c9\'ed\'c8\'cb\'b2\'bb\'b7\'a2\'bb\'d8\'d6\'b4\'a3\'a8\'d2\'d1\'b6\'c1\'c1\'d0\'b1\'ed\'b2\'bb\'cf\'d4\'ca\'be\'a3\'a9 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (![msg.isReadDel boolValue] && [roleM.role intValue] !=\cf7 4\cf4 ) \{\ [msg sendAlreadyReadMsg];\ \}\ \}\ \ \ \cf2 // \f1 \'b7\'b5\'bb\'d8\'b6\'d4\'d3\'a6\'b5\'c4 \f0 Cell\cf4 \ JXBaseChatCell * cell = [ \f2\b \cf8 self \f0\b0 \cf4 getCell:msg indexPath:indexPath];\ cell.selectionStyle = UITableViewCellSelectionStyleNone;\ cell.isSelectMore = \f2\b \cf8 self \f0\b0 \cf4 .isSelectMore;\ cell.room = _room;\ cell.isOpenIntegral = _isOpenIntegral;\ cell.groupLevelNameArray = _groupLevelNameArray;\ \cf2 // memberData *data = [self.room getMember:g_myself.userId];\cf4 \ \cf2 // BOOL flag = [data.role intValue] == 1 || [data.role intValue] == 2;\cf4 \ \cf2 // if (!flag && ![self.chatPerson.allowSpeakCourse boolValue]) \{\cf4 \ \cf2 // cell.isShowRecordCourse = NO;\cf4 \ \cf2 // \}else \{\cf4 \ \cf2 // cell.isShowRecordCourse = YES;\cf4 \ \cf2 // \}\cf4 \ \ \f2\b \cf8 if \f0\b0 \cf4 ([chatPerson.userId rangeOfString:MY_USER_ID].location == NSNotFound) \{\ cell.isShowRecordCourse = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ cell.isShowRecordCourse = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ cell.msg = msg;\ cell.isCourse = \f2\b \cf8 self \f0\b0 \cf4 .courseId.length > \cf7 0\cf4 ;\ cell.indexNum = ( \f2\b \cf8 int \f0\b0 \cf4 )indexPath.row;\ cell.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ cell.chatCellDelegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ cell.checkBox.selected = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 for \f0\b0 \cf4 (JXMessageObject *selMsg \f2\b \cf8 in \f0\b0 \cf4 \f2\b \cf8 self \f0\b0 \cf4 .selectMoreArr) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([selMsg.messageId isEqualToString:msg.messageId]) \{\ cell.checkBox.selected = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ cell.readDele = \f2\b \cf8 @selector \f0\b0 \cf4 (readDeleWithUser:);\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeShake) \{\ \f2\b \cf8 if \f0\b0 \cf4 (![msg.fileName isEqualToString:\cf6 @"1"\cf4 ]) \{\ \f2\b \cf8 self \f0\b0 \cf4 .shakeMsg = msg;\ \}\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid.length > \cf7 0\cf4 ) \{\ cell.isShowHead = [ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.allowSendCard boolValue] || _isAdmin;\ \ \f2\b \cf8 BOOL \f0\b0 \cf4 isWithdraw = \f2\b \cf8 NO \f0\b0 \cf4 ;\ memberData *myData = [ \f2\b \cf8 self \f0\b0 \cf4 .room getMember:g_myself.userId];\ \f2\b \cf8 if \f0\b0 \cf4 ([myData.role intValue] == \cf7 1\cf4 ) \{\ isWithdraw = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ([myData.role intValue] == \cf7 2\cf4 ) \{\ memberData *msgData = [ \f2\b \cf8 self \f0\b0 \cf4 .room getMember:msg.fromUserId];\ \f2\b \cf8 if \f0\b0 \cf4 ([msgData.role intValue] == \cf7 1\cf4 || [msgData.role intValue] == \cf7 2\cf4 ) \{\ isWithdraw = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ isWithdraw = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \}\ \ cell.isWithdraw = msg.isMySend || isWithdraw;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ cell.isShowHead = \f2\b \cf8 YES \f0\b0 \cf4 ;\ cell.isWithdraw = msg.isMySend;\ \}\ \cf2 // [cell setHeaderImage];\cf4 \ \cf2 // [cell setCellData];\cf4 \ \cf2 // [cell setBackgroundImage];\cf4 \ \cf2 // [cell isShowSendTime];\cf4 \ \ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeSuperDelete) \{\ cell.isSelectMore = \f2\b \cf8 NO \f0\b0 \cf4 ;\ cell.checkBox.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ cell.readView.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ cell.isSelectMore = \f2\b \cf8 self \f0\b0 \cf4 .isSelectMore;\ [cell setHeaderImage];\ [cell setCellData];\ [cell setBackgroundImage];\ [cell isShowSendTime];\ \}\ \ \ \cf2 // \f1 \'b6\'e0\'d1\'a1\'d7\'b4\'cc\'ac\'cf\'c2\'c8\'a1\'cf\'fb \f0 cell \f1 \'c4\'da\'bf\'d8\'bc\'fe\'b5\'c4\'b5\'e3\'bb\'f7\'ca\'c2\'bc\'fe \f0 \cf4 \ cell.bubbleBg.userInteractionEnabled = ! \f2\b \cf8 self \f0\b0 \cf4 .isSelectMore;\ \ \cf2 // \f1 \'d7\'aa\'c8\'a6\'b5\'c8\'b4\'fd \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([msg.isSend intValue] == transfer_status_ing) \{\ \ \f2\b \cf8 BOOL \f0\b0 \cf4 flag = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < g_xmpp.poolSend.allKeys.count; i ++) \{\ NSString *msgId = g_xmpp.poolSend.allKeys[i];\ \f2\b \cf8 if \f0\b0 \cf4 ([msgId isEqualToString:msg.messageId]) \{\ flag = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (flag || msg.isShowWait) \{\ [cell drawIsSend];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [msg updateIsSend:transfer_status_no];\ cell.sendFailed.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (indexPath.row == _array.count - \cf7 1\cf4 ) \{\ \cf2 // \f1 \'b4\'c1\'d2\'bb\'b4\'c1 \f0 \cf4 \ \cf2 // if (self.shakeMsg) \{\cf4 \ \cf2 // int value = 0;\cf4 \ \cf2 // if (self.shakeMsg.isMySend) \{\cf4 \ \cf2 // value = -50;\cf4 \ \cf2 // \}else \{\cf4 \ \cf2 // value = 50;\cf4 \ \cf2 // \}\cf4 \ \cf2 //\cf4 \ \cf2 // self.shakeMsg = nil;\cf4 \ \cf2 // CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.translation.x"];/// \f1 \'ba\'e1\'cf\'f2\'d2\'c6\'b6\'af \f0 \cf4 \ \cf2 //\cf4 \ \cf2 // animation.toValue = [NSNumber numberWithInt:value];\cf4 \ \cf2 //\cf4 \ \cf2 // animation.duration = .5;\cf4 \ \cf2 //\cf4 \ \cf2 // animation.removedOnCompletion = YES;//yes \f1 \'b5\'c4\'bb\'b0\'a3\'ac\'d3\'d6\'b7\'b5\'bb\'d8\'d4\'ad\'ce\'bb\'d6\'c3\'c1\'cb\'a1\'a3 \f0 \cf4 \ \cf2 //\cf4 \ \cf2 // animation.repeatCount = 2;\cf4 \ \cf2 //\cf4 \ \cf2 // animation.fillMode = kCAFillModeForwards;\cf4 \ \cf2 //\cf4 \ \cf2 // // \f1 \'cc\'ed\'bc\'d3\'d5\'f1\'b6\'af \f0 \cf4 \ \cf2 // // AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);\cf4 \ \cf2 // AudioServicesPlaySystemSound(1521);\cf4 \ \cf2 // [_messageText.inputView.superview.layer addAnimation:animation forKey:nil];\cf4 \ \cf2 // [g_window.layer addAnimation:animation forKey:nil];\cf4 \ \cf2 //\cf4 \ \cf2 // \}\cf4 \ \ \}\ msg = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \ NSLog(\cf6 @"lastIndex === %ld"\cf4 , indexPath.row);\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isRefresh && _array.count > \cf7 1\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 doAutoScroll:indexPath];\ \}\ \ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ -(CGFloat)\cf11 tableView\cf4 :(UITableView *)tableView \cf11 heightForRowAtIndexPath\cf4 :(NSIndexPath *)indexPath\ \{\ \f2\b \cf8 if \f0\b0 \cf4 (indexPath.row >= _array.count) \{\ \f2\b \cf8 return \f0\b0 \cf4 \cf7 0\cf4 ;\ \}\ JXMessageObject *msg=[_array objectAtIndex:indexPath.row];\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid)\ msg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \ \f2\b \cf8 switch \f0\b0 \cf4 ([msg.type intValue]) \{\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeText:\ \f2\b \cf8 return \f0\b0 \cf4 [JXMessageCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeImage:\ \f2\b \cf8 return \f0\b0 \cf4 [JXImageCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeCustomFace:\ \f2\b \cf8 return \f0\b0 \cf4 [JXFaceCustomCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeEmoji:\ \f2\b \cf8 return \f0\b0 \cf4 [JXEmojiCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeVoice:\ \f2\b \cf8 return \f0\b0 \cf4 [JXAudioCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeLocation:\ \f2\b \cf8 return \f0\b0 \cf4 [JXLocationCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeGif:\ \f2\b \cf8 return \f0\b0 \cf4 [JXGifCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeVideo:\ \f2\b \cf8 return \f0\b0 \cf4 [JXVideoCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeAudio:\ \f2\b \cf8 return \f0\b0 \cf4 [JXVideoCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeCard:\ \f2\b \cf8 return \f0\b0 \cf4 [JXCardCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeFile:\ \f2\b \cf8 return \f0\b0 \cf4 [JXFileCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeRemind:\ \f2\b \cf8 return \f0\b0 \cf4 [JXRemindCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeSuperDelete:\ \f2\b \cf8 return \f0\b0 \cf4 \cf7 0\cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeRedPacket:\ \f2\b \cf8 return \f0\b0 \cf4 [JXRedPacketCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeTransfer:\ \f2\b \cf8 return \f0\b0 \cf4 [JXTransferCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeSystemImage1:\ \f2\b \cf8 return \f0\b0 \cf4 [JXSystemImage1Cell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeSystemImage2:\ \f2\b \cf8 return \f0\b0 \cf4 [JXSystemImage2Cell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeAudioMeetingInvite:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeVideoMeetingInvite:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeAudioChatCancel:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeAudioChatEnd:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeVideoChatCancel:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeVideoChatEnd:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeAVBusy:\ \f2\b \cf8 return \f0\b0 \cf4 [JXAVCallCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeLink:\ \f2\b \cf8 return \f0\b0 \cf4 [JXLinkCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeShake:\ \f2\b \cf8 if \f0\b0 \cf4 (msg.content.length>\cf7 0\cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 [JXNewShakeCell getChatCellHeight:msg];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 return \f0\b0 \cf4 [JXShakeCell getChatCellHeight:msg];\ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeMergeRelay:\ \f2\b \cf8 return \f0\b0 \cf4 [JXMergeRelayCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeShare:\ \f2\b \cf8 return \f0\b0 \cf4 [JXShareCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeReply:\ \f2\b \cf8 return \f0\b0 \cf4 [JXReplyCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 default \f0\b0 \cf4 :\ \f2\b \cf8 return \f0\b0 \cf4 [JXBaseChatCell getChatCellHeight:msg];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 tableView\cf4 :(UITableView *)tableView \cf11 didSelectRowAtIndexPath\cf4 :(NSIndexPath *)indexPath\ \{\ \ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isSelectMore) \{\ \cf2 // \f1 \'bb\'f1\'c8\'a1\'b5\'da\'bc\'b8\'b8\'f6 \f0 Cell \f1 \'b1\'bb\'b5\'e3\'bb\'f7 \f0 \cf4 \ \ _selCell = (JXBaseChatCell*)[_table cellForRowAtIndexPath:indexPath];\ _selCell.checkBox.selected = !_selCell.checkBox.selected;\ NSLog(\cf6 @"indexNum = %d, isSelect = %d"\cf4 ,_selCell.indexNum, _selCell.checkBox.selected);\ [ \f2\b \cf8 self \f0\b0 \cf4 chatCell:_selCell checkBoxSelectIndexNum:_selCell.indexNum isSelect:_selCell.checkBox.selected];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ \cf2 // [super tableView:tableView didSelectRowAtIndexPath:indexPath];\cf4 \ \}\ \}\ \ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 scrollViewDidScrollToTop\cf4 :(UIScrollView *)scrollView \{\ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 scrollViewDidScroll\cf4 :(UIScrollView *)scrollView \{\ \f2\b \cf8 if \f0\b0 \cf4 (scrollView.contentOffset.y <= \cf7 0\cf4 ) \{\ \ \f2\b \cf8 self \f0\b0 \cf4 .jumpNewMsgBtn.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (scrollView.contentOffset.y < \f2\b \cf8 self \f0\b0 \cf4 .lastY) \{\ \f2\b \cf8 self \f0\b0 \cf4 .isRefresh = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 self \f0\b0 \cf4 .isRefresh = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 self \f0\b0 \cf4 .lastY = scrollView.contentOffset.y;\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 scrollViewWillBeginDragging\cf4 :(UIScrollView *)scrollView \{\ \ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \ \cf5 #pragma mark \f2\b \cf16 ----------------- \f4 \'bb\'f1\'c8\'a1\'b6\'d4\'d3\'a6\'b5\'c4 \f2 Cell----------------- \f0\b0 \cf4 \ - (JXBaseChatCell *)\cf11 getCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ JXBaseChatCell * cell = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \f2\b \cf8 switch \f0\b0 \cf4 ([msg.type intValue]) \{\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeText:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatMessageCell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeImage:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatImageCell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeCustomFace:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatFaceCustomCell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeEmoji:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatEmojiCell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeVoice:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatAudioCell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeLocation:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatLocationCell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeGif:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatGifCell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeVideo:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatVideoCell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeAudio:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatVideoCell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeCard:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatCardCell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeFile:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatFileCell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeRemind:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatRemindCell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeSuperDelete:\ cell = [[JXBaseChatCell alloc] init];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeRedPacket:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatRedPacketCell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeTransfer:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 createTransferCell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeSystemImage1:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatSystemImage1Cell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeSystemImage2:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatSystemImage2Cell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeAudioMeetingInvite:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeVideoMeetingInvite:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeAudioChatCancel:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeAudioChatEnd:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeVideoChatCancel:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeVideoChatEnd:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeAVBusy:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatAVCallCell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeLink:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatLinkCell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeShake:\ \f2\b \cf8 if \f0\b0 \cf4 (msg.content.length>\cf7 0\cf4 ) \{\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatNewShakeCell:msg indexPath:indexPath];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatShakeCell:msg indexPath:indexPath];\ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeMergeRelay:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 creatMergeRelayCell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeShare:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 createShareCell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeReply:\ cell = [ \f2\b \cf8 self \f0\b0 \cf4 createReplyCell:msg indexPath:indexPath];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 default \f0\b0 \cf4 :\ cell = [[JXBaseChatCell alloc] init];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \ \cf5 #pragma mark \f2\b \cf16 ----------------------- \f4 \'b4\'b4\'bd\'a8\'b6\'d4\'d3\'a6\'b5\'c4 \f2 Cell--------------------- \f0\b0 \cf4 \ \cf2 // \f1 \'ce\'c4\'b1\'be \f0 \cf4 \ - (JXBaseChatCell *)\cf11 creatMessageCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ NSString * identifier = \cf6 @"JXMessageCell"\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.isReadDel boolValue]) \{\ identifier = [NSString stringWithFormat:\cf6 @"JXMessageCell_%ld"\cf4 ,indexPath.row];\ \}\ JXMessageCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXMessageCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \ \}\ cell.block = ^(JXMessageObject *msg) \{\ \ _strURLGoback=\cf6 @""\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.content containsString:\cf6 @"===jixinJXBigRellV"\cf4 ]) \{ \cf2 // \f1 \'d7\'aa\'c5\'cc \f0 \cf4 \ \ JXBigReelVc *vc = [JXBigReelVc \f2\b \cf8 new \f0\b0 \cf4 ];\ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ([msg.content containsString:\cf6 @"===jixinJXLuckRescueFundVc"\cf4 ]) \{\ \ JXLuckRescueFundVc *vc = [JXLuckRescueFundVc \f2\b \cf8 new \f0\b0 \cf4 ];\ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ([msg.content containsString:\cf6 @"===jixinJXGoldMangVc"\cf4 ]) \{\ \ JXGoldMangVc *vc = [JXGoldMangVc \f2\b \cf8 new \f0\b0 \cf4 ];\ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ([msg.content containsString:\cf6 @"===jixinJXBigRellV"\cf4 ]) \{\ \ JXApplyViewController *vc = [JXApplyViewController \f2\b \cf8 new \f0\b0 \cf4 ];\ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \}\ \ \};\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \cf2 // \f1 \'cd\'bc\'c6\'ac \f0 \cf4 \ - (JXBaseChatCell *)\cf11 creatImageCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ NSString * identifier = \cf6 @"JXImageCell"\cf4 ;\ JXImageCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXImageCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \cf2 // cell.chatImage.delegate = self;\cf4 \ \cf2 // cell.chatImage.didTouch = @selector(onCellImage:);\cf4 \ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \ \cf2 // \f1 \'d7\'d4\'b6\'a8\'d2\'e5\'b1\'ed\'c7\'e9 \f0 \cf4 \ - (JXBaseChatCell *)\cf11 creatFaceCustomCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ NSString * identifier = \cf6 @"JXFaceCustomCell"\cf4 ;\ JXFaceCustomCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXFaceCustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \cf2 // cell.chatImage.delegate = self;\cf4 \ \cf2 // cell.chatImage.didTouch = @selector(onCellImage:);\cf4 \ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \ \cf2 // \f1 \'b1\'ed\'c7\'e9\'b0\'fc \f0 \cf4 \ - (JXBaseChatCell *)\cf11 creatEmojiCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ NSString * identifier = \cf6 @"JXEmojiCell"\cf4 ;\ JXEmojiCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXEmojiCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \cf2 // cell.chatImage.delegate = self;\cf4 \ \cf2 // cell.chatImage.didTouch = @selector(onCellImage:);\cf4 \ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \ \cf2 // \f1 \'ca\'d3\'c6\'b5 \f0 \cf4 \ - (JXBaseChatCell *)\cf11 creatVideoCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ NSString * identifier = \cf6 @"JXVideoCell"\cf4 ;\ JXVideoCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXVideoCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \}\ cell.videoDelegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ cell.indexTag = indexPath.row;\ \ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \cf2 // \f1 \'d2\'f4\'c6\'b5 \f0 \cf4 \ - (JXBaseChatCell *)\cf11 creatAudioCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ NSString * identifier = \cf6 @"JXAudioCell"\cf4 ;\ JXAudioCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXAudioCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \}\ cell.indexNum = ( \f2\b \cf8 int \f0\b0 \cf4 )indexPath.row;\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \cf2 // \f1 \'ce\'c4\'bc\'fe \f0 \cf4 \ - (JXBaseChatCell *)\cf11 creatFileCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ NSString * identifier = \cf6 @"JXFileCell"\cf4 ;\ JXFileCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXFileCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \cf2 // \f1 \'ce\'bb\'d6\'c3 \f0 \cf4 \ - (JXBaseChatCell *)\cf11 creatLocationCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ NSString * identifier = \cf6 @"JXLocationCell"\cf4 ;\ JXLocationCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXLocationCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \cf2 // \f1 \'c3\'fb\'c6\'ac \f0 \cf4 \ - (JXBaseChatCell *)\cf11 creatCardCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ NSString * identifier = \cf6 @"JXCardCell"\cf4 ;\ JXCardCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXCardCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \cf2 // \f1 \'ba\'ec\'b0\'fc \f0 \cf4 \ - (JXBaseChatCell *)\cf11 creatRedPacketCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ NSString * identifier = \cf6 @"JXRedPacketCell"\cf4 ;\ JXRedPacketCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXRedPacketCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \cf2 // \f1 \'b6\'af\'bb\'ad \f0 \cf4 \ - (JXBaseChatCell *)\cf11 creatGifCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ NSString * identifier = \cf6 @"JXGifCell"\cf4 ;\ JXGifCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXGifCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \cf2 // \f1 \'cf\'b5\'cd\'b3\'cc\'e1\'d0\'d1 \f0 \cf4 \ - (JXBaseChatCell *)\cf11 creatRemindCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ NSString * identifier = \cf6 @"JXRemindCell"\cf4 ;\ JXRemindCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXRemindCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \ \cf2 // \f1 \'b5\'a5\'cc\'f5\'cd\'bc\'ce\'c4 \f0 \cf4 \ - (JXBaseChatCell *)\cf11 creatSystemImage1Cell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ NSString * identifier = \cf6 @"JXSystemImage1Cell"\cf4 ;\ JXSystemImage1Cell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXSystemImage1Cell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \ \cf2 // \f1 \'b6\'e0\'cc\'f5\'cd\'bc\'ce\'c4 \f0 \cf4 \ - (JXBaseChatCell *)\cf11 creatSystemImage2Cell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ NSString * identifier = \cf6 @"JXSystemImage2Cell"\cf4 ;\ JXSystemImage2Cell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXSystemImage2Cell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \ \cf2 // \f1 \'d2\'f4\'ca\'d3\'c6\'b5\'cd\'a8\'bb\'b0 \f0 \cf4 \ - (JXBaseChatCell *)\cf11 creatAVCallCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ NSString * identifier = \cf6 @"JXAVCallCell"\cf4 ;\ JXAVCallCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXAVCallCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \ \cf2 // \f1 \'c1\'b4\'bd\'d3 \f0 \cf4 \ - (JXBaseChatCell *)\cf11 creatLinkCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ NSString * identifier = \cf6 @"JXLinkCell"\cf4 ;\ JXLinkCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXLinkCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \ \cf2 // \f1 \'b4\'c1\'d2\'bb\'b4\'c1 \f0 \cf4 \ - (JXBaseChatCell *)\cf11 creatShakeCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ NSString * identifier = \cf6 @"JXShakeCell"\cf4 ;\ JXShakeCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXShakeCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \ \cf2 // \f1 \'b4\'c1\'d2\'bb\'b4\'c1\'d0\'c2 \f0 \cf4 \ - (JXBaseChatCell *)\cf11 creatNewShakeCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ NSString * identifier = \cf6 @"JXNewShakeCell"\cf4 ;\ JXNewShakeCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXNewShakeCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \ \cf2 // \f1 \'ba\'cf\'b2\'a2\'d7\'aa\'b7\'a2\'cf\'fb\'cf\'a2 \f0 \cf4 \ - (JXBaseChatCell *)\cf11 creatMergeRelayCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath\{\ NSString * identifier = \cf6 @"JXMergeRelayCell"\cf4 ;\ JXMergeRelayCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXMergeRelayCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \cf2 // \f1 \'b7\'d6\'cf\'ed \f0 \cf4 \ - (JXBaseChatCell *)\cf11 createShareCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath \{\ NSString * identifier = \cf6 @"JXShareCell"\cf4 ;\ JXShareCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXShareCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \cf2 // \f1 \'d7\'aa\'d5\'cb \f0 \cf4 \ - (JXBaseChatCell *)\cf11 createTransferCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath \{\ NSString * identifier = \cf6 @"JXTransferCell"\cf4 ;\ JXTransferCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXTransferCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \cf2 // \f1 \'bb\'d8\'b8\'b4 \f0 \cf4 \ - (JXBaseChatCell *)\cf11 createReplyCell\cf4 :(JXMessageObject *)msg \cf11 indexPath\cf4 :(NSIndexPath *)indexPath \{\ NSString * identifier = \cf6 @"JXReplyCell"\cf4 ;\ JXReplyCell *cell=[_table dequeueReusableCellWithIdentifier:identifier];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ cell = [[JXReplyCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 cell;\ \}\ \ \cf2 // \f1 \'cf\'d4\'ca\'be\'c8\'ab\'c6\'c1\'ca\'d3\'c6\'b5\'b2\'a5\'b7\'c5 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 showVideoPlayerWithTag\cf4 :(NSInteger)tag \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .indexNum = ( \f2\b \cf8 int \f0\b0 \cf4 )tag;\ \ _player= [JXVideoPlayer alloc];\ _player.type = JXVideoTypeChat;\ _player.isShowHide = \f2\b \cf8 YES \f0\b0 \cf4 ; \cf2 // \f1 \'b2\'a5\'b7\'c5\'d6\'d0\'b5\'e3\'bb\'f7\'b2\'a5\'b7\'c5\'c6\'f7\'b1\'e3\'cf\'fa\'bb\'d9\'b2\'a5\'b7\'c5\'c6\'f7 \f0 \cf4 \ _player.isStartFullScreenPlay = \f2\b \cf8 YES \f0\b0 \cf4 ; \cf2 // \f1 \'c8\'ab\'c6\'c1\'b2\'a5\'b7\'c5 \f0 \cf4 \ _player.didVideoPlayEnd = \f2\b \cf8 @selector \f0\b0 \cf4 (didVideoPlayEnd);\ _player.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ JXMessageObject *msg = [_array objectAtIndex:tag];\ \f2\b \cf8 if \f0\b0 \cf4 (msg.isMySend && isFileExist(msg.fileName))\ _player.videoFile = msg.fileName;\ \f2\b \cf8 else \f0\b0 \cf4 \ _player.videoFile = msg.content;\ _player.isReadDel = [msg.isReadDel boolValue];\ _player = [_player initWithParent: \f2\b \cf8 self \f0\b0 \cf4 .view];\ \ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(\cf7 .2f\cf4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^\{\ [_player \f2\b \cf8 switch \f0\b0 \cf4 ];\ \});\ \}\ \ \ \cf2 // \f1 \'cf\'fa\'bb\'d9\'b2\'a5\'b7\'c5\'c6\'f7 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 didVideoPlayEnd\cf4 \{\ \cf2 // [[UIApplication sharedApplication] setStatusBarHidden:NO];\cf4 \ JXVideoCell *cell = [ \f2\b \cf8 self \f0\b0 \cf4 .tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow: \f2\b \cf8 self \f0\b0 \cf4 .indexNum inSection:\cf7 0\cf4 ]];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell.msg.isMySend) \{\ [cell deleteMsg];\ \}\ \}\ \ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 showOneMsg\cf4 :(JXMessageObject*)msg\{\ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i=\cf7 0\cf4 ;i<[_array count];i++)\{\ JXMessageObject* p = (JXMessageObject*)[_array objectAtIndex:i];\ \f2\b \cf8 if \f0\b0 \cf4 ([p.messageId isEqualToString:msg.messageId])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ p = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \cf2 // \f1 \'c5\'d0\'b6\'cf\'ca\'c7\'b7\'f1\'d5\'b9\'ca\'be\'ca\'b1\'bc\'e4 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 setNewShowTime:msg];\ CGFloat height = \cf7 0\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (_array.count > \cf7 0\cf4 ) \{\ height = [ \f2\b \cf8 self \f0\b0 \cf4 tableView:_table heightForRowAtIndexPath:[NSIndexPath indexPathForRow:_array.count - \cf7 1\cf4 inSection:\cf7 0\cf4 ]];\ \}\ \ \f2\b \cf8 BOOL \f0\b0 \cf4 flag = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (fabs(_table.contentOffset.y + _table.frame.size.height - _table.contentSize.height) < height) \{\ flag = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ msg.isShowWait = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [_array addObject:msg];\ \cf2 // NSLog(@"_array:%d",msg.retainCount);\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeRedPacket) \{\ \f2\b \cf8 if \f0\b0 \cf4 (![_orderRedPacketArray containsObject:msg]) \{\ [_orderRedPacketArray addObject:msg];\ \}\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (_isRefreshing) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 @try \f0\b0 \cf4 \{\ [_table insertRow:( \f2\b \cf8 int \f0\b0 \cf4 )[_array count]-\cf7 1\cf4 section:\cf7 0\cf4 ];\ \} \f2\b \cf8 @catch \f0\b0 \cf4 (NSException *exception) \{\ \ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ((flag || msg.isMySend) && ! \f2\b \cf8 self \f0\b0 \cf4 .isSyncMsg) \{\ \cf2 // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^\{\cf4 \ [_table gotoLastRow: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \cf2 // \});\cf4 \ \}\ \ \}\ \ \cf2 // \f1 \'c9\'cf\'b4\'ab\'cd\'ea\'b3\'c9\'ba\'f3\'a3\'ac\'b7\'a2\'cf\'fb\'cf\'a2 \f0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 doSendAfterUpload\cf4 :(NSDictionary*)dict\{\ \ NSString* msgId = [dict objectForKey:\cf6 @"oUrl"\cf4 ];\ msgId = [[msgId lastPathComponent] stringByDeletingPathExtension];\ NSString* oFileName = [dict objectForKey:\cf6 @"oFileName"\cf4 ];\ \ \cf2 // NSString *userId = self.userIds[self.groupMessagesIndex];\cf4 \ \cf2 // NSString *userName = self.userNames[self.groupMessagesIndex];\cf4 \ \ JXMessageObject* p= \f2\b \cf8 nil \f0\b0 \cf4 ;\ \f2\b \cf8 int \f0\b0 \cf4 found=-\cf7 1\cf4 ;\ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i=( \f2\b \cf8 int \f0\b0 \cf4 )[_array count]-\cf7 1\cf4 ;i>=\cf7 0\cf4 ;i--)\{\ p = [_array objectAtIndex:i];\ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue]==kWCMessageTypeLocation)\ \f2\b \cf8 if \f0\b0 \cf4 ([[p.fileName lastPathComponent] isEqualToString:[oFileName lastPathComponent]])\{\ found = i;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue]==kWCMessageTypeFile && ![p.isUpload boolValue])\ \f2\b \cf8 if \f0\b0 \cf4 ([[p.fileName lastPathComponent] isEqualToString:[oFileName lastPathComponent]])\{\ found = i;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (p.content.length > \cf7 0\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([oFileName rangeOfString:p.content].location != NSNotFound) \{\ found = i;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \cf2 // if([p.content isEqualToString:msgId])\{\cf4 \ \cf2 // found = i;\cf4 \ \cf2 // break;\cf4 \ \cf2 // \}\cf4 \ p = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (found>=\cf7 0\cf4 )\{\cf2 // \f1 \'d5\'d2\'b5\'bd\'cf\'fb\'cf\'a2\'cc\'e5 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([[dict objectForKey:\cf6 @"status"\cf4 ] intValue] != \cf7 1\cf4 )\{\ NSLog(\cf6 @"doUploadFaire"\cf4 );\ [p updateIsSend:transfer_status_no];\ JXBaseChatCell* cell = [ \f2\b \cf8 self \f0\b0 \cf4 getCell:found];\ [cell drawIsSend];\ cell = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ NSLog(\cf6 @"doSendAfterUpload"\cf4 );\ p.content = [dict objectForKey:\cf6 @"oUrl"\cf4 ];\ \cf2 // if (self.isGroupMessages) \{\cf4 \ \cf2 // p.toUserId = userId;\cf4 \ \cf2 // \}\cf4 \ [p updateIsUpload: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 (_useInfoTempChat==\cf7 11\cf4 ) \{\ \ p.tempChat = \cf7 11\cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \ \{\ \ p.tempChat = \cf7 1\cf4 ;\ \}\ \ \cf2 // [g_xmpp sendMessage:p roomName:self.roomJid];// \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isCYMSGgroupANDFriendy) \{\ \f2\b \cf8 for \f0\b0 \cf4 (NSString *userId \f2\b \cf8 in \f0\b0 \cf4 \f2\b \cf8 self \f0\b0 \cf4 .userIds) \{\ \f2\b \cf8 if \f0\b0 \cf4 (userId.length>\cf7 10\cf4 ) \{\ [g_xmpp sendMessage:p roomName:userId];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [g_xmpp sendMessage:p roomName:userId];\ \}\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [g_xmpp sendMessage:p roomName: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \}\ \cf2 // [self.tableView reloadData];\cf4 \ \}\ \ p = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex ++;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .userIds && \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex >= \f2\b \cf8 self \f0\b0 \cf4 .userIds.count) \{\ \ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex = \cf7 0\cf4 ;\ [JXMyTools showTipView:Localized(\cf6 @"JX_SendComplete"\cf4 )];\ \ \}\ \}\ \}\ \ \cf2 // \f1 \'c9\'cf\'b4\'ab\'cd\'ea\'b3\'c9\'ba\'f3\'a3\'ac\'b7\'a2\'cf\'fb\'cf\'a2 \f0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 doUploadError\cf4 :(JXConnection*)downloader\{\ NSString* msgId = downloader.userData;\ msgId = [[msgId lastPathComponent] stringByDeletingPathExtension];\ \ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i=( \f2\b \cf8 int \f0\b0 \cf4 )[_array count]-\cf7 1\cf4 ;i>=\cf7 0\cf4 ;i--)\{\ JXMessageObject* p = [_array objectAtIndex:i];\ \f2\b \cf8 if \f0\b0 \cf4 ([p.content isEqualToString:msgId])\{\ [p updateIsSend:transfer_status_no];\ [[ \f2\b \cf8 self \f0\b0 \cf4 getCell:i] drawIsSend];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ p = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onSendTimeout\cf4 :(NSNotification *)notifacation\cf2 // \f1 \'b3\'ac\'ca\'b1\'ce\'b4\'ca\'d5\'b5\'bd\'bb\'d8\'d6\'b4 \f0 \cf4 \ \{\ JXMessageObject *msg = (JXMessageObject *)notifacation.object;\ \f2\b \cf8 if \f0\b0 \cf4 (msg== \f2\b \cf8 nil \f0\b0 \cf4 )\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeWithdraw) \{\ [_wait stop];\ \cf2 // [g_App showAlert:Localized(@"JX_WithdrawFailed")];\cf4 \ [JXMyTools showTipView:Localized(\cf6 @"JX_WithdrawFailed"\cf4 )];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i=( \f2\b \cf8 int \f0\b0 \cf4 )[_array count]-\cf7 1\cf4 ;i>=\cf7 0\cf4 ;i--)\{\ JXMessageObject* p = [_array objectAtIndex:i];\ \f2\b \cf8 if \f0\b0 \cf4 (p == msg)\{\ \cf2 // NSLog(@"receive:onSendTimeout");\cf4 \ [[ \f2\b \cf8 self \f0\b0 \cf4 getCell:i] drawIsSend];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ p = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \}\ \ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onReceiveFile\cf4 :(NSNotification *)notifacation\cf2 // \f1 \'ca\'d5\'b5\'bd\'cf\'c2\'d4\'d8\'d7\'b4\'cc\'ac \f0 \cf4 \ \{\ JXMessageObject *msg = (JXMessageObject *)notifacation.object;\ \f2\b \cf8 if \f0\b0 \cf4 (msg== \f2\b \cf8 nil \f0\b0 \cf4 )\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i=( \f2\b \cf8 int \f0\b0 \cf4 )[_array count]-\cf7 1\cf4 ;i>=\cf7 0\cf4 ;i--)\{\ JXMessageObject* p = [_array objectAtIndex:i];\ \f2\b \cf8 if \f0\b0 \cf4 (p == msg)\{\ \cf2 // NSLog(@"onReceiveFile");\cf4 \ [[ \f2\b \cf8 self \f0\b0 \cf4 getCell:i] drawIsReceive];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ p = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 showMsg\cf4 :(NSNotification *)notifacation\{\ JXMessageObject *msg = (JXMessageObject *)notifacation.object;\ \f2\b \cf8 if \f0\b0 \cf4 (msg== \f2\b \cf8 nil \f0\b0 \cf4 )\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([[msg getTableName] isEqualToString:chatPerson.userId] && msg.isMySend)\ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \}\ \ \cf5 #pragma mark \f4\b \cf16 \'bd\'d3\'ca\'dc\'d0\'c2\'cf\'fb\'cf\'a2\'b9\'e3\'b2\'a5 \f0\b0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 newMsgCome\cf4 :(NSNotification *)notifacation\{\ \ \ JXMessageObject *msg = (JXMessageObject *)notifacation.object;\ \f2\b \cf8 if \f0\b0 \cf4 (msg== \f2\b \cf8 nil \f0\b0 \cf4 )\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \ \cf2 // \f1 \'b8\'fc\'d0\'c2 \f0 title \f1 \'d4\'da\'cf\'df\'d7\'b4\'cc\'ac \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (! \f2\b \cf8 self \f0\b0 \cf4 .roomJid && ! \f2\b \cf8 self \f0\b0 \cf4 .onlinestate && ![msg.fromUserId isEqualToString:MY_USER_ID]) \{\ \f2\b \cf8 self \f0\b0 \cf4 .onlinestate = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 self \f0\b0 \cf4 .title = Localized(\cf6 @"JX_GroupHair"\cf4 );\ \ [ \f2\b \cf8 self \f0\b0 \cf4 setAudioIconFrame];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .courseId.length > \cf7 0\cf4 ) \{\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ \f2\b \cf8 if \f0\b0 \cf4 ([chatPerson.userId intValue]<\cf7 10100\cf4 && [chatPerson.userId intValue]>=\cf7 10000\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .title = chatPerson.userNickname;\ [ \f2\b \cf8 self \f0\b0 \cf4 setAudioIconFrame];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // NSString *str = self.onlinestate ? Localized(@"JX_OnLine") : Localized(@"JX_OffLine");\cf4 \ \cf2 // self.title = [NSString stringWithFormat:@"%@(%@)",chatPerson.remarkName.length > 0 ? chatPerson.remarkName : chatPerson.userNickname,str];\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 setChatTitle:chatPerson.remarkName.length > \cf7 0\cf4 ? chatPerson.remarkName : chatPerson.userNickname];\ \}\ \}\ \}\ \}\ \ \cf5 #ifdef Live_Version\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([[JXLiveJidManager shareArray] contains:msg.toUserId] || [[JXLiveJidManager shareArray] contains:msg.fromUserId])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \cf5 #endif\cf4 \ \ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == XMPP_TYPE_NOBLACK) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.fromUserId isEqualToString: \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.userId]) \{\ \f2\b \cf8 self \f0\b0 \cf4 .isBeenBlack = \cf7 0\cf4 ;\ \}\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (!msg.isVisible)\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid || msg.isGroup) \{\cf2 // \f1 \'ca\'c7\'b7\'bf\'bc\'e4 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (msg.isRepeat) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.toUserId isEqualToString:chatPerson.userId]||[msg.toId isEqualToString: \f2\b \cf8 self \f0\b0 \cf4 .roomJid]) \{\cf2 // \f1 \'b5\'da\'d2\'bb\'b8\'f6\'c5\'d0\'b6\'cf\'ca\'b1\'b4\'d3 \f0 MsgView \f1 \'bd\'f8\'c8\'eb\'a3\'ac\'b5\'da\'b6\'fe\'b8\'f6\'b4\'d3 \f0 GroupView \f1 \'bd\'f8\'c8\'eb \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.fromId isEqualToString:chatPerson.userId]||[msg.fromId isEqualToString: \f2\b \cf8 self \f0\b0 \cf4 .roomJid])\cf2 // \f1 \'b5\'da\'d2\'bb\'b8\'f6\'c5\'d0\'b6\'cf\'ca\'b1\'b4\'d3 \f0 MsgView \f1 \'bd\'f8\'c8\'eb\'a3\'ac\'b5\'da\'b6\'fe\'b8\'f6\'b4\'d3 \f0 GroupView \f1 \'bd\'f8\'c8\'eb \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeSuperDelete) \{\ JXMessageObject *newMsg;\ NSInteger index = \cf7 0\cf4 ;\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < _array.count; i ++) \{\ JXMessageObject *withDrawMsg = _array[i];\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.content isEqualToString:withDrawMsg.messageId]) \{\ newMsg = withDrawMsg;\ index = i;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (!newMsg) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ newMsg.isShowTime = \f2\b \cf8 NO \f0\b0 \cf4 ;\ newMsg.type = [NSNumber numberWithInt:kWCMessageTypeSuperDelete];\ \cf2 // newMsg.content = Localized(@"JX_AlreadyWithdraw");\cf4 \ newMsg.content = \cf6 @""\cf4 ;\ NSString* s;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\ s = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ \f2\b \cf8 else \f0\b0 \cf4 \ s = chatPerson.userId;\ newMsg.fromUserId = MY_USER_ID;\ newMsg.toUserId = s;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .withdrawIndex == _array.count - \cf7 1\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .lastMsg.content = newMsg.content;\ \}\ [newMsg updateLastSend:UpdateLastSendType_None];\ [newMsg update];\ [newMsg notifyNewMsg];\ [_wait stop];\ [_table reloadRow:( \f2\b \cf8 int \f0\b0 \cf4 )index section:\cf7 0\cf4 ];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type integerValue] == kWCMessageTypeRemind && !msg.isShowRemind) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.fromUserId isEqualToString:MY_USER_ID] && [msg.type intValue] == kWCMessageTypeWithdraw) \{\ \ JXMessageObject *newMsg;\ NSInteger index = \cf7 0\cf4 ;\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < _array.count; i ++) \{\ JXMessageObject *withDrawMsg = _array[i];\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.content isEqualToString:withDrawMsg.messageId]) \{\ newMsg = withDrawMsg;\ index = i;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (!newMsg) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ newMsg.isShowTime = \f2\b \cf8 NO \f0\b0 \cf4 ;\ newMsg.type = [NSNumber numberWithInt:kWCMessageTypeRemind];\ newMsg.content = Localized(\cf6 @"JX_AlreadyWithdraw"\cf4 );\ NSString* s;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\ s = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ \f2\b \cf8 else \f0\b0 \cf4 \ s = chatPerson.userId;\ newMsg.fromUserId = MY_USER_ID;\ newMsg.toUserId = s;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .withdrawIndex == _array.count - \cf7 1\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .lastMsg.content = newMsg.content;\ \}\ [newMsg updateLastSend:UpdateLastSendType_None];\ [newMsg update];\ [newMsg notifyNewMsg];\ [_wait stop];\ [_table reloadRow:( \f2\b \cf8 int \f0\b0 \cf4 )index section:\cf7 0\cf4 ];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([msg.fromUserId isEqualToString:chatPerson.userId] || ([msg.fromUserId isEqualToString:MY_USER_ID] && [msg.toUserId isEqualToString:chatPerson.userId]))\ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \}\ msg = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 newReceipt\cf4 :(NSNotification *)notifacation\{\cf2 // \f1 \'d0\'c2\'bb\'d8\'d6\'b4 \f0 \cf4 \ \cf2 // NSLog(@"newReceipt");\cf4 \ JXMessageObject *msg = (JXMessageObject *)notifacation.object;\ \f2\b \cf8 if \f0\b0 \cf4 (msg == \f2\b \cf8 nil \f0\b0 \cf4 )\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeWithdraw) \{\ JXMessageObject *msg1 = _array[ \f2\b \cf8 self \f0\b0 \cf4 .withdrawIndex];\ msg1.isShowTime = \f2\b \cf8 NO \f0\b0 \cf4 ;\ msg1.type = [NSNumber numberWithInt:kWCMessageTypeRemind];\ msg1.content = Localized(\cf6 @"JX_AlreadyWithdraw"\cf4 );\ NSString* s;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\ s = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ \f2\b \cf8 else \f0\b0 \cf4 \ s = chatPerson.userId;\ msg1.fromUserId = MY_USER_ID;\ msg1.toUserId = s;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .withdrawIndex == _array.count - \cf7 1\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .lastMsg.content = msg1.content;\ \}\ [msg1 updateLastSend:UpdateLastSendType_None];\ [msg1 update];\ [msg1 notifyNewMsg];\ [_wait stop];\ [_table reloadRow:( \f2\b \cf8 int \f0\b0 \cf4 ) \f2\b \cf8 self \f0\b0 \cf4 .withdrawIndex section:\cf7 0\cf4 ];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeSuperDelete) \{\ JXMessageObject *msg1 = _array[ \f2\b \cf8 self \f0\b0 \cf4 .withdrawIndex];\ msg1.isShowTime = \f2\b \cf8 NO \f0\b0 \cf4 ;\ msg1.type = [NSNumber numberWithInt:kWCMessageTypeNone];\ msg1.content = \cf6 @" \f1 \'c4\'e3\'c9\'be\'b3\'fd\'c1\'cb\'d2\'bb\'cc\'f5\'cf\'fb\'cf\'a2 \f0 "\cf4 ;\ NSString* s;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\ s = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ \f2\b \cf8 else \f0\b0 \cf4 \ s = chatPerson.userId;\ msg1.fromUserId = MY_USER_ID;\ msg1.toUserId = s;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .withdrawIndex == _array.count - \cf7 1\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .lastMsg.content = msg1.content;\ \}\ [msg1 updateLastSend:UpdateLastSendType_None];\ [msg1 update];\ [msg1 notifyNewMsg];\ [_wait stop];\ [_table reloadRow:( \f2\b \cf8 int \f0\b0 \cf4 ) \f2\b \cf8 self \f0\b0 \cf4 .withdrawIndex section:\cf7 0\cf4 ];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([chatPerson.userId rangeOfString: msg.fromUserId].location != NSNotFound || [chatPerson.userId rangeOfString: msg.toUserId].location != NSNotFound || [msg.toUserId isEqualToString: \f2\b \cf8 self \f0\b0 \cf4 .roomJid] )\{\ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i=( \f2\b \cf8 int \f0\b0 \cf4 )[_array count]-\cf7 1\cf4 ;i>=\cf7 0\cf4 ;i--)\{\ JXMessageObject* p = [_array objectAtIndex:i];\ \f2\b \cf8 if \f0\b0 \cf4 ([p.messageId isEqualToString:msg.messageId])\{\ \ JXBaseChatCell* cell = [ \f2\b \cf8 self \f0\b0 \cf4 getCell:i];\ \f2\b \cf8 if \f0\b0 \cf4 (p != msg) \{\ cell.msg = msg;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (cell)\ [cell drawIsSend];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ p = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \}\ \}\ \ \cf5 #pragma mark \f2\b \cf16 sharemore \f4 \'b0\'b4\'c5\'a5\'d7\'e9\'d0\'ad\'d2\'e9 \f0\b0 \cf4 \ \cf2 // \f1 \'d5\'d5\'c6\'ac\'d1\'a1\'d4\'f1\'c6\'f7 \f0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 pickPhoto\cf4 \ \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 showDisableSay])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 sendMsgCheck])\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ RITLPhotosViewController *photoController = RITLPhotosViewController.photosViewController;\ photoController.configuration.maxCount = \cf7 9\cf4 ;\cf2 // \f1 \'d7\'ee\'b4\'f3\'b5\'c4\'d1\'a1\'d4\'f1\'ca\'fd\'c4\'bf \f0 \cf4 \ photoController.configuration.containVideo = \f2\b \cf8 YES \f0\b0 \cf4 ;\cf2 // \f1 \'d1\'a1\'d4\'f1\'c0\'e0\'d0\'cd\'a3\'ac\'c4\'bf\'c7\'b0\'d6\'bb\'d1\'a1\'d4\'f1\'cd\'bc\'c6\'ac\'b2\'bb\'d1\'a1\'d4\'f1\'ca\'d3\'c6\'b5 \f0 \cf4 \ \ photoController.photo_delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ photoController.thumbnailSize = CGSizeMake(\cf7 320\cf4 , \cf7 320\cf4 );\cf2 // \f1 \'cb\'f5\'c2\'d4\'cd\'bc\'b5\'c4\'b3\'df\'b4\'e7 \f0 \cf4 \ \cf2 // photoController.defaultIdentifers = self.saveAssetIds;// \f1 \'bc\'c7\'c2\'bc\'d2\'d1\'be\'ad\'d1\'a1\'d4\'f1\'b9\'fd\'b5\'c4\'d7\'ca\'d4\'b4 \f0 \cf4 \ \ [ \f2\b \cf8 self \f0\b0 \cf4 presentViewController:photoController animated: \f2\b \cf8 true \f0\b0 \cf4 completion:^\{\}];\ \ \cf2 // UIImagePickerController *imgPicker=[[UIImagePickerController alloc]init];\cf4 \ \cf2 // [imgPicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];\cf4 \ \cf2 // [imgPicker setDelegate:self];\cf4 \ \cf2 // [imgPicker setAllowsEditing:NO];\cf4 \ \cf12 /// \f3 \cf2 / [g_App.window addSubview:imgPicker.view]; \f0 \cf4 \ \cf2 //\cf4 \ \cf2 // [self presentViewController:imgPicker animated:YES completion:^\{\}];\cf4 \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendPhotos\cf4 :(NSArray < \f2\b \cf8 id \f0\b0 \cf4 > *)datas \cf11 withOriginal\cf4 :( \f2\b \cf8 BOOL \f0\b0 \cf4 )isOriginal\{\ \f2\b \cf8 if \f0\b0 \cf4 (_isGroupSendCancel) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ NSString *userId = \f2\b \cf8 self \f0\b0 \cf4 .userIds[ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex];\ NSString *name = \cf6 @"jpg"\cf4 ;\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < datas.count; i ++) \{\ UIImage *chosedImage = datas[i];\ \f2\b \cf8 int \f0\b0 \cf4 imageWidth = chosedImage.size.width;\ \f2\b \cf8 int \f0\b0 \cf4 imageHeight = chosedImage.size.height;\ NSString *file = [FileInfo getUUIDFileName:name];\ [g_server saveImageToFile:chosedImage file:file isOriginal:isOriginal];\ [ \f2\b \cf8 self \f0\b0 \cf4 sendImage:file withWidth:imageWidth andHeight:imageHeight userId:userId];\ \}\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex ++;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex < \f2\b \cf8 self \f0\b0 \cf4 .userIds.count) \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex % _onceSendNum == \cf7 0\cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 sendPhotos:datas withOriginal:isOriginal];\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .userIds)\{\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex = \cf7 0\cf4 ;\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 photosViewController\cf4 :(UIViewController *)viewController \cf11 assets\cf4 :(NSArray *)assets \{\ \f2\b \cf8 self \f0\b0 \cf4 .imgDataArr = assets;\ \ \}\ \ \cf5 #pragma mark \f2\b \cf16 - \f4 \'b7\'a2\'cb\'cd\'cd\'bc\'c6\'ac \f0\b0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 photosViewController\cf4 :(UIViewController *)viewController \cf11 datas\cf4 :(NSArray < \f2\b \cf8 id \f0\b0 \cf4 > *)datas; \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \cf2 // if (datas.count == 0) \{\cf4 \ \cf2 // return;\cf4 \ \cf2 // \}\cf4 \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i = \cf7 0\cf4 ; i < datas.count; i++) \{\ \f2\b \cf8 BOOL \f0\b0 \cf4 isGif = [datas[i] isKindOfClass:[NSData \f2\b \cf8 class \f0\b0 \cf4 ]];\ \ \f2\b \cf8 if \f0\b0 \cf4 (isGif) \{\ \cf2 // GIF\cf4 \ NSString *file = [FileInfo getUUIDFileName:\cf6 @"gif"\cf4 ];\ [g_server saveDataToFile:datas[i] file:file];\ [ \f2\b \cf8 self \f0\b0 \cf4 sendImage:file withWidth:\cf7 0\cf4 andHeight:\cf7 0\cf4 userId: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // \f1 \'c6\'d5\'cd\'a8\'cd\'bc\'c6\'ac \f0 \cf4 \ UIImage *chosedImage = datas[i];\ \cf2 // \f1 \'bb\'f1\'c8\'a1 \f0 image \f1 \'b5\'c4\'b3\'a4\'bf\'ed \f0 \cf4 \ \f2\b \cf8 int \f0\b0 \cf4 imageWidth = chosedImage.size.width;\ \f2\b \cf8 int \f0\b0 \cf4 imageHeight = chosedImage.size.height;\ NSString *name = \cf6 @"jpg"\cf4 ;\ NSString *file = [FileInfo getUUIDFileName:name];\ [g_server saveImageToFile:chosedImage file:file isOriginal: \f2\b \cf8 YES \f0\b0 \cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 sendImage:file withWidth:imageWidth andHeight:imageHeight userId: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \}\ \}\ \}\ \ \cf5 #pragma mark \f2\b \cf16 - \f4 \'b7\'a2\'cb\'cd\'ca\'d3\'c6\'b5 \f0\b0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 photosViewController\cf4 :(UIViewController *)viewController \cf11 media\cf4 :(JXMediaObject *)media \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \cf2 // for (NSInteger i = 0; i < self.userIds.count; i ++) \{\cf4 \ \cf2 // NSString *userId = self.userIds[i];\cf4 \ \cf2 //\cf4 \ \cf2 // [self sendMedia:media userId:userId];\cf4 \ \cf12 /// \f3 \cf2 / [g_server uploadFile:media.fileName validTime:self.chatPerson.chatRecordTimeOut messageId:self.curMessageId toView:self]; \f0 \cf4 \ \cf2 // \}\cf4 \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 sendMedia:media userId: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf2 // [g_server uploadFile:media.fileName validTime:self.chatPerson.chatRecordTimeOut messageId:self.curMessageId toView:self];\cf4 \ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 photosViewController\cf4 :(UIViewController *)viewController \cf11 imageAndVideos\cf4 :(NSDictionary *)imageAndVideosDic\{\ \f2\b \cf8 if \f0\b0 \cf4 (! \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ NSArray *imageArr = [imageAndVideosDic objectForKey:\cf6 @"images"\cf4 ];\ NSArray *mediaArr = [imageAndVideosDic objectForKey:\cf6 @"videos"\cf4 ];\ NSInteger num = imageArr.count + mediaArr.count;\ [ \f2\b \cf8 self \f0\b0 \cf4 addWaitGroupSendViewWithMsgNum:num withType:groupsend_msgType_imagesAndVideos];\ \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray = [NSMutableArray arrayWithArray:imageArr];\ [ \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray addObjectsFromArray:mediaArr];\ _onceSendNum = \cf7 20\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (imageArr.count + mediaArr.count > \cf7 1\cf4 ) \{\ _onceSendNum = \cf7 1\cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (mediaArr.count > \cf7 0\cf4 ) \{\ _onceSendNum = \cf7 1\cf4 ;\ \}\ \f2\b \cf8 self \f0\b0 \cf4 .imgsAndVideosDic = imageAndVideosDic;\ [ \f2\b \cf8 self \f0\b0 \cf4 sendImagesAndVideos:imageAndVideosDic];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendMedias\cf4 :(NSArray *)mediaArray \cf11 isSave\cf4 :( \f2\b \cf8 BOOL \f0\b0 \cf4 )isSave\{\ \f2\b \cf8 if \f0\b0 \cf4 (_isGroupSendCancel) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ NSString *userId = \f2\b \cf8 self \f0\b0 \cf4 .userIds[ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex];\ JXMediaObject *media = mediaArray.lastObject;\ [ \f2\b \cf8 self \f0\b0 \cf4 sendMedia:media userId:userId];\ \f2\b \cf8 if \f0\b0 \cf4 (isSave) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 saveVideo:media.fileName];\ \}\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex ++;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex < \f2\b \cf8 self \f0\b0 \cf4 .userIds.count) \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex % _onceSendNum == \cf7 0\cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 sendMedias:mediaArray isSave:isSave];\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .userIds)\{\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex = \cf7 0\cf4 ;\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendImagesAndVideos\cf4 :(NSDictionary *)imageAndVideosDic\{\ \f2\b \cf8 if \f0\b0 \cf4 (_isGroupSendCancel) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ NSString *userId = \f2\b \cf8 self \f0\b0 \cf4 .userIds[ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex];\ NSArray *imageArr = [imageAndVideosDic objectForKey:\cf6 @"images"\cf4 ];\ NSArray *mediaArr = [imageAndVideosDic objectForKey:\cf6 @"videos"\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (imageArr.count > \cf7 0\cf4 ) \{\ NSString *name = \cf6 @"jpg"\cf4 ;\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < imageArr.count; i++) \{\ \f2\b \cf8 BOOL \f0\b0 \cf4 isGif = [imageArr[i] isKindOfClass:[NSData \f2\b \cf8 class \f0\b0 \cf4 ]];\ \f2\b \cf8 if \f0\b0 \cf4 (isGif) \{\ NSString *file = [FileInfo getUUIDFileName:\cf6 @"gif"\cf4 ];\ [g_server saveDataToFile:imageArr[i] file:file];\ [ \f2\b \cf8 self \f0\b0 \cf4 sendImage:file withWidth:\cf7 0\cf4 andHeight:\cf7 0\cf4 userId: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ UIImage *chosedImage = imageArr[i];\ \f2\b \cf8 int \f0\b0 \cf4 imageWidth = chosedImage.size.width;\ \f2\b \cf8 int \f0\b0 \cf4 imageHeight = chosedImage.size.height;\ NSString *file = [FileInfo getUUIDFileName:name];\ [g_server saveImageToFile:chosedImage file:file isOriginal: \f2\b \cf8 YES \f0\b0 \cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 sendImage:file withWidth:imageWidth andHeight:imageHeight userId:userId];\ \}\ \}\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (mediaArr.count > \cf7 0\cf4 ) \{\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < mediaArr.count; i++) \{\ JXMediaObject *media = mediaArr[i];\ [ \f2\b \cf8 self \f0\b0 \cf4 sendMedia:media userId:userId];\ \}\ \}\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex ++;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex < \f2\b \cf8 self \f0\b0 \cf4 .userIds.count) \{\ \f2\b \cf8 if \f0\b0 \cf4 (_onceSendNum == \cf7 1\cf4 || \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex % _onceSendNum == \cf7 0\cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 sendImagesAndVideos:imageAndVideosDic];\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .userIds)\{\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex = \cf7 0\cf4 ;\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onCamera\cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 (![ \f2\b \cf8 self \f0\b0 \cf4 checkCameraLimits]) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 showDisableSay])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 sendMsgCheck])\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ JXCameraVC *vc = [[JXCameraVC alloc] init];\ vc.cameraDelegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 presentViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 completion: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ \cf2 // UIImagePickerController *imgPicker=[[UIImagePickerController alloc]init];\cf4 \ \cf2 // [imgPicker setSourceType:UIImagePickerControllerSourceTypeCamera];\cf4 \ \cf2 // [imgPicker setDelegate:self];\cf4 \ \cf2 // [imgPicker setAllowsEditing:NO];\cf4 \ \cf2 // // [g_App.window addSubview:imgPicker.view];\cf4 \ \cf2 //\cf4 \ \cf2 // [self presentViewController:imgPicker animated:YES completion:^\{\}];\cf4 \ \ \}\ \ \cf2 // \f1 \'b4\'c1\'d2\'bb\'b4\'c1\'b6\'af\'bb\'ad \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onShake\cf4 \{\ XLsn0wInputBox *inputBox = [[XLsn0wInputBox alloc] init];\ NSString *name = chatPerson.remarkName.length > \cf7 0\cf4 ? chatPerson.remarkName : chatPerson.userNickname;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid.length > \cf7 0\cf4 ) \{\ inputBox.title.text = [NSString stringWithFormat:\cf6 @" \f1 \'c4\'fa\'c8\'b7\'b6\'a8\'d2\'aa\'b4\'c1\'c8\'ba\'c4\'da\'cb\'f9\'d3\'d0\'c8\'cb\'c2\'f0 \f0 ?"\cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ inputBox.title.text = [NSString stringWithFormat:\cf6 @" \f1 \'c4\'fa\'d2\'aa\'b4\'c1 \f0 %@ \f1 \'c9\'cf\'cf\'df\'c2\'f0 \f0 ?"\cf4 ,name];\ \}\ inputBox.placeholder = \cf6 @" \f1 \'cc\'ee\'d0\'b4 \f0 \\" \f1 \'d5\'f0 \f0 \\" \f1 \'c4\'da\'c8\'dd\'bb\'f2\'b5\'e3\'bb\'f7 \f0 \\" \f1 \'c8\'b7\'b6\'a8 \f0 \\" \f1 \'d6\'b1\'bd\'d3\'d5\'f0 \f0 "\cf4 ;\ [inputBox confirmBtnClickBlock:^(NSString *inputString) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 showShakeMessage:inputString];\ \}];\ [inputBox show];\ \}\ \cf2 // \f1 \'c1\'c4\'cc\'ec\'b4\'c1\'d2\'bb\'b4\'c1 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 showShakeMessage\cf4 :(NSString *)message \{\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 showDisableSay])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 sendMsgCheck])\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid.length > \cf7 0\cf4 ) \{\ \cf2 // [JXMyTools showTipView:@" \f1 \'c8\'ba\'d7\'e9\'d4\'dd\'b2\'bb\'d6\'a7\'b3\'d6\'b8\'c3\'b9\'a6\'c4\'dc\'a3\'a1 \f0 "];\cf4 \ \cf2 // return;\cf4 \ \ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 if \f0\b0 \cf4 (_isGroupSendCancel) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex == \cf7 0\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 addWaitGroupSendViewWithMsgNum:\cf7 1\cf4 withType:groupsend_msgType_shake];\ _onceSendNum = \cf7 20\cf4 ;\ \}\ \}\ \ NSString *userId = \f2\b \cf8 self \f0\b0 \cf4 .userIds[ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex];\ \cf2 // NSString *userName = self.userNames[self.groupMessagesIndex];\cf4 \ JXMessageObject *msg=[[JXMessageObject alloc]init];\ msg.timeSend = [NSDate date];\ msg.fromUserId = MY_USER_ID;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\{\ msg.toUserId = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ msg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.fromUserName = _userNickName;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ msg.toUserId = userId;\ msg.isGroupSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex + \cf7 1\cf4 ) % _onceSendNum == \cf7 0\cf4 ) \{\ msg.isLastGroupSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.toUserId = chatPerson.userId;\ \}\ msg.isGroup = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ msg.content = message;\ msg.type = [NSNumber numberWithInt:kWCMessageTypeShake];\ msg.isSend = [NSNumber numberWithInt:transfer_status_ing];\ msg.isRead = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.isReadDel = [NSNumber numberWithInt: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (_useInfoTempChat==\cf7 11\cf4 ) \{\ \ msg.tempChat = \cf7 11\cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \ \{\ \ msg.tempChat = \cf7 1\cf4 ;\ \}\ \cf2 // \f1 \'b7\'a2\'cd\'f9\'c4\'c4\'c0\'ef \f0 \cf4 \ [msg insert: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\ [g_xmpp sendMessage:msg roomName: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ _groupSendType = groupsend_msgType_shake;\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex ++;\ \f2\b \cf8 if \f0\b0 \cf4 (msg.isLastGroupSend) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex < \f2\b \cf8 self \f0\b0 \cf4 .userIds.count) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 onShake];\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .userIds)\{\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex = \cf7 0\cf4 ;\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \}\ \ \cf2 // \f1 \'b7\'a2\'cb\'cd\'ca\'d5\'b2\'d8 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onCollection\cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 showDisableSay])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 sendMsgCheck])\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ WeiboViewControlle * collection = [[WeiboViewControlle alloc] initCollection];\ collection.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ collection.isSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [g_navigation pushViewController:collection animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ \cf2 // \f1 \'b7\'a2\'cb\'cd\'ca\'d6\'bb\'fa\'c1\'aa\'cf\'b5\'c8\'cb \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onAddressBook\cf4 \{\ JXSelectAddressBookVC *vc = [[JXSelectAddressBookVC alloc] init];\ vc.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ \cf2 // \f1 \'c8\'ba\'d6\'fa\'ca\'d6 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onGroupHelper\cf4 \{\ [g_server queryGroupHelper: \f2\b \cf8 self \f0\b0 \cf4 .roomId toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \ \cf2 // \f1 \'cc\'f8\'d7\'aa\'c8\'ba\'d6\'fa\'ca\'d6\'c1\'d0\'b1\'ed \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onGroupHelperList\cf4 \{\ JXGroupHelperListVC *vc = [[JXGroupHelperListVC alloc] init];\ vc.roomJid = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ vc.roomId = \f2\b \cf8 self \f0\b0 \cf4 .roomId;\ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 selectAddressBookVC\cf4 :(JXSelectAddressBookVC *)selectVC \cf11 doneAction\cf4 :(NSArray *)array \{\ \ NSString *userId = \f2\b \cf8 self \f0\b0 \cf4 .userIds[ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex];\ \cf2 // NSString *userName = self.userNames[self.groupMessagesIndex];\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 if \f0\b0 \cf4 (_isGroupSendCancel) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex == \cf7 0\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 addWaitGroupSendViewWithMsgNum:array.count withType:groupsend_msgType_addressbook];\ _onceSendNum = \cf7 20\cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .groupSendMsgArray = [NSMutableArray arrayWithArray:array];\ \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray = [NSMutableArray arrayWithObject:selectVC];\ \}\ \}\ \ \f2\b \cf8 BOOL \f0\b0 \cf4 isLastGroupSend = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ;i < array.count;i++)\{\ JXAddressBook *address = array[i];\ \ JXMessageObject *msg=[[JXMessageObject alloc]init];\ msg.timeSend = [NSDate date];\ msg.fromUserId = MY_USER_ID;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\{\ msg.toUserId = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ msg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.fromUserName = _userNickName;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ msg.toUserId = userId;\ msg.isGroupSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex + \cf7 1\cf4 ) % _onceSendNum == \cf7 0\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 (i == array.count - \cf7 1\cf4 ) \{\ msg.isLastGroupSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ isLastGroupSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.toUserId = chatPerson.userId;\ \}\ msg.isGroup = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ msg.content = [NSString stringWithFormat:\cf6 @"%@\\n%@"\cf4 , address.addressBookName, address.toTelephone];\ msg.type = [NSNumber numberWithInt:kWCMessageTypeText];\ msg.isSend = [NSNumber numberWithInt:transfer_status_ing];\ msg.isRead = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.isReadDel = [NSNumber numberWithInt: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \ [msg insert: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\ \ \f2\b \cf8 if \f0\b0 \cf4 (_useInfoTempChat==\cf7 11\cf4 ) \{\ \ msg.tempChat = \cf7 11\cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \ \{\ \ msg.tempChat = \cf7 1\cf4 ;\ \}\ [g_xmpp sendMessage:msg roomName: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ _groupSendType = groupsend_msgType_addressbook;\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex ++;\ \f2\b \cf8 if \f0\b0 \cf4 (isLastGroupSend) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex < \f2\b \cf8 self \f0\b0 \cf4 .userIds.count) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 selectAddressBookVC:selectVC doneAction:array];\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .userIds)\{\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex = \cf7 0\cf4 ;\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 ) \cf11 weiboVC\cf4 :(WeiboViewControlle *)weiboVC \cf11 didSelectWithData\cf4 :(WeiboData *)data \{\ \f2\b \cf8 if \f0\b0 \cf4 (data.type == \cf7 1\cf4 ) \{\ \ NSString *userId = \f2\b \cf8 self \f0\b0 \cf4 .userIds[ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex];\ \cf2 // NSString *userName = self.userNames[self.groupMessagesIndex];\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 if \f0\b0 \cf4 (_isGroupSendCancel) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex == \cf7 0\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 addWaitGroupSendViewWithMsgNum:\cf7 1\cf4 withType:groupsend_msgType_collect];\ \f2\b \cf8 self \f0\b0 \cf4 .groupSendMsgArray = [NSMutableArray arrayWithObject:data];\ _onceSendNum = \cf7 20\cf4 ;\ \}\ \}\ \ JXMessageObject *msg=[[JXMessageObject alloc]init];\ msg.timeSend = [NSDate date];\ msg.fromUserId = MY_USER_ID;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\{\ msg.toUserId = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ msg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.fromUserName = _userNickName;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ msg.toUserId = userId;\ msg.isGroupSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex % _onceSendNum == \cf7 0\cf4 ) \{\ msg.isLastGroupSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.toUserId = chatPerson.userId;\ \}\ msg.isGroup = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ msg.content = data.content;\ msg.type = [NSNumber numberWithInt:kWCMessageTypeText];\ msg.isSend = [NSNumber numberWithInt:transfer_status_ing];\ msg.isRead = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.isReadDel = [NSNumber numberWithInt: \f2\b \cf8 self \f0\b0 \cf4 .isReadDelete];\ \ \cf2 // \f1 \'b7\'a2\'cd\'f9\'c4\'c4\'c0\'ef \f0 \cf4 \ [msg insert: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\ \ \f2\b \cf8 if \f0\b0 \cf4 (_useInfoTempChat==\cf7 11\cf4 ) \{\ \ msg.tempChat = \cf7 11\cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \ \{\ \ msg.tempChat = \cf7 1\cf4 ;\ \}\ \ [g_xmpp sendMessage:msg roomName: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex ++;\ \f2\b \cf8 if \f0\b0 \cf4 (msg.isLastGroupSend) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex < \f2\b \cf8 self \f0\b0 \cf4 .userIds.count) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 weiboVC:weiboVC didSelectWithData:data];\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .userIds)\{\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex = \cf7 0\cf4 ;\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ NSString *url;\ NSMutableArray *imgArr = [NSMutableArray array];\ \f2\b \cf8 switch \f0\b0 \cf4 (data.type) \{\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 2\cf4 :\{\ \f2\b \cf8 for \f0\b0 \cf4 (ObjUrlData *dict \f2\b \cf8 in \f0\b0 \cf4 data.larges) \{\ NSString *imgUrl = dict.url;\ [imgArr addObject:imgUrl];\ \}\ \cf2 // url = ((ObjUrlData *)data.larges.firstObject).url;\cf4 \ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 3\cf4 :\ url = ((ObjUrlData *)data.audios.firstObject).url;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 4\cf4 :\ url = ((ObjUrlData *)data.videos.firstObject).url;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 5\cf4 :\ url = ((ObjUrlData *)data.files.firstObject).url;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \ \f2\b \cf8 default \f0\b0 \cf4 :\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ _collectionData = data;\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 if \f0\b0 \cf4 (_isGroupSendCancel) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ NSInteger i = \cf7 0\cf4 ;\ NSMutableArray *allArray = [NSMutableArray array];\ \f2\b \cf8 if \f0\b0 \cf4 (data.content && data.content.length > \cf7 0\cf4 ) \{\ i = i + \cf7 1\cf4 ;\ [allArray addObject:data.content];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (imgArr.count > \cf7 0\cf4 ) \{\ i = i + imgArr.count;\ [allArray addObjectsFromArray:imgArr];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ i = i + \cf7 1\cf4 ;\ \}\ [ \f2\b \cf8 self \f0\b0 \cf4 addWaitGroupSendViewWithMsgNum:i withType:groupsend_msgType_collect];\ _onceSendNum = \cf7 20\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (imgArr.count > \cf7 0\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .groupSendMsgArray = allArray;\ [ \f2\b \cf8 self \f0\b0 \cf4 collectionMsgSendAll:allArray];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ [g_server uploadCopyFileServlet:url validTime:g_config.fileValidTime toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ \cf2 // \f1 \'c8\'e7\'b9\'fb\'ca\'d5\'b2\'d8\'b5\'c4\'ce\'c4\'bc\'fe\'d3\'d0\'ce\'c4\'b1\'be\'a3\'ac\'cf\'c8\'b7\'a2\'cb\'cd\'ce\'c4\'b1\'be\'cf\'fb\'cf\'a2 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (data.content && data.content.length > \cf7 0\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 collectionMsgSend:data.content isFile: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (imgArr.count > \cf7 0\cf4 ) \{\ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i = \cf7 0\cf4 ; i < imgArr.count; i++ ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 collectionMsgSend:imgArr[i] isFile: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [g_server uploadCopyFileServlet:url validTime:g_config.fileValidTime toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \}\ \}\ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 collectionMsgSendAll\cf4 :(NSArray *)allArray\{\ \f2\b \cf8 if \f0\b0 \cf4 (_isGroupSendCancel) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ NSString *userId = \f2\b \cf8 self \f0\b0 \cf4 .userIds[ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex];\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < allArray.count; i++) \{\ NSString *content = allArray[i];\ \f2\b \cf8 if \f0\b0 \cf4 (i == \cf7 0\cf4 && _collectionData.content && _collectionData.content.length > \cf7 0\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 collectionMsgSendOne:content withUserId:userId isText: \f2\b \cf8 YES \f0\b0 \cf4 isLast: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 (( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex+\cf7 1\cf4 ) % _onceSendNum == \cf7 0\cf4 && i == allArray.count - \cf7 1\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 collectionMsgSendOne:content withUserId:userId isText: \f2\b \cf8 NO \f0\b0 \cf4 isLast: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 collectionMsgSendOne:content withUserId:userId isText: \f2\b \cf8 NO \f0\b0 \cf4 isLast: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \}\ \}\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex ++;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex < \f2\b \cf8 self \f0\b0 \cf4 .userIds.count) \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex % _onceSendNum == \cf7 0\cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 collectionMsgSendAll:allArray];\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .userIds)\{\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex = \cf7 0\cf4 ;\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 collectionMsgSendOne\cf4 :(NSString *)content \cf11 withUserId\cf4 :(NSString *)userId \cf11 isText\cf4 :( \f2\b \cf8 BOOL \f0\b0 \cf4 )isText \cf11 isLast\cf4 :( \f2\b \cf8 BOOL \f0\b0 \cf4 )isLast\{\ \ JXMessageObject *msg = [[JXMessageObject alloc]init];\ msg.timeSend = [NSDate date];\ msg.fromUserId = MY_USER_ID;\ msg.toUserId = userId;\ msg.isGroupSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.isLastGroupSend = isLast;\ msg.isGroup = \f2\b \cf8 NO \f0\b0 \cf4 ;\ msg.content = content;\ msg.isSend = [NSNumber numberWithInt:transfer_status_ing];\ msg.isRead = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.isReadDel = [NSNumber numberWithInt: \f2\b \cf8 self \f0\b0 \cf4 .isReadDelete];\ \f2\b \cf8 if \f0\b0 \cf4 (isText) \{\ msg.type = [NSNumber numberWithInt:kWCMessageTypeText];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 switch \f0\b0 \cf4 (_collectionData.type) \{\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 2\cf4 :\ msg.type = [NSNumber numberWithInt:kWCMessageTypeImage];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 3\cf4 :\{\ msg.type = [NSNumber numberWithInt:kWCMessageTypeVoice];\ ObjUrlData *obj = _collectionData.audios.firstObject;\ msg.timeLen = obj.timeLen;\ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 4\cf4 :\ msg.type = [NSNumber numberWithInt:kWCMessageTypeVideo];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 5\cf4 :\{\ msg.fileName = ((ObjUrlData *)_collectionData.files.firstObject).name;\ msg.type = [NSNumber numberWithInt:kWCMessageTypeFile];\ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \ \f2\b \cf8 default \f0\b0 \cf4 :\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \ \cf2 // \f1 \'b7\'a2\'cd\'f9\'c4\'c4\'c0\'ef \f0 \cf4 \ [msg insert: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\ \ \f2\b \cf8 if \f0\b0 \cf4 (_useInfoTempChat==\cf7 11\cf4 ) \{\ \ msg.tempChat = \cf7 11\cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \ \{\ \ msg.tempChat = \cf7 1\cf4 ;\ \}\ [g_xmpp sendMessage:msg roomName: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 cameraVC\cf4 :(JXCameraVC *)vc \cf11 didFinishWithImage\cf4 :(UIImage *)image \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \cf2 // \f1 \'bb\'f1\'c8\'a1 \f0 image \f1 \'b5\'c4\'b3\'a4\'bf\'ed \f0 \cf4 \ \f2\b \cf8 int \f0\b0 \cf4 imageWidth = image.size.width;\ \f2\b \cf8 int \f0\b0 \cf4 imageHeight = image.size.height;\ \ \f2\b \cf8 self \f0\b0 \cf4 .view.frame = CGRectMake(\cf7 0\cf4 , \cf7 0\cf4 , JX_SCREEN_WIDTH, JX_SCREEN_HEIGHT);\ NSString *name = \cf6 @"jpg"\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \cf2 // for (NSInteger i = 0; i < self.userIds.count; i ++) \{\cf4 \ \cf2 // NSString *userId = self.userIds[i];\cf4 \ \cf2 //\cf4 \ \cf2 // NSString *file = [FileInfo getUUIDFileName:name];\cf4 \ \cf2 // [g_server saveImageToFile:image file:file isOriginal:NO];\cf4 \ \cf2 // [self sendImage:file withWidth:imageWidth andHeight:imageHeight userId:userId];\cf4 \ \cf12 /// \f3 \cf2 / [g_server uploadFile:file validTime:self.chatPerson.chatRecordTimeOut messageId:nil toView:self]; \f0 \cf4 \ \cf2 // \}\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 addWaitGroupSendViewWithMsgNum:\cf7 1\cf4 withType:groupsend_msgType_image];\ \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray = [NSMutableArray arrayWithObject:image];\ _onceSendNum = \cf7 10\cf4 ;\ _isOriginal = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 sendPhotos: \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray withOriginal: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ NSString *file = [FileInfo getUUIDFileName:name];\ [g_server saveImageToFile:image file:file isOriginal: \f2\b \cf8 NO \f0\b0 \cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 sendImage:file withWidth:imageWidth andHeight:imageHeight userId: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf2 // [g_server uploadFile:file validTime:self.chatPerson.chatRecordTimeOut messageId:nil toView:self];\cf4 \ \}\ \ \cf2 // NSString* file = [FileInfo getUUIDFileName:name];\cf4 \ \cf2 //\cf4 \ \cf2 // [g_server saveImageToFile:image file:file isOriginal:NO];\cf4 \ \cf12 /// \f3 \cf2 / [self sendImage:file withWidth:imageWidth andHeight:imageHeight]; \f0 \cf4 \ \cf2 // [g_server uploadFile:file validTime:self.chatPerson.chatRecordTimeOut toView:self];\cf4 \ \}\ \ \cf5 #pragma mark \f2\b \cf16 ---------- \f4 \'cd\'bc\'c6\'ac\'d1\'a1\'d4\'f1\'cd\'ea\'b3\'c9 \f2 ------------- \f0\b0 \cf4 \ \cf2 //UIImagePickerController \f1 \'b4\'fa\'c0\'ed\'b7\'bd\'b7\'a8 \f0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 imagePickerController\cf4 :(UIImagePickerController *)picker \cf11 didFinishPickingMediaWithInfo\cf4 :(NSDictionary *)info\ \{\ UIImage * chosedImage=[info objectForKey:\cf6 @"UIImagePickerControllerOriginalImage"\cf4 ];\ \cf2 // \f1 \'bb\'f1\'c8\'a1 \f0 image \f1 \'b5\'c4\'b3\'a4\'bf\'ed \f0 \cf4 \ \f2\b \cf8 int \f0\b0 \cf4 imageWidth = chosedImage.size.width;\ \f2\b \cf8 int \f0\b0 \cf4 imageHeight = chosedImage.size.height;\ [ \f2\b \cf8 self \f0\b0 \cf4 dismissViewControllerAnimated: \f2\b \cf8 NO \f0\b0 \cf4 completion:^\{\ \f2\b \cf8 self \f0\b0 \cf4 .view.frame = CGRectMake(\cf7 0\cf4 , \cf7 0\cf4 , JX_SCREEN_WIDTH, JX_SCREEN_HEIGHT);\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \ NSURL *url = [info objectForKey:\cf6 @"UIImagePickerControllerReferenceURL"\cf4 ];\ NSString *urlStr = [url absoluteString];\ NSString *name = [urlStr substringFromIndex:urlStr.length - \cf7 3\cf4 ];\ name = [name lowercaseString];\ \ NSString* file = [FileInfo getUUIDFileName:name];\ \ \ \f2\b \cf8 if \f0\b0 \cf4 ([name isEqualToString:\cf6 @"gif"\cf4 ]) \{ \cf2 // gif \f1 \'b2\'bb\'c4\'dc\'b0\'b4\'d5\'d5 \f0 image \f1 \'c8\'a1 \f0 data \f1 \'b4\'e6\'b4\'a2 \f0 \cf4 \ ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];\ \ \f2\b \cf8 void \f0\b0 \cf4 (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *) = ^(ALAsset *asset) \{\ \ \f2\b \cf8 if \f0\b0 \cf4 (asset != \f2\b \cf8 nil \f0\b0 \cf4 ) \{\ \ ALAssetRepresentation *rep = [asset defaultRepresentation];\ Byte *imageBuffer = (Byte*)malloc(rep.size);\ NSUInteger bufferSize = [rep getBytes:imageBuffer fromOffset:\cf7 0.0\cf4 length:rep.size error: \f2\b \cf8 nil \f0\b0 \cf4 ];\ NSData *imageData = [NSData dataWithBytesNoCopy:imageBuffer length:bufferSize freeWhenDone: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < \f2\b \cf8 self \f0\b0 \cf4 .userIds.count; i ++) \{\ NSString *userId = \f2\b \cf8 self \f0\b0 \cf4 .userIds[i];\ \ NSString *file = [FileInfo getUUIDFileName:name];\ [g_server saveDataToFile:imageData file:file];\ [ \f2\b \cf8 self \f0\b0 \cf4 sendImage:file withWidth:imageWidth andHeight:imageHeight userId:userId];\ \cf2 // [g_server uploadFile:file validTime:self.chatPerson.chatRecordTimeOut messageId:nil toView:self];\cf4 \ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ NSString *file = [FileInfo getUUIDFileName:name];\ [g_server saveDataToFile:imageData file:file];\ [ \f2\b \cf8 self \f0\b0 \cf4 sendImage:file withWidth:imageWidth andHeight:imageHeight userId: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf2 // [g_server uploadFile:file validTime:self.chatPerson.chatRecordTimeOut messageId:nil toView:self];\cf4 \ \}\ \cf2 // [g_server saveDataToFile:imageData file:file];\cf4 \ \cf12 /// \f3 \cf2 / [self sendImage:file withWidth:imageWidth andHeight:imageHeight]; \f0 \cf4 \ \cf2 // [g_server uploadFile:file validTime:self.chatPerson.chatRecordTimeOut toView:self];\cf4 \ \ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ \}\ \};\ \ [assetLibrary assetForURL:url\ resultBlock:ALAssetsLibraryAssetForURLResultBlock\ failureBlock:^(NSError *error) \{\ \ \}];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ name = \cf6 @"jpg"\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \cf2 // for (NSInteger i = 0; i < self.userIds.count; i ++) \{\cf4 \ \cf2 // NSString *userId = self.userIds[i];\cf4 \ \cf2 //\cf4 \ \cf2 // NSString *file = [FileInfo getUUIDFileName:name];\cf4 \ \cf2 // [g_server saveImageToFile:chosedImage file:file isOriginal:NO];\cf4 \ \cf2 // [self sendImage:file withWidth:imageWidth andHeight:imageHeight userId:userId];\cf4 \ \cf12 /// \f3 \cf2 / [g_server uploadFile:file validTime:self.chatPerson.chatRecordTimeOut messageId:nil toView:self]; \f0 \cf4 \ \cf2 // \}\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 addWaitGroupSendViewWithMsgNum:\cf7 1\cf4 withType:groupsend_msgType_image];\ \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray = [NSMutableArray arrayWithObject:chosedImage];\ _onceSendNum = \cf7 10\cf4 ;\ _isOriginal = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 sendPhotos: \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray withOriginal: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ NSString *file = [FileInfo getUUIDFileName:name];\ [g_server saveImageToFile:chosedImage file:file isOriginal: \f2\b \cf8 NO \f0\b0 \cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 sendImage:file withWidth:imageWidth andHeight:imageHeight userId: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf2 // [g_server uploadFile:file validTime:self.chatPerson.chatRecordTimeOut messageId:nil toView:self];\cf4 \ \}\ \cf2 // file = [FileInfo getUUIDFileName:name];\cf4 \ \cf2 // [g_server saveImageToFile:chosedImage file:file isOriginal:NO];\cf4 \ \cf12 /// \f3 \cf2 / [self sendImage:file withWidth:imageWidth andHeight:imageHeight]; \f0 \cf4 \ \cf2 // [g_server uploadFile:file validTime:self.chatPerson.chatRecordTimeOut toView:self];\cf4 \ \}\ \ \ \cf2 // [picker release];\cf4 \ \}];\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 imagePickerControllerDidCancel\cf4 :(UIImagePickerController *)picker\ \{\ [ \f2\b \cf8 self \f0\b0 \cf4 dismissViewControllerAnimated: \f2\b \cf8 NO \f0\b0 \cf4 completion:^\{\ \f2\b \cf8 self \f0\b0 \cf4 .view.frame = CGRectMake(\cf7 0\cf4 , \cf7 0\cf4 , JX_SCREEN_WIDTH, JX_SCREEN_HEIGHT);\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \cf2 // [picker release];\cf4 \ \}];\ \}\ \ \cf5 #pragma mark \f2\b \cf16 - \f4 \'c2\'bc\'d6\'c6\'d3\'ef\'d2\'f4 \f0\b0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 recordStart\cf4 :(UIButton *)sender \{\ NSLog(\cf6 @"recordStart-------"\cf4 );\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 showDisableSay])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (recording)\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 sendMsgCheck])\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (![ \f2\b \cf8 self \f0\b0 \cf4 canRecord]) \{\ [g_App showAlert:Localized(\cf6 @"JX_CanNotOpenMicr"\cf4 )];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \cf2 // _recordBtn.layer.borderColor = [[UIColor blueColor] CGColor];\cf4 \ _recordBtn.backgroundColor = HEXCOLOR(\cf7 0xB8B9BD\cf4 );\ \ [g_notify postNotificationName:kAllAudioPlayerPauseNotifaction object: \f2\b \cf8 self \f0\b0 \cf4 userInfo: \f2\b \cf8 nil \f0\b0 \cf4 ];\ [g_notify postNotificationName:kAllVideoPlayerPauseNotifaction object: \f2\b \cf8 self \f0\b0 \cf4 userInfo: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ recording= \f2\b \cf8 YES \f0\b0 \cf4 ;\ \ NSDictionary *settings=[NSDictionary dictionaryWithObjectsAndKeys:\ [NSNumber numberWithFloat:\cf7 8000\cf4 ],AVSampleRateKey,\ [NSNumber numberWithInt:kAudioFormatLinearPCM],AVFormatIDKey,\ [NSNumber numberWithInt:\cf7 1\cf4 ],AVNumberOfChannelsKey,\ [NSNumber numberWithInt:\cf7 16\cf4 ],AVLinearPCMBitDepthKey,\ [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ],AVLinearPCMIsBigEndianKey,\ [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ],AVLinearPCMIsFloatKey,\ \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ NSError *error;\ [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error: &error];\ [[AVAudioSession sharedInstance] setActive: \f2\b \cf8 YES \f0\b0 \cf4 error:&error];\ \ NSURL *url = [NSURL fileURLWithPath:[FileInfo getUUIDFileName:\cf6 @"wav"\cf4 ]];\ pathURL = url;\ \ audioRecorder = [[AVAudioRecorder alloc] initWithURL:pathURL settings:settings error:&error];\ audioRecorder.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ \ peakTimer = [NSTimer scheduledTimerWithTimeInterval:\cf7 0.01\cf4 target: \f2\b \cf8 self \f0\b0 \cf4 selector: \f2\b \cf8 @selector \f0\b0 \cf4 (updatePeak:) userInfo: \f2\b \cf8 nil \f0\b0 \cf4 repeats: \f2\b \cf8 YES \f0\b0 \cf4 ];\ [peakTimer fire];\ \f2\b \cf8 BOOL \f0\b0 \cf4 flag = \f2\b \cf8 NO \f0\b0 \cf4 ;\ flag = [audioRecorder prepareToRecord];\ [audioRecorder setMeteringEnabled: \f2\b \cf8 YES \f0\b0 \cf4 ];\ flag = [audioRecorder peakPowerForChannel:\cf7 1\cf4 ];\ flag = [audioRecorder record];\ \ _voice.center = \f2\b \cf8 self \f0\b0 \cf4 .view.center;\ [_voice show];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 updatePeak\cf4 :(NSTimer*)timer\ \{\ _timeLen = audioRecorder.currentTime;\ \f2\b \cf8 if \f0\b0 \cf4 (_timeLen>=\cf7 60\cf4 )\ [ \f2\b \cf8 self \f0\b0 \cf4 recordStop: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ [audioRecorder updateMeters];\ \f2\b \cf8 const \f0\b0 \cf4 \f2\b \cf8 double \f0\b0 \cf4 alpha=\cf7 0.5\cf4 ;\ NSLog(\cf6 @"peakPowerForChannel = %f,%f"\cf4 , [audioRecorder peakPowerForChannel:\cf7 0\cf4 ],[audioRecorder peakPowerForChannel:\cf7 1\cf4 ]);\ \f2\b \cf8 double \f0\b0 \cf4 peakPowerForChannel=pow(\cf7 10\cf4 , (\cf7 0.05\cf4 )*[audioRecorder peakPowerForChannel:\cf7 0\cf4 ]);\ lowPassResults=alpha*peakPowerForChannel+(\cf7 1.0\cf4 -alpha)*lowPassResults;\ _voice.volume = lowPassResults;\ \ \cf2 /* for (int i=1; i<8; i++) \{\cf4 \ \cf2 if (lowPassResults>1.0/7.0*i)\{\cf4 \ \cf2 [[talkView viewWithTag:i] setHidden:NO];\cf4 \ \cf2 \}else\{\cf4 \ \cf2 [[talkView viewWithTag:i] setHidden:YES];\cf4 \ \cf2 \}\cf4 \ \cf2 \}*/\cf4 \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 recordStop\cf4 :(UIButton *)sender \{\ \ [_voice hide];\ [peakTimer invalidate];\ peakTimer = \f2\b \cf8 nil \f0\b0 \cf4 ;\ recording = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \ \cf2 // if(!recording)\cf4 \ \cf2 // return;\cf4 \ \ _recordBtn.layer.borderColor = [[UIColor grayColor] CGColor];\ _recordBtn.backgroundColor = HEXCOLOR(\cf7 0xFEFEFE\cf4 );\ _timeLen = audioRecorder.currentTime;\ [audioRecorder pause];\ [audioRecorder stop];\ \cf2 // [audioRecorder release];\cf4 \ \cf2 // if (_timeLen<1) \{\cf4 \ \cf2 // [g_App showAlert:@" \f1 \'c2\'bc\'b5\'c4\'ca\'b1\'bc\'e4\'b9\'fd\'b6\'cc \f0 \cf4 \ \cf2 // "];\cf4 \ \cf2 // return;\cf4 \ \cf2 // \}\cf4 \ \ \f2\b \cf8 if \f0\b0 \cf4 (_timeLen<\cf7 1\cf4 )\ _timeLen = \cf7 1\cf4 ;\ NSString *amrPath = [VoiceConverter wavToAmr:pathURL.path];\ [[ChatCacheFileUtil sharedInstance] deleteWithContentPath:pathURL.path];\ _lastRecordFile = [[amrPath lastPathComponent] copy];\ \ \cf2 // NSLog(@" \f1 \'d2\'f4\'c6\'b5\'ce\'c4\'bc\'fe\'c2\'b7\'be\'b6 \f0 :%@\\n%@",pathURL.path,amrPath);\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (amrPath == \f2\b \cf8 nil \f0\b0 \cf4 )\{\ \cf2 // [g_App showAlert:Localized(@"JXChatVC_TimeLess")];\cf4 \ [g_server showMsg:Localized(\cf6 @"JXChatVC_TimeLess"\cf4 ) delay:\cf7 1.0\cf4 ];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \cf2 // for (NSInteger i = 0; i < self.userIds.count; i ++) \{\cf4 \ \cf2 // NSString *userId = self.userIds[i];\cf4 \ \cf2 //\cf4 \ \cf2 // [self sendVoice:amrPath userId:userId];\cf4 \ \cf2 // [g_server uploadFile:amrPath validTime:self.chatPerson.chatRecordTimeOut messageId:nil toView:self];\cf4 \ \cf2 // \}\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 addWaitGroupSendViewWithMsgNum:\cf7 1\cf4 withType:groupsend_msgType_audio];\ _onceSendNum = \cf7 15\cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray = [NSMutableArray arrayWithObject:amrPath];\ [ \f2\b \cf8 self \f0\b0 \cf4 sendVoices: \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 sendVoice:amrPath userId: \f2\b \cf8 nil \f0\b0 \cf4 ];\ [g_server uploadFile:amrPath validTime: \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.chatRecordTimeOut messageId: \f2\b \cf8 nil \f0\b0 \cf4 toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendVoices\cf4 :(NSArray *)voicesArray\{\ NSString *userId = \f2\b \cf8 self \f0\b0 \cf4 .userIds[ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex];\ NSString *amrPath = voicesArray.lastObject;\ [ \f2\b \cf8 self \f0\b0 \cf4 sendVoice:amrPath userId:userId];\ [g_server uploadFile:amrPath validTime: \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.chatRecordTimeOut messageId: \f2\b \cf8 nil \f0\b0 \cf4 toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex ++;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex < \f2\b \cf8 self \f0\b0 \cf4 .userIds.count) \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex % _onceSendNum == \cf7 0\cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 sendVoices:voicesArray];\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .userIds)\{\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex = \cf7 0\cf4 ;\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 audioRecorderDidFinishRecording\cf4 :(\cf10 AVAudioRecorder\cf4 *)recorder \cf11 successfully\cf4 :( \f2\b \cf8 BOOL \f0\b0 \cf4 )flag\{\ [\cf15 _voice\cf4 \cf15 hide\cf4 ];\ [\cf15 peakTimer\cf4 \cf14 invalidate\cf4 ];\ \cf15 peakTimer\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \cf15 recording\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 recordCancel\cf4 :(\cf10 UIButton\cf4 *)sender\ \{\ \f2\b \cf8 if \f0\b0 \cf4 (!\cf15 recording\cf4 )\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \cf15 _recordBtn\cf4 .\cf14 layer\cf4 .\cf14 borderColor\cf4 = [[\cf10 UIColor\cf4 \cf14 grayColor\cf4 ] \cf14 CGColor\cf4 ];\ \cf15 _recordBtn\cf4 .\cf14 backgroundColor\cf4 = \cf5 HEXCOLOR\cf4 (\cf7 0xFEFEFE\cf4 );\ [\cf15 audioRecorder\cf4 \cf14 stop\cf4 ];\ \cf15 audioRecorder\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ [[\cf9 ChatCacheFileUtil\cf4 \cf15 sharedInstance\cf4 ] \cf15 deleteWithContentPath\cf4 :\cf15 pathURL\cf4 .\cf14 path\cf4 ];\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendVoice\cf4 :(\cf10 NSString\cf4 *)file \cf11 userId\cf4 :(\cf10 NSString\cf4 *)userId\{\ \ \cf2 // \f1 \'c9\'fa\'b3\'c9\'cf\'fb\'cf\'a2\'b6\'d4\'cf\'f3 \f0 \cf4 \ \cf9 JXMessageObject\cf4 *msg=[[\cf9 JXMessageObject\cf4 \cf14 alloc\cf4 ]\cf14 init\cf4 ];\ msg.\cf15 timeSend\cf4 = [\cf10 NSDate\cf4 \cf14 date\cf4 ];\ msg.\cf15 fromUserId\cf4 = \cf5 MY_USER_ID\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 \cf14 length\cf4 ]>\cf7 0\cf4 )\{\ msg.\cf15 toUserId\cf4 = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ;\ msg.\cf15 isGroup\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.\cf15 fromUserName\cf4 = \cf15 _userNickName\cf4 ;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isGroupMessages\cf4 ) \{\ msg.\cf15 toUserId\cf4 = userId;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.\cf15 toUserId\cf4 = \cf15 chatPerson\cf4 .\cf15 userId\cf4 ;\ \}\ msg.\cf15 isGroup\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ msg.\cf15 fileName\cf4 = file;\ msg.\cf15 content\cf4 = [[file \cf14 lastPathComponent\cf4 ] \cf14 stringByDeletingPathExtension\cf4 ];\ msg.\cf15 type\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 :\cf15 kWCMessageTypeVoice\cf4 ];\ msg.\cf15 isSend\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 :\cf5 transfer_status_ing\cf4 ];\ msg.\cf15 isUpload\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithBool\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.\cf15 isRead\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithBool\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.\cf15 timeLen\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 :\cf15 _timeLen\cf4 ];\ \ msg.\cf15 isReadDel\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isReadDelete\cf4 ];\ [msg \cf15 insert\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 showOneMsg\cf4 :msg];\ \cf2 // [msg release];\cf4 \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendGif\cf4 :(\cf10 NSString\cf4 *)str \{\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 \cf15 sendMsgCheck\cf4 ])\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \cf10 NSString\cf4 *message = str;\ \f2\b \cf8 if \f0\b0 \cf4 (message.\cf14 length\cf4 > \cf7 0\cf4 ) \{\ \cf9 JXMessageObject\cf4 *msg=[[\cf9 JXMessageObject\cf4 \cf14 alloc\cf4 ]\cf14 init\cf4 ];\ msg.\cf15 timeSend\cf4 = [\cf10 NSDate\cf4 \cf14 date\cf4 ];\ msg.\cf15 fromUserId\cf4 = \cf5 MY_USER_ID\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 \cf14 length\cf4 ]>\cf7 0\cf4 )\{\ msg.\cf15 toUserId\cf4 = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ;\ msg.\cf15 isGroup\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.\cf15 fromUserName\cf4 = \cf15 _userNickName\cf4 ;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.\cf15 toUserId\cf4 = \cf15 chatPerson\cf4 .\cf15 userId\cf4 ;\ msg.\cf15 isGroup\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ msg.\cf15 fileData\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \cf2 // msg.fileName = message;\cf4 \ msg.\cf15 content\cf4 = message;\ msg.\cf15 type\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 :\cf15 kWCMessageTypeGif\cf4 ];\ msg.\cf15 isSend\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 :\cf5 transfer_status_ing\cf4 ];\ msg.\cf15 isRead\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithBool\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.\cf15 isReadDel\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ \ [msg \cf15 insert\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ];\ \ \ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _useInfoTempChat\cf4 ==\cf7 11\cf4 ) \{\ \ msg.\cf15 tempChat\cf4 = \cf7 11\cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \ \{\ \ msg.tempChat = \cf7 1\cf4 ;\ \}\ [\cf5 g_xmpp\cf4 sendMessage:msg roomName: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 showOneMsg\cf4 :msg];\ \cf2 // [msg release];\cf4 \ \}\ \cf2 // [_messageText setText:nil];\cf4 \ \}\ \ \ \cf5 #pragma mark \f2\b \cf16 - \f4 \'ca\'e4\'c8\'eb \f2 TextField \f4 \'b4\'fa\'c0\'ed \f0\b0 \cf4 \ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 doBeginEdit\cf4 \{\ \cf15 _table\cf4 .\cf14 frame\cf4 = \cf14 CGRectMake\cf4 (\cf7 0\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightHeader\cf4 +\cf15 _noticeHeight\cf4 , \cf5 JX_SCREEN_WIDTH\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 -\cf5 faceHeight\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightHeader\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 -\cf15 _noticeHeight\cf4 );\ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 tableFooter\cf4 .frame = \cf15 CGRectMake\cf4 (\cf7 0\cf4 , _table.\cf15 frame\cf4 .origin.y+_table.frame.size.height, JX_SCREEN_WIDTH, \f2\b \cf8 self \f0\b0 \cf4 .heightFooter);\ [\cf15 _table\cf4 \cf15 gotoLastRow\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 doEndEdit\cf4 \{\ \ _textViewBtn.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \ \ \f2\b \cf8 if \f0\b0 \cf4 (\cf5 _messageText\cf4 .\cf15 isFirstResponder\cf4 ) \{\ \ \cf14 _table\cf4 .\cf14 frame\cf4 =\cf14 CGRectMake\cf4 (\cf7 0\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightHeader\cf4 +\cf15 _noticeHeight\cf4 ,\cf5 self_width\cf4 ,\cf5 JX_SCREEN_HEIGHT\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightHeader\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 -\cf15 _noticeHeight\cf4 );\ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 tableFooter\cf4 .frame = \cf15 CGRectMake\cf4 (\cf7 0\cf4 , \cf15 JX_SCREEN_HEIGHT\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf5 heightFooter\cf4 , JX_SCREEN_WIDTH, \f2\b \cf8 self \f0\b0 \cf4 .heightFooter);\ \cf15 _btnFace\cf4 .selected = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [\cf14 _messageText\cf4 \cf5 resignFirstResponder\cf4 ];\ \cf15 _messageText\cf4 .\cf14 inputView\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 deltaHeight\cf4 = \cf7 0\cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .frame = CGRectMake( \f2\b \cf8 self \f0\b0 \cf4 .screenShotView.frame.origin.x, \f2\b \cf8 self \f0\b0 \cf4 .tableFooter.frame.origin.y - \f2\b \cf8 self \f0\b0 \cf4 .screenShotView.frame.size.height - \cf7 10\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .screenShotView.frame.size.width, \f2\b \cf8 self \f0\b0 \cf4 .screenShotView.frame.size.height);\ [\cf15 _table\cf4 gotoLastRow: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _faceView\cf4 && !\cf14 _faceView\cf4 .\cf14 hidden\cf4 ) \{\ \cf15 _table\cf4 .frame =\cf15 CGRectMake\cf4 (\cf7 0\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf14 heightHeader\cf4 +\cf14 _noticeHeight\cf4 ,self_width,\cf15 JX_SCREEN_HEIGHT\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf14 heightHeader\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 -\cf14 _noticeHeight\cf4 );\ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 tableFooter\cf4 .frame = \cf15 CGRectMake\cf4 (\cf7 0\cf4 , \cf15 JX_SCREEN_HEIGHT\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf5 heightFooter\cf4 , JX_SCREEN_WIDTH, \f2\b \cf8 self \f0\b0 \cf4 .heightFooter);\ \cf15 _faceView\cf4 .hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [\cf5 _faceView\cf4 \cf5 removeFromSuperview\cf4 ];\ [\cf15 _table\cf4 \cf14 gotoLastRow\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \ \}\ \ - ( \f2\b \cf8 BOOL \f0\b0 \cf4 )\cf5 textFieldShouldBeginEditing\cf4 :(UITextField *)textField\{\ [ \f2\b \cf8 self \f0\b0 \cf4 doBeginEdit];\ \cf15 _btnFace\cf4 .\cf10 selected\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \cf2 // if([[NSDate date] timeIntervalSince1970] <= _disableSay)\cf4 \ \cf2 // return NO;\cf4 \ \cf2 // else\cf4 \ \cf2 // return YES;\cf4 \ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ - ( \f2\b \cf8 BOOL \f0\b0 \cf4 )\cf11 textFieldShouldEndEditing\cf4 :(\cf10 UITextField\cf4 *)textField \{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 doEndEdit\cf4 ];\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ - ( \f2\b \cf8 BOOL \f0\b0 \cf4 ) \cf11 hideKeyboard\cf4 :( \f2\b \cf8 BOOL \f0\b0 \cf4 )gotoLastRow\{\ \f2\b \cf8 if \f0\b0 \cf4 (gotoLastRow)\ [\cf15 _table\cf4 \cf15 gotoLastRow\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ \cf15 _btnFace\cf4 .\cf14 selected\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [\cf15 _messageText\cf4 \cf14 resignFirstResponder\cf4 ];\ \cf15 _messageText\cf4 .\cf14 inputView\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 deltaHeight\cf4 = \cf7 0\cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 doEndEdit\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 shareMore\cf4 .\cf14 selected\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 frame\cf4 = \cf14 CGRectMake\cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 x\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableFooter\cf4 .\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 y\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 - \cf7 10\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 );\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ - ( \f2\b \cf8 BOOL \f0\b0 \cf4 )\cf11 textFieldShouldReturn\cf4 :(\cf10 UITextField\cf4 *)textField \{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 hideKeyboard\cf4 : \f2\b \cf8 YES \f0\b0 \cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (textField.\cf14 tag\cf4 == \cf15 kWCMessageTypeGif\cf4 )\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 sendGif\cf4 :textField.\cf14 text\cf4 ];\ \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 sendIt\cf4 :textField];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 actionFace\cf4 :(\cf10 UIButton\cf4 *)sender\{\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 \cf15 showDisableSay\cf4 ])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 shareMore\cf4 .\cf14 selected\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf15 _messageText\cf4 .\cf14 inputView\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ [\cf15 _messageText\cf4 \cf14 reloadInputViews\cf4 ];\ \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 offRecordBtns\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (sender.\cf14 selected\cf4 )\{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 doBeginEdit\cf4 ];\ [\cf15 _messageText\cf4 \cf14 becomeFirstResponder\cf4 ];\ [\cf15 _faceView\cf4 \cf14 removeFromSuperview\cf4 ];\ \cf15 _faceView\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ sender.\cf14 selected\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _faceView\cf4 == \f2\b \cf8 nil \f0\b0 \cf4 )\{\ \cf15 _faceView\cf4 = \cf5 g_App\cf4 .\cf15 faceView2\cf4 ;\ \cf15 _faceView\cf4 .\cf15 delegate\cf4 = \f2\b \cf8 self \f0\b0 \cf4 ;\ \}\ [\cf15 _messageText\cf4 \cf14 resignFirstResponder\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 \cf14 addSubview\cf4 :\cf15 _faceView\cf4 ];\ \cf15 _faceView\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ sender.\cf14 selected\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf2 // [_faceView selectType:0];\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 doBeginEdit\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 deltaHeight\cf4 = -\cf5 faceHeight\cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 setTableFooterFrame\cf4 :\cf15 _messageText\cf4 ];\ \}\ \cf2 // [self doBeginEdit];\cf4 \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 ) \cf11 selectImageNameString\cf4 :(\cf10 NSString\cf4 *)imageName \cf11 ShortName\cf4 :(\cf10 NSString\cf4 *)shortName \cf11 isSelectImage\cf4 :( \f2\b \cf8 BOOL \f0\b0 \cf4 )isSelectImage \{\ \cf2 // \f1 \'c8\'e7\'b9\'fb\'b2\'bb\'ca\'c7 \f0 delete \f1 \'cf\'ec\'d3\'a6 \f0 , \f1 \'b5\'b1\'c7\'b0\'ca\'c7\'cc\'e1\'ca\'be\'d0\'c5\'cf\'a2\'a3\'ac\'d0\'de\'b8\'c4\'c6\'e4\'ca\'f4\'d0\'d4 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (![shortName \cf14 isEqualToString\cf4 :\cf6 @""\cf4 ] && \cf15 _messageText\cf4 .\cf14 textColor\cf4 == [\cf10 UIColor\cf4 \cf14 lightGrayColor\cf4 ]) \{\ \cf15 _messageText\cf4 .\cf14 text\cf4 = \cf6 @""\cf4 ;\cf2 // \f1 \'d6\'c3\'bf\'d5 \f0 \cf4 \ \cf15 _messageText\cf4 .\cf14 textColor\cf4 = [\cf10 UIColor\cf4 \cf14 blackColor\cf4 ];\ \}\ \ \cf9 EmojiTextAttachment\cf4 *attachment = [[\cf9 EmojiTextAttachment\cf4 \cf14 alloc\cf4 ] \cf14 init\cf4 ];\ attachment.\cf15 emojiTag\cf4 = shortName;\ attachment.\cf14 image\cf4 = [\cf10 UIImage\cf4 \cf14 imageNamed\cf4 :imageName];\ attachment.\cf14 bounds\cf4 = \cf14 CGRectMake\cf4 (\cf7 0\cf4 , -\cf7 4\cf4 , \cf15 _messageText\cf4 .\cf14 font\cf4 .\cf14 lineHeight\cf4 , \cf15 _messageText\cf4 .\cf14 font\cf4 .\cf14 lineHeight\cf4 );\ \cf2 // attachment.emojiSize = CGSizeMake(_messageText.font.lineHeight, _messageText.font.lineHeight);\cf4 \ \ \cf10 NSRange\cf4 newRange = \cf14 NSMakeRange\cf4 (\cf15 _messageText\cf4 .\cf14 selectedRange\cf4 .\cf14 location\cf4 + \cf7 1\cf4 , \cf7 0\cf4 );\ \ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _messageText\cf4 .\cf14 selectedRange\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ) \{\ [\cf15 _messageText\cf4 .\cf14 textStorage\cf4 \cf14 deleteCharactersInRange\cf4 :\cf15 _messageText\cf4 .\cf14 selectedRange\cf4 ];\ \}\ [\cf15 _messageText\cf4 .\cf14 textStorage\cf4 \cf14 insertAttributedString\cf4 :[\cf10 NSAttributedString\cf4 \cf14 attributedStringWithAttachment\cf4 :attachment] \cf14 atIndex\cf4 :\cf15 _messageText\cf4 .\cf14 selectedRange\cf4 .\cf14 location\cf4 ];\ \ \cf15 _messageText\cf4 .\cf14 selectedRange\cf4 = newRange;\ \cf15 _messageText\cf4 .\cf14 font\cf4 = \cf5 SYSFONT\cf4 (\cf7 18\cf4 );\ \ [\cf15 _messageText\cf4 \cf14 scrollRangeToVisible\cf4 :\cf14 NSMakeRange\cf4 (\cf15 _messageText\cf4 .\cf14 text\cf4 .\cf14 length\cf4 , \cf7 1\cf4 )];\ \f2\b \cf8 if \f0\b0 \cf4 (isSelectImage) \{\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 deltaHeight\cf4 = -\cf5 faceHeight\cf4 ;\ \}\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 setTableFooterFrame\cf4 :\cf15 _messageText\cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 faceViewDeleteAction\cf4 \{\ [\cf15 _messageText\cf4 \cf14 deleteBackward\cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 selectGifWithString\cf4 :(\cf10 NSString\cf4 *)str \{\ \cf2 // _messageText.text = str;\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 sendGif\cf4 :str];\ \}\ \ \cf2 // \f1 \'b7\'a2\'cb\'cd\'b1\'ed\'c7\'e9\'b0\'fc\'b1\'ed\'c7\'e9 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 selectEmojiPackgeWithString\cf4 :(\cf10 NSString\cf4 *)str \{\ \ \cf10 UIImage\cf4 * chosedImage=[[\cf9 SDImageCache\cf4 \cf15 sharedImageCache\cf4 ] \cf15 imageFromMemoryCacheForKey\cf4 :str];\ \cf2 // \f1 \'bb\'f1\'c8\'a1 \f0 image \f1 \'b5\'c4\'b3\'a4\'bf\'ed \f0 \cf4 \ \f2\b \cf8 int \f0\b0 \cf4 imageWidth = chosedImage.\cf14 size\cf4 .\cf14 width\cf4 ;\ \f2\b \cf8 int \f0\b0 \cf4 imageHeight = chosedImage.\cf14 size\cf4 .\cf14 height\cf4 ;\ \cf10 NSString\cf4 *s = [str \cf14 pathExtension\cf4 ];\ \cf10 NSString\cf4 * file = [\cf9 FileInfo\cf4 \cf15 getUUIDFileName\cf4 :s];\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isCYMSGgroupANDFriendy\cf4 ) \{\ \cf9 JXMessageObject\cf4 *msg=[[\cf9 JXMessageObject\cf4 \cf14 alloc\cf4 ]\cf14 init\cf4 ];\ \f2\b \cf8 for \f0\b0 \cf4 (\cf10 NSInteger\cf4 i = \cf7 0\cf4 ; i < \f2\b \cf8 self \f0\b0 \cf4 .\cf15 userIds\cf4 .\cf14 count\cf4 ; i ++) \{\ \cf10 NSString\cf4 *userId = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 userIds\cf4 [i];\ \ \f2\b \cf8 if \f0\b0 \cf4 ([file \cf14 length\cf4 ]>\cf7 0\cf4 ) \{\ \ msg.\cf15 timeSend\cf4 = [\cf10 NSDate\cf4 \cf14 date\cf4 ];\ msg.\cf15 fromUserId\cf4 = \cf5 MY_USER_ID\cf4 ;\ msg.\cf15 toUserId\cf4 = userId;\ \cf2 // \f1 \'c8\'ba \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([userId \cf14 length\cf4 ]>\cf7 10\cf4 )\{\ msg.\cf15 isGroup\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.\cf15 fromUserName\cf4 = \cf15 _userNickName\cf4 ;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.\cf15 isGroup\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ msg.\cf15 fileName\cf4 = file;\ msg.\cf15 content\cf4 = str;\ \cf2 // msg.type = [NSNumber numberWithInt:kWCMessageTypeImage];\cf4 \ \cf2 // \f1 \'b8\'c4\'b3\'c9 \f0 kWCMessageTypeEmoji=12, \f1 \'d7\'d4\'b6\'a8\'d2\'e5\'b5\'c4\'b1\'ed\'c7\'e9\'cf\'fb\'cf\'a2 \f0 \cf4 \ msg.\cf15 type\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 :\cf15 kWCMessageTypeEmoji\cf4 ];\ \cf2 // msg.remindType = [NSNumber numberWithInt:kWCMessageTypeCustomFace];\cf4 \ msg.\cf15 isSend\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 :\cf5 transfer_status_ing\cf4 ];\ msg.\cf15 isRead\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithBool\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.\cf15 isUpload\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithBool\cf4 : \f2\b \cf8 YES \f0\b0 \cf4 ];\ \cf2 // \f1 \'d0\'c2\'cc\'ed\'bc\'d3\'b5\'c4\'cd\'bc\'c6\'ac\'bf\'ed\'b8\'df \f0 \cf4 \ msg.\cf15 location_x\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 :imageWidth];\ msg.\cf15 location_y\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 :imageHeight];\ \ msg.\cf15 isReadDel\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isReadDelete\cf4 ];\ \ [msg \cf15 insert\cf4 :userId];\ \ \f2\b \cf8 if \f0\b0 \cf4 ([userId \cf14 length\cf4 ]>\cf7 10\cf4 )\{\ [\cf5 g_xmpp\cf4 \cf15 sendMessage\cf4 :msg \cf15 roomName\cf4 :userId];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [\cf5 g_xmpp\cf4 \cf15 sendMessage\cf4 :msg \cf15 roomName\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \}\ \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 showOneMsg\cf4 :msg];\ \}\ \}\ \ \cf2 // \f1 \'d0\'b4\'c8\'eb\'ca\'fd\'be\'dd\'bf\'e2 \f0 \cf4 \ \cf10 NSArray\cf4 *array = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 userIds\cf4 ;\ \cf10 NSString\cf4 *userIdsString = [array \cf14 componentsJoinedByString\cf4 :\cf6 @","\cf4 ];\ array = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 userNames\cf4 ;\ \cf10 NSString\cf4 *userNamesString = [array \cf14 componentsJoinedByString\cf4 :\cf6 @","\cf4 ];\ array = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 userNamesWithGroup\cf4 ;\ \cf10 NSString\cf4 *userNamesWithGroupString = [array \cf14 componentsJoinedByString\cf4 :\cf6 @","\cf4 ];\ NSString *sendTime = [NSString stringWithFormat:\cf6 @"%@"\cf4 , msg.dictionary[\cf6 @"timeSend"\cf4 ]];\ \ array = \f2\b \cf8 self \f0\b0 \cf4 .userNmaesWithFriend;\ NSString *userNmaesWithFriendString = [array componentsJoinedByString:\cf6 @","\cf4 ];\ \ JXLabelObject *obj = JXLabelObject.sharedInstance;\ obj.userId = msg.fromUserId;\ obj.userIds = userIdsString;\ obj.text1 = _names;\ obj.text2 = _names2;\ obj.userNames = userNamesString;\ obj.userNamesWithGroup = userNamesWithGroupString;\ obj.message = \cf6 @"[ \f1 \'b1\'ed\'c7\'e9 \f0 ]"\cf4 ;\ obj.sendTime = sendTime;\ obj.userNmaesWithFriend = userNmaesWithFriendString;\ \f2\b \cf8 BOOL \f0\b0 \cf4 succeed = [obj insertRecord];\ \f2\b \cf8 if \f0\b0 \cf4 (succeed) \{\ [g_App showAlert:Localized(\cf6 @"JX_SendComplete"\cf4 )];\ [g_notify postNotificationName:kGroupHelperRefreshNotif object: \f2\b \cf8 nil \f0\b0 \cf4 ];\ [g_navigation popToViewController:[CYGroupSendHelperViewController \f2\b \cf8 class \f0\b0 \cf4 ] animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // \f1 \'b5\'a5\'c1\'c4 \f0 , \f1 \'c8\'ba\'c1\'c4 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([file length]>\cf7 0\cf4 ) \{\ JXMessageObject *msg=[[JXMessageObject alloc]init];\ msg.timeSend = [NSDate date];\ msg.fromUserId = MY_USER_ID;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\{\ msg.toUserId = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ msg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.fromUserName = _userNickName;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.toUserId = chatPerson.userId;\ msg.isGroup = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ msg.fileName = file;\ msg.content = str;\ \cf2 // msg.type = [NSNumber numberWithInt:kWCMessageTypeImage];\cf4 \ \cf2 // \f1 \'b8\'c4\'b3\'c9 \f0 kWCMessageTypeEmoji=12, \f1 \'b1\'ed\'c7\'e9\'b0\'fc\'b1\'ed\'c7\'e9\'cf\'fb\'cf\'a2 \f0 \cf4 \ msg.type = [NSNumber numberWithInt:kWCMessageTypeEmoji];\ msg.isSend = [NSNumber numberWithInt:transfer_status_ing];\ msg.isRead = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.isUpload = [NSNumber numberWithBool: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \cf2 // \f1 \'d0\'c2\'cc\'ed\'bc\'d3\'b5\'c4\'cd\'bc\'c6\'ac\'bf\'ed\'b8\'df \f0 \cf4 \ msg.location_x = [NSNumber numberWithInt:imageWidth];\ msg.location_y = [NSNumber numberWithInt:imageHeight];\ \ msg.isReadDel = [NSNumber numberWithInt: \f2\b \cf8 self \f0\b0 \cf4 .isReadDelete];\ \cf2 // msg.remindType = [NSNumber numberWithInt:kWCMessageTypeEmoji];\cf4 \ \ [msg insert: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\ [g_xmpp sendMessage:msg roomName: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \cf2 // [msg release];\cf4 \ \}\ \}\ \ \ \}\ \ \ \cf2 // \f1 \'b7\'a2\'cb\'cd\'ca\'d5\'b2\'d8\'b1\'ed\'c7\'e9 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 selectFavoritWithString\cf4 :(NSString *)str \{\ \ UIImage * chosedImage=[[SDImageCache sharedImageCache] imageFromMemoryCacheForKey:str];\ \cf2 // \f1 \'bb\'f1\'c8\'a1 \f0 image \f1 \'b5\'c4\'b3\'a4\'bf\'ed \f0 \cf4 \ \f2\b \cf8 int \f0\b0 \cf4 imageWidth = chosedImage.size.width;\ \f2\b \cf8 int \f0\b0 \cf4 imageHeight = chosedImage.size.height;\ NSString *s = [str pathExtension];\ NSString* file = [FileInfo getUUIDFileName:s];\ \ \cf2 // \f1 \'c8\'ba\'b7\'a2\'d6\'fa\'ca\'d6 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isCYMSGgroupANDFriendy) \{\ JXMessageObject *msg=[[JXMessageObject alloc]init];\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < \f2\b \cf8 self \f0\b0 \cf4 .userIds.count; i ++) \{\ NSString *userId = \f2\b \cf8 self \f0\b0 \cf4 .userIds[i];\ \ \f2\b \cf8 if \f0\b0 \cf4 ([file length]>\cf7 0\cf4 ) \{\ msg.timeSend = [NSDate date];\ msg.fromUserId = MY_USER_ID;\ msg.toUserId = userId;\ \cf2 // \f1 \'c8\'ba \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([userId length]>\cf7 10\cf4 )\{\ msg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.fromUserName = _userNickName;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.isGroup = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ msg.fileName = file;\ msg.content = str;\ \cf2 // msg.type = [NSNumber numberWithInt:kWCMessageTypeImage];\cf4 \ \cf2 // \f1 \'b8\'c4\'b3\'c9 \f0 kWCMessageTypeCustomFace=11, \f1 \'d7\'d4\'b6\'a8\'d2\'e5\'b5\'c4\'b1\'ed\'c7\'e9\'cf\'fb\'cf\'a2 \f0 \cf4 \ msg.type = [NSNumber numberWithInt:kWCMessageTypeCustomFace];\ \cf2 // msg.remindType = [NSNumber numberWithInt:kWCMessageTypeCustomFace];\cf4 \ msg.isSend = [NSNumber numberWithInt:transfer_status_ing];\ msg.isRead = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.isUpload = [NSNumber numberWithBool: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \cf2 // \f1 \'d0\'c2\'cc\'ed\'bc\'d3\'b5\'c4\'cd\'bc\'c6\'ac\'bf\'ed\'b8\'df \f0 \cf4 \ msg.location_x = [NSNumber numberWithInt:imageWidth];\ msg.location_y = [NSNumber numberWithInt:imageHeight];\ \ msg.isReadDel = [NSNumber numberWithInt: \f2\b \cf8 self \f0\b0 \cf4 .isReadDelete];\ \ [msg insert:userId];\ \f2\b \cf8 if \f0\b0 \cf4 ([userId length]>\cf7 10\cf4 )\{\ [g_xmpp sendMessage:msg roomName:userId];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [g_xmpp sendMessage:msg roomName: \f2\b \cf8 nil \f0\b0 \cf4 ];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \}\ \ \}\ \}\ \cf2 // \f1 \'d0\'b4\'c8\'eb\'ca\'fd\'be\'dd\'bf\'e2 \f0 \cf4 \ NSArray *array = \f2\b \cf8 self \f0\b0 \cf4 .userIds;\ NSString *userIdsString = [array componentsJoinedByString:\cf6 @","\cf4 ];\ array = \f2\b \cf8 self \f0\b0 \cf4 .userNames;\ NSString *userNamesString = [array componentsJoinedByString:\cf6 @","\cf4 ];\ array = \f2\b \cf8 self \f0\b0 \cf4 .userNamesWithGroup;\ NSString *userNamesWithGroupString = [array componentsJoinedByString:\cf6 @","\cf4 ];\ NSString *sendTime = [NSString stringWithFormat:\cf6 @"%@"\cf4 , msg.dictionary[\cf6 @"timeSend"\cf4 ]];\ \ array = \f2\b \cf8 self \f0\b0 \cf4 .userNmaesWithFriend;\ NSString *userNmaesWithFriendString = [array componentsJoinedByString:\cf6 @","\cf4 ];\ \ JXLabelObject *obj = JXLabelObject.sharedInstance;\ obj.userId = msg.fromUserId;\ obj.userIds = userIdsString;\ obj.text1 = _names;\ obj.text2 = _names2;\ obj.userNames = userNamesString;\ obj.userNamesWithGroup = userNamesWithGroupString;\ obj.message = \cf6 @"[ \f1 \'cd\'bc\'c6\'ac \f0 ]"\cf4 ;\ obj.sendTime = sendTime;\ obj.userNmaesWithFriend = userNmaesWithFriendString;\ \f2\b \cf8 BOOL \f0\b0 \cf4 succeed = [obj insertRecord];\ \f2\b \cf8 if \f0\b0 \cf4 (succeed) \{\ [g_App showAlert:Localized(\cf6 @"JX_SendComplete"\cf4 )];\ [g_notify postNotificationName:kGroupHelperRefreshNotif object: \f2\b \cf8 nil \f0\b0 \cf4 ];\ [g_navigation popToViewController:[CYGroupSendHelperViewController \f2\b \cf8 class \f0\b0 \cf4 ] animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // \f1 \'b5\'a5\'c1\'c4 \f0 , \f1 \'c8\'ba\'c1\'c4 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([file length]>\cf7 0\cf4 ) \{\ JXMessageObject *msg=[[JXMessageObject alloc]init];\ msg.timeSend = [NSDate date];\ msg.fromUserId = MY_USER_ID;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\{\ msg.toUserId = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ msg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.fromUserName = _userNickName;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.toUserId = chatPerson.userId;\ msg.isGroup = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ msg.fileName = file;\ msg.content = str;\ \cf2 // msg.type = [NSNumber numberWithInt:kWCMessageTypeImage];\cf4 \ \cf2 // \f1 \'b8\'c4\'b3\'c9 \f0 kWCMessageTypeCustomFace=11, \f1 \'d7\'d4\'b6\'a8\'d2\'e5\'b5\'c4\'b1\'ed\'c7\'e9\'cf\'fb\'cf\'a2 \f0 \cf4 \ msg.type = [NSNumber numberWithInt:kWCMessageTypeCustomFace];\ \cf2 // msg.remindType = [NSNumber numberWithInt:kWCMessageTypeCustomFace];\cf4 \ msg.isSend = [NSNumber numberWithInt:transfer_status_ing];\ msg.isRead = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.isUpload = [NSNumber numberWithBool: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \cf2 // \f1 \'d0\'c2\'cc\'ed\'bc\'d3\'b5\'c4\'cd\'bc\'c6\'ac\'bf\'ed\'b8\'df \f0 \cf4 \ msg.location_x = [NSNumber numberWithInt:imageWidth];\ msg.location_y = [NSNumber numberWithInt:imageHeight];\ \ msg.isReadDel = [NSNumber numberWithInt: \f2\b \cf8 self \f0\b0 \cf4 .isReadDelete];\ \ [msg insert: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\ [g_xmpp sendMessage:msg roomName: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \cf2 // [msg release];\cf4 \ \}\ \ \}\ \ \ \}\ \ \cf2 // \f1 \'c8\'a1\'cf\'fb\'ca\'d5\'b2\'d8 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 deleteFavoritWithString\cf4 :(NSString *)str \{\ \cf2 // [g_server userEmojiDeleteWithId:str toView:self];\cf4 \ [g_server faceClollectDeleteFaceClollect:str View: \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \ - ( \f2\b \cf8 BOOL \f0\b0 \cf4 )\cf11 textView\cf4 :(UITextView *)textView \cf11 shouldChangeTextInRange\cf4 :(NSRange)range \cf11 replacementText\cf4 :(NSString *)text \{\ \cf2 // \f1 \'d6\'bb\'d3\'d0\'cb\'ae\'d3\'a1\'ca\'b1\'a3\'ac\'b2\'bb\'c4\'dc \f0 send\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([text isEqualToString:\cf6 @"\\n"\cf4 ] && textView.textColor == [UIColor lightGrayColor]) \{\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \cf2 // \f1 \'c8\'e7\'b9\'fb\'b2\'bb\'ca\'c7 \f0 delete \f1 \'cf\'ec\'d3\'a6 \f0 , \f1 \'b5\'b1\'c7\'b0\'ca\'c7\'cc\'e1\'ca\'be\'d0\'c5\'cf\'a2\'a3\'ac\'d0\'de\'b8\'c4\'c6\'e4\'ca\'f4\'d0\'d4 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (![text isEqualToString:\cf6 @""\cf4 ] && textView.textColor == [UIColor lightGrayColor]) \{\ textView.text = \cf6 @""\cf4 ;\cf2 // \f1 \'d6\'c3\'bf\'d5 \f0 \cf4 \ textView.textColor = [UIColor blackColor];\ \}\ \ NSMutableArray *arr = [NSMutableArray array];\ [ \f2\b \cf8 self \f0\b0 \cf4 getImageRange:text array:arr];\ \f2\b \cf8 if \f0\b0 \cf4 (arr.count > \cf7 1\cf4 ) \{\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < arr.count; i ++) \{\ NSString *str = arr[i];\ NSInteger n;\ \ _messageText.font = SYSFONT(\cf7 18\cf4 );\ \f2\b \cf8 if \f0\b0 \cf4 ([str hasPrefix:\cf6 @"["\cf4 ]&&[str hasSuffix:\cf6 @"]"\cf4 ] && [g_faceVC.shortNameArrayE containsObject:str]) \{\ n = [g_faceVC.shortNameArrayE indexOfObject:str];\ NSDictionary *dic = [g_constant.emojiArray objectAtIndex:n];\ [ \f2\b \cf8 self \f0\b0 \cf4 selectImageNameString:dic[\cf6 @"filename"\cf4 ] ShortName:str isSelectImage: \f2\b \cf8 NO \f0\b0 \cf4 ];\ NSLog(\cf6 @""\cf4 );\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // NSMutableString *textViewStr = [_messageText.text mutableCopy];\cf4 \ \cf2 // [textViewStr insertString:str atIndex:_messageText.selectedRange.location];\cf4 \ \cf2 // _messageText.text = textViewStr;\cf4 \ NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];\ paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping;\ NSRange newRange = NSMakeRange(_messageText.selectedRange.location + str.length, \cf7 0\cf4 );\ [_messageText.textStorage insertAttributedString:[[NSAttributedString alloc] initWithString:str attributes:\cf7 @\{\cf4 NSParagraphStyleAttributeName:paragraphStyle,NSFontAttributeName:SYSFONT(\cf7 18\cf4 )\cf7 \}\cf4 ] atIndex:_messageText.selectedRange.location];\ \ _messageText.selectedRange = newRange;\ \ [_messageText scrollRangeToVisible:NSMakeRange(_messageText.text.length, \cf7 1\cf4 )];\ \}\ \}\ [ \f2\b \cf8 self \f0\b0 \cf4 setTableFooterFrame:textView];\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([text isEqualToString:\cf6 @"\\n"\cf4 ])\{ \cf2 // \f1 \'c5\'d0\'b6\'cf\'ca\'e4\'c8\'eb\'b5\'c4\'d7\'d6\'ca\'c7\'b7\'f1\'ca\'c7\'bb\'d8\'b3\'b5\'a3\'ac\'bc\'b4\'b0\'b4\'cf\'c2 \f0 return\cf4 \ \cf2 // \f1 \'d4\'da\'d5\'e2\'c0\'ef\'d7\'f6\'c4\'e3\'cf\'ec\'d3\'a6 \f0 return \f1 \'bc\'fc\'b5\'c4\'b4\'fa\'c2\'eb \f0 \cf4 \ \cf2 // if(textView.tag == kWCMessageTypeGif)\cf4 \ \cf2 // [self sendGif:textView];\cf4 \ \cf2 // else\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ _onceSendNum = \cf7 20\cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 addWaitGroupSendViewWithMsgNum:\cf7 1\cf4 withType:groupsend_msgType_text];\ \}\ [ \f2\b \cf8 self \f0\b0 \cf4 sendIt:textView];\ [ \f2\b \cf8 self \f0\b0 \cf4 setTableFooterFrame:textView];\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 NO \f0\b0 \cf4 ; \cf2 // \f1 \'d5\'e2\'c0\'ef\'b7\'b5\'bb\'d8 \f0 NO \f1 \'a3\'ac\'be\'cd\'b4\'fa\'b1\'ed \f0 return \f1 \'bc\'fc\'d6\'b5\'ca\'a7\'d0\'a7\'a3\'ac\'bc\'b4\'d2\'b3\'c3\'e6\'c9\'cf\'b0\'b4\'cf\'c2 \f0 return \f1 \'a3\'ac\'b2\'bb\'bb\'e1\'b3\'f6\'cf\'d6\'bb\'bb\'d0\'d0\'a3\'ac\'c8\'e7\'b9\'fb\'ce\'aa \f0 yes \f1 \'a3\'ac\'d4\'f2\'ca\'e4\'c8\'eb\'d2\'b3\'c3\'e6\'bb\'e1\'bb\'bb\'d0\'d0 \f0 \cf4 \ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ([text isEqualToString:\cf6 @"@"\cf4 ] && [ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\{\ \f2\b \cf8 if \f0\b0 \cf4 (! \f2\b \cf8 self \f0\b0 \cf4 .isShowAT) \{\ \f2\b \cf8 self \f0\b0 \cf4 .isShowAT = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf2 //@ \f1 \'c8\'ba\'b3\'c9\'d4\'b1 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 performSelector: \f2\b \cf8 @selector \f0\b0 \cf4 (showAtSelectMemberView) withObject: \f2\b \cf8 nil \f0\b0 \cf4 afterDelay:\cf7 0.35\cf4 ];\ \}\ \}\ \ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ \ \cf5 #pragma mark \f2\b \cf16 - \f4 \'d3\'d0\'b1\'ed\'c7\'e9\'b5\'c4 \f2 txt \f4 \'d7\'aa\'bb\'bb\'b3\'c9 \f2 \f4 \'ba\'ac\'cd\'bc\'c6\'ac\'b5\'c4 \f2 txt \f0\b0 \cf4 \ - ( \f2\b \cf8 BOOL \f0\b0 \cf4 )\cf11 changeEmjoyText\cf4 :(NSString *)text \cf11 textColor\cf4 :(UIColor *)textColor \{\ NSMutableArray *arr = [NSMutableArray array];\ [ \f2\b \cf8 self \f0\b0 \cf4 getImageRange:text array:arr];\ NSRange newRange = _messageText.selectedRange;\ \f2\b \cf8 if \f0\b0 \cf4 (arr.count > \cf7 1\cf4 ) \{\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < arr.count; i ++) \{\ NSString *str = arr[i];\ NSInteger n;\ \ _messageText.font = SYSFONT(\cf7 18\cf4 );\ \f2\b \cf8 if \f0\b0 \cf4 ([str hasPrefix:\cf6 @"["\cf4 ]&&[str hasSuffix:\cf6 @"]"\cf4 ] && [g_faceVC.shortNameArrayE containsObject:str]) \{\ n = [g_faceVC.shortNameArrayE indexOfObject:str];\ NSDictionary *dic = [g_constant.emojiArray objectAtIndex:n];\ \ EmojiTextAttachment *attachment = [[EmojiTextAttachment alloc] init];\ attachment.emojiTag = str;\ attachment.image = [UIImage imageNamed:dic[\cf6 @"filename"\cf4 ]];\ attachment.bounds = CGRectMake(\cf7 0\cf4 , -\cf7 4\cf4 , _messageText.font.lineHeight, _messageText.font.lineHeight);\ \ newRange = NSMakeRange(newRange.location + \cf7 1\cf4 , \cf7 0\cf4 );\ [_messageText.textStorage appendAttributedString:[NSAttributedString attributedStringWithAttachment:attachment]];\ _messageText.font = SYSFONT(\cf7 18\cf4 );\ \ [_messageText scrollRangeToVisible:NSMakeRange(_messageText.text.length, \cf7 1\cf4 )];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ newRange = NSMakeRange(newRange.location + str.length, \cf7 0\cf4 );\ \ [_messageText.textStorage appendAttributedString:[[NSAttributedString alloc] initWithString:str attributes:\cf7 @\{\cf4 NSFontAttributeName:SYSFONT(\cf7 18\cf4 ),NSForegroundColorAttributeName:textColor\cf7 \}\cf4 ]];\ [_messageText scrollRangeToVisible:NSMakeRange(_messageText.text.length, \cf7 1\cf4 )];\ \}\ \ \}\ _messageText.selectedRange = newRange;\ \}\ \f2\b \cf8 return \f0\b0 \cf4 arr.count > \cf7 1\cf4 ;\ \}\ \ \cf2 // \f1 \'bd\'ab\'b1\'ed\'c7\'e9\'ba\'cd\'ce\'c4\'d7\'d6\'b7\'d6\'bf\'aa\'a3\'ac\'d7\'b0\'bd\'f8 \f0 array\cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 getImageRange\cf4 :(NSString*)message \cf11 array\cf4 : (NSMutableArray*)array \{\ NSRange range=[message rangeOfString: \cf6 @"["\cf4 ];\ NSRange range1=[message rangeOfString: \cf6 @"]"\cf4 ];\ NSRange atRange = [message rangeOfString:\cf6 @"@"\cf4 ];\ \cf2 // \f1 \'c5\'d0\'b6\'cf\'b5\'b1\'c7\'b0\'d7\'d6\'b7\'fb\'b4\'ae\'ca\'c7\'b7\'f1\'bb\'b9\'d3\'d0\'b1\'ed\'c7\'e9\'b5\'c4\'b1\'ea\'d6\'be\'a1\'a3 \f0 \cf4 \ \ \cf2 // self.contentEmoji = [self isContainsEmoji:message];\cf4 \ \ \f2\b \cf8 if \f0\b0 \cf4 (((range.length>\cf7 0\cf4 && range1.length>\cf7 0\cf4 ) || atRange.length>\cf7 0\cf4 ) && range1.location > range.location) \{\ \f2\b \cf8 if \f0\b0 \cf4 (range.length>\cf7 0\cf4 && range1.length>\cf7 0\cf4 ) \{\ \cf2 // self.contentEmoji = YES;\cf4 \ \cf2 // if (range.location > 0) \{\cf4 \ \cf2 // [array addObject:[message substringToIndex:range.location]];\cf4 \ \cf2 // [array addObject:[message substringWithRange:NSMakeRange(range.location, range1.location+1-range.location)]];\cf4 \ \cf2 // NSString *str=[message substringFromIndex:range1.location+1];\cf4 \ \cf2 // [self getImageRange:str array:array];\cf4 \ \cf2 // \}else \{\cf4 \ \cf2 // NSString *nextstr=[message substringWithRange:NSMakeRange(range.location, range1.location+1-range.location)];\cf4 \ \cf2 // // \f1 \'c5\'c5\'b3\'fd\'ce\'c4\'d7\'d6\'ca\'c7 \f0 \'93\'94 \f1 \'b5\'c4 \f0 \cf4 \ \cf2 // if (![nextstr isEqualToString:@""]) \{\cf4 \ \cf2 // [array addObject:nextstr];\cf4 \ \cf2 // NSString *str=[message substringFromIndex:range1.location+1];\cf4 \ \cf2 // [self getImageRange:str array:array];\cf4 \ \cf2 // \}else \{\cf4 \ \cf2 // return;\cf4 \ \cf2 // \}\cf4 \ \cf2 // \}\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (range.\cf14 location\cf4 > \cf7 0\cf4 ) \{\ \ \cf10 NSString\cf4 *str = [message \cf14 substringToIndex\cf4 :range.\cf14 location\cf4 ];\ \ \cf10 NSString\cf4 *str1 = [message \cf14 substringFromIndex\cf4 :range.\cf14 location\cf4 ];\ \ [array \cf14 addObject\cf4 :str];\ \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 getImageRange\cf4 :str1 \cf15 array\cf4 :array];\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ \cf10 NSString\cf4 *emojiString = [message \cf14 substringWithRange\cf4 :\cf14 NSMakeRange\cf4 (range.\cf14 location\cf4 + \cf7 1\cf4 , range1.\cf14 location\cf4 - \cf7 1\cf4 )];\ \f2\b \cf8 BOOL \f0\b0 \cf4 isEmoji = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \cf10 NSString\cf4 *str;\ \cf10 NSString\cf4 *str1;\ \f2\b \cf8 for \f0\b0 \cf4 (\cf10 NSMutableDictionary\cf4 *dic \f2\b \cf8 in \f0\b0 \cf4 \cf5 g_constant\cf4 .\cf15 emojiArray\cf4 ) \{\ \cf10 NSString\cf4 *emoji = [dic \cf14 objectForKey\cf4 :\cf6 @"english"\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ([emoji \cf14 isEqualToString\cf4 :emojiString]) \{\ isEmoji = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (isEmoji) \{\ str = [message \cf14 substringWithRange\cf4 :\cf14 NSMakeRange\cf4 (range.\cf14 location\cf4 , range1.\cf14 location\cf4 + \cf7 1\cf4 )];\ str1 = [message \cf14 substringFromIndex\cf4 :range1.\cf14 location\cf4 + \cf7 1\cf4 ];\ [array \cf14 addObject\cf4 :str];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf10 NSString\cf4 *posString = [message \cf14 substringWithRange\cf4 :\cf14 NSMakeRange\cf4 (range.\cf14 location\cf4 + \cf7 1\cf4 , range1.\cf14 location\cf4 )];\ \cf10 NSRange\cf4 posRange = [posString \cf14 rangeOfString\cf4 :\cf6 @"["\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (posRange.\cf14 location\cf4 != \cf14 NSNotFound\cf4 ) \{\ str = [message \cf14 substringToIndex\cf4 :posRange.\cf14 location\cf4 ];\ str1 = [message \cf14 substringFromIndex\cf4 :posRange.\cf14 location\cf4 ];\ [array \cf14 addObject\cf4 :str];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ str = [message \cf14 substringToIndex\cf4 :range1.\cf14 location\cf4 + \cf7 1\cf4 ];\ str1 = [message \cf14 substringFromIndex\cf4 :range1.\cf14 location\cf4 + \cf7 1\cf4 ];\ [array \cf14 addObject\cf4 :str];\ \}\ \}\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 getImageRange\cf4 :str1 \cf15 array\cf4 :array];\ \}\ \ \ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (atRange.\cf14 length\cf4 >\cf7 0\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 (atRange.\cf14 location\cf4 > \cf7 0\cf4 ) \{\ [array \cf14 addObject\cf4 :[message \cf14 substringToIndex\cf4 :atRange.\cf14 location\cf4 ]];\ [array \cf14 addObject\cf4 :[message \cf14 substringWithRange\cf4 :\cf14 NSMakeRange\cf4 (atRange.\cf14 location\cf4 , \cf7 1\cf4 )]];\ \cf10 NSString\cf4 *str=[message \cf14 substringFromIndex\cf4 :atRange.\cf14 location\cf4 +\cf7 1\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 getImageRange\cf4 :str \cf15 array\cf4 :array];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [array \cf14 addObject\cf4 :[message \cf14 substringWithRange\cf4 :\cf14 NSMakeRange\cf4 (atRange.\cf14 location\cf4 , \cf7 1\cf4 )]];\ \cf10 NSString\cf4 *str=[message \cf14 substringFromIndex\cf4 :atRange.\cf14 location\cf4 +\cf7 1\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 getImageRange\cf4 :str \cf15 array\cf4 :array];\ \}\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (message != \f2\b \cf8 nil \f0\b0 \cf4 ) \{\ [array \cf14 addObject\cf4 :message];\ \}\ \}\ \ \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (range.\cf14 length\cf4 >\cf7 0\cf4 && range1.\cf14 length\cf4 >\cf7 0\cf4 && range1.\cf14 location\cf4 < range.\cf14 location\cf4 )\{\ \cf10 NSString\cf4 *str = [message \cf14 substringToIndex\cf4 :range1.\cf14 location\cf4 + \cf7 1\cf4 ];\ \cf10 NSString\cf4 *str1 = [message \cf14 substringFromIndex\cf4 :range1.\cf14 location\cf4 + \cf7 1\cf4 ];\ [array \cf14 addObject\cf4 :str];\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 getImageRange\cf4 :str1 \cf15 array\cf4 :array];\ \}\ \ \ \ \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (message != \f2\b \cf8 nil \f0\b0 \cf4 ) \{\ [array \cf14 addObject\cf4 :message];\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 textViewDidChangeSelection\cf4 :(\cf10 UITextView\cf4 *)textView \{\ \cf2 // \f1 \'c8\'e7\'b9\'fb\'ca\'c7\'cc\'e1\'ca\'be\'c4\'da\'c8\'dd\'a3\'ac\'b9\'e2\'b1\'ea\'b7\'c5\'d6\'c3\'bf\'aa\'ca\'bc\'ce\'bb\'d6\'c3 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (textView.\cf14 textColor\cf4 ==[\cf10 UIColor\cf4 \cf14 lightGrayColor\cf4 ]) \{\ \cf10 NSRange\cf4 range;\ range.\cf14 location\cf4 = \cf7 0\cf4 ;\ range.\cf14 length\cf4 = \cf7 0\cf4 ;\ textView.\cf14 selectedRange\cf4 = range;\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 textViewDidChange\cf4 :(\cf10 UITextView\cf4 *)textView \{\ \ \f2\b \cf8 if \f0\b0 \cf4 (textView.\cf14 text\cf4 .\cf10 length\cf4 <= \cf7 0\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf14 removeAllAt\cf4 ];\ \cf2 // \f1 \'cf\'d4\'ca\'be\'cb\'ae\'d3\'a1 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 getTextViewWatermark];\ \}\ \ [ \f2\b \cf8 self \f0\b0 \cf4 setTableFooterFrame:textView];\ \ \cf2 // \f1 \'b7\'a2\'cb\'cd\'d5\'fd\'d4\'da\'ca\'e4\'c8\'eb\'b9\'fd\'c2\'cb\'cc\'f5\'bc\'fe \f0 \cf4 \ \cf2 // BOOL enteringStatus = [g_default boolForKey:kStartEnteringStatus];\cf4 \ \f2\b \cf8 BOOL \f0\b0 \cf4 enteringStatus = [g_myself.isTyping intValue] > \cf7 0\cf4 ? \f2\b \cf8 YES \f0\b0 \cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (!enteringStatus || \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 || \f2\b \cf8 self \f0\b0 \cf4 .\cf5 isSendEntering\cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \{\cf2 // \f1 \'b7\'a2\'cb\'cd\'d5\'fd\'d4\'da\'ca\'e4\'c8\'eb \f0 \cf4 \ \f2\b \cf8 self \f0\b0 \cf4 .isSendEntering = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 sendEntering];\ [ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 enteringTimer\cf4 invalidate];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 enteringTimer\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 enteringTimer\cf4 = [NSTimer scheduledTimerWithTimeInterval:\cf7 10\cf4 target: \f2\b \cf8 self \f0\b0 \cf4 selector: \f2\b \cf8 @selector \f0\b0 \cf4 (enteringTimerAction:) userInfo: \f2\b \cf8 nil \f0\b0 \cf4 repeats: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 ) \cf10 enteringTimerAction\cf4 :(NSTimer *)timer \{\ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 isSendEntering\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 .enteringTimer \cf5 invalidate\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 enteringTimer\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \cf2 // \f1 \'bc\'fc\'c5\'cc \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 ) \cf5 setTableFooterFrame\cf4 :(UITextView *) textView \{\ \ \f2\b \cf8 static \f0\b0 \cf4 CGFloat \cf10 maxHeight\cf4 =\cf7 66.0f\cf4 ;\ CGRect \cf10 frame\cf4 = textView.frame;\ \cf10 CGSize\cf4 constraintSize = \cf14 CGSizeMake\cf4 (frame.size.width, MAXFLOAT);\ \cf10 CGSize\cf4 size = [textView sizeThatFits:\cf14 constraintSize\cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 (size.height >= \cf14 maxHeight\cf4 )\ \{\ size.height = maxHeight;\ \cf14 textView\cf4 .scrollEnabled = \f2\b \cf8 YES \f0\b0 \cf4 ; \cf2 // \f1 \'d4\'ca\'d0\'ed\'b9\'f6\'b6\'af \f0 \cf4 \ \}\ \f2\b \cf8 else \f0\b0 \cf4 \ \{\ \cf5 textView\cf4 .scrollEnabled = \f2\b \cf8 NO \f0\b0 \cf4 ; \cf2 // \f1 \'b2\'bb\'d4\'ca\'d0\'ed\'b9\'f6\'b6\'af \f0 \cf4 \ \}\ \f2\b \cf8 if \f0\b0 \cf4 (\cf14 textView\cf4 .hidden) \{\ size.\cf14 height\cf4 = \cf7 32\cf4 + \cf7 5.5\cf4 ;\ \}\ \f2\b \cf8 self \f0\b0 \cf4 .heightFooter = size.height + \cf7 16\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isHiddenFooter) \{\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 =\cf7 0\cf4 ;\ \}\ \cf15 textView\cf4 .frame = CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, size.height);\ inputBar.\cf14 frame\cf4 = \cf14 CGRectMake\cf4 (\cf14 inputBar\cf4 .\cf14 frame\cf4 .origin.\cf14 x\cf4 , inputBar.\cf14 frame\cf4 .\cf14 origin\cf4 .y, \cf14 inputBar\cf4 .frame.size.width, \f2\b \cf8 self \f0\b0 \cf4 .heightFooter);\ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 tableFooter\cf4 .\cf14 frame\cf4 = \cf15 CGRectMake\cf4 (\cf7 0\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .view.\cf15 frame\cf4 .size.\cf14 height\cf4 + \f2\b \cf8 self \f0\b0 \cf4 .\cf15 deltaHeight\cf4 -\cf14 size\cf4 .\cf14 height\cf4 -\cf7 16\cf4 , \cf15 JX_SCREEN_WIDTH\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .heightFooter);\ \cf15 CGFloat\cf4 height = \cf7 0\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf14 heightFooter\cf4 > \cf7 0\cf4 ) \{\ \cf15 height\cf4 = \f2\b \cf8 self \f0\b0 \cf4 .tableFooter.\cf14 frame\cf4 .origin.\cf5 y\cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf15 height\cf4 = \cf14 JX_SCREEN_HEIGHT\cf4 ;\ \}\ _table.\cf5 frame\cf4 =CGRectMake(_table.frame.origin.x,_table.frame.origin.y,self_width,JX_SCREEN_HEIGHT-_table.frame.origin.y-(JX_SCREEN_HEIGHT - height));\ [_table \cf14 gotoLastRow\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ \ \cf15 _publicMenuBar\cf4 .\cf5 frame\cf4 = \cf14 CGRectMake\cf4 (\cf5 _publicMenuBar\cf4 .frame.origin.x, \f2\b \cf8 self \f0\b0 \cf4 .\cf14 tableFooter\cf4 .\cf5 frame\cf4 .size.height, _publicMenuBar.frame.size.width, _publicMenuBar.frame.size.height);\ \ \ \f2\b \cf8 self \f0\b0 \cf4 .\cf14 screenShotView\cf4 .\cf15 frame\cf4 = CGRectMake( \f2\b \cf8 self \f0\b0 \cf4 .\cf14 screenShotView\cf4 .\cf15 frame\cf4 .origin.\cf14 x\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf14 tableFooter\cf4 .frame.origin.y - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 screenShotView\cf4 .frame.size.\cf14 height\cf4 - \cf7 10\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .screenShotView.frame.size.width, \f2\b \cf8 self \f0\b0 \cf4 .screenShotView.frame.size.height);\ \}\ \ - ( \f2\b \cf8 BOOL \f0\b0 \cf4 )\cf14 textViewShouldBeginEditing\cf4 :(\cf15 UITextView\cf4 *)textView \{\ \ \cf14 _btnFace\cf4 .\cf15 selected\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ - ( \f2\b \cf8 BOOL \f0\b0 \cf4 )\cf5 textViewShouldEndEditing\cf4 :(UITextView *)\cf15 textView\cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf14 doEndEdit\cf4 ];\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ \ \ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf14 recordSwitch\cf4 :(UIButton*)sender\{\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 \cf10 showDisableSay\cf4 ])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ _messageText.inputView = \f2\b \cf8 nil \f0\b0 \cf4 ;\ [_messageText \cf5 reloadInputViews\cf4 ];\ \ \cf15 sender\cf4 .\cf14 selected\cf4 = !sender.selected;\ \cf14 _recordBtn\cf4 .hidden = !\cf14 sender\cf4 .selected;\ \cf14 _messageText\cf4 .hidden = !\cf14 _recordBtn\cf4 .hidden;\ \f2\b \cf8 if \f0\b0 \cf4 (!\cf14 _recordBtn\cf4 .hidden)\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf14 hideKeyboard\cf4 : \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf5 setTableFooterFrame\cf4 :_messageText];\ \}\ \ \cf2 // \f1 \'c1\'c4\'cc\'ec\'ce\'bb\'d6\'c3\'b1\'bb\'b5\'e3\'bb\'f7 \f0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf15 onDidLocation\cf4 :(JXMessageObject*)msg\{\ JXLocationVC* vc = [JXLocationVC alloc];\ \cf9 vc\cf4 .longitude = [msg.\cf9 location_y\cf4 \cf14 doubleValue\cf4 ];\ vc.\cf15 latitude\cf4 = [msg.\cf15 location_x\cf4 \cf14 doubleValue\cf4 ];\ vc.\cf15 locationType\cf4 = \cf14 JXLocationTypeShowStaticLocation\cf4 ;\ vc = [vc init];\ \cf2 // [g_window addSubview:vc.view];\cf4 \ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \cf2 // [vc release];\cf4 \ \}\ \ \cf2 //cell \f1 \'c0\'ef\'b5\'c4\'cd\'bc\'c6\'ac\'a3\'ac\'b1\'bb\'b5\'e3\'bb\'f7\'ba\'f3\'b5\'c4\'b4\'a6\'c0\'ed\'ca\'c2\'bc\'fe \f0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onSelectImage\cf4 :(\cf9 JXImageView\cf4 *)sender\{\ \cf2 // [sender removeFromSuperview];\cf4 \ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 offRecordBtns\cf4 \{\ \cf15 _recordBtnLeft\cf4 .\cf14 selected\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \cf15 _recordBtn\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \cf15 _messageText\cf4 .\cf14 hidden\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 scrollToPageUp\cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _isLoading\cf4 )\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \cf14 NSLog\cf4 (\cf6 @"scrollToPageUp"\cf4 );\ \cf15 _page\cf4 ++;\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 getServerData\cf4 ];\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 scrollToPageDown\cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _isLoading\cf4 )\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \cf15 _page\cf4 =\cf7 0\cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 getServerData\cf4 ];\ \}\ \cf5 #pragma mark \f2\b \cf16 - ViewLoad \f4 \'bb\'f1\'c8\'a1\'ca\'fd\'be\'dd \f0\b0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 getServerData\cf4 \{\ \cf15 _isLoading\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 refresh\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf14 NSLog\cf4 (\cf6 @"_isLoading=no"\cf4 );\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 stopLoading\cf4 ];\ \}\ \ \ \cf2 //- (void)tableView:(UITableView *)tableView touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event\{\cf4 \ \cf2 // [self hideKeyboard:NO];\cf4 \ \cf2 //\}\cf4 \ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendText\cf4 :(\cf10 UIView\cf4 *)sender\{\ \f2\b \cf8 if \f0\b0 \cf4 ([\cf15 _messageText\cf4 .\cf14 text\cf4 \cf14 length\cf4 ]<=\cf7 0\cf4 )\{\ \cf2 // [g_App showAlert:Localized(@"JXAlert_MessageNotNil")];\cf4 \ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \cf2 // [self hideKeyboard:NO];\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isGroupMessages\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 hideKeyboard\cf4 : \f2\b \cf8 YES \f0\b0 \cf4 ];\ \cf15 _onceSendNum\cf4 = \cf7 20\cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 addWaitGroupSendViewWithMsgNum\cf4 :\cf7 1\cf4 \cf15 withType\cf4 :\cf5 groupsend_msgType_text\cf4 ];\ \}\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 sendIt\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 setTableFooterFrame\cf4 :\cf15 _messageText\cf4 ];\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 ) \cf11 setChatPerson\cf4 :(\cf9 JXUserObject\cf4 *)user\{\ \f2\b \cf8 if \f0\b0 \cf4 (user == \f2\b \cf8 nil \f0\b0 \cf4 || user == \cf15 chatPerson\cf4 )\{\ \cf15 current_chat_userId\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \cf2 // chatPerson = [user retain];\cf4 \ \cf15 chatPerson\cf4 = user;\ \cf15 current_chat_userId\cf4 = user.\cf15 userId\cf4 ;\ \}\ \ \cf5 #pragma mark \f2\b \cf16 ---- \f4 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2\'b2\'a2\'cf\'d4\'ca\'be \f0\b0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 resendMsgNotif\cf4 :(\cf10 NSNotification\cf4 *)notification\{\ \f2\b \cf8 int \f0\b0 \cf4 indexNum = [notification.\cf14 object\cf4 \cf14 intValue\cf4 ];\ \cf9 JXMessageObject\cf4 *p =[\cf15 _array\cf4 \cf14 objectAtIndex\cf4 :indexNum];\ [p \cf15 updateIsSend\cf4 :\cf5 transfer_status_ing\cf4 ];\ \cf10 NSIndexPath\cf4 * cellIndex = [\cf10 NSIndexPath\cf4 \cf14 indexPathForRow\cf4 :indexNum \cf14 inSection\cf4 :\cf7 0\cf4 ];\ \cf15 _selCell\cf4 = [\cf15 _table\cf4 \cf14 cellForRowAtIndexPath\cf4 :cellIndex];\ [\cf15 _selCell\cf4 \cf15 drawIsSend\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ([p.\cf15 isUpload\cf4 \cf14 boolValue\cf4 ])\{\ [\cf5 g_xmpp\cf4 \cf15 sendMessage\cf4 :p \cf15 roomName\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [\cf5 g_server\cf4 \cf15 uploadFile\cf4 :p.\cf15 fileName\cf4 \cf15 validTime\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 chatPerson\cf4 .\cf15 chatRecordTimeOut\cf4 \cf15 messageId\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 \cf15 toView\cf4 : \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \}\ \ \cf5 #pragma mark \f2\b \cf16 ---- \f4 \'c9\'be\'b3\'fd\'cf\'fb\'cf\'a2\'b2\'a2\'cb\'a2\'d0\'c2 \f0\b0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 deleteMsgNotif\cf4 :(NSNotification*)notification\{\ \f2\b \cf8 int \f0\b0 \cf4 indexNum = [notification.object intValue];\ JXMessageObject *p=[_array objectAtIndex:indexNum];\ [p \f2\b \cf8 delete \f0\b0 \cf4 ];\ [_array removeObject:p];\ [ \f2\b \cf8 self \f0\b0 \cf4 deleteMsg:p];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 showReadPersons\cf4 :(NSNotification *)notification\{\ \f2\b \cf8 if \f0\b0 \cf4 (recording) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 int \f0\b0 \cf4 indexNum = [notification.object intValue];\ JXMessageObject *msg = _array[indexNum];\ JXReadListVC *vc = [[JXReadListVC alloc] init];\ vc.msg = msg;\ vc.room = _room;\ \cf2 // [g_window addSubview:vc.view];\cf4 \ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 resend\cf4 :(JXMessageObject*)p\{\ \cf2 // NSLog(@"resend");\cf4 \ [p updateIsSend:transfer_status_ing];\ [_selCell drawIsSend];\ \f2\b \cf8 if \f0\b0 \cf4 ([p.isUpload boolValue])\{\ [g_xmpp sendMessage:p roomName: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [g_server uploadFile:p.fileName validTime: \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.chatRecordTimeOut messageId: \f2\b \cf8 nil \f0\b0 \cf4 toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 deleteMsg\cf4 :(JXMessageObject*)p\{\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < _array.count; i ++) \{\ JXMessageObject *msg = _array[i];\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeText) \{\ JXMessageCell *cell = [_table cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:\cf7 0\cf4 ]];\ [cell.readDelTimer invalidate];\ cell.readDelTimer = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \ \f2\b \cf8 if \f0\b0 \cf4 ([p.messageId isEqualToString:msg.messageId]) \{\ \f2\b \cf8 if \f0\b0 \cf4 (i == _array.count - \cf7 1\cf4 && i > \cf7 0\cf4 ) \{\ JXMessageObject *theLastMsg = _array[_array.count - \cf7 2\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .lastMsg = theLastMsg;\ [theLastMsg updateLastSend:UpdateLastSendType_None];\ \}\ \}\ \}\ \}\ \ [_array removeObject:p];\ _refreshCount++;\ [_table reloadData];\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 actionQuit\cf4 \{\ \ [_voice hide];\ [peakTimer invalidate];\ peakTimer = \f2\b \cf8 nil \f0\b0 \cf4 ;\ recording = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ _isGroupSendCancel = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isSelectMore) \{\ \f2\b \cf8 self \f0\b0 \cf4 .isSelectMore = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .selectMoreView.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \ [ \f2\b \cf8 self \f0\b0 \cf4 .gotoBackBtn setBackgroundImage:[UIImage imageNamed:\cf6 @"title_back_black_big"\cf4 ] forState:UIControlStateNormal];\ [ \f2\b \cf8 self \f0\b0 \cf4 .gotoBackBtn setTitle: \f2\b \cf8 nil \f0\b0 \cf4 forState:UIControlStateNormal];\ [_selectMoreArr removeAllObjects];\ [ \f2\b \cf8 self \f0\b0 \cf4 enableCell];\ [ \f2\b \cf8 self \f0\b0 \cf4 .tableView reloadData];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ [g_notify postNotificationName:kAllVideoPlayerStopNotifaction object: \f2\b \cf8 nil \f0\b0 \cf4 userInfo: \f2\b \cf8 nil \f0\b0 \cf4 ];\ [g_notify postNotificationName:kAllAudioPlayerStopNotifaction object: \f2\b \cf8 nil \f0\b0 \cf4 userInfo: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < _array.count; i ++) \{\ JXMessageObject *msg = _array[i];\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeText) \{\ JXMessageCell *cell = [_table cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:\cf7 0\cf4 ]];\ \f2\b \cf8 if \f0\b0 \cf4 ([cell isKindOfClass:[JXMessageCell \f2\b \cf8 class \f0\b0 \cf4 ]]) \{\ \ [cell.readDelTimer invalidate];\ cell.readDelTimer = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \}\ \}\ \cf2 // \f1 \'b1\'a3\'b4\'e6\'b8\'fc\'d0\'c2\'ca\'e4\'c8\'eb\'bf\'f2\'d6\'d0\'c8\'e7\'c8\'e7\'b5\'c4\'d0\'c5\'cf\'a2 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (_messageText.textColor != [UIColor lightGrayColor]) \{\ chatPerson.lastInput = [_messageText.textStorage getPlainString];\ [chatPerson updateLastInput];\ \}\ \cf2 // if (g_mainVC.msgVc.array.count > 0) \{\cf4 \ \cf2 // [g_mainVC.msgVc.tableView reloadRow:(int)self.rowIndex section:0];\cf4 \ \cf2 // \}\cf4 \ \ [g_notify postNotificationName:kChatViewDisappear object: \f2\b \cf8 nil \f0\b0 \cf4 ];\ [g_xmpp.chatingUserIds removeObject:current_chat_userId];\ current_chat_userId = \f2\b \cf8 nil \f0\b0 \cf4 ;\ [g_notify removeObserver: \f2\b \cf8 self \f0\b0 \cf4 ];\ [ \f2\b \cf8 super \f0\b0 \cf4 actionQuit];\ \}\ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 showChatView\cf4 \{\ [_wait stop];\ NSDictionary * dict = _dataDict;\ \cf2 // \f1 \'c0\'cf\'b7\'bf\'bc\'e4 \f0 :\cf4 \ JXRoomObject *chatRoom = [[JXXMPP sharedInstance].roomPool joinRoom:[dict objectForKey:\cf6 @"jid"\cf4 ] title:[dict objectForKey:\cf6 @"name"\cf4 ] lastDate: \f2\b \cf8 nil \f0\b0 \cf4 isNew: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ roomData * roomdata = [[roomData alloc] init];\ [roomdata getDataFromDict:dict];\ \ JXChatViewController *sendView=[JXChatViewController alloc];\ sendView.title = [dict objectForKey:\cf6 @"name"\cf4 ];\ sendView.roomJid = [dict objectForKey:\cf6 @"jid"\cf4 ];\ sendView.roomId = [dict objectForKey:\cf6 @"id"\cf4 ];\ sendView.chatRoom = chatRoom;\ sendView.room = roomdata;\ \ \ JXUserObject * userObj = [[JXUserObject alloc]init];\ userObj.userId = [dict objectForKey:\cf6 @"jid"\cf4 ];\ userObj.showRead = [dict objectForKey:\cf6 @"showRead"\cf4 ];\ userObj.userNickname = [dict objectForKey:\cf6 @"name"\cf4 ];\ userObj.showMember = [dict objectForKey:\cf6 @"showMember"\cf4 ];\ userObj.allowSendCard = [dict objectForKey:\cf6 @"allowSendCard"\cf4 ];\ userObj.chatRecordTimeOut = roomdata.chatRecordTimeOut;\ userObj.talkTime = [dict objectForKey:\cf6 @"talkTime"\cf4 ];\ userObj.allowInviteFriend = [dict objectForKey:\cf6 @"allowInviteFriend"\cf4 ];\ userObj.allowUploadFile = [dict objectForKey:\cf6 @"allowUploadFile"\cf4 ];\ userObj.allowConference = [dict objectForKey:\cf6 @"allowConference"\cf4 ];\ userObj.allowSpeakCourse = [dict objectForKey:\cf6 @"allowSpeakCourse"\cf4 ];\ userObj.isNeedVerify = [dict objectForKey:\cf6 @"isNeedVerify"\cf4 ];\ \ sendView.chatPerson = userObj;\ sendView = [sendView init];\ \cf2 // [g_App.window addSubview:sendView.view];\cf4 \ [g_navigation pushViewController:sendView animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ dict = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onInputHello\cf4 :(JXInputVC*)sender\{\ \ JXMessageObject *msg = [[JXMessageObject alloc] init];\ msg.fromUserId = MY_USER_ID;\ msg.toUserId = [NSString stringWithFormat:\cf6 @"%@"\cf4 , [_dataDict objectForKey:\cf6 @"userId"\cf4 ]];\ msg.fromUserName = MY_USER_NAME;\ msg.toUserName = [_dataDict objectForKey:\cf6 @"nickname"\cf4 ];\ msg.timeSend = [NSDate date];\ msg.type = [NSNumber numberWithInt:kRoomRemind_NeedVerify];\ NSString *userIds = g_myself.userId;\ NSString *userNames = g_myself.userNickname;\ NSDictionary *dict = \cf7 @\{\cf4 \ \cf6 @"userIds"\cf4 : userIds,\ \cf6 @"userNames"\cf4 : userNames,\ \cf6 @"roomJid"\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .roomJid,\ \cf6 @"reason"\cf4 : sender.inputText,\ \cf6 @"isInvite"\cf4 : [NSNumber numberWithBool: \f2\b \cf8 YES \f0\b0 \cf4 ]\ \cf7 \}\cf4 ;\ NSError *error = \f2\b \cf8 nil \f0\b0 \cf4 ;\ NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error];\ \ NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];\ msg.objectId = jsonStr;\ [g_xmpp sendMessage:msg roomName: \f2\b \cf8 nil \f0\b0 \cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 actionQuit];\ \ \cf2 // msg.fromUserId = self.roomJid;\cf4 \ \cf2 // msg.type = [NSNumber numberWithInt:kWCMessageTypeRemind];\cf4 \ \cf2 // msg.content = @" \f1 \'c9\'ea\'c7\'eb\'d2\'d1\'b7\'a2\'cb\'cd\'b8\'f8\'c8\'ba\'d6\'f7\'a3\'ac\'c7\'eb\'b5\'c8\'b4\'fd\'c8\'ba\'d6\'f7\'c8\'b7\'c8\'cf \f0 ";\cf4 \ \cf2 // [msg insert:self.roomJid];\cf4 \ \cf2 // if ([self.delegate respondsToSelector:@selector(needVerify:)]) \{\cf4 \ \cf2 // [self.delegate needVerify:msg];\cf4 \ \cf2 // \}\cf4 \ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 xmppRoomDidJoin\cf4 \{\ \ NSDictionary * dict = _dataDict;\ \ JXUserObject* user = [[JXUserObject alloc]init];\ user.userNickname = [dict objectForKey:\cf6 @"name"\cf4 ];\ user.userId = [dict objectForKey:\cf6 @"jid"\cf4 ];\ user.userDescription = [dict objectForKey:\cf6 @"desc"\cf4 ];\ user.roomId = [dict objectForKey:\cf6 @"id"\cf4 ];\ user.showRead = [dict objectForKey:\cf6 @"showRead"\cf4 ];\ user.showMember = [dict objectForKey:\cf6 @"showMember"\cf4 ];\ user.allowSendCard = [dict objectForKey:\cf6 @"allowSendCard"\cf4 ];\ user.chatRecordTimeOut = [dict objectForKey:\cf6 @"chatRecordTimeOut"\cf4 ];\ user.talkTime = [dict objectForKey:\cf6 @"talkTime"\cf4 ];\ user.allowInviteFriend = [dict objectForKey:\cf6 @"allowInviteFriend"\cf4 ];\ user.allowUploadFile = [dict objectForKey:\cf6 @"allowUploadFile"\cf4 ];\ user.allowConference = [dict objectForKey:\cf6 @"allowConference"\cf4 ];\ user.allowSpeakCourse = [dict objectForKey:\cf6 @"allowSpeakCourse"\cf4 ];\ user.isNeedVerify = [dict objectForKey:\cf6 @"isNeedVerify"\cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 (![user haveTheUser])\ [user insertRoom];\ \cf2 // else\cf4 \ \cf2 // [user update];\cf4 \ \cf2 // [user release];\cf4 \ \ \cf2 // [g_server addRoomMember:[dict objectForKey:@"id"] userId:g_myself.userId nickName:g_myself.userNickname toView:self];\cf4 \ [g_server roomJoin:[dict objectForKey:\cf6 @"id"\cf4 ] userId:g_myself.userId nickName:g_myself.userNickname toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \ user.groupStatus = [NSNumber numberWithInt:\cf7 0\cf4 ];\ [user updateGroupInvalid];\ \ dict = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \cf2 // chatRoom.delegate = nil;\cf4 \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 goundAttionTitle\cf4 :(NSMutableArray *)tempArr\{\ \ memberData *model=[tempArr firstObject];\ [ \f2\b \cf8 self \f0\b0 \cf4 .attioPersonBtn setTitle:model.userNickName forState:UIControlStateNormal];\ \ \}\ \cf5 #pragma mark \f2\b \cf16 ------------------- \f4 \'b7\'fe\'ce\'f1\'c6\'f7\'b7\'b5\'bb\'d8\'ca\'fd\'be\'dd \f2 -------------------- \f0\b0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 ) \cf11 didServerResultSucces\cf4 :(JXConnection*)aDownload \cf11 dict\cf4 :(NSDictionary*)dict \cf11 array\cf4 :(NSArray*)array1\{\ \ \f2\b \cf8 double \f0\b0 \cf4 time = [dict[\cf6 @"timeSend"\cf4 ] doubleValue];\ \f2\b \cf8 __block \f0\b0 \cf4 NSUInteger aaaa=\cf7 0\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_UserRoomgetlastMessage]) \{\ NSLog(\cf6 @" \f1 \'d7\'ee\'ba\'f3\'d2\'bb\'cc\'f5\'cf\'fb\'cf\'a2\'ca\'b1\'bc\'e4 \f0 X \f1 \'a3\'ba \f0 %@"\cf4 ,dict[\cf6 @"timeSend"\cf4 ]);\ [_array enumerateObjectsUsingBlock:^(JXMessageObject * \f2\b \cf8 _Nonnull \f0\b0 \cf4 obj, NSUInteger idx, \f2\b \cf8 BOOL \f0\b0 \cf4 * \f2\b \cf8 _Nonnull \f0\b0 \cf4 stop) \{\ \f2\b \cf8 double \f0\b0 \cf4 time2 = [obj.timeSend timeIntervalSince1970]*\cf7 1000\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (time ==time2) \{\ aaaa=idx;\ \}\ \}];\ NSIndexPath * dayOne = [NSIndexPath indexPathForRow:aaaa inSection:\cf7 0\cf4 ];\ [_table scrollToRowAtIndexPath:dayOne atScrollPosition:UITableViewScrollPositionTop animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_UserRoomgetRoomAttention]) \{\ \ NSArray * memberArray = [memberData fetchAllMembers:roomId];\ NSString *userArr = [dict[\cf6 @"attentionUserIds"\cf4 ] firstObject];\ [memberArray enumerateObjectsUsingBlock:^(memberData * \f2\b \cf8 _Nonnull \f0\b0 \cf4 obj, NSUInteger idx, \f2\b \cf8 BOOL \f0\b0 \cf4 * \f2\b \cf8 _Nonnull \f0\b0 \cf4 stop) \{\ memberData *dataModel=obj;\ \f2\b \cf8 if \f0\b0 \cf4 (dataModel.userId == [userArr longLongValue]) \{\ [_tempArrMM addObject:dataModel];\ \}\ \ \}];\ [ \f2\b \cf8 self \f0\b0 \cf4 goundAttionTitle:_tempArrMM];\ memberData *model=[_tempArrMM firstObject];\ [ \f2\b \cf8 self \f0\b0 \cf4 .showTopView.tebieGuanXin setTitle:model.userNickName forState:UIControlStateNormal];\ \ \ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_SilkPlanallByJidlist]) \{\ NSDictionary *dict = array1.firstObject;\ \ JXSiDaiWebView *vc = [[JXSiDaiWebView alloc] init];\ vc.dataArr=[array1 mutableCopy];\ vc.sdaiArr=array1;\ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_getAppResource]) \{\ NSDictionary *dict = array1.firstObject;\ NSString *imageUrl = dict[\cf6 @"imgUrl"\cf4 ];\ CYWebCustomerServiceVC *vc = [[CYWebCustomerServiceVC alloc] init];\ vc.titleName = dict[\cf6 @"desc"\cf4 ];\ vc.link = imageUrl;\ [ \f2\b \cf8 self \f0\b0 \cf4 presentViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 completion:^\{\ \ \}];\ \}\ \ \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_getFaceListByGrade]) \{\ \cf2 // NSMutableArray *tempArr=[NSMutableArray arrayWithCapacity:0];\cf4 \ \cf2 // tempArr=[array1 mutableCopy];\cf4 \ \cf2 // NSSortDescriptor *sortNumSD = [NSSortDescriptor sortDescriptorWithKey:@"sortNum" ascending:YES];\cf4 \ \cf2 // tempArr = [[tempArr sortedArrayUsingDescriptors:@[sortNumSD]] mutableCopy];\cf4 \ \cf2 // if (tempArr.count>=7) \{\cf4 \ \cf2 // \cf4 \ \cf2 // [tempArr removeLastObject];\cf4 \ \cf2 // [tempArr removeLastObject];\cf4 \ \cf2 // array1=[tempArr copy];\cf4 \ _faceView.emojiDataArray = array1;\ \cf2 // \}\cf4 \ \ [g_notify postNotificationName:kFavoritesRefresh object:array1];\ \}\ \ \ \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_getbubbleFontByUserId]) \{\ \ \}\ \ \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_roomMemberGetMemberListByPage]) \{\ \ [ \f2\b \cf8 self \f0\b0 \cf4 stopLoading];\ \ \f2\b \cf8 if \f0\b0 \cf4 (array1.count < kRoomMemberListNum) \{\ \cf2 // self.isShowFooterPull = NO;\cf4 \ \}\ \ NSDictionary *lastDict = array1.lastObject;\ \cf2 // self.user.joinTime = [NSDate dateWithTimeIntervalSince1970:[lastDict[@"createTime"] longValue]];\cf4 \ \cf2 // [self.user updateJoinTime];\cf4 \ \cf2 // _dataArrGetGroundPersonArr=[array1 mutableCopy];\cf4 \ \f2\b \cf8 for \f0\b0 \cf4 (NSDictionary *member \f2\b \cf8 in \f0\b0 \cf4 array1) \{\ memberData* option = [[memberData alloc] init];\ [option getDataFromDict:member];\ option.roomId = \f2\b \cf8 self \f0\b0 \cf4 .room.roomId;\ [option insert];\ \}\ \cf2 // [self refresh];\cf4 \ \cf2 // [self refresh:nil];\cf4 \ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_roomActivityRecord]) \{\ \cf2 // // \f1 \'c7\'c0\'b5\'bd\'c1\'cb \f0 \cf4 \ \cf2 // _activityModel.content = dict[@"resultMsg"];\cf4 \ \cf2 // _activityModel.success = YES;\cf4 \ \cf2 // [self showAdAlertViewImageString:@"ad_box.gif" linkUrl:nil audio:nil duration:1 content:nil showCancelButton:NO type:(DYAdModelTypeGifttOpenAnimation) success:YES];\cf4 \ \ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_roomActivity]) \{\ \cf2 // \f1 \'c7\'c0\'b5\'bd\'c1\'cb \f0 \cf4 \ _activityModel.content = dict[\cf6 @"resultMsg"\cf4 ];\ _activityModel.success = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 showAdAlertViewImageString:\cf6 @"ad_box.gif"\cf4 linkUrl: \f2\b \cf8 nil \f0\b0 \cf4 audio: \f2\b \cf8 nil \f0\b0 \cf4 duration:\cf7 1\cf4 content: \f2\b \cf8 nil \f0\b0 \cf4 showCancelButton: \f2\b \cf8 NO \f0\b0 \cf4 type:(DYAdModelTypeGifttOpenAnimation) success: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_FaceList]) \{\ _faceView.emojiDataArray = array1;\ [g_notify postNotificationName:kFavoritesRefresh object:array1];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_FaceClollectList]) \{\ \cf2 // NSMutableArray *nameArray = [NSMutableArray array];\cf4 \ \cf2 // for (NSDictionary *dict in array1) \{\cf4 \ \cf2 // [nameArray addObject:dict[@"name"]];\cf4 \ \cf2 // \}\cf4 \ \cf2 // _faceView.emojiDataArray = array1;\cf4 \ \ _faceView.emojiDataArray = array1;\ [g_notify postNotificationName:kFavoritesRefresh object:array1];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_FaceClollectAddFaceClollect]) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 getEmojsData];\ [g_notify postNotificationName:kFavoritesRefresh object: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (![aDownload.action isEqualToString:act_getRedPacket]) \{\ [_wait stop];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_roomJoin]) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 showChatView];\ [ \f2\b \cf8 self \f0\b0 \cf4 actionQuit];\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_UploadFile])\{\ NSDictionary* p = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([(NSArray *)[dict objectForKey:\cf6 @"audios"\cf4 ] count]>\cf7 0\cf4 )\ p = [[dict objectForKey:\cf6 @"audios"\cf4 ] objectAtIndex:\cf7 0\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ([(NSArray *)[dict objectForKey:\cf6 @"images"\cf4 ] count]>\cf7 0\cf4 )\ p = [[dict objectForKey:\cf6 @"images"\cf4 ] objectAtIndex:\cf7 0\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ([(NSArray *)[dict objectForKey:\cf6 @"videos"\cf4 ] count]>\cf7 0\cf4 )\ p = [(NSArray *)[dict objectForKey:\cf6 @"videos"\cf4 ] objectAtIndex:\cf7 0\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (p== \f2\b \cf8 nil \f0\b0 \cf4 )\ p = [(NSArray *)[dict objectForKey:\cf6 @"others"\cf4 ] objectAtIndex:\cf7 0\cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isMapMsg) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 sendMapMsgWithDict:p];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 doSendAfterUpload:p];\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 keepOnUplpadGroupSend];\ \f2\b \cf8 if \f0\b0 \cf4 (_sendedNum == \f2\b \cf8 self \f0\b0 \cf4 .userIds.count * \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray.count) \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendView) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendView removeFromSuperview];\ [g_App showAlert:Localized(\cf6 @"JX_SendComplete"\cf4 )];\ \}\ \}\ \}\ \}\ p = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_UploadVoiceServlet]) \{\ NSDictionary* p = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([(NSDictionary *)[dict objectForKey:\cf6 @"audios"\cf4 ] count]>\cf7 0\cf4 )\ p = [[dict objectForKey:\cf6 @"audios"\cf4 ] objectAtIndex:\cf7 0\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 doSendAfterUpload:p];\ p = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ( [aDownload.action isEqualToString:act_UserGet] )\{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .firstGetUser || \f2\b \cf8 self \f0\b0 \cf4 .courseId.length > \cf7 0\cf4 ) \{\ JXUserObject* user = [[JXUserObject alloc]init];\ [user getDataFromDict:dict];\ [_room setNickNameForUser:user];\ \ JXUserInfoVC* vc = [JXUserInfoVC alloc];\ vc.user = user;\ vc.isJustShow = \f2\b \cf8 self \f0\b0 \cf4 .courseId.length > \cf7 0\cf4 ;\ vc.fromAddType = \cf7 3\cf4 ;\ vc = [vc init];\ \ JXUserBaseObj *baseObj = [[JXUserBaseObj alloc] init];\ \cf2 // self.bubbleFontId,self.gradeIndex,self.userId\cf4 \ baseObj.userId = [dict objectForKey:\cf6 @"userId"\cf4 ];\ baseObj.bubbleFontId = [dict objectForKey:\cf6 @"bubbleFontId"\cf4 ];\ baseObj.gradeIndex = [dict objectForKey:\cf6 @"gradeIndex"\cf4 ];\ [baseObj updateBubbleFontIdAndGradIndex];\ \cf2 // [g_window addSubview:vc.view];\cf4 \ \cf2 // [g_navigation pushViewController:vc animated:YES];\cf4 \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ JXUserBaseObj *baseObj = [[JXUserBaseObj alloc] init];\ \cf2 // self.bubbleFontId,self.gradeIndex,self.userId\cf4 \ baseObj.bubbleFontId = [dict objectForKey:\cf6 @"bubbleFontId"\cf4 ];\ baseObj.gradeIndex = [dict objectForKey:\cf6 @"gradeIndex"\cf4 ];\ baseObj.userId = [dict objectForKey:\cf6 @"userId"\cf4 ];\ [baseObj updateBubbleFontIdAndGradIndex];\ \ \f2\b \cf8 self \f0\b0 \cf4 .isBeenBlack = [[(NSDictionary *)[dict objectForKey:\cf6 @"friends"\cf4 ] objectForKey:\cf6 @"isBeenBlack"\cf4 ] intValue];\ \f2\b \cf8 self \f0\b0 \cf4 .friendStatus = [[(NSDictionary *)[dict objectForKey:\cf6 @"friends"\cf4 ] objectForKey:\cf6 @"status"\cf4 ] intValue];\ \f2\b \cf8 self \f0\b0 \cf4 .isReadDelete = [[(NSDictionary *)[dict objectForKey:\cf6 @"friends"\cf4 ] objectForKey:\cf6 @"isOpenSnapchat"\cf4 ] boolValue];\ \f2\b \cf8 self \f0\b0 \cf4 .isReadDelete = [[(NSDictionary *)[dict objectForKey:\cf6 @"friends"\cf4 ] objectForKey:\cf6 @"isOpenSnapchat"\cf4 ] boolValue];\ \f2\b \cf8 self \f0\b0 \cf4 .firstGetUser = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .onlinestate = [dict[\cf6 @"onlinestate"\cf4 ] boolValue];\ \f2\b \cf8 if \f0\b0 \cf4 ([chatPerson.userId intValue]<\cf7 10100\cf4 && [chatPerson.userId intValue]>=\cf7 10000\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 (chatPerson.userNickname) \{\ \f2\b \cf8 self \f0\b0 \cf4 .title = chatPerson.userNickname;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 self \f0\b0 \cf4 .title = dict[\cf6 @"nickname"\cf4 ];\ \}\ [ \f2\b \cf8 self \f0\b0 \cf4 setAudioIconFrame];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .courseId.length > \cf7 0\cf4 ) \{\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // NSString *str = self.onlinestate ? Localized(@"JX_OnLine") : Localized(@"JX_OffLine");\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (chatPerson.userNickname) \{\ \cf2 // self.title = [NSString stringWithFormat:@"%@(%@)",chatPerson.remarkName.length > 0 ? chatPerson.remarkName : chatPerson.userNickname,str];\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 setChatTitle:chatPerson.remarkName.length > \cf7 0\cf4 ? chatPerson.remarkName : chatPerson.userNickname];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // self.title = [NSString stringWithFormat:@"%@(%@)",dict[@"nickname"],str];\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 setChatTitle:dict[\cf6 @"nickname"\cf4 ]];\ \}\ \}\ \ \}\ \ \ \f2\b \cf8 if \f0\b0 \cf4 ([dict[\cf6 @"userType"\cf4 ] intValue] == \cf7 2\cf4 ) \{ \cf2 // \f1 \'bb\'f1\'c8\'a1\'b9\'ab\'d6\'da\'ba\'c5\'b2\'cb\'b5\'a5 \f0 \cf4 \ \cf2 // \f1 \'bb\'f1\'c8\'a1\'b9\'ab\'d6\'da\'ba\'c5\'b2\'cb\'b5\'a5 \f0 \cf4 \ [g_server getPublicMenuListWithUserId:chatPerson.userId toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \cf2 // else \{\cf4 \ \cf2 // // \f1 \'bb\'f1\'c8\'a1\'b9\'ab\'d6\'da\'ba\'c5\'b2\'cb\'b5\'a5 \f0 \cf4 \ \cf2 // [g_server getPublicMenuListWithUserId:chatPerson.userId toView:self];\cf4 \ \cf2 // \}\cf4 \ \}\ \ \ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( [aDownload.action isEqualToString:act_roomGet] )\{\ \cf2 // [_room getDataFromDict:dict];\cf4 \ \cf2 //\cf4 \ \cf2 // JXRoomMemberVC* vc = [JXRoomMemberVC alloc];\cf4 \ \cf2 // vc.chatRoom = chatRoom;\cf4 \ \cf2 // vc.room = _room;\cf4 \ \cf2 // vc.delegate = self;\cf4 \ \cf2 // vc = [vc init];\cf4 \ \cf12 /// \f3 \cf2 / [g_window addSubview:vc.view]; \f0 \cf4 \ \cf2 // [g_navigation pushViewController:vc animated:YES];\cf4 \ \ _dataDict = dict;\ \ \f2\b \cf8 if \f0\b0 \cf4 ([[dict objectForKey:\cf6 @"s"\cf4 ] integerValue] == \cf7 1\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .isDisable = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 self \f0\b0 \cf4 .isDisable = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (g_xmpp.isLogined == login_status_no)\{\ \cf2 // [self hideKeyboard:NO];\cf4 \ \cf2 // [g_xmpp showXmppOfflineAlert];\cf4 \ \cf2 // return YES;\cf4 \ \ \cf2 // [g_xmpp logout];\cf4 \ [g_xmpp login];\ \ \}\ \ \cf2 // _chatRoom = [g_xmpp.roomPool joinRoom:[dict objectForKey:@"jid"] title:[dict objectForKey:@"name"] isNew:YES];\cf4 \ \ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isFirst) \{\ \f2\b \cf8 self \f0\b0 \cf4 .isFirst = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \ roomData * roomdata = [[roomData alloc] init];\ [roomdata getDataFromDict:dict];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \ JXUserObject *user = [[JXUserObject sharedInstance] getUserById:[dict objectForKey:\cf6 @"jid"\cf4 ]];\ \f2\b \cf8 if \f0\b0 \cf4 (user && [user.groupStatus intValue] == \cf7 0\cf4 )\{\ \ \cf2 // \f1 \'c0\'cf\'b7\'bf\'bc\'e4 \f0 :\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 showChatView];\ [ \f2\b \cf8 self \f0\b0 \cf4 actionQuit];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ JXRoomObject *chatRoomObj = [[JXXMPP sharedInstance].roomPool joinRoom:[dict objectForKey:\cf6 @"jid"\cf4 ] title:[dict objectForKey:\cf6 @"name"\cf4 ] lastDate: \f2\b \cf8 nil \f0\b0 \cf4 isNew: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \f2\b \cf8 BOOL \f0\b0 \cf4 isNeedVerify = [dict[\cf6 @"isNeedVerify"\cf4 ] boolValue];\ \f2\b \cf8 long \f0\b0 \cf4 userId = [dict[\cf6 @"userId"\cf4 ] longLongValue];\ \f2\b \cf8 if \f0\b0 \cf4 (isNeedVerify && userId != [g_myself.userId longLongValue]) \{\ \ \f2\b \cf8 self \f0\b0 \cf4 .roomJid = [dict objectForKey:\cf6 @"jid"\cf4 ];\ \cf2 // self.roomUserName = [dict objectForKey:@"nickname"];\cf4 \ \cf2 // self.roomUserId = [dict objectForKey:@"userId"];\cf4 \ \ JXInputVC* vc = [JXInputVC alloc];\ vc.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ vc.didTouch = \f2\b \cf8 @selector \f0\b0 \cf4 (onInputHello:);\ vc.inputTitle = Localized(\cf6 @"JX_GroupOwnersHaveEnabled"\cf4 );\ vc.titleColor = [UIColor lightGrayColor];\ vc.titleFont = [UIFont systemFontOfSize:\cf7 13.0\cf4 ];\ vc.inputHint = Localized(\cf6 @"JX_PleaseEnterTheReason"\cf4 );\ vc = [vc init];\ [g_window addSubview:vc.view];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ [_wait start:Localized(\cf6 @"JXAlert_AddRoomIng"\cf4 ) delay:\cf7 30\cf4 ];\ \cf2 // \f1 \'d0\'c2\'b7\'bf\'bc\'e4 \f0 :\cf4 \ chatRoomObj.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ [chatRoomObj joinRoom: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \}\ \ \ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( [aDownload.action isEqualToString:act_roomMemberGet] )\{\ _disableSay = [[dict objectForKey:\cf6 @"talkTime"\cf4 ] longLongValue];\ _audioMeetingNo = [NSString stringWithFormat:\cf6 @"%@"\cf4 ,dict[\cf6 @"call"\cf4 ]];\ _videoMeetingNo = [NSString stringWithFormat:\cf6 @"%@"\cf4 ,dict[\cf6 @"videoMeetingNo"\cf4 ]];\ _userNickName = dict[\cf6 @"nickname"\cf4 ];\ [_table reloadData];\ \ \f2\b \cf8 if \f0\b0 \cf4 (_relayMsgArray.count > \cf7 0\cf4 ) \{\ \f2\b \cf8 for \f0\b0 \cf4 (JXMessageObject *msg \f2\b \cf8 in \f0\b0 \cf4 \f2\b \cf8 self \f0\b0 \cf4 .relayMsgArray) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeRedPacket) \{\ msg.type = [NSNumber numberWithInt:kWCMessageTypeText];\ msg.content = [NSString stringWithFormat:\cf6 @"[%@]"\cf4 , Localized(\cf6 @"JXredPacket"\cf4 )];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeAudioMeetingInvite || [msg.type intValue] == kWCMessageTypeVideoMeetingInvite || [msg.type intValue] == kWCMessageTypeAudioChatCancel || [msg.type intValue] == kWCMessageTypeAudioChatEnd || [msg.type intValue] == kWCMessageTypeVideoChatCancel || [msg.type intValue] == kWCMessageTypeVideoChatEnd || [msg.type intValue] == kWCMessageTypeAVBusy) \{\ \ msg.type = [NSNumber numberWithInt:kWCMessageTypeText];\ msg.content = [NSString stringWithFormat:\cf6 @"[%@]"\cf4 , Localized(\cf6 @"JX_AudioAndVideoCalls"\cf4 )];\ \}\ [ \f2\b \cf8 self \f0\b0 \cf4 relay:msg];\ \}\ \cf2 // [self relay];\cf4 \ \}\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_roomMemberList]) \{\ _room.roomId = roomId;\ _room.members = [array1 mutableCopy];\ \ memberData *data = [ \f2\b \cf8 self \f0\b0 \cf4 .room getMember:g_myself.userId];\ \f2\b \cf8 if \f0\b0 \cf4 ([data.role intValue] == \cf7 1\cf4 || [data.role intValue] == \cf7 2\cf4 ) \{\ _isAdmin = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ _isAdmin = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 self \f0\b0 \cf4 .title = [NSString stringWithFormat:\cf6 @"%@(%ld)"\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.userNickname, array1.count];\ [ \f2\b \cf8 self \f0\b0 \cf4 setAudioIconFrame];\ \}\ \cf2 // \f1 \'bb\'f1\'c8\'a1\'ba\'ec\'b0\'fc\'d0\'c5\'cf\'a2 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_getRedPacket]) \{\ \cf2 // if ([dict[@"packet"][@"type"] intValue] != 3) \{\cf4 \ NSString *userId = [NSString stringWithFormat:\cf6 @"%@"\cf4 ,[(NSDictionary *)[dict objectForKey:\cf6 @"packet"\cf4 ] objectForKey:\cf6 @"userId"\cf4 ]];\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid.length > \cf7 0\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isDidRedPacketRemind) \{\ \f2\b \cf8 self \f0\b0 \cf4 .isDidRedPacketRemind = \f2\b \cf8 NO \f0\b0 \cf4 ;\ JXredPacketDetailVC * redPacketDetailVC = [[JXredPacketDetailVC alloc]init];\ redPacketDetailVC.dataDict = [[NSDictionary alloc]initWithDictionary:dict];\ redPacketDetailVC.isGroup = \f2\b \cf8 self \f0\b0 \cf4 .room.roomId.length > \cf7 0\cf4 ;\ [g_navigation pushViewController:redPacketDetailVC animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ \f2\b \cf8 if \f0\b0 \cf4 ([dict[\cf6 @"packet"\cf4 ][\cf6 @"type"\cf4 ] intValue] == \cf7 3\cf4 ) \{\ \cf2 //\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 showRedPacket:dict];\ [ \f2\b \cf8 self \f0\b0 \cf4 openReadPacket];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 showRedPacket:dict];\ \}\ \}\ \ \cf2 // [g_server openRedPacket:dict[@"packet"][@"id"] toView:self];\cf4 \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [_wait stop];\ \f2\b \cf8 if \f0\b0 \cf4 ([userId isEqualToString:MY_USER_ID]) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 changeMessageRedPacketStatus:dict[\cf6 @"packet"\cf4 ][\cf6 @"id"\cf4 ]];\ [ \f2\b \cf8 self \f0\b0 \cf4 changeMessageArrFileSize:dict[\cf6 @"packet"\cf4 ][\cf6 @"id"\cf4 ]];\ \ JXredPacketDetailVC * redPacketDetailVC = [[JXredPacketDetailVC alloc]init];\ redPacketDetailVC.dataDict = [[NSDictionary alloc]initWithDictionary:dict];\ redPacketDetailVC.isGroup = \f2\b \cf8 self \f0\b0 \cf4 .room.roomId.length > \cf7 0\cf4 ;\ [g_navigation pushViewController:redPacketDetailVC animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // [g_server openRedPacket:dict[@"packet"][@"id"] toView:self];\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([dict[\cf6 @"packet"\cf4 ][\cf6 @"type"\cf4 ] intValue] == \cf7 3\cf4 ) \{\ \cf2 //\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 showRedPacket:dict];\ [ \f2\b \cf8 self \f0\b0 \cf4 openReadPacket];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 showRedPacket:dict];\ \}\ \}\ \}\ \cf2 // \}\cf4 \ \ \}\ \cf2 // \f1 \'b4\'f2\'bf\'aa\'ba\'ec\'b0\'fc \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_openRedPacket]) \{\ \ NSString *userId = [NSString stringWithFormat:\cf6 @"%@"\cf4 ,[(NSDictionary *)[dict objectForKey:\cf6 @"packet"\cf4 ] objectForKey:\cf6 @"userId"\cf4 ]];\ \ \cf2 // if ([dict[@"packet"][@"status"] intValue] == 2) \{\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 changeMessageRedPacketStatus:dict[\cf6 @"packet"\cf4 ][\cf6 @"id"\cf4 ]];\ [ \f2\b \cf8 self \f0\b0 \cf4 changeMessageArrFileSize:dict[\cf6 @"packet"\cf4 ][\cf6 @"id"\cf4 ]];\ \cf2 // \}\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 doEndEdit];\ \cf2 // JXOpenRedPacketVC * openRedPacketVC = [[JXOpenRedPacketVC alloc]init];\cf4 \ \cf2 // openRedPacketVC.dataDict = [[NSDictionary alloc]initWithDictionary:dict];\cf4 \ \cf2 // [g_window addSubview:openRedPacketVC.view];\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid.length > \cf7 0\cf4 ) \{\ JXMessageObject *msg = [[JXMessageObject alloc] init];\ msg.type = [NSNumber numberWithInt:kWCMessageTypeRemind];\ msg.timeSend = [NSDate date];\ msg.toUserId = \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.userId;\ msg.fromUserId = MY_USER_ID;\ msg.objectId = dict[\cf6 @"packet"\cf4 ][\cf6 @"id"\cf4 ];\ NSString *userName = [NSString string];\ NSString *overStr = [NSString string];\ \f2\b \cf8 if \f0\b0 \cf4 ([userId intValue] == [MY_USER_ID intValue]) \{\ userName = Localized(\cf6 @"JX_RedPacketOneself"\cf4 );\ \f2\b \cf8 double \f0\b0 \cf4 over = [[NSString stringWithFormat:\cf6 @"%.2f"\cf4 ,[dict[\cf6 @"packet"\cf4 ][\cf6 @"over"\cf4 ] floatValue]] doubleValue];\ \f2\b \cf8 if \f0\b0 \cf4 (over < \cf7 0.01\cf4 ) \{\ overStr = Localized(\cf6 @"JX_RedPacketOver"\cf4 );\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ userName = dict[\cf6 @"packet"\cf4 ][\cf6 @"userName"\cf4 ];\ \}\ NSString *getRedStr = [NSString stringWithFormat:Localized(\cf6 @"JX_GetRedPacketFromFriend"\cf4 ),userName];\ msg.content = [NSString stringWithFormat:\cf6 @"%@%@"\cf4 ,getRedStr,overStr];\ [msg insert: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\ \ \ \ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \}\ [UIView animateWithDuration:\cf7 .3f\cf4 animations:^\{\ _redBackV.frame = CGRectMake(_redBackV.frame.origin.x, -_redBackV.frame.size.height/\cf7 2\cf4 , _redBackV.frame.size.width, _redBackV.frame.size.height);\ \} completion:^( \f2\b \cf8 BOOL \f0\b0 \cf4 finished) \{\ [_redBaseView removeFromSuperview];\ \ JXredPacketDetailVC * redPacketDetailVC = [[JXredPacketDetailVC alloc]init];\ redPacketDetailVC.dataDict = [[NSDictionary alloc]initWithDictionary:dict];\ redPacketDetailVC.isGroup = \f2\b \cf8 self \f0\b0 \cf4 .room.roomId.length > \cf7 0\cf4 ;\ [g_navigation pushViewController:redPacketDetailVC animated: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}];\ \ \ [g_server getUserMoenyToView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_getUserMoeny]) \{\ g_App.myMoney = [dict[\cf6 @"balance"\cf4 ] doubleValue];\ \}\ \ \cf2 // \f1 \'c2\'fe\'d3\'ce\'c1\'c4\'cc\'ec\'bc\'c7\'c2\'bc \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_tigaseMsgs] || [aDownload.action isEqualToString:act_tigaseMucMsgs]) \{\ \f2\b \cf8 self \f0\b0 \cf4 .isGetServerMsg = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (array1.count > \cf7 0\cf4 ) \{\ NSString* s;\ \f2\b \cf8 if \f0\b0 \cf4 (!IsStringNull( \f2\b \cf8 self \f0\b0 \cf4 .roomJid))\ s = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ \f2\b \cf8 else \f0\b0 \cf4 \ s = chatPerson.userId;\ [[JXMessageObject sharedInstance] getHistory:array1 userId:s];\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid && _taskList.count > \cf7 0\cf4 ) \{\ JXSynTask *task = _taskList.firstObject;\ \f2\b \cf8 if \f0\b0 \cf4 (array1.count < PAGECOUNT) \{\ [task \f2\b \cf8 delete \f0\b0 \cf4 ];\ [_taskList removeObjectAtIndex: \cf7 0\cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ NSDictionary *dict = array1.lastObject;\ task.endTime = [NSDate dateWithTimeIntervalSince1970:[[dict objectForKey:kMESSAGE_TIMESEND] doubleValue] / \cf7 1000.0\cf4 ];\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isSyncMsg) \{\ [_array removeAllObjects];\ _page = \cf7 0\cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .isSyncMsg = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ \f2\b \cf8 self \f0\b0 \cf4 .isShowHeaderPull = array1.count >= \cf7 20\cf4 ;\ \}\ \}\ \ \f2\b \cf8 int \f0\b0 \cf4 pageCount = \cf7 20\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .newMsgCount > \cf7 20\cf4 ) \{\ pageCount = \f2\b \cf8 self \f0\b0 \cf4 .newMsgCount;\ \f2\b \cf8 self \f0\b0 \cf4 .newMsgCount = \cf7 0\cf4 ;\ \}\ NSMutableArray *p = [[JXMessageObject sharedInstance] fetchMessageListWithUser:s byAllNum:_array.count pageCount:pageCount startTime:[NSDate dateWithTimeIntervalSince1970:\cf7 0\cf4 ]];\ \f2\b \cf8 if \f0\b0 \cf4 (p.count > \cf7 0\cf4 ) \{\ \ \f2\b \cf8 self \f0\b0 \cf4 .isGetServerMsg = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .scrollLine = \cf7 0\cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 refresh: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid && _taskList.count > \cf7 0\cf4 ) \{\ JXSynTask *task = _taskList.firstObject;\ [task \f2\b \cf8 delete \f0\b0 \cf4 ];\ [_taskList removeObjectAtIndex: \cf7 0\cf4 ];\ \ \f2\b \cf8 self \f0\b0 \cf4 .isGetServerMsg = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .scrollLine = \cf7 0\cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 refresh: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 self \f0\b0 \cf4 .isShowHeaderPull = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \}\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_publicMenuList]) \{\ \ _menuList = [NSArray arrayWithArray:array1];\ \f2\b \cf8 if \f0\b0 \cf4 (_menuList.count > \cf7 0\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 createFooterSubViews];\ \}\ \ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_tigaseDeleteMsg]) \{\ \ NSDictionary *param = aDownload.params;\ \f2\b \cf8 int \f0\b0 \cf4 type = [[NSString stringWithFormat:\cf6 @"%@"\cf4 , param[\cf6 @"deleteType"\cf4 ]] intValue];\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .withdrawIndex >= \cf7 0\cf4 ) \{\ \cf2 //[_wait start];\cf4 \ JXMessageObject *msg = _array[ \f2\b \cf8 self \f0\b0 \cf4 .withdrawIndex];\ \ \cf2 // \f1 \'b7\'a2\'cb\'cd\'b3\'b7\'bb\'d8\'cf\'fb\'cf\'a2\'b5\'c4 \f0 XMPP\cf4 \ JXMessageObject *newMsg=[[JXMessageObject alloc]init];\ newMsg.timeSend = [NSDate date];\ newMsg.fromUserId = MY_USER_ID;\ \ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\{\ newMsg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ newMsg.fromUserName = _userNickName;\ newMsg.toUserId = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ newMsg.fromUserName = MY_USER_NAME;\ newMsg.toUserId = chatPerson.userId;\ \}\ newMsg.content = msg.messageId;\ newMsg.type = [NSNumber numberWithInt:type];\ newMsg.isSend = [NSNumber numberWithInt:transfer_status_ing];\ \ [g_xmpp sendMessage:newMsg roomName: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \}\ \ \}\ \ \ \cf2 // \f1 \'ca\'d5\'b2\'d8\'b1\'ed\'c7\'e9 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_userEmojiAdd]) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([dict[\cf6 @"type"\cf4 ] intValue] == CollectTypeEmoji) \{\ [g_myself.favorites addObject:dict];\ \}\ \ [JXMyTools showTipView:Localized(\cf6 @"JX_CollectionSuccess"\cf4 )];\ \ [g_notify postNotificationName:kEmojiRefresh object: \f2\b \cf8 nil \f0\b0 \cf4 ];\ [g_notify postNotificationName:kFavoritesRefresh object: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isSelectMore) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 actionQuit];\ \}\ \}\ \ \cf2 // \f1 \'c8\'a1\'cf\'fb\'ca\'d5\'b2\'d8 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_userEmojiDelete]) \{\ [JXMyTools showTipView:Localized(\cf6 @"JXAlert_DeleteOK"\cf4 )];\ \}\ \ \cf2 // \f1 \'cc\'ed\'bc\'d3\'bf\'ce\'b3\'cc \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_userCourseAdd]) \{\ [JXMyTools showTipView:Localized(\cf6 @"JX_AddSuccess"\cf4 )];\ [_recordArray removeAllObjects];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_userCourseUpdate]) \{\ [JXMyTools showTipView:Localized(\cf6 @"JXAlert_DeleteOK"\cf4 )];\ [g_notify postNotificationName:kUpdateCourseList object: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \ \cf2 // \f1 \'b7\'a2\'cb\'cd\'ca\'d5\'b2\'d8 \f0 \f1 \'bf\'bd\'b1\'b4\'ce\'c4\'bc\'fe \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_UploadCopyFileServlet]) \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ NSMutableArray *allArray = [NSMutableArray array];\ \f2\b \cf8 if \f0\b0 \cf4 (_collectionData.content && _collectionData.content.length > \cf7 0\cf4 ) \{\ [allArray addObject:_collectionData.content];\ \}\ [allArray addObject:dict[\cf6 @"url"\cf4 ]];\ \f2\b \cf8 self \f0\b0 \cf4 .groupSendMsgArray = allArray;\ [ \f2\b \cf8 self \f0\b0 \cf4 collectionMsgSendAll:allArray];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 collectionMsgSend:dict[\cf6 @"url"\cf4 ] isFile: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \}\ \ \cf2 // \f1 \'bb\'f1\'c8\'a1\'d2\'f4\'ca\'d3\'c6\'b5\'b7\'fe\'ce\'f1\'c6\'f7\'b5\'d8\'d6\'b7 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_UserOpenMeet]) \{\ \f2\b \cf8 self \f0\b0 \cf4 .meetUrl = [dict objectForKey:\cf6 @"meetUrl"\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isAudioMeeting) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 onChatAudio: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 onChatVideo: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \}\ \ \cf2 // \f1 \'bb\'f1\'c8\'a1\'c8\'ba\'d6\'fa\'ca\'d6 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_queryGroupHelper]) \{\ NSMutableArray *arr = [[NSMutableArray alloc] init];\ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i = \cf7 0\cf4 ; i < array1.count; i++) \{\ JXGroupHeplerModel *model = [[JXGroupHeplerModel alloc] init];\ [model getDataWithDict:array1[i]];\ [arr addObject:model];\ \}\ [ \f2\b \cf8 self \f0\b0 \cf4 setupMoreView:arr];\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_roomGetRoom]) \{\ \ \f2\b \cf8 BOOL \f0\b0 \cf4 isOpen = [g_default boolForKey:kgoucaiComePush];\ \ \f2\b \cf8 BOOL \f0\b0 \cf4 isOpen2 = [g_default boolForKey:kGuanXinComePush];\ \ \f2\b \cf8 if \f0\b0 \cf4 ([dict[\cf6 @"lottery"\cf4 ] intValue]==\cf7 1\cf4 ) \{\ \ \ _biaotishifoBC=\cf7 1111\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (isOpen==\cf7 1\cf4 && isOpen2==\cf7 1\cf4 ) \{\ _noticeView2.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _noticeViewScrollView.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (isOpen==\cf7 1\cf4 && isOpen2==\cf7 0\cf4 ) \{\ _noticeView2.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _noticeViewScrollView.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _noticeViewScrollView.frame=CGRectMake(\cf7 0\cf4 , JX_SCREEN_TOP, JX_SCREEN_WIDTH, \cf7 37\cf4 );\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (isOpen==\cf7 0\cf4 && isOpen2==\cf7 1\cf4 )\{\ _noticeView2.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .showTopView.xiaLineView.hidden= \f2\b \cf8 YES \f0\b0 \cf4 ;\ _noticeViewScrollView.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (isOpen==\cf7 0\cf4 && isOpen2==\cf7 0\cf4 ) \{\ _noticeViewScrollView.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \ \f2\b \cf8 self \f0\b0 \cf4 .showTopView.xiaLineView.hidden= \f2\b \cf8 YES \f0\b0 \cf4 ;\ _noticeView2.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _noticeViewScrollView.frame=CGRectMake(\cf7 0\cf4 , \cf7 37\cf4 +JX_SCREEN_TOP, JX_SCREEN_WIDTH, \cf7 37\cf4 );\ \}\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ _noticeView2.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (isOpen2==\cf7 1\cf4 ) \{\ \ _noticeViewScrollView.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ _noticeViewScrollView.frame=CGRectMake(\cf7 0\cf4 , JX_SCREEN_TOP, JX_SCREEN_WIDTH, \cf7 37\cf4 );\ _noticeViewScrollView.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ \}\ \ \f2\b \cf8 self \f0\b0 \cf4 .title = [NSString stringWithFormat:\cf6 @"%@(%ld)"\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.userNickname, [dict[\cf6 @"userSize"\cf4 ] integerValue]];\ [ \f2\b \cf8 self \f0\b0 \cf4 setAudioIconFrame];\ \f2\b \cf8 if \f0\b0 \cf4 ([dict objectForKey:\cf6 @"jid"\cf4 ]) \{\ \ \f2\b \cf8 if \f0\b0 \cf4 (![dict objectForKey:\cf6 @"member"\cf4 ]) \{\ [JXMyTools showTipView:Localized(\cf6 @"JX_YouOutOfGroup"\cf4 )];\ \f2\b \cf8 self \f0\b0 \cf4 .groupStatus = [NSNumber numberWithInt:\cf7 1\cf4 ];\ chatPerson.groupStatus = [NSNumber numberWithInt:\cf7 1\cf4 ];\ [chatPerson updateGroupInvalid];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ \f2\b \cf8 if \f0\b0 \cf4 ([[dict objectForKey:\cf6 @"s"\cf4 ] integerValue] != \cf7 1\cf4 ) \{\ [JXMyTools showTipView:Localized(\cf6 @"JX_GroupNotUse"\cf4 )];\ \f2\b \cf8 self \f0\b0 \cf4 .isDisable = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ NSString *groupLevelName = [dict objectForKey:\cf6 @"groupLevelName"\cf4 ];\ _groupLevelNameArray = [groupLevelName componentsSeparatedByString:\cf6 @","\cf4 ];\ _isAttritionRecall = [[dict objectForKey:\cf6 @"isAttritionRecall"\cf4 ] boolValue];\ _isOpenIntegral = [[dict objectForKey:\cf6 @"isOpenIntegral"\cf4 ] boolValue];\ _disableSay = [[(NSDictionary *)[dict objectForKey:\cf6 @"member"\cf4 ]objectForKey:\cf6 @"talkTime"\cf4 ] longLongValue];\ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.talkTime = [NSNumber numberWithLongLong:[[dict objectForKey:\cf6 @"talkTime"\cf4 ] longLongValue]];\ NSString *role = [(NSDictionary *)[dict objectForKey:\cf6 @"member"\cf4 ] objectForKey:\cf6 @"role"\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ([role intValue] == \cf7 1\cf4 || [role intValue] == \cf7 2\cf4 ) \{\ _isAdmin = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ _isAdmin = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([role intValue] == \cf7 1\cf4 || [role intValue] == \cf7 2\cf4 ) \{\ _isAdmin = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ _isAdmin = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (([ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.talkTime longLongValue] > \cf7 0\cf4 && !_isAdmin) || [role intValue] == \cf7 4\cf4 ) \{\ _talkTimeLabel.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _talkTimeLabel.text = Localized(\cf6 @"JX_TotalSilence"\cf4 );\ \f2\b \cf8 if \f0\b0 \cf4 ([role intValue] == \cf7 4\cf4 ) \{\ _talkTimeLabel.text = Localized(\cf6 @"JX_ProhibitToSpeak"\cf4 );\ \}\ _messageText.userInteractionEnabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _shareMore.enabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _recordBtnLeft.enabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _btnFace.enabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _messageText.text = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ _talkTimeLabel.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _shareMore.enabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _recordBtnLeft.enabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _btnFace.enabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _messageText.userInteractionEnabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.showRead = [dict objectForKey:\cf6 @"showRead"\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .room.showRead = [ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.showRead boolValue];\ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.allowSendCard = [dict objectForKey:\cf6 @"allowSendCard"\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .room.allowSendCard = [ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.allowSendCard boolValue];\ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.allowConference = [dict objectForKey:\cf6 @"allowConference"\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .room.allowConference = [ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.allowConference boolValue];\ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.allowSpeakCourse = [dict objectForKey:\cf6 @"allowSpeakCourse"\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .room.allowSpeakCourse = [ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.allowSpeakCourse boolValue];\ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.allowUploadFile = [dict objectForKey:\cf6 @"allowUploadFile"\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .room.allowUploadFile = [ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.allowUploadFile boolValue];\ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.isNeedVerify = [dict objectForKey:\cf6 @"isNeedVerify"\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson updateGroupSetting];\ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.chatRecordTimeOut = [dict objectForKey:\cf6 @"chatRecordTimeOut"\cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .room.chatRecordTimeOut = \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.chatRecordTimeOut;\ [ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson updateUserChatRecordTimeOut];\ \f2\b \cf8 self \f0\b0 \cf4 .room.curCount = [[dict objectForKey:\cf6 @"userSize"\cf4 ] intValue];\ \f2\b \cf8 self \f0\b0 \cf4 .room.maxCount = [[dict objectForKey:\cf6 @"maxUserSize"\cf4 ] intValue];\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .chatRoom.roomJid.length > \cf7 0\cf4 ) \{\ NSString *noticeStr = [(NSDictionary *)[dict objectForKey:\cf6 @"notice"\cf4 ] objectForKey:\cf6 @"text"\cf4 ];\ NSString *noticeTime = [(NSDictionary *)[dict objectForKey:\cf6 @"notice"\cf4 ] objectForKey:\cf6 @"time"\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 setupNoticeWithContent:noticeStr time:noticeTime];\ \f2\b \cf8 if \f0\b0 \cf4 (noticeStr)\{\ \cf2 // [self showLatestBroadcastTitle:@" \f1 \'d7\'ee\'d0\'c2\'b9\'ab\'b8\'e6 \f0 " message:noticeStr];\cf4 \ \}\ \}\ \ \cf2 // \f1 \'b1\'a3\'b4\'e6\'d7\'d4\'bc\'ba \f0 \cf4 \ NSDictionary* p = [dict objectForKey:\cf6 @"member"\cf4 ];\ memberData* option = [[memberData alloc] init];\ [option getDataFromDict:p];\ option.roomId = \f2\b \cf8 self \f0\b0 \cf4 .roomId;\ [option insert];\ \ \cf2 // \f1 \'b1\'a3\'b4\'e6\'c8\'ba\'d6\'f7\'ba\'cd\'b9\'dc\'c0\'ed\'d4\'b1 \f0 \cf4 \ NSMutableArray *memb = [NSMutableArray array];\ NSArray *members = [dict objectForKey:\cf6 @"members"\cf4 ];\ \f2\b \cf8 for \f0\b0 \cf4 (NSDictionary *member \f2\b \cf8 in \f0\b0 \cf4 members) \{\ memberData* option = [[memberData alloc] init];\ [option getDataFromDict:member];\ option.roomId = \f2\b \cf8 self \f0\b0 \cf4 .roomId;\ [option insert];\ [memb addObject:option];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (_room.members.count <= \cf7 0\cf4 ) \{\ [_room.members addObjectsFromArray:memb];\ \}\ \ \}\ \ \cf2 //<<<<<<< .working\cf4 \ \cf2 // [_table reloadData];\cf4 \ \cf2 //\cf4 \ \cf2 //=======\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isSendRedPacket) \{\ \ JXSendRedPacketViewController * sendGiftVC = [[JXSendRedPacketViewController alloc] init];\ sendGiftVC.isRoom = \f2\b \cf8 YES \f0\b0 \cf4 ;\ sendGiftVC.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ sendGiftVC.roomJid = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ sendGiftVC.size = \f2\b \cf8 self \f0\b0 \cf4 .room.curCount;\ \cf2 // [g_window addSubview:sendGiftVC.view];\cf4 \ [g_navigation pushViewController:sendGiftVC animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \f2\b \cf8 self \f0\b0 \cf4 .isSendRedPacket = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [JXMyTools showTipView:Localized(\cf6 @"JX_GroupDissolved"\cf4 )];\ chatPerson.groupStatus = [NSNumber numberWithInt:\cf7 2\cf4 ];\ [chatPerson updateGroupInvalid];\ \ \}\ \ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_UserGetByAccount]) \{\ JXUserInfoVC* vc = [JXUserInfoVC alloc];\ vc.userId = dict[\cf6 @"userId"\cf4 ];\ vc.fromAddType = \cf7 1\cf4 ;\ vc = [vc init];\ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \cf2 // [_table reloadData];\cf4 \ \}\ \ \ -( \f2\b \cf8 int \f0\b0 \cf4 ) \cf11 didServerResultFailed\cf4 :(JXConnection*)aDownload \cf11 dict\cf4 :(NSDictionary*)dict\{\ [ \f2\b \cf8 self \f0\b0 \cf4 doUploadError:aDownload];\ [_wait stop];\ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_roomActivity]) \{\ \cf2 // \f1 \'c3\'bb\'c7\'c0\'b5\'bd \f0 \cf4 \ _activityModel.content = dict[\cf6 @"resultMsg"\cf4 ];\ _activityModel.success = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 showAdAlertViewImageString:\cf6 @"ad_box.gif"\cf4 linkUrl: \f2\b \cf8 nil \f0\b0 \cf4 audio: \f2\b \cf8 nil \f0\b0 \cf4 duration:\cf7 1\cf4 content: \f2\b \cf8 nil \f0\b0 \cf4 showCancelButton: \f2\b \cf8 NO \f0\b0 \cf4 type:(DYAdModelTypeGifttOpenAnimation) success: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \cf2 // \f1 \'d7\'d4\'bc\'ba\'b2\'e9\'bf\'b4\'ba\'ec\'b0\'fc\'bb\'f2\'d5\'df\'ba\'ec\'b0\'fc\'d2\'d1\'c1\'ec\'cd\'ea\'a3\'ac \f0 resultCode \f1 \'a3\'bd \f0 0\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_getRedPacket]) \{\ \ [ \f2\b \cf8 self \f0\b0 \cf4 changeMessageRedPacketStatus:dict[\cf6 @"data"\cf4 ][\cf6 @"packet"\cf4 ][\cf6 @"id"\cf4 ]];\ [ \f2\b \cf8 self \f0\b0 \cf4 changeMessageArrFileSize:dict[\cf6 @"data"\cf4 ][\cf6 @"packet"\cf4 ][\cf6 @"id"\cf4 ]];\ \ JXredPacketDetailVC * redPacketDetailVC = [[JXredPacketDetailVC alloc]init];\ redPacketDetailVC.dataDict = [[NSDictionary alloc]initWithDictionary:dict];\ redPacketDetailVC.isGroup = \f2\b \cf8 self \f0\b0 \cf4 .room.roomId.length > \cf7 0\cf4 ;\ redPacketDetailVC.code = [[dict objectForKey:\cf6 @"resultCode"\cf4 ] intValue];\ \cf2 // [g_window addSubview:redPacketDetailVC.view];\cf4 \ [g_navigation pushViewController:redPacketDetailVC animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_roomGetRoom]) \{\ \ [JXMyTools showTipView:Localized(\cf6 @"JX_GroupDissolved"\cf4 )];\ chatPerson.groupStatus = [NSNumber numberWithInt:\cf7 2\cf4 ];\ [chatPerson updateGroupInvalid];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_userEmojiAdd]) \{\ \f2\b \cf8 return \f0\b0 \cf4 show_error;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_openRedPacket]) \{\ \f2\b \cf8 self \f0\b0 \cf4 .redPacketDict = dict;\ \f2\b \cf8 self \f0\b0 \cf4 .openImgV.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .seeLab.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .tintLab.text = Localized(\cf6 @"JX_SlowHandNoRedPacket"\cf4 );\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_UploadFile]) \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 keepOnUplpadGroupSend];\ \f2\b \cf8 if \f0\b0 \cf4 (_sendedNum == \f2\b \cf8 self \f0\b0 \cf4 .userIds.count * \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray.count) \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendView) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendView removeFromSuperview];\ [g_App showAlert:Localized(\cf6 @"JX_SendComplete"\cf4 )];\ \}\ \}\ \}\ \}\ \ \f2\b \cf8 return \f0\b0 \cf4 hide_error;\ \}\ \ -( \f2\b \cf8 int \f0\b0 \cf4 ) \cf11 didServerConnectError\cf4 :(JXConnection*)aDownload \cf11 error\cf4 :(NSError *)error\{\cf2 //error \f1 \'ce\'aa\'bf\'d5\'ca\'b1\'a3\'ac\'b4\'fa\'b1\'ed\'b3\'ac\'ca\'b1 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 doUploadError:aDownload];\ [_wait stop];\ \f2\b \cf8 return \f0\b0 \cf4 hide_error;\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 ) \cf11 didServerConnectStart\cf4 :(JXConnection*)aDownload\{\ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_UploadFile] || [aDownload.action isEqualToString:act_publicMenuList] || [aDownload.action isEqualToString:act_tigaseMsgs] || [aDownload.action isEqualToString:act_tigaseMucMsgs])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([aDownload.action isEqualToString:act_tigaseDeleteMsg]) \{\ \cf2 // \f1 \'b3\'b7\'bb\'d8\'bc\'d3\'b5\'c8\'b4\'fd\'b7\'fb\'a3\'a8\'b3\'b7\'bb\'d8\'bd\'d3\'bf\'da\'b5\'f7\'d3\'c3\'ba\'dc\'c2\'fd\'a3\'a9 \f0 \cf4 \ \cf2 //[_wait start];\cf4 \ \}\ \}\ \ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 collectionMsgSend\cf4 :(NSString *)content \cf11 isFile\cf4 :( \f2\b \cf8 BOOL \f0\b0 \cf4 )isFile\{\ NSString *userId = \f2\b \cf8 self \f0\b0 \cf4 .userIds[ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex];\ \cf2 // NSString *userName = self.userNames[self.groupMessagesIndex];\cf4 \ \ JXMessageObject *msg=[[JXMessageObject alloc]init];\ msg.timeSend = [NSDate date];\ msg.fromUserId = MY_USER_ID;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\{\ msg.toUserId = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ msg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.fromUserName = _userNickName;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ msg.toUserId = userId;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.toUserId = chatPerson.userId;\ \}\ msg.isGroup = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ msg.content = content;\ msg.isSend = [NSNumber numberWithInt:transfer_status_ing];\ msg.isRead = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.isReadDel = [NSNumber numberWithInt: \f2\b \cf8 self \f0\b0 \cf4 .isReadDelete];\ \ \f2\b \cf8 switch \f0\b0 \cf4 (_collectionData.type) \{\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 2\cf4 :\ msg.type = [NSNumber numberWithInt:kWCMessageTypeImage];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 3\cf4 :\{\ msg.type = [NSNumber numberWithInt:kWCMessageTypeVoice];\ ObjUrlData *obj = _collectionData.audios.firstObject;\ msg.timeLen = obj.timeLen;\ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 4\cf4 :\ msg.type = [NSNumber numberWithInt:kWCMessageTypeVideo];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 5\cf4 :\{\ msg.fileName = ((ObjUrlData *)_collectionData.files.firstObject).name;\ msg.type = [NSNumber numberWithInt:kWCMessageTypeFile];\ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 11\cf4 :\ msg.type = [NSNumber numberWithInt:kWCMessageTypeCustomFace];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 12\cf4 :\ msg.type = [NSNumber numberWithInt:kWCMessageTypeEmoji];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 default \f0\b0 \cf4 :\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (!isFile) \{\ msg.type = [NSNumber numberWithInt:kWCMessageTypeText];\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (!isFile) \{\ msg.type = [NSNumber numberWithInt:kWCMessageTypeText];\ \}\ \ \cf2 // \f1 \'b7\'a2\'cd\'f9\'c4\'c4\'c0\'ef \f0 \cf4 \ [msg insert: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\ \ [g_xmpp sendMessage:msg roomName: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex ++;\ \f2\b \cf8 if \f0\b0 \cf4 (msg.isLastGroupSend) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex < \f2\b \cf8 self \f0\b0 \cf4 .userIds.count) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 collectionMsgSend:content isFile:isFile];\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .userIds)\{\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex = \cf7 0\cf4 ;\ [g_App showAlert:Localized(\cf6 @"JX_SendComplete"\cf4 )];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 showAtSelectMemberView\cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .isShowAT = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (_room.members.count >\cf7 0\cf4 ) \{\ JXSelFriendVC * selVC = [[JXSelFriendVC alloc] init];\ \cf2 // selVC.chatRoom = chatRoom;\cf4 \ _room.roomJid = _roomJid;\ selVC.room = _room;\ selVC.type = JXSelUserTypeGroupAT;\ selVC.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ selVC.didSelect = \f2\b \cf8 @selector \f0\b0 \cf4 (atSelectMemberDelegate:);\ \ \cf2 // [g_window addSubview:selVC.view];\cf4 \ [g_navigation pushViewController:selVC animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // \f1 \'b5\'f7\'bd\'d3\'bf\'da \f0 \cf4 \ [g_App showAlert:Localized(\cf6 @"JX_NoGetMemberList"\cf4 )];\ \}\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 removeAllAt\cf4 \{\ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i = \cf7 0\cf4 ; i<_atMemberArray.count; i++) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 removeAtTextString:_atMemberArray[i]];\ \}\ [_atMemberArray removeAllObjects];\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 removeAtTextString\cf4 :(memberData *)member\{\ NSString * atStr = [NSString stringWithFormat:\cf6 @"@%@"\cf4 ,member.userNickName];\ NSRange atRange = [[_messageText.textStorage string] rangeOfString:atStr];\ \f2\b \cf8 if \f0\b0 \cf4 (atRange.location != NSNotFound) \{\ [_messageText.textStorage deleteCharactersInRange:atRange];\ \}\ \ \}\ \ -( \f2\b \cf8 BOOL \f0\b0 \cf4 )\cf11 hasMember\cf4 :(NSString*)theUserId\{\ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i=\cf7 0\cf4 ;i<[_atMemberArray count];i++)\{\ memberData* p = [_atMemberArray objectAtIndex:i];\ \f2\b \cf8 if \f0\b0 \cf4 ([theUserId intValue] == p.userId)\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 atSelectMemberDelegate\cf4 :(memberData *)member\{\ \ \ \f2\b \cf8 if \f0\b0 \cf4 (member.idStr) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 removeAllAt];\ [_atMemberArray addObject:member];\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 hasMember:[NSString stringWithFormat:\cf6 @"%ld"\cf4 ,member.userId]])\{\ \f2\b \cf8 if \f0\b0 \cf4 (_messageText.selectedRange.location >=\cf7 1\cf4 && [[[_messageText.textStorage string] substringWithRange:NSMakeRange(_messageText.selectedRange.location-\cf7 1\cf4 , \cf7 1\cf4 )] isEqualToString:\cf6 @"@"\cf4 ]) \{\ [_messageText.textStorage deleteCharactersInRange:NSMakeRange(_messageText.selectedRange.location-\cf7 1\cf4 , \cf7 1\cf4 )];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i=\cf7 0\cf4 ; i<_atMemberArray.count; i++) \{\ memberData * member = _atMemberArray[i];\ \f2\b \cf8 if \f0\b0 \cf4 (member.idStr)\{\ [ \f2\b \cf8 self \f0\b0 \cf4 removeAllAt];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ [_atMemberArray addObject:member];\ \}\ \ \cf2 // [_messageText.textStorage replaceCharactersInRange:NSMakeRange(_messageText.selectedRange.location-1, 1) withString:@""];\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (_messageText.selectedRange.location >=\cf7 1\cf4 && [[[_messageText.textStorage string] substringWithRange:NSMakeRange(_messageText.selectedRange.location-\cf7 1\cf4 , \cf7 1\cf4 )] isEqualToString:\cf6 @"@"\cf4 ]) \{\ [_messageText.textStorage deleteCharactersInRange:NSMakeRange(_messageText.selectedRange.location-\cf7 1\cf4 , \cf7 1\cf4 )];\ \}\ \ \ NSString * atStr = [NSString stringWithFormat:\cf6 @"@%@"\cf4 ,member.userNickName];\ NSMutableAttributedString* tncString = [[NSMutableAttributedString alloc] initWithString:atStr];\ [tncString addAttribute:NSBackgroundColorAttributeName value:[UIColor yellowColor] range:NSMakeRange(\cf7 0\cf4 ,atStr.length)];\ [tncString addAttribute:NSFontAttributeName value:SYSFONT(\cf7 18\cf4 ) range:NSMakeRange(\cf7 0\cf4 ,atStr.length)];\ \cf2 // if (_messageText.selectedRange.length > 0) \{\cf4 \ \cf2 // [_messageText.textStorage deleteCharactersInRange:_messageText.selectedRange];\cf4 \ \cf2 // \}\cf4 \ [_messageText.textStorage insertAttributedString:tncString atIndex:_messageText.selectedRange.location];\ tncString = \f2\b \cf8 nil \f0\b0 \cf4 ;\ NSRange newRange = NSMakeRange(_messageText.selectedRange.location + atStr.length, \cf7 0\cf4 );\ _messageText.selectedRange = newRange;\ \ \ NSMutableAttributedString* spaceString = [[NSMutableAttributedString alloc] initWithString:\cf6 @" "\cf4 ];\ [_messageText.textStorage insertAttributedString:spaceString atIndex:_messageText.selectedRange.location];\ newRange = NSMakeRange(_messageText.selectedRange.location + spaceString.length, \cf7 0\cf4 );\ _messageText.selectedRange = newRange;\ \cf2 // attachment.emojiSize = CGSizeMake(_messageText.font.lineHeight, _messageText.font.lineHeight);\cf4 \ \ \cf2 //\cf4 \ \cf2 //\cf4 \ \cf2 //\cf4 \ \cf2 // [_messageText.textStorage insertAttributedString:[NSAttributedString attributedStringWithAttachment:attachment] atIndex:_messageText.selectedRange.location];\cf4 \ \ \cf2 // _messageText.selectedRange = newRange;\cf4 \ _messageText.font = SYSFONT(\cf7 18\cf4 );\ \ \cf2 // [_messageText scrollRangeToVisible:NSMakeRange(_messageText.text.length, 1)];\cf4 \ \ \cf2 // [_messageText becomeFirstResponder];\cf4 \ [_messageText performSelector: \f2\b \cf8 @selector \f0\b0 \cf4 (becomeFirstResponder) withObject: \f2\b \cf8 nil \f0\b0 \cf4 afterDelay:\cf7 0.7\cf4 ];\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onSelMedia\cf4 :(JXMediaObject*)p\{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < \f2\b \cf8 self \f0\b0 \cf4 .userIds.count; i ++) \{\ NSString *userId = \f2\b \cf8 self \f0\b0 \cf4 .userIds[i];\ \ [ \f2\b \cf8 self \f0\b0 \cf4 sendMedia:p userId:userId];\ \cf2 // [g_server uploadFile:p.fileName validTime:self.chatPerson.chatRecordTimeOut messageId:nil toView:self];\cf4 \ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 sendMedia:p userId: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf2 // [g_server uploadFile:p.fileName validTime:self.chatPerson.chatRecordTimeOut messageId:nil toView:self];\cf4 \ \}\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 pickVideo\cf4 \{\ \ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (![ \f2\b \cf8 self \f0\b0 \cf4 checkCameraLimits]) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 showDisableSay])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 sendMsgCheck])\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ JXCameraVC *vc = [[JXCameraVC alloc] init];\ vc.cameraDelegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ \cf2 // vc.maxTime = 30;\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 presentViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 completion: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ \cf2 // if ([[JXMediaObject sharedInstance] fetch].count <= 0) \{\cf4 \ \cf2 //\cf4 \ \cf2 // myMediaVC* vc = [[myMediaVC alloc]init];\cf4 \ \cf2 // vc.delegate = self;\cf4 \ \cf2 // vc.didSelect = @selector(onSelMedia:);\cf4 \ \cf12 /// \f3 \cf2 / [g_window addSubview:vc.view]; \f0 \cf4 \ \cf2 // [g_navigation pushViewController:vc animated:YES];\cf4 \ \cf2 // [vc onAddVideo];\cf4 \ \cf2 // \}else \{\cf4 \ \cf2 // myMediaVC* vc = [[myMediaVC alloc]init];\cf4 \ \cf2 // vc.delegate = self;\cf4 \ \cf2 // vc.didSelect = @selector(onSelMedia:);\cf4 \ \cf12 /// \f3 \cf2 / [g_window addSubview:vc.view]; \f0 \cf4 \ \cf2 // [g_navigation pushViewController:vc animated:YES];\cf4 \ \cf2 // \}\cf4 \ \}\ \ \cf5 #pragma mark \f2\b \cf16 - \f4 \'d2\'95\'c6\'c1\'e4\'9b\'d1\'75\'bb\'d8\'d5\'7b \f0\b0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 cameraVC\cf4 :(JXCameraVC *)vc \cf11 didFinishWithVideoPath\cf4 :(NSString *)filePath \cf11 timeLen\cf4 :(NSInteger)timeLen \{\ \f2\b \cf8 if \f0\b0 \cf4 ( ![[NSFileManager defaultManager] fileExistsAtPath:filePath] )\ \f2\b \cf8 return \f0\b0 \cf4 ;\ NSString* file = filePath;\ \ JXMediaObject* p = [[JXMediaObject alloc]init];\ p.userId = g_server.myself.userId;\ p.fileName = file;\ p.isVideo = [NSNumber numberWithBool: \f2\b \cf8 YES \f0\b0 \cf4 ];\ p.timeLen = [NSNumber numberWithInteger:timeLen];\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \cf2 // for (NSInteger i = 0; i < self.userIds.count; i ++) \{\cf4 \ \cf2 // NSString *userId = self.userIds[i];\cf4 \ \cf2 //\cf4 \ \cf2 // [self sendMedia:p userId:userId];\cf4 \ \cf12 /// \f3 \cf2 / [g_server uploadFile:p.fileName validTime:self.chatPerson.chatRecordTimeOut messageId:nil toView:self]; \f0 \cf4 \ \cf2 // [self saveVideo:file];\cf4 \ \cf2 // \}\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 addWaitGroupSendViewWithMsgNum:\cf7 1\cf4 withType:groupsend_msgType_video];\ \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray = [NSMutableArray arrayWithObject:p];\ _onceSendNum = \cf7 1\cf4 ;\ _isOriginal = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 sendMedias: \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray isSave: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 sendMedia:p userId: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf2 // [g_server uploadFile:p.fileName validTime:self.chatPerson.chatRecordTimeOut messageId:nil toView:self];\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 saveVideo:file];\ \}\ \}\ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 saveVideo\cf4 :(NSString *)videoPath\{\ \ \f2\b \cf8 if \f0\b0 \cf4 (videoPath) \{\ NSURL *url = [NSURL URLWithString:videoPath];\ \f2\b \cf8 BOOL \f0\b0 \cf4 compatible = UIVideoAtPathIsCompatibleWithSavedPhotosAlbum([url path]);\ \f2\b \cf8 if \f0\b0 \cf4 (compatible) \{\ \cf2 // \f1 \'b1\'a3\'b4\'e6\'cf\'e0\'b2\'e1\'ba\'cb\'d0\'c4\'b4\'fa\'c2\'eb \f0 \cf4 \ UISaveVideoAtPathToSavedPhotosAlbum([url path], \f2\b \cf8 self \f0\b0 \cf4 , \f2\b \cf8 @selector \f0\b0 \cf4 (savedPhotoImage:didFinishSavingWithError:contextInfo:), \f2\b \cf8 nil \f0\b0 \cf4 );\ \}\ \}\ \}\ \ \ \cf2 // \f1 \'b1\'a3\'b4\'e6\'ca\'d3\'c6\'b5\'cd\'ea\'b3\'c9\'d6\'ae\'ba\'f3\'b5\'c4\'bb\'d8\'b5\'f7 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 ) \cf11 savedPhotoImage\cf4 :(UIImage*)image \cf11 didFinishSavingWithError\cf4 : (NSError *)error \cf11 contextInfo\cf4 : ( \f2\b \cf8 void \f0\b0 \cf4 *)contextInfo \{\ \f2\b \cf8 if \f0\b0 \cf4 (error) \{\ NSLog(\cf6 @" \f1 \'b1\'a3\'b4\'e6\'ca\'d3\'c6\'b5\'ca\'a7\'b0\'dc \f0 %@"\cf4 , error.localizedDescription);\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ NSLog(\cf6 @" \f1 \'b1\'a3\'b4\'e6\'ca\'d3\'c6\'b5\'b3\'c9\'b9\'a6 \f0 "\cf4 );\ \}\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onChatSip\cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \cf2 // if (![self checkCameraLimits]) \{\cf4 \ \cf2 // return;\cf4 \ \cf2 // \}\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 showDisableSay])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 sendMsgCheck])\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ NSString *str1;\ NSString *str2;\ NSString *str3;\ JXActionSheetVC *actionVC;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid.length > \cf7 0\cf4 ) \{\ memberData *data = [ \f2\b \cf8 self \f0\b0 \cf4 .room getMember:g_myself.userId];\ \ \f2\b \cf8 if \f0\b0 \cf4 (!_isAdmin && ![ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.allowConference boolValue]) \{\ [g_App showAlert:Localized(\cf6 @"JX_DisabledAudioAndVideo"\cf4 )];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ str1 = Localized(\cf6 @"JXSettingVC_VideoMeeting"\cf4 );\ str2 = Localized(\cf6 @"JX_Meeting"\cf4 );\ str3 = Localized(\cf6 @"JX_WalkieTalkie"\cf4 );\ actionVC = [[JXActionSheetVC alloc] initWithImages:\cf7 @[\cf6 @"meeting_talk"\cf4 ,\cf6 @"meeting_tel"\cf4 ,\cf6 @"meeting_video"\cf7 ]\cf4 names:\cf7 @[\cf4 str3,str2,str1\cf7 ]\cf4 ];\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ str1 = Localized(\cf6 @"JX_VideoChat"\cf4 );\ str2 = Localized(\cf6 @"JX_VoiceChat"\cf4 );\ actionVC = [[JXActionSheetVC alloc] initWithImages:\cf7 @[\cf6 @"meeting_tel"\cf4 ,\cf6 @"meeting_video"\cf7 ]\cf4 names:\cf7 @[\cf4 str2,str1\cf7 ]\cf4 ];\ \}\ \ actionVC.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 presentViewController:actionVC animated: \f2\b \cf8 NO \f0\b0 \cf4 completion: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 actionSheet\cf4 :(JXActionSheetVC *)actionSheet \cf11 didButtonWithIndex\cf4 :(NSInteger)index \{\ \f2\b \cf8 if \f0\b0 \cf4 (actionSheet.tag == \cf7 2457\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 (index == \cf7 0\cf4 ) \{\ \ \f2\b \cf8 BOOL \f0\b0 \cf4 flag = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < \f2\b \cf8 self \f0\b0 \cf4 .selectMoreArr.count; i ++) \{\ JXMessageObject *msg = [ \f2\b \cf8 self \f0\b0 \cf4 .selectMoreArr[i] copy];\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeRedPacket || [msg.type intValue] == kWCMessageTypeTransfer) \{\ flag = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (flag) \{\ \ UIAlertView *alert = [[UIAlertView alloc] initWithTitle: \f2\b \cf8 nil \f0\b0 \cf4 message:\cf6 @" \f1 \'b6\'e0\'d1\'a1\'cf\'fb\'cf\'a2\'d6\'d0\'a3\'ac\'ba\'ec\'b0\'fc\'ba\'cd\'d7\'aa\'d5\'cb\'cf\'fb\'cf\'a2\'b2\'bb\'c4\'dc\'b1\'bb\'d7\'aa\'b7\'a2 \f0 "\cf4 delegate: \f2\b \cf8 self \f0\b0 \cf4 cancelButtonTitle:\cf6 @" \f1 \'c8\'a1\'cf\'fb \f0 "\cf4 otherButtonTitles:\cf6 @" \f1 \'d7\'aa\'b7\'a2 \f0 "\cf4 , \f2\b \cf8 nil \f0\b0 \cf4 ];\ alert.tag = \cf7 3457\cf4 ;\ [alert show];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ JXRelayVC *vc = [[JXRelayVC alloc] init];\ vc.relayMsgArray = [NSMutableArray arrayWithArray: \f2\b \cf8 self \f0\b0 \cf4 .selectMoreArr];\ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (index == \cf7 1\cf4 ) \{\ JXRelayVC *vc = [[JXRelayVC alloc] init];\ \ NSMutableArray *contentArr = [NSMutableArray array];\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < \f2\b \cf8 self \f0\b0 \cf4 .selectMoreArr.count; i ++) \{\ JXMessageObject *msg = [ \f2\b \cf8 self \f0\b0 \cf4 .selectMoreArr[i] copy];\ \ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] != kWCMessageTypeText && [msg.type intValue] != kWCMessageTypeLocation && [msg.type intValue] != kWCMessageTypeGif && [msg.type intValue] != kWCMessageTypeVideo && [msg.type intValue] != kWCMessageTypeImage && [msg.type intValue] != kWCMessageTypeCustomFace && [msg.type intValue] != kWCMessageTypeEmoji) \{\ msg.content = [msg getLastContent];\ \f2\b \cf8 switch \f0\b0 \cf4 ([msg.type intValue]) \{\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeRedPacket: \{\ msg.content = [NSString stringWithFormat:\cf6 @"[%@]"\cf4 , Localized(\cf6 @"JXredPacket"\cf4 )];\ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeAudioMeetingInvite:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeVideoMeetingInvite:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeAudioChatCancel:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeAudioChatEnd:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeVideoChatCancel:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeVideoChatEnd:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeAVBusy:\{\ msg.content = [NSString stringWithFormat:\cf6 @"[%@]"\cf4 , Localized(\cf6 @"JX_AudioAndVideoCalls"\cf4 )];;\ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeSystemImage1:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeSystemImage2: \{\ msg.content = [NSString stringWithFormat:\cf6 @"[%@]"\cf4 , Localized(\cf6 @"JXGraphic"\cf4 )];\ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeMergeRelay:\ msg.content = [NSString stringWithFormat:\cf6 @"[%@]"\cf4 , Localized(\cf6 @"JX_ChatRecord"\cf4 )];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 default \f0\b0 \cf4 :\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ msg.type = [NSNumber numberWithInt:kWCMessageTypeText];\ msg.fileName = \cf6 @""\cf4 ;\ \}\ \ SBJsonWriter * OderJsonwriter = [SBJsonWriter \f2\b \cf8 new \f0\b0 \cf4 ];\ NSString * jsonString = [OderJsonwriter stringWithObject:[msg toDictionary]];\ [contentArr addObject:jsonString];\ \}\ \ JXMessageObject *relayMsg = [[JXMessageObject alloc] init];\ relayMsg.type = [NSNumber numberWithInt:kWCMessageTypeMergeRelay];\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid.length > \cf7 0\cf4 ) \{\ relayMsg.objectId = Localized(\cf6 @"JX_GroupChatLogs"\cf4 );\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ relayMsg.objectId = [NSString stringWithFormat:Localized(\cf6 @"JX_GroupChat%@And%@"\cf4 ), \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.userNickname, g_myself.userNickname];\ \}\ NSData *jsonData = [NSJSONSerialization dataWithJSONObject:contentArr options:NSJSONWritingPrettyPrinted error: \f2\b \cf8 nil \f0\b0 \cf4 ];\ NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];\ relayMsg.content = jsonStr;\ \ \ vc.relayMsgArray = [NSMutableArray arrayWithObject:relayMsg];\ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (actionSheet.tag == \cf7 2458\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 (index == \cf7 0\cf4 ) \{\ UIAlertView *alert = [[UIAlertView alloc] initWithTitle: \f2\b \cf8 nil \f0\b0 \cf4 message:Localized(\cf6 @"JX_SaveOnlyPictureMessages"\cf4 ) delegate: \f2\b \cf8 self \f0\b0 \cf4 cancelButtonTitle:Localized(\cf6 @"JX_Cencal"\cf4 ) otherButtonTitles:Localized(\cf6 @"JX_Save"\cf4 ), \f2\b \cf8 nil \f0\b0 \cf4 ];\ alert.tag = \cf7 2458\cf4 ;\ [alert show];\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (actionSheet.tag == \cf7 1111\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 (index == \cf7 0\cf4 )\ [g_notify postNotificationName:kCellDeleteMsgNotifaction object:[NSNumber numberWithInt: \f2\b \cf8 self \f0\b0 \cf4 .indexNum]];\ \f2\b \cf8 if \f0\b0 \cf4 (index == \cf7 1\cf4 )\ [g_notify postNotificationName:kCellResendMsgNotifaction object:[NSNumber numberWithInt: \f2\b \cf8 self \f0\b0 \cf4 .indexNum]];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid || [g_config.isOpenCluster integerValue] != \cf7 1\cf4 ) \{\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid) \{\ \ \f2\b \cf8 if \f0\b0 \cf4 (index == \cf7 0\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 onChatTalk: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (index == \cf7 1\cf4 )\{\ [ \f2\b \cf8 self \f0\b0 \cf4 onChatAudio: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (index == \cf7 2\cf4 )\{\ [ \f2\b \cf8 self \f0\b0 \cf4 onChatVideo: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ \f2\b \cf8 if \f0\b0 \cf4 (index == \cf7 0\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 onChatAudio: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (index == \cf7 1\cf4 )\{\ [ \f2\b \cf8 self \f0\b0 \cf4 onChatVideo: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 (index == \cf7 0\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .isAudioMeeting = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (index == \cf7 1\cf4 )\{\ \f2\b \cf8 self \f0\b0 \cf4 .isAudioMeeting = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ [g_server userOpenMeetWithToUserId:chatPerson.userId toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \ \}\ \ \}\ \ \ \cf5 #if TAR_IM\cf4 \ \cf5 #ifdef Meeting_Version\cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onGroupAudioMeeting\cf4 :(JXMessageObject*)msg\{\ NSString* no;\ NSString* s;\ \f2\b \cf8 if \f0\b0 \cf4 (msg != \f2\b \cf8 nil \f0\b0 \cf4 )\{\ no = msg.fileName;\ s = msg.objectId;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ no = _audioMeetingNo;\ s = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ \}\ \cf2 // if(!no)\{\cf4 \ \cf2 // [g_App showAlert:Localized(@"JXMeeting_numberNULL")];\cf4 \ \cf2 // return;\cf4 \ \cf2 // \}\cf4 \ \f2\b \cf8 self \f0\b0 \cf4 .meetingNo = no;\ \f2\b \cf8 self \f0\b0 \cf4 .isAudioMeeting = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .isTalkMeeting = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 onInvite];\ \cf2 // [g_meeting startAudioMeeting:no roomJid:s];\cf4 \ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onGroupVideoMeeting\cf4 :(JXMessageObject*)msg\{\ NSString* no;\ NSString* s;\ \f2\b \cf8 if \f0\b0 \cf4 (msg != \f2\b \cf8 nil \f0\b0 \cf4 )\{\ no = msg.fileName;\ s = msg.objectId;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ no = _videoMeetingNo;\ s = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ \}\ \cf2 // if(!no)\{\cf4 \ \cf2 // [g_App showAlert:Localized(@"JXMeeting_numberNULL")];\cf4 \ \cf2 // return;\cf4 \ \cf2 // \}\cf4 \ \f2\b \cf8 self \f0\b0 \cf4 .isAudioMeeting = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .meetingNo = no;\ \f2\b \cf8 self \f0\b0 \cf4 .isTalkMeeting = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 onInvite];\ \cf2 // [g_meeting startVideoMeeting:no roomJid:s];\cf4 \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onGroupTalkMeeting\cf4 :(JXMessageObject *)msg \{\ NSString* no;\ NSString* s;\ \f2\b \cf8 if \f0\b0 \cf4 (msg != \f2\b \cf8 nil \f0\b0 \cf4 )\{\ no = msg.fileName;\ s = msg.objectId;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ no = _audioMeetingNo;\ s = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ \}\ \cf2 // if(!no)\{\cf4 \ \cf2 // [g_App showAlert:Localized(@"JXMeeting_numberNULL")];\cf4 \ \cf2 // return;\cf4 \ \cf2 // \}\cf4 \ \f2\b \cf8 self \f0\b0 \cf4 .meetingNo = no;\ \f2\b \cf8 self \f0\b0 \cf4 .isAudioMeeting = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .isTalkMeeting = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 onInvite];\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onInvite\cf4 \{\ \ \f2\b \cf8 if \f0\b0 \cf4 (!_room.roomId) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ NSMutableSet* p = [[NSMutableSet alloc]init];\ \ JXSelectFriendsVC* vc = [JXSelectFriendsVC alloc];\ vc.isNewRoom = \f2\b \cf8 NO \f0\b0 \cf4 ;\ vc.isShowMySelf = \f2\b \cf8 NO \f0\b0 \cf4 ;\ vc.type = JXSelectFriendTypeSelMembers;\ vc.room = _room;\ vc.existSet = p;\ vc.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ vc.didSelect = \f2\b \cf8 @selector \f0\b0 \cf4 (meetingAddMember:);\ vc = [vc init];\ \cf2 // [g_window addSubview:vc.view];\cf4 \ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 meetingAddMember\cf4 :(JXSelectFriendsVC*)vc\{\ \f2\b \cf8 int \f0\b0 \cf4 type;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isAudioMeeting) \{\ type = kWCMessageTypeAudioMeetingInvite;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ type = kWCMessageTypeVideoMeetingInvite;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isTalkMeeting) \{\ type = kWCMessageTypeTalkInvite;\ \}\ \f2\b \cf8 for \f0\b0 \cf4 (NSNumber* n \f2\b \cf8 in \f0\b0 \cf4 vc.set)\{\ memberData *user;\ \f2\b \cf8 if \f0\b0 \cf4 (vc.seekTextField.text.length > \cf7 0\cf4 ) \{\ user = vc.searchArray[[n intValue] % \cf7 100000\cf4 -\cf7 1\cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ user = [[vc.letterResultArr objectAtIndex:[n intValue] / \cf7 100000\cf4 -\cf7 1\cf4 ] objectAtIndex:[n intValue] % \cf7 100000\cf4 -\cf7 1\cf4 ];\ \}\ NSString* s = [NSString stringWithFormat:\cf6 @"%ld"\cf4 ,user.userId];\ [g_meeting sendMeetingInvite:s toUserName:user.userName roomJid: \f2\b \cf8 self \f0\b0 \cf4 .roomJid callId: \f2\b \cf8 self \f0\b0 \cf4 .meetingNo type:type];\ \}\ \ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(\cf7 .5\cf4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^\{\ \f2\b \cf8 if \f0\b0 \cf4 (g_meeting.isMeeting) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ JXAVCallViewController *avVC = [[JXAVCallViewController alloc] init];\ avVC.roomNum = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ avVC.isAudio = \f2\b \cf8 self \f0\b0 \cf4 .isAudioMeeting;\ avVC.isTalk = \f2\b \cf8 self \f0\b0 \cf4 .isTalkMeeting;\ avVC.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ avVC.toUserName = \f2\b \cf8 self \f0\b0 \cf4 .chatRoom.roomTitle;\ avVC.view.frame = [UIScreen mainScreen].bounds;\ \cf2 // [self presentViewController:avVC animated:YES completion:nil];\cf4 \ [g_window addSubview:avVC.view];\ \ \});\ \ \}\ \cf5 #endif\cf4 \ \cf5 #endif\cf4 \ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onChatAudio\cf4 :(JXMessageObject*)msg\{\ \cf5 #if TAR_IM\cf4 \ \cf5 #ifdef Meeting_Version\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 sendMsgCheck])\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \cf2 // \f1 \'d1\'e9\'d6\'a4 \f0 XMPP \f1 \'ca\'c7\'b7\'f1\'d4\'da\'cf\'df \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (g_xmpp.isLogined != login_status_yes)\{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ [g_xmpp showXmppOfflineAlert];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \cf2 // if(!g_meeting.connected)\{\cf4 \ \cf2 // [g_meeting showAutoConnect];\cf4 \ \cf2 // return;\cf4 \ \cf2 // \}\cf4 \ \ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (( \f2\b \cf8 self \f0\b0 \cf4 .roomJid || msg.objectId.length > \cf7 0\cf4 ) && [msg.type intValue] != kWCMessageTypeAVBusy)\{\ [ \f2\b \cf8 self \f0\b0 \cf4 onGroupAudioMeeting:msg];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ AskCallViewController* vc = [AskCallViewController alloc];\ vc.toUserId = chatPerson.userId;\ vc.toUserName = chatPerson.userNickname;\ vc.type = kWCMessageTypeAudioChatAsk;\ vc.meetUrl = \f2\b \cf8 self \f0\b0 \cf4 .meetUrl;\ vc = [vc init];\ \cf2 // [g_window addSubview:vc.view];\cf4 \ [g_navigation pushViewController:vc animated: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \ \cf5 #endif\cf4 \ \cf5 #endif\cf4 \ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onChatVideo\cf4 :(JXMessageObject*)msg\{\ \cf5 #if TAR_IM\cf4 \ \cf5 #ifdef Meeting_Version\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 sendMsgCheck])\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \cf2 // \f1 \'d1\'e9\'d6\'a4 \f0 XMPP \f1 \'ca\'c7\'b7\'f1\'d4\'da\'cf\'df \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (g_xmpp.isLogined != login_status_yes)\{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ [g_xmpp showXmppOfflineAlert];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \cf2 // if(!g_meeting.connected)\{\cf4 \ \cf2 // [g_meeting showAutoConnect];\cf4 \ \cf2 // return;\cf4 \ \cf2 // \}\cf4 \ \ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (( \f2\b \cf8 self \f0\b0 \cf4 .roomJid || msg.objectId.length > \cf7 0\cf4 ) && [msg.type intValue] != kWCMessageTypeAVBusy)\{\ [ \f2\b \cf8 self \f0\b0 \cf4 onGroupVideoMeeting:msg];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ AskCallViewController* vc = [AskCallViewController alloc];\ vc.toUserId = chatPerson.userId;\ vc.toUserName = chatPerson.userNickname;\ vc.type = kWCMessageTypeVideoChatAsk;\ vc.meetUrl = \f2\b \cf8 self \f0\b0 \cf4 .meetUrl;\ vc = [vc init];\ \cf2 // [g_window addSubview:vc.view];\cf4 \ [g_navigation pushViewController:vc animated: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \cf5 #endif\cf4 \ \cf5 #endif\cf4 \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onChatTalk\cf4 :(JXMessageObject*)msg \{\ \cf5 #if TAR_IM\cf4 \ \cf5 #ifdef Meeting_Version\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 sendMsgCheck])\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \cf2 // \f1 \'d1\'e9\'d6\'a4 \f0 XMPP \f1 \'ca\'c7\'b7\'f1\'d4\'da\'cf\'df \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (g_xmpp.isLogined != login_status_yes)\{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ [g_xmpp showXmppOfflineAlert];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \cf2 // if(!g_meeting.connected)\{\cf4 \ \cf2 // [g_meeting showAutoConnect];\cf4 \ \cf2 // return;\cf4 \ \cf2 // \}\cf4 \ \ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 onGroupTalkMeeting:msg];\ \ \cf5 #endif\cf4 \ \cf5 #endif\cf4 \ \}\ \ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onHeadImage\cf4 :(UIView*)sender\{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \ JXMessageObject *msg=[_array objectAtIndex:sender.tag];\ [g_server getUser:msg.fromUserId toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ msg = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onMember\cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 (recording) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ NSString *s;\ \f2\b \cf8 switch \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .groupStatus intValue]) \{\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 0\cf4 :\ s = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 1\cf4 :\ s = Localized(\cf6 @"JX_OutOfTheGroup1"\cf4 );\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 2\cf4 :\ s = Localized(\cf6 @"JX_DissolutionGroup1"\cf4 );\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \ \f2\b \cf8 default \f0\b0 \cf4 :\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (s.length > \cf7 0\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ [g_server showMsg:s];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // [_wait start];\cf4 \ \ JXRoomMemberVC* vc = [JXRoomMemberVC alloc];\ \cf2 // vc.chatRoom = [[JXXMPP sharedInstance].roomPool joinRoom:roomdata.roomJid title:roomdata.name isNew:NO];\cf4 \ \cf2 // vc.room = roomdata;\cf4 \ vc.roomId = roomId;\ vc.room = \f2\b \cf8 self \f0\b0 \cf4 .room;\ vc.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ vc = [vc init];\ \cf2 // [g_window addSubview:vc.view];\cf4 \ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \cf2 // [g_server getRoom:roomId toView:self];\cf4 \ \}\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onQuitRoom\cf4 :(NSNotification *)notifacation\cf2 // \f1 \'b3\'ac\'ca\'b1\'ce\'b4\'ca\'d5\'b5\'bd\'bb\'d8\'d6\'b4 \f0 \cf4 \ \{\ JXRoomObject* p = (JXRoomObject *)notifacation.object;\ \f2\b \cf8 if \f0\b0 \cf4 (p == chatRoom)\ [ \f2\b \cf8 self \f0\b0 \cf4 actionQuit];\ p = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \ \cf5 #pragma mark \f2\b \cf16 - \f4 \'bf\'d8\'d6\'c6\'cf\'fb\'cf\'a2\'b4\'a6\'c0\'ed \f0\b0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onReceiveRoomRemind\cf4 :(NSNotification *)notifacation\ \{\ JXRoomRemind* p = (JXRoomRemind *)notifacation.object;\ \ \f2\b \cf8 if \f0\b0 \cf4 ([p.objectId isEqualToString: \f2\b \cf8 self \f0\b0 \cf4 .roomJid])\{\ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_RoomName)\{\ \f2\b \cf8 self \f0\b0 \cf4 .title = [NSString stringWithFormat:\cf6 @"%@(%ld)"\cf4 ,p.content,_room.curCount];\ [ \f2\b \cf8 self \f0\b0 \cf4 setAudioIconFrame];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_DisableSay)\{\ \f2\b \cf8 if \f0\b0 \cf4 ([p.toUserId isEqualToString:MY_USER_ID])\ _disableSay = [p.content longLongValue];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_DelMember)\{\ \f2\b \cf8 if \f0\b0 \cf4 ([p.toUserId isEqualToString:MY_USER_ID])\ \f2\b \cf8 self \f0\b0 \cf4 .groupStatus = [NSNumber numberWithInt:\cf7 1\cf4 ];\ \cf2 // [self actionQuit];\cf4 \ \ NSArray * memberArray = [memberData fetchAllMembers:_room.roomId];\ \f2\b \cf8 self \f0\b0 \cf4 .title = [NSString stringWithFormat:\cf6 @"%@(%ld)"\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.userNickname, memberArray.count];\ [ \f2\b \cf8 self \f0\b0 \cf4 setAudioIconFrame];\ \ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_NewNotice)\{\ NSArray *noticeArr = [p.content componentsSeparatedByString:Localized(\cf6 @"JXMessageObject_AddNewAdv"\cf4 )];\ [ \f2\b \cf8 self \f0\b0 \cf4 setupNoticeWithContent:[noticeArr lastObject] time:[NSString stringWithFormat:\cf6 @"%lf"\cf4 ,[[NSDate date] timeIntervalSince1970]]];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_DelRoom)\{\ \f2\b \cf8 if \f0\b0 \cf4 ([p.toUserId isEqualToString:MY_USER_ID] || IS_OTHER_DEVICE(p.toUserId))\ \f2\b \cf8 self \f0\b0 \cf4 .groupStatus = [NSNumber numberWithInt:\cf7 2\cf4 ];\ \cf2 // [self actionQuit];\cf4 \ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_AddMember)\{\ \f2\b \cf8 if \f0\b0 \cf4 ([p.toUserId isEqualToString:MY_USER_ID])\{\ \f2\b \cf8 self \f0\b0 \cf4 .groupStatus = [NSNumber numberWithInt:\cf7 0\cf4 ];\ chatRoom.isConnected = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ NSArray * memberArray = [memberData fetchAllMembers:_room.roomId];\ \f2\b \cf8 self \f0\b0 \cf4 .title = [NSString stringWithFormat:\cf6 @"%@(%ld)"\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.userNickname, memberArray.count];\ [ \f2\b \cf8 self \f0\b0 \cf4 setAudioIconFrame];\ \cf2 // [self actionQuit];\cf4 \ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_NickName)\{\ \ memberData *data = [[memberData alloc] init];\ data.roomId = roomId;\ data.userNickName = p.content;\ data.userId = [p.toUserId longLongValue];\ [data updateUserNickName];\ \ \cf2 // for (int i = 0; i < [_array count] ; i++) \{\cf4 \ \cf2 // JXMessageObject *msg=[_array objectAtIndex:i];\cf4 \ \cf2 // if ([msg.fromUserId isEqualToString:p.userId]) \{\cf4 \ \cf2 // msg.fromUserName = p.content;\cf4 \ \cf2 // \}\cf4 \ \cf2 // \}\cf4 \ \ [_table reloadData];\ \ \cf2 // for(int i=0;i<[_room.members count];i++)\{\cf4 \ \cf2 // memberData* m = [_room.members objectAtIndex:i];\cf4 \ \cf2 // if(m.userId == [p.toUserId intValue])\{\cf4 \ \cf2 // m.userNickName = p.content;\cf4 \ \cf2 // break;\cf4 \ \cf2 // \}\cf4 \ \cf2 // m = nil;\cf4 \ \cf2 // \}\cf4 \ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_SetManage) \{\ \cf2 // \f1 \'c9\'e8\'d6\'c3\'c8\'ba\'d7\'e9\'b9\'dc\'c0\'ed\'d4\'b1 \f0 \cf4 \ \ JXUserObject *user = [[JXUserObject sharedInstance] getUserById:p.objectId];\ \ NSDictionary * groupDict = [user toDictionary];\ roomData * roomdata = [[roomData alloc] init];\ [roomdata getDataFromDict:groupDict];\ NSArray * allMem = [memberData fetchAllMembers:user.roomId];\ roomdata.members = [allMem mutableCopy];\ \ memberData *member = [roomdata getMember:p.toUserId];\ \f2\b \cf8 if \f0\b0 \cf4 ([member.role intValue] == \cf7 2\cf4 ) \{\ member.role = [NSNumber numberWithInt:\cf7 2\cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ member.role = [NSNumber numberWithInt:\cf7 3\cf4 ];\ \}\ [member updateRole];\ _room = roomdata;\ \ \f2\b \cf8 if \f0\b0 \cf4 ([p.toUserId isEqualToString:g_myself.userId]) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([member.role intValue] == \cf7 2\cf4 ) \{\ _isAdmin = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \ _shareMore.enabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _recordBtnLeft.enabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _btnFace.enabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _messageText.userInteractionEnabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _talkTimeLabel.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ _isAdmin = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.talkTime longLongValue] > \cf7 0\cf4 ) \{\ _talkTimeLabel.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _talkTimeLabel.text = Localized(\cf6 @"JX_TotalSilence"\cf4 );\ _shareMore.enabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _recordBtnLeft.enabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _btnFace.enabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _messageText.userInteractionEnabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _messageText.text = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ _shareMore.enabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _recordBtnLeft.enabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _btnFace.enabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _messageText.userInteractionEnabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _talkTimeLabel.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \}\ \}\ \ [ \f2\b \cf8 self \f0\b0 \cf4 refresh: \f2\b \cf8 nil \f0\b0 \cf4 ];\ [_table reloadData];\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_ShowRead)\{\ \cf2 //BOOL b = [self.chatPerson.showRead boolValue];\cf4 \ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.showRead = [NSNumber numberWithInt:[p.content intValue]];\ \cf2 //if(b != [self.chatPerson.showRead boolValue])\cf4 \ \ \cf2 // [self refresh:nil];\cf4 \ [_table reloadData];\ \ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_ShowMember)\{\ \ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.showMember = [NSNumber numberWithInt:[p.content intValue]];\ \ [ \f2\b \cf8 self \f0\b0 \cf4 refresh: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_allowSendCard)\{\ \ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.allowSendCard = [NSNumber numberWithInt:[p.content intValue]];\ \f2\b \cf8 self \f0\b0 \cf4 .room.allowSendCard = [p.content boolValue];\ \ [ \f2\b \cf8 self \f0\b0 \cf4 refresh: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf2 // \f1 \'bd\'fb\'d6\'b9\'cb\'bd\'c1\'c4\'a3\'ac\'cb\'f9\'d3\'d0\'c3\'fb\'d7\'d6\'d7\'ee\'ba\'f3\'d2\'bb\'ce\'bb\'b8\'c4\'ce\'aa \f0 * \f1 \'a3\'ac\'d0\'e8\'d2\'aa\'cb\'a2\'d0\'c2\'bd\'e7\'c3\'e6\'a3\'ac\'b1\'a3\'d6\'a4\'d5\'fb\'b8\'f6\'c1\'d0\'b1\'ed\'bc\'b4\'ca\'b1\'b8\'fc\'d0\'c2 \f0 \cf4 \ [_table reloadData];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_RoomAllowInviteFriend)\{\ \ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.allowInviteFriend = [NSNumber numberWithInt:[p.content intValue]];\ \ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_RoomAllowUploadFile)\{\ \ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.allowUploadFile = [NSNumber numberWithInt:[p.content intValue]];\ \ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_RoomAllowConference)\{\ \ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.allowConference = [NSNumber numberWithInt:[p.content intValue]];\ \ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_RoomAllowSpeakCourse)\{\ \ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.allowSpeakCourse = [NSNumber numberWithInt:[p.content intValue]];\ [ \f2\b \cf8 self \f0\b0 \cf4 refresh: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_RoomAllBanned)\{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.talkTime = [NSNumber numberWithInt:[p.content intValue]];\ _disableSay = [ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.talkTime longLongValue];\ \ \ \cf2 // memberData *data = [self.room getMember:g_myself.userId];\cf4 \ \cf2 // if ([data.role intValue] == 1 || [data.role intValue] == 2) \{\cf4 \ \cf2 // _isAdmin = YES;\cf4 \ \cf2 // \}else \{\cf4 \ \cf2 // _isAdmin = NO;\cf4 \ \cf2 // \}\cf4 \ \ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.talkTime longLongValue] > \cf7 0\cf4 && !_isAdmin) \{\ _talkTimeLabel.text = Localized(\cf6 @"JX_TotalSilence"\cf4 );\ _shareMore.enabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _recordBtnLeft.enabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _btnFace.enabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _messageText.userInteractionEnabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _talkTimeLabel.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _messageText.text = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ _shareMore.enabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _recordBtnLeft.enabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _btnFace.enabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _messageText.userInteractionEnabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _talkTimeLabel.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \cf2 // [self refresh:nil];\cf4 \ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_SetInvisible)\{\ JXUserObject *user = [[JXUserObject sharedInstance] getUserById:p.objectId];\ \ NSDictionary * groupDict = [user toDictionary];\ roomData * roomdata = [[roomData alloc] init];\ [roomdata getDataFromDict:groupDict];\ NSArray * allMem = [memberData fetchAllMembers:user.roomId];\ roomdata.members = [allMem mutableCopy];\ \ memberData *member = [roomdata getMember:p.toUserId];\ \f2\b \cf8 if \f0\b0 \cf4 ([p.content intValue] == \cf7 1\cf4 ) \{\ [member updateRoleByUserId:[p.toUserId longLongValue] role:[NSNumber numberWithInt:\cf7 4\cf4 ]];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [member updateRoleByUserId:[p.toUserId longLongValue] role:[NSNumber numberWithInt:\cf7 3\cf4 ]];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([p.toUserId isEqualToString:MY_USER_ID]) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([p.content intValue] == \cf7 1\cf4 ) \{\ _talkTimeLabel.text = Localized(\cf6 @"JX_ProhibitToSpeak"\cf4 );\ _messageText.userInteractionEnabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _shareMore.enabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _recordBtnLeft.enabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _btnFace.enabled = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _talkTimeLabel.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ _messageText.text = \f2\b \cf8 nil \f0\b0 \cf4 ;\ member.role = [NSNumber numberWithInt:\cf7 4\cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ _talkTimeLabel.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _shareMore.enabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _recordBtnLeft.enabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _btnFace.enabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _messageText.userInteractionEnabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ member.role = [NSNumber numberWithInt:\cf7 3\cf4 ];\ \}\ [member updateRole];\ _room = roomdata;\ \}\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_RoomTransfer)\{\ \f2\b \cf8 if \f0\b0 \cf4 ([p.fromUserId isEqualToString:MY_USER_ID] || [p.toUserId isEqualToString:MY_USER_ID]) \{\ \ \f2\b \cf8 if \f0\b0 \cf4 ([p.fromUserId isEqualToString:MY_USER_ID]) \{\ _isAdmin = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ _isAdmin = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ [ \f2\b \cf8 self \f0\b0 \cf4 refresh: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_RoomDisable) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([p.content integerValue] != \cf7 1\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .isDisable = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 self \f0\b0 \cf4 .isDisable = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([p.type intValue] == kRoomRemind_SetRecordTimeOut) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([p.objectId isEqualToString: \f2\b \cf8 self \f0\b0 \cf4 .roomJid]) \{\ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.chatRecordTimeOut = p.content;\ [ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson updateUserChatRecordTimeOut];\ \}\ \}\ \ \cf2 // \f1 \'c8\'ba\'c4\'da\'cc\'df\'c8\'cb\'a3\'ac\'c9\'be\'b3\'fd\'cb\'f9\'d3\'d0\'cf\'fb\'cf\'a2 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([p.type integerValue] == kRoomRemind_RoomDeleteMsg) \{\ \cf2 // printf(<#const char *, ...#>)\cf4 \ \}\ \ \cf2 // \f1 \'c8\'ba\'d7\'e9\'cf\'d4\'ca\'be\'cd\'b7\'cf\'ce \f0 \cf4 \ \cf2 // if ([p.type integerValue] == kRoomRemind_RoomIsOpenIntegral) \{\cf4 \ \cf2 // if ([p.content intValue] == 0) \{\cf4 \ \cf2 // self.isOpenIntegral = NO;\cf4 \ \cf2 // \}else\{\cf4 \ \cf2 // self.isOpenIntegral = YES;\cf4 \ \cf2 // \}\cf4 \ \cf2 // // [self refresh:nil];\cf4 \ \cf2 // [_table reloadData];\cf4 \ \cf2 // \}\cf4 \ \ \cf2 // \f1 \'c8\'ba\'d7\'e9\'cf\'fb\'cf\'a2\'b7\'c0\'b2\'e2\'bb\'d8 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([p.type integerValue] == kRoomRemind_RoomIsAttritionRecall) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([p.content intValue] == \cf7 0\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .isOpenIntegral = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 self \f0\b0 \cf4 .isOpenIntegral = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \}\ \ \cf2 // \f1 \'d7\'ee\'d0\'c2\'b9\'ab\'b8\'e6 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([p.type integerValue] == kRoomRemind_editNotice) \{\ \cf2 // NSArray *noticeArr = [p.content componentsSeparatedByString:Localized(@"JXMessageObject_AddNewAdv")];\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 setupNoticeWithContent:p.content time:[NSString stringWithFormat:\cf6 @"%lf"\cf4 ,[[NSDate date] timeIntervalSince1970]]];\ [ \f2\b \cf8 self \f0\b0 \cf4 showLatestBroadcastTitle:\cf6 @" \f1 \'d7\'ee\'d0\'c2\'b9\'ab\'b8\'e6 \f0 "\cf4 message:p.content];\ \}\ \ \}\ \}\ \ \cf2 // \f1 \'c8\'ba\'bb\'ee\'b6\'af\'cf\'fb\'cf\'a2 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 roomGroupActivityRefresh\cf4 :(NSNotification *)notifacation \{\ JLGroupActivityModel *model = (JLGroupActivityModel *)notifacation.object;\ _activityModel = model;\ \ \cf2 // \f1 \'b7\'c0\'b3\'b7\'bb\'d8\'d0\'de\'b8\'c4 \f0 \cf4 \ [_container dismiss];\ \cf2 /**/\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([model.roomJid isEqualToString: \f2\b \cf8 self \f0\b0 \cf4 .roomJid]) \{\ \f2\b \cf8 if \f0\b0 \cf4 (model.type == \cf7 1\cf4 ) \{\ JXLabelObject *obj = [JXLabelObject sharedInstance];\ obj.roomJid = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ NSString *groupAnnouncement = \f2\b \cf8 nil \f0\b0 \cf4 ;\ NSString *selectItem = [obj fetchGroupAnnouncementSelectItemFromLocal];\ NSArray *response = [ \f2\b \cf8 self \f0\b0 \cf4 dictionaryWithJsonString: model.content];\ NSMutableArray *modelArray = [NSMutableArray array];\ \f2\b \cf8 for \f0\b0 \cf4 (NSDictionary *dict \f2\b \cf8 in \f0\b0 \cf4 response) \{\ [JLSelectModel mj_setupObjectClassInArray:^NSDictionary *\{\ \f2\b \cf8 return \f0\b0 \cf4 \cf7 @\{\cf4 \ \cf6 @"data"\cf4 : \cf6 @"JLSelectItemModel"\cf4 \ \cf7 \}\cf4 ;\ \}];\ JLSelectModel *model = [JLSelectModel mj_objectWithKeyValues:dict];\ [modelArray addObject:model];\ \}\ \cf2 // \f1 \'b2\'f0\'b7\'d6 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (selectItem) \{\ NSArray *temp = [selectItem componentsSeparatedByString:\cf6 @"-"\cf4 ];\ NSString *first = temp.firstObject;\ NSString *last = temp.lastObject;\ \ \f2\b \cf8 for \f0\b0 \cf4 (JLSelectModel *model \f2\b \cf8 in \f0\b0 \cf4 modelArray) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([model.name isEqualToString:first]) \{\ \f2\b \cf8 for \f0\b0 \cf4 (JLSelectItemModel *selectItemModel \f2\b \cf8 in \f0\b0 \cf4 model.data) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([selectItemModel.subName isEqualToString:last]) \{\ groupAnnouncement = selectItemModel.content;\ \cf2 // _leftLabel2.text = groupAnnouncement;\cf4 \ \ [_showTopView.caizongBtn setTitle:selectItemModel.subName forState:UIControlStateNormal];\ _showTopView.selectItemModel=selectItemModel;\ \}\ \}\ \}\ \ \}\ \ \}\ \ \ _noticeView2.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (model.type == \cf7 0\cf4 ) \{\ \cf2 // \f1 \'b5\'da\'d2\'bb\'b4\'ce\'c9\'e8\'d6\'c3 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([g_default boolForKey:kLongComePushIsFirstSetUp] != \cf7 1\cf4 )\{\ [ \f2\b \cf8 self \f0\b0 \cf4 showAdAlertViewImageString:\cf6 @"ad_long.gif"\cf4 linkUrl:model.link audio:\cf6 @"houjiao.mp3"\cf4 duration:\cf7 4\cf4 content:model.content showCancelButton: \f2\b \cf8 NO \f0\b0 \cf4 type:(DYAdModelTypeLongAnimation) success: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ([g_default boolForKey:kLongComePush] == \cf7 0\cf4 )\{\ [ \f2\b \cf8 self \f0\b0 \cf4 showAdAlertViewImageString:\cf6 @"ad_long.gif"\cf4 linkUrl:model.link audio:\cf6 @"houjiao.mp3"\cf4 duration:\cf7 4\cf4 content:model.content showCancelButton: \f2\b \cf8 NO \f0\b0 \cf4 type:(DYAdModelTypeLongAnimation) success: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \}\ \ \ \}\ \f2\b \cf8 if \f0\b0 \cf4 (model.type == \cf7 3\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 showAdAlertViewImageString:\cf6 @"ad_treasureBox.png"\cf4 linkUrl: \f2\b \cf8 nil \f0\b0 \cf4 audio: \f2\b \cf8 nil \f0\b0 \cf4 duration:\cf7 0\cf4 content:\cf6 @" \f1 \'b9\'a7\'cf\'b2\'c4\'fa\'bb\'f1\'b5\'c3\'d2\'bb\'b8\'f6\'b1\'a6\'cf\'e4 \f0 !"\cf4 showCancelButton: \f2\b \cf8 YES \f0\b0 \cf4 type:(DYAdModelTypeGiftOpen) success: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \}\ \}\ \ \cf2 // \f1 \'c8\'ba\'cd\'b7\'cf\'ce\'bf\'aa\'b9\'d8\'bf\'d8\'d6\'c6 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 roomIsOpenIntegral\cf4 :(NSNotification *)notifacation \{\ NSString* p = (NSString *)notifacation.object;\ \ \f2\b \cf8 if \f0\b0 \cf4 ([p intValue] == \cf7 0\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .isOpenIntegral = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 self \f0\b0 \cf4 .isOpenIntegral = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ [ \f2\b \cf8 self \f0\b0 \cf4 refresh: \f2\b \cf8 nil \f0\b0 \cf4 ];\ [_table reloadData];\ \}\ \ \cf2 // \f1 \'c8\'ba\'d7\'e9\'cf\'fb\'cf\'a2\'b7\'c0\'b2\'e2\'bb\'d8 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 roomIsisAttritionRecall\cf4 :(NSNotification *)notifacation \{\ NSString* p = (NSString *)notifacation.object;\ \cf2 // \f1 \'c8\'ba\'d7\'e9\'cf\'fb\'cf\'a2\'b7\'c0\'b2\'e2\'bb\'d8 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([p intValue] == \cf7 0\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .isAttritionRecall = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 self \f0\b0 \cf4 .isAttritionRecall = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \cf2 // [g_server roomGetRoom:self.roomId toView:self];\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 refresh: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \ -( \f2\b \cf8 BOOL \f0\b0 \cf4 )\cf11 showDisableSay\cf4 \{\ \ memberData *data = [ \f2\b \cf8 self \f0\b0 \cf4 .room getMember:g_myself.userId];\ \cf2 // if([[NSDate date] timeIntervalSince1970] <= _disableSay && [data.role intValue] != 1)\{\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([[NSDate date] timeIntervalSince1970] <= _disableSay && !_isAdmin)\{\ NSString* s = [TimeUtil formatDate:[NSDate dateWithTimeIntervalSince1970:_disableSay] format:\cf6 @"yyyy-MM-dd HH:mm"\cf4 ];\ [g_App showAlert:[NSString stringWithFormat:\cf6 @"%@%@"\cf4 ,s,Localized(\cf6 @"JXChatVC_GagTime"\cf4 )]];\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onLocation\cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ([CLLocationManager locationServicesEnabled] && ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized)) \{\ \cf2 // \f1 \'b6\'a8\'ce\'bb\'b9\'a6\'c4\'dc\'bf\'c9\'d3\'c3 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 showDisableSay])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 sendMsgCheck])\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (g_server.latitude <= \cf7 0\cf4 && g_server.longitude <= \cf7 0\cf4 ) \{\ g_server.latitude = \cf7 22.6\cf4 ;\ g_server.longitude = \cf7 114.04\cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (g_config.isChina) \{\ _locVC = [JXLocationVC alloc];\ _locVC.isSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _locVC.locationType = JXLocationTypeCurrentLocation;\ _locVC.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ _locVC.didSelect = \f2\b \cf8 @selector \f0\b0 \cf4 (onSelLocation:);\ \cf2 // self.locationVC.locations = [[NSMutableArray alloc]init];\cf4 \ \ \cf2 // JXMapData* p = [[JXMapData alloc]init];\cf4 \ \cf2 // p.latitude = [NSString stringWithFormat:@"%f",g_server.latitude];\cf4 \ \cf2 // p.longitude = [NSString stringWithFormat:@"%f",g_server.longitude];\cf4 \ \cf2 // p.title = g_server.locationCity;\cf4 \ \cf2 // p.subtitle = g_server.locationAddress;\cf4 \ \cf2 // [self.locationVC.locations addObject:p];\cf4 \ \cf2 // [p release];\cf4 \ \ _locVC = [_locVC init];\ \cf2 // self.locationVC.locY = g_server.latitude;\cf4 \ \cf2 // self.locationVC.locX = g_server.longitude;\cf4 \ \cf2 // [g_window addSubview:_locVC.view];\cf4 \ [g_navigation pushViewController:_locVC animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ _gooMap = [JXGoogleMapVC alloc];\ _gooMap.isSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ _gooMap.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ _gooMap.locationType = JXGooLocationTypeCurrentLocation;\ _gooMap.didSelect = \f2\b \cf8 @selector \f0\b0 \cf4 (onSelLocation:);\ \ _gooMap = [_gooMap init];\ [g_navigation pushViewController:_gooMap animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ([CLLocationManager authorizationStatus] ==kCLAuthorizationStatusDenied) \{\ \cf2 // \f1 \'b6\'a8\'ce\'bb\'b2\'bb\'c4\'dc\'d3\'c3 \f0 \cf4 \ [g_App showAlert:[NSString stringWithFormat:Localized(\cf6 @"JX_NoLocationPermissions"\cf4 ),APP_NAME]];\ \}\ \ \}\ \ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onSelLocation\cf4 :(JXMapData*)location\{\ \f2\b \cf8 if \f0\b0 \cf4 (_isGroupSendCancel) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \cf2 // \f1 \'c9\'cf\'b4\'ab\'cd\'bc\'c6\'ac \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (location.imageUrl) \{\ \f2\b \cf8 self \f0\b0 \cf4 .isMapMsg = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .mapData = location;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 if \f0\b0 \cf4 (! \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendView) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 addWaitGroupSendViewWithMsgNum:\cf7 1\cf4 withType:groupsend_msgType_location];\ _onceSendNum = \cf7 10\cf4 ;\ \}\ \}\ [g_server uploadFile:location.imageUrl validTime: \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.chatRecordTimeOut messageId: \f2\b \cf8 nil \f0\b0 \cf4 toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \}\ \ \cf2 //- (void)groupSendLocation:(NSMutableArray *)msgArray\{\cf4 \ \cf2 // NSDictionary *p = msgArray.lastObject;\cf4 \ \cf2 // if (_isGroupSendCancel) \{\cf4 \ \cf2 // return;\cf4 \ \cf2 // \}\cf4 \ \cf2 // NSString *userId = self.userIds[self.groupMessagesIndex];\cf4 \ \cf2 //\cf4 \ \cf2 // NSString* msgId = [dict objectForKey:@"oUrl"];\cf4 \ \cf2 // msgId = [[msgId lastPathComponent] stringByDeletingPathExtension];\cf4 \ \cf2 // NSString* oFileName = [dict objectForKey:@"oFileName"];\cf4 \ \cf2 //\cf4 \ \cf2 // // NSString *userId = self.userIds[self.groupMessagesIndex];\cf4 \ \cf2 // // NSString *userName = self.userNames[self.groupMessagesIndex];\cf4 \ \cf2 //\cf4 \ \cf2 // JXMessageObject* p=nil;\cf4 \ \cf2 // int found=-1;\cf4 \ \cf2 // for(int i=(int)[_array count]-1;i>=0;i--)\{\cf4 \ \cf2 // p = [_array objectAtIndex:i];\cf4 \ \cf2 // if([p.type intValue]==kWCMessageTypeLocation)\cf4 \ \cf2 // if([[p.fileName lastPathComponent] isEqualToString:[oFileName lastPathComponent]])\{\cf4 \ \cf2 // found = i;\cf4 \ \cf2 // break;\cf4 \ \cf2 // \}\cf4 \ \cf2 // if([p.type intValue]==kWCMessageTypeFile && ![p.isUpload boolValue])\cf4 \ \cf2 // if([[p.fileName lastPathComponent] isEqualToString:[oFileName lastPathComponent]])\{\cf4 \ \cf2 // found = i;\cf4 \ \cf2 // break;\cf4 \ \cf2 // \}\cf4 \ \cf2 // if (p.content.length > 0) \{\cf4 \ \cf2 // if ([oFileName rangeOfString:p.content].location != NSNotFound) \{\cf4 \ \cf2 // found = i;\cf4 \ \cf2 // break;\cf4 \ \cf2 // \}\cf4 \ \cf2 // \}\cf4 \ \cf2 // // if([p.content isEqualToString:msgId])\{\cf4 \ \cf2 // // found = i;\cf4 \ \cf2 // // break;\cf4 \ \cf2 // // \}\cf4 \ \cf2 // p = nil;\cf4 \ \cf2 // \}\cf4 \ \cf2 // if(found>=0)\{// \f1 \'d5\'d2\'b5\'bd\'cf\'fb\'cf\'a2\'cc\'e5 \f0 \cf4 \ \cf2 // if([[dict objectForKey:@"status"] intValue] != 1)\{\cf4 \ \cf2 // NSLog(@"doUploadFaire");\cf4 \ \cf2 // [p updateIsSend:transfer_status_no];\cf4 \ \cf2 // JXBaseChatCell* cell = [self getCell:found];\cf4 \ \cf2 // [cell drawIsSend];\cf4 \ \cf2 // cell = nil;\cf4 \ \cf2 // return;\cf4 \ \cf2 // \}\cf4 \ \cf2 // if (self.isGroupMessages) \{\cf4 \ \cf2 // p.isGroupSend = YES;\cf4 \ \cf2 // \}\cf4 \ \cf2 // NSLog(@"doSendAfterUpload");\cf4 \ \cf2 // p.content = [dict objectForKey:@"oUrl"];\cf4 \ \cf2 // // if (self.isGroupMessages) \{\cf4 \ \cf2 // // p.toUserId = userId;\cf4 \ \cf2 // // \}\cf4 \ \cf2 // [p updateIsUpload:YES];\cf4 \ \cf2 // [g_xmpp sendMessage:p roomName:self.roomJid];// \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \cf2 // // [self.tableView reloadData];\cf4 \ \cf2 // \}\cf4 \ \cf2 //\cf4 \ \cf2 // p = nil;\cf4 \ \cf2 // self.groupMessagesIndex ++;\cf4 \ \cf2 // if (self.groupMessagesIndex < self.userIds.count) \{\cf4 \ \cf2 // if (self.groupMessagesIndex % _onceSendNum == 0) \{\cf4 \ \cf2 // return;\cf4 \ \cf2 // \}else\{\cf4 \ \cf2 // [self collectionMsgSendAll:allArray];\cf4 \ \cf2 // \}\cf4 \ \cf2 // \}else if (self.userIds)\{\cf4 \ \cf2 // self.groupMessagesIndex = 0;\cf4 \ \cf2 // return;\cf4 \ \cf2 // \}\cf4 \ \cf2 // return;\cf4 \ \cf2 //\}\cf4 \ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendMapMsgWithDict\cf4 :(NSDictionary *)dict \{\ NSString *userId = \f2\b \cf8 self \f0\b0 \cf4 .userIds[ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex];\ \cf2 // NSString *userName = self.userNames[self.groupMessagesIndex];\cf4 \ \ JXMessageObject *msg=[[JXMessageObject alloc]init];\ msg.timeSend = [NSDate date];\ msg.fromUserId = MY_USER_ID;\ msg.fromUserName = MY_USER_NAME;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\{\ msg.toUserId = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ msg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.fromUserName = _userNickName;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ msg.toUserId = userId;\ msg.isGroupSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex+\cf7 1\cf4 ) % _onceSendNum == \cf7 0\cf4 ) \{\ msg.isLastGroupSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.toUserId = chatPerson.userId;\ \}\ msg.isGroup = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ msg.location_x = [NSNumber numberWithDouble:[ \f2\b \cf8 self \f0\b0 \cf4 .mapData.latitude doubleValue]];\ msg.location_y = [NSNumber numberWithDouble:[ \f2\b \cf8 self \f0\b0 \cf4 .mapData.longitude doubleValue]];\ msg.type = [NSNumber numberWithInt:kWCMessageTypeLocation];\ msg.isSend = [NSNumber numberWithInt:transfer_status_ing];\ msg.isRead = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \cf2 // msg.isUpload = [NSNumber numberWithBool:NO];\cf4 \ \cf2 // msg.content = [NSString stringWithFormat:@"%@",location.subtitle];\cf4 \ msg.objectId = [NSString stringWithFormat:\cf6 @"%@"\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .mapData.subtitle];\ \ msg.isReadDel = [NSNumber numberWithInt: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \ \cf2 // \f1 \'c9\'cf\'b4\'ab\'cd\'bc\'c6\'ac \f0 \cf4 \ \cf2 // if (location.imageUrl) \{\cf4 \ \cf2 // [g_server uploadFile:location.imageUrl toView:self];\cf4 \ \cf2 // msg.fileName = location.imageUrl;\cf4 \ \cf2 // \}else\{\cf4 \ msg.content = [dict objectForKey:\cf6 @"oUrl"\cf4 ];\ \cf2 // BOOL isShowGoo = [g_myself.isUseGoogleMap intValue] > 0 ? YES : NO;\cf4 \ \cf2 // if (isShowGoo) \{\cf4 \ \cf2 // msg.content = [[NSString stringWithFormat:@"\cf17 http://maps.googleapis.com/maps/api/staticmap?center=%@,%@&size=640x480&markers=color:blue%7Clabel:S%7C62.107733,-145.541936&zoom=15\cf2 ",location.latitude, location.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];\cf4 \ \cf2 // \} else \{\cf4 \ \cf2 // msg.content = [NSString stringWithFormat:@"\cf17 http://api.map.baidu.com/staticimage?width=640&height=480¢er=%@,%@&zoom=15\cf2 ",location.longitude, location.latitude];\cf4 \ \cf2 // \}\cf4 \ msg.fileName = msg.content;\ [g_xmpp sendMessage:msg roomName: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \cf2 // \}\cf4 \ [msg insert: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex ++;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex % _onceSendNum == \cf7 0\cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex < \f2\b \cf8 self \f0\b0 \cf4 .userIds.count) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 onSelLocation: \f2\b \cf8 self \f0\b0 \cf4 .mapData];\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .userIds)\{\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex = \cf7 0\cf4 ;\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 self \f0\b0 \cf4 .isMapMsg = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onCard\cf4 \{\ \ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid.length > \cf7 0\cf4 && ![ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.allowSendCard boolValue] && !_isAdmin) \{\ [g_App showAlert:Localized(\cf6 @"JX_GroupDisableSendCard"\cf4 )];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 showDisableSay])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 sendMsgCheck])\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ JXSelectFriendsVC* vc = [JXSelectFriendsVC alloc];\ vc.isNewRoom = \f2\b \cf8 NO \f0\b0 \cf4 ;\ vc.chatRoom = \f2\b \cf8 nil \f0\b0 \cf4 ;\ vc.room = \f2\b \cf8 nil \f0\b0 \cf4 ;\ vc.isShowMySelf = \f2\b \cf8 YES \f0\b0 \cf4 ;\ vc.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ vc.didSelect = \f2\b \cf8 @selector \f0\b0 \cf4 (onAfterAddMember:);\ vc = [vc init];\ \cf2 // [g_window addSubview:vc.view];\cf4 \ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onAfterAddMember\cf4 :(JXSelectFriendsVC*)vc\{\ \ NSString *userId = \f2\b \cf8 self \f0\b0 \cf4 .userIds[ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex];\ \cf2 // NSString *userName = self.userNames[self.groupMessagesIndex];\cf4 \ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 if \f0\b0 \cf4 (_isGroupSendCancel) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex == \cf7 0\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 addWaitGroupSendViewWithMsgNum:vc.set.count withType:groupsend_msgType_card];\ \f2\b \cf8 self \f0\b0 \cf4 .groupSendMsgArray = [NSMutableArray arrayWithObject:vc];\ _onceSendNum = \cf7 20\cf4 ;\ \}\ \}\ NSInteger i = \cf7 0\cf4 ;\ \f2\b \cf8 BOOL \f0\b0 \cf4 isLastGroupSend = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 for \f0\b0 \cf4 (NSNumber* n \f2\b \cf8 in \f0\b0 \cf4 vc.set)\{\ i++;\ JXUserObject *user;\ \f2\b \cf8 if \f0\b0 \cf4 (vc.seekTextField.text.length > \cf7 0\cf4 ) \{\ user = vc.searchArray[[n intValue] % \cf7 100000\cf4 -\cf7 1\cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ user = [[vc.letterResultArr objectAtIndex:[n intValue] / \cf7 100000\cf4 -\cf7 1\cf4 ] objectAtIndex:[n intValue] % \cf7 100000\cf4 -\cf7 1\cf4 ];\ \}\ \ JXMessageObject *msg=[[JXMessageObject alloc]init];\ msg.timeSend = [NSDate date];\ msg.fromUserId = MY_USER_ID;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\{\ msg.toUserId = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ msg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.fromUserName = _userNickName;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ msg.toUserId = userId;\ msg.isGroupSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex + \cf7 1\cf4 ) % _onceSendNum == \cf7 0\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 (i == vc.set.count) \{\ msg.isLastGroupSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ isLastGroupSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.toUserId = chatPerson.userId;\ \}\ msg.isGroup = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ msg.content = user.userNickname;\ msg.objectId = user.userId;\ msg.type = [NSNumber numberWithInt:kWCMessageTypeCard];\ msg.isSend = [NSNumber numberWithInt:transfer_status_ing];\ msg.isRead = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.isReadDel = [NSNumber numberWithInt: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \ [msg insert: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\ [g_xmpp sendMessage:msg roomName: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \cf2 // [msg release];\cf4 \ user = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex ++;\ \f2\b \cf8 if \f0\b0 \cf4 (isLastGroupSend) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex < \f2\b \cf8 self \f0\b0 \cf4 .userIds.count) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 onAfterAddMember:vc];\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .userIds)\{\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex = \cf7 0\cf4 ;\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendFile\cf4 :(NSString*)file \cf11 userId\cf4 :(NSString *)userId\ \{\ \cf2 // NSString *userId = self.userIds[self.groupMessagesIndex];\cf4 \ \cf2 // NSString *userName = self.userNames[self.groupMessagesIndex];\cf4 \ \ \f2\b \cf8 if \f0\b0 \cf4 ([file length]>\cf7 0\cf4 ) \{\ JXMessageObject *msg=[[JXMessageObject alloc] init];\ msg.timeSend = [NSDate date];\ msg.fromUserId = MY_USER_ID;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\{\ msg.toUserId = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ msg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.fromUserName = _userNickName;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ msg.toUserId = userId;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.toUserId = chatPerson.userId;\ \}\ msg.isGroup = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ msg.fileName = file;\ msg.content = file;\ msg.type = [NSNumber numberWithInt:kWCMessageTypeFile];\ msg.isSend = [NSNumber numberWithInt:transfer_status_ing];\ msg.isRead = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.isUpload = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \ msg.isReadDel = [NSNumber numberWithInt: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \ [msg insert: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \ \cf2 // if (self.isGroupMessages) \{\cf4 \ \cf2 // self.groupMessagesIndex ++;\cf4 \ \cf2 // if (self.groupMessagesIndex < self.userIds.count) \{\cf4 \ \cf2 // [self sendFile:file];\cf4 \ \cf2 // \}else if (self.userIds)\{\cf4 \ \cf2 // self.groupMessagesIndex = 0;\cf4 \ \cf2 // return;\cf4 \ \cf2 // \}\cf4 \ \cf2 // return;\cf4 \ \cf2 // \}\cf4 \ \cf2 // [msg release];\cf4 \ [g_server uploadFile:file validTime: \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.chatRecordTimeOut messageId:msg.messageId toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \}\ \cf2 // \f1 \'b7\'a2\'ba\'ec\'b0\'fc \f0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendRedPacket\cf4 :(NSDictionary*)redPacketDict \cf11 withGreet\cf4 :(NSString *)greet\ \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ([redPacketDict[\cf6 @"id"\cf4 ] length]>\cf7 0\cf4 ) \{\ JXMessageObject *msg=[[JXMessageObject alloc] init];\ msg.timeSend = [NSDate date];\ msg.fromUserId = MY_USER_ID;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\{\ msg.toUserId = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ msg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.fromUserName = _userNickName;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.toUserId = chatPerson.userId;\ msg.isGroup = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ msg.content = greet;\ msg.type = [NSNumber numberWithInt:kWCMessageTypeRedPacket];\ msg.isSend = [NSNumber numberWithInt:transfer_status_ing];\ msg.isRead = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \cf2 // msg.isUpload = [NSNumber numberWithBool:NO];\cf4 \ msg.fileName = redPacketDict[\cf6 @"type"\cf4 ];\ msg.objectId = redPacketDict[\cf6 @"id"\cf4 ];\ msg.isReadDel = [NSNumber numberWithInt: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \ [msg insert: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\ \ \cf2 // if (![_orderRedPacketArray containsObject:msg]) \{\cf4 \ \cf2 // [_orderRedPacketArray addObject:msg];\cf4 \ \cf2 // \}\cf4 \ [g_xmpp sendMessage:msg roomName: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \cf2 // [msg release];\cf4 \ \}\ \cf2 // \f1 \'bb\'f1\'c8\'a1\'d3\'e0\'b6\'ee \f0 \cf4 \ [g_server getUserMoenyToView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onSelFile\cf4 :(NSString*)file\{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \cf2 // for (NSInteger i = 0; i < self.userIds.count; i ++) \{\cf4 \ \cf2 // NSString *userId = self.userIds[i];\cf4 \ \cf2 //\cf4 \ \cf2 // // \f1 \'b7\'a2\'cb\'cd\'ce\'c4\'bc\'fe\'a3\'ac \f0 file \f1 \'bd\'f6\'bd\'f6\'b0\'fc\'ba\'ac\'ce\'c4\'bc\'fe\'d4\'da\'b1\'be\'b5\'d8\'b5\'c4\'b5\'d8\'d6\'b7 \f0 \cf4 \ \cf2 // [self sendFile:file userId:userId];\cf4 \ \cf2 // // \f1 \'c9\'cf\'b4\'ab\'ce\'c4\'bc\'fe\'b5\'bd\'b7\'fe\'ce\'f1\'c6\'f7 \f0 \cf4 \ \cf12 /// \f3 \cf2 / [g_server uploadFile:file validTime:self.chatPerson.chatRecordTimeOut messageId:self.curMessageId toView:self]; \f0 \cf4 \ \cf2 // \}\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 addWaitGroupSendViewWithMsgNum:\cf7 1\cf4 withType:groupsend_msgType_file];\ \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray = [NSMutableArray arrayWithObject:file];\ _onceSendNum = \cf7 5\cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 sendFiles: \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // \f1 \'b7\'a2\'cb\'cd\'ce\'c4\'bc\'fe\'a3\'ac \f0 file \f1 \'bd\'f6\'bd\'f6\'b0\'fc\'ba\'ac\'ce\'c4\'bc\'fe\'d4\'da\'b1\'be\'b5\'d8\'b5\'c4\'b5\'d8\'d6\'b7 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 sendFile:file userId: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \cf2 // \f1 \'c9\'cf\'b4\'ab\'ce\'c4\'bc\'fe\'b5\'bd\'b7\'fe\'ce\'f1\'c6\'f7 \f0 \cf4 \ \cf2 // [g_server uploadFile:file validTime:self.chatPerson.chatRecordTimeOut messageId:self.curMessageId toView:self];\cf4 \ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendFiles\cf4 :(NSArray *)filesArray\{\ NSString *userId = \f2\b \cf8 self \f0\b0 \cf4 .userIds[ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex];\ NSString *file = filesArray.lastObject;\ [ \f2\b \cf8 self \f0\b0 \cf4 sendFile:file userId:userId];\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex ++;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex < \f2\b \cf8 self \f0\b0 \cf4 .userIds.count) \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex % _onceSendNum == \cf7 0\cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 sendFiles:filesArray];\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .userIds)\{\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex = \cf7 0\cf4 ;\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendGift\cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 showDisableSay])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 sendMsgCheck])\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ JXSendRedPacketViewController * sendGiftVC = [[JXSendRedPacketViewController alloc] init];\ sendGiftVC.isRoom = \f2\b \cf8 NO \f0\b0 \cf4 ;\ sendGiftVC.toUserId = chatPerson.userId;\ sendGiftVC.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ \cf2 // [g_window addSubview:sendGiftVC.view];\cf4 \ [g_navigation pushViewController:sendGiftVC animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onTransfer\cf4 \{\ JXTransferViewController *transferVC = [JXTransferViewController alloc];\ transferVC.user = chatPerson;\ transferVC.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ transferVC = [transferVC init];\ [g_navigation pushViewController:transferVC animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendGiftToRoom\cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 showDisableSay])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 sendMsgCheck])\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .room.curCount == \cf7 1\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .isSendRedPacket = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [g_server roomGetRoom: \f2\b \cf8 self \f0\b0 \cf4 .roomId toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // \f1 \'bb\'f1\'c8\'a1\'c8\'ba\'b3\'c9\'d4\'b1\'c1\'d0\'b1\'ed \f0 \cf4 \ NSArray * memberArray = [memberData fetchAllMembers:_room.roomId];\ \ JXSendRedPacketViewController * sendGiftVC = [[JXSendRedPacketViewController alloc] init];\ sendGiftVC.isRoom = \f2\b \cf8 YES \f0\b0 \cf4 ;\ sendGiftVC.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ sendGiftVC.roomJid = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ sendGiftVC.size = memberArray.count;\ \cf2 // [g_window addSubview:sendGiftVC.view];\cf4 \ [g_navigation pushViewController:sendGiftVC animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \}\ \ \cf5 #pragma mark \f2\b \cf16 - \f4 \'d7\'aa\'d5\'cb \f2 delegate \f0\b0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 transferToUser\cf4 :(NSDictionary *)dict \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ([dict[\cf6 @"id"\cf4 ] length]>\cf7 0\cf4 ) \{\ JXMessageObject *msg=[[JXMessageObject alloc] init];\ msg.timeSend = [NSDate date];\ msg.fromUserId = MY_USER_ID;\ msg.toUserId = chatPerson.userId;\ msg.isGroup = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \ msg.content = [NSString stringWithFormat:\cf6 @"%@"\cf4 ,dict[\cf6 @"money"\cf4 ]];\ msg.type = [NSNumber numberWithInt:kWCMessageTypeTransfer];\ msg.isSend = [NSNumber numberWithInt:transfer_status_ing];\ msg.isRead = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \cf2 // msg.isUpload = [NSNumber numberWithBool:NO];\cf4 \ msg.fileName = dict[\cf6 @"remark"\cf4 ];\ msg.objectId = dict[\cf6 @"id"\cf4 ];\ msg.isReadDel = [NSNumber numberWithInt: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \ [msg insert: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ [g_xmpp sendMessage:msg roomName: \f2\b \cf8 nil \f0\b0 \cf4 ];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \}\ \cf2 // \f1 \'bb\'f1\'c8\'a1\'d3\'e0\'b6\'ee \f0 \cf4 \ [g_server getUserMoenyToView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendRedPacketDelegate\cf4 :(NSDictionary *)redpacketDict\{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ([redpacketDict[\cf6 @"id"\cf4 ] length]>\cf7 0\cf4 ) \{\ JXMessageObject *msg=[[JXMessageObject alloc] init];\ msg.timeSend = [NSDate date];\ msg.fromUserId = MY_USER_ID;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\{\ msg.toUserId = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ msg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.fromUserName = _userNickName;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.toUserId = chatPerson.userId;\ msg.isGroup = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ msg.content = redpacketDict[\cf6 @"greet"\cf4 ];\ msg.type = [NSNumber numberWithInt:kWCMessageTypeRedPacket];\ msg.isSend = [NSNumber numberWithInt:transfer_status_ing];\ msg.isRead = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.fileName = redpacketDict[\cf6 @"type"\cf4 ];\ msg.objectId = redpacketDict[\cf6 @"id"\cf4 ];\ msg.isReadDel = [NSNumber numberWithInt: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \ [msg insert: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\ \ \cf2 // if (![_orderRedPacketArray containsObject:msg]) \{\cf4 \ \cf2 // [_orderRedPacketArray addObject:msg];\cf4 \ \cf2 // \}\cf4 \ [g_xmpp sendMessage:msg roomName: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \cf2 // [msg release];\cf4 \ \}\ \cf2 // \f1 \'bb\'f1\'c8\'a1\'d3\'e0\'b6\'ee \f0 \cf4 \ [g_server getUserMoenyToView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onFile\cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 showDisableSay])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 sendMsgCheck])\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid.length > \cf7 0\cf4 ) \{\ \ \f2\b \cf8 if \f0\b0 \cf4 (!_isAdmin && ![ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.allowUploadFile boolValue]) \{\ [g_App showAlert:Localized(\cf6 @"JX_NotUploadSharedFiles"\cf4 )];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \}\ JXMyFile* vc = [[JXMyFile alloc]init];\ vc.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ vc.didSelect = \f2\b \cf8 @selector \f0\b0 \cf4 (onSelFile:);\ \cf2 // [g_window addSubview:vc.view];\cf4 \ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onDidCard\cf4 :(JXMessageObject*)msg\{\ \cf2 // [g_server getUser:msg.objectId toView:self];\cf4 \ \ JXUserInfoVC* vc = [JXUserInfoVC alloc];\ vc.userId = msg.objectId;\ vc.isJustShow = \f2\b \cf8 self \f0\b0 \cf4 .courseId.length > \cf7 0\cf4 ;\ vc = [vc init];\ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ \cf5 #pragma mark \f2\b \cf16 ------cell \f4 \'cd\'b7\'cf\'f1\'b5\'e3\'bb\'f7 \f0\b0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 chatCellHeadIMG\cf4 :(JXMessageObject *)msgCell \cf11 audioPlayChangeIndexNum\cf4 :(NSInteger)indexNum\{\ \ \cf2 //-(void)onDidHeadImage:(NSNotification*)notification\{\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (recording) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([chatPerson.userId rangeOfString:MY_USER_ID].location != NSNotFound) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \cf2 //JXMessageObject *msg = notification.object;\cf4 \ JXMessageObject *msg = msgCell;\ \ \f2\b \cf8 if \f0\b0 \cf4 ([msg.fromUserId isEqualToString:CALL_CENTER_USERID])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (! \f2\b \cf8 self \f0\b0 \cf4 .roomJid) \{\ \cf2 // \f1 \'bf\'b4\'cf\'ea\'c7\'e9 \f0 \cf4 \ \cf2 // [g_server getUser:msg.fromUserId toView:self];\cf4 \ \cf2 //JXUserDetialVc JXUserInfoVC\cf4 \ \cf2 // JXUserDetialVc* vc = [JXUserDetialVc alloc];\cf4 \ JXUserInfoVC* vc = [JXUserInfoVC alloc];\ vc.userId = msg.fromUserId;\ vc.isJustShow = \f2\b \cf8 self \f0\b0 \cf4 .courseId.length > \cf7 0\cf4 ;\ vc.fromAddType = \cf7 3\cf4 ;\ vc.chatVC2 = \f2\b \cf8 self \f0\b0 \cf4 ;\ vc = [vc init];\ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 (_isAdmin || [ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.allowSendCard boolValue]) \{\ \ NSString *s;\ \f2\b \cf8 switch \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .groupStatus intValue]) \{\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 0\cf4 :\ s = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 1\cf4 :\ s = Localized(\cf6 @"JX_OutOfTheGroup1"\cf4 );\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 2\cf4 :\ s = Localized(\cf6 @"JX_DissolutionGroup1"\cf4 );\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \ \f2\b \cf8 default \f0\b0 \cf4 :\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (s.length > \cf7 0\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ [g_server showMsg:s];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ JXUserInfoVC* vc = [JXUserInfoVC alloc];\ vc.userId = msg.fromUserId;\ vc.isJustShow = \f2\b \cf8 self \f0\b0 \cf4 .courseId.length > \cf7 0\cf4 ;\ vc.fromAddType = \cf7 3\cf4 ;\ vc.chatVC2 = \f2\b \cf8 self \f0\b0 \cf4 ;\ vc = [vc init];\ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [g_App showAlert:Localized(\cf6 @"JX_GroupNotTalk"\cf4 )];\ \}\ \}\ \ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 longGesHeadImageNotification\cf4 :(NSNotification *)notification\{\ \ \f2\b \cf8 if \f0\b0 \cf4 (!_messageText.userInteractionEnabled) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ JXMessageObject *msg = notification.object;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid) \{\ \cf2 //@ \f1 \'c8\'ba\'b3\'c9\'d4\'b1 \f0 \cf4 \ \cf2 // [self performSelector:@selector(showAtSelectMemberView) withObject:nil afterDelay:0.35];\cf4 \ \cf2 // [self showAtSelectMemberView];\cf4 \ memberData * mem = [ \f2\b \cf8 self \f0\b0 \cf4 .room getMember:msg.fromUserId];\ \f2\b \cf8 if \f0\b0 \cf4 (mem) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 atSelectMemberDelegate:mem];\ \}\ \}\ \}\ \ \cf2 // \f1 \'d6\'d8\'d0\'c2\'b7\'a2\'cb\'cd\'d7\'aa\'d5\'cb\'cf\'fb\'cf\'a2 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onResend\cf4 :(JXMessageObject *)msg \{\ JXMessageObject *msg1 = [[JXMessageObject alloc]init];\ msg1 = [msg copy];\ msg1.messageId = \f2\b \cf8 nil \f0\b0 \cf4 ;\ msg1.timeSend = [NSDate date];\ msg1.fromId = \f2\b \cf8 nil \f0\b0 \cf4 ;\ msg1.isGroup = \f2\b \cf8 NO \f0\b0 \cf4 ;\ msg1.isSend = [NSNumber numberWithInt:transfer_status_ing];\ msg1.isRead = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg1.isReadDel = [NSNumber numberWithInt: \f2\b \cf8 NO \f0\b0 \cf4 ];\ [msg1 insert: \f2\b \cf8 nil \f0\b0 \cf4 ];\ [g_xmpp sendMessage:msg1 roomName: \f2\b \cf8 nil \f0\b0 \cf4 ];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg1];\ \}\ \ \cf5 #pragma mark \f2\b \cf16 ------ \f4 \'d7\'aa\'d5\'cb\'b5\'e3\'bb\'f7 \f0\b0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onDidTransfer\cf4 :(NSNotification*)notification \{\ \f2\b \cf8 if \f0\b0 \cf4 (recording) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ JXMessageObject *msg = notification.object;\ JXTransferDeatilVC *detailVC = [JXTransferDeatilVC alloc];\ detailVC.msg = msg;\ detailVC.onResend = \f2\b \cf8 @selector \f0\b0 \cf4 (onResend:);\ detailVC.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ detailVC = [detailVC init];\ [g_navigation pushViewController:detailVC animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ \cf5 #pragma mark \f2\b \cf16 ------ \f4 \'ba\'ec\'b0\'fc\'b5\'e3\'bb\'f7 \f0\b0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onDidRedPacket\cf4 :(NSNotification*)notification\{\ \f2\b \cf8 if \f0\b0 \cf4 (recording) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid) \{\ NSString *s;\ \cf2 // \f1 \'d1\'e9\'d6\'a4\'c8\'ba\'d7\'e9\'ca\'c7\'b7\'f1\'d3\'d0\'d0\'a7 \f0 \cf4 \ \f2\b \cf8 switch \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .groupStatus intValue]) \{\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 0\cf4 :\ s = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 1\cf4 :\ s = Localized(\cf6 @"JX_OutOfTheGroup1"\cf4 );\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 2\cf4 :\ s = Localized(\cf6 @"JX_DissolutionGroup1"\cf4 );\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \ \f2\b \cf8 default \f0\b0 \cf4 :\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (s.length > \cf7 0\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ [g_server showMsg:s];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \}\ \ memberData *data = [ \f2\b \cf8 self \f0\b0 \cf4 .room getMember:g_myself.userId];\ \f2\b \cf8 if \f0\b0 \cf4 ([data.role integerValue] == \cf7 4\cf4 ) \{\ [JXMyTools showTipView:\cf6 @" \f1 \'d2\'fe\'c9\'ed\'c8\'cb\'b2\'bb\'c4\'dc\'c1\'ec\'c8\'a1\'ba\'ec\'b0\'fc \f0 "\cf4 ];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ JXMessageObject *msg = notification.object;\ \ \f2\b \cf8 if \f0\b0 \cf4 (([msg.fileName isEqualToString:\cf6 @"3"\cf4 ] && [msg.fileSize intValue] != \cf7 2\cf4 )) \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomId.length > \cf7 0\cf4 ) \{\ \ _messageText.text = msg.content;\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 (![msg.fromUserId isEqualToString:MY_USER_ID]) \{\ \ _messageText.text = msg.content;\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \}\ \}\ [_wait start];\ [g_server getRedPacket:msg.objectId toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \ \cf2 // if (([msg.fileName isEqualToString:@"3"] && [msg.fileSize intValue] != 2) && ![msg.fromUserId isEqualToString:MY_USER_ID]) \{\cf4 \ \cf2 // _messageText.text = msg.content;\cf4 \ \cf2 // return;\cf4 \ \cf2 // \}\cf4 \ \cf2 // [_wait start];\cf4 \ \cf2 // [g_server getRedPacket:msg.objectId toView:self];\cf4 \ \cf12 /// \f3 \cf2 / [g_server openRedPacket:msg.objectId toView:self]; \f0 \cf4 \ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 shakeToShow\cf4 :(UIView*)aView\{\ CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:\cf6 @"transform"\cf4 ];\ animation.duration = \cf7 0.5\cf4 ;\ \ NSMutableArray *values = [NSMutableArray array];\ [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(\cf7 0.1\cf4 , \cf7 0.1\cf4 , \cf7 1.0\cf4 )]];\ [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(\cf7 1.2\cf4 , \cf7 1.2\cf4 , \cf7 1.0\cf4 )]];\ [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(\cf7 0.9\cf4 , \cf7 0.9\cf4 , \cf7 1.0\cf4 )]];\ [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(\cf7 1.0\cf4 , \cf7 1.0\cf4 , \cf7 1.0\cf4 )]];\ animation.values = values;\ [aView.layer addAnimation:animation forKey: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 showRedPacket\cf4 :(NSDictionary *)dict \{\ [_wait stop];\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ NSString *userName = [NSString stringWithFormat:\cf6 @"%@"\cf4 ,[(NSDictionary *)[dict objectForKey:\cf6 @"packet"\cf4 ] objectForKey:\cf6 @"userName"\cf4 ]];\ NSString *greetings = [NSString stringWithFormat:\cf6 @"%@"\cf4 ,[(NSDictionary *)[dict objectForKey:\cf6 @"packet"\cf4 ] objectForKey:\cf6 @"greetings"\cf4 ]];\ NSString *userId = [NSString stringWithFormat:\cf6 @"%@"\cf4 ,[(NSDictionary *)[dict objectForKey:\cf6 @"packet"\cf4 ] objectForKey:\cf6 @"userId"\cf4 ]];\ \ \f2\b \cf8 self \f0\b0 \cf4 .redPacketDict = dict;\ \ \ \f2\b \cf8 self \f0\b0 \cf4 .redBaseView = [[UIView alloc] initWithFrame: \f2\b \cf8 self \f0\b0 \cf4 .view.bounds];\ \f2\b \cf8 self \f0\b0 \cf4 .redBaseView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:\cf7 .5f\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 .view addSubview: \f2\b \cf8 self \f0\b0 \cf4 .redBaseView];\ \ UIImage *redImage = [UIImage imageNamed:\cf6 @"red_packet_bg"\cf4 ];\ \ CGFloat h = JX_SCREEN_HEIGHT - JX_SCREEN_TOP - JX_SCREEN_BOTTOM - \cf7 30\cf4 -\cf7 50\cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .redBackV = [[UIImageView alloc] initWithFrame:CGRectMake(\cf7 20\cf4 , \cf7 30\cf4 +JX_SCREEN_TOP, JX_SCREEN_WIDTH-\cf7 40\cf4 , h)];\ \f2\b \cf8 self \f0\b0 \cf4 .redBackV.userInteractionEnabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .redBackV.image = redImage;\ [ \f2\b \cf8 self \f0\b0 \cf4 .redBaseView addSubview: \f2\b \cf8 self \f0\b0 \cf4 .redBackV];\ \cf2 // \f1 \'cc\'ed\'bc\'d3\'b8\'f6\'b6\'af\'bb\'ad \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 shakeToShow: \f2\b \cf8 self \f0\b0 \cf4 .redBackV];\ \ CGSize size = [[NSString stringWithFormat:\cf6 @"%@%@"\cf4 ,userName,Localized(\cf6 @"JX_FromRedPacket"\cf4 )] sizeWithAttributes:\cf7 @\{\cf4 NSFontAttributeName:SYSFONT(\cf7 18\cf4 )\cf7 \}\cf4 ];\ UIImageView *icon = [[UIImageView alloc] initWithFrame:CGRectMake((JX_SCREEN_WIDTH-\cf7 40\cf4 - size.width-\cf7 30\cf4 -\cf7 5\cf4 )/\cf7 2\cf4 , \cf7 100\cf4 , \cf7 30\cf4 , \cf7 30\cf4 )];\ icon.layer.masksToBounds = \f2\b \cf8 YES \f0\b0 \cf4 ;\ icon.layer.cornerRadius = icon.frame.size.width/\cf7 2\cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 .redBackV addSubview:icon];\ [g_server getHeadImageSmall:userId userName:userName imageView:icon];\ \ \ UILabel *name = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(icon.frame)+\cf7 5\cf4 , CGRectGetMinY(icon.frame)+(\cf7 30\cf4 -size.height)/\cf7 2\cf4 , size.width, size.height)];\ name.font = SYSFONT(\cf7 18\cf4 );\ name.text = [NSString stringWithFormat:\cf6 @"%@%@"\cf4 ,userName,Localized(\cf6 @"JX_FromRedPacket"\cf4 )];\ name.textColor = HEXCOLOR(\cf7 0xFEDCA2\cf4 );\ [ \f2\b \cf8 self \f0\b0 \cf4 .redBackV addSubview:name];\ \ UILabel *tint = [[UILabel alloc] initWithFrame:CGRectMake(\cf7 20\cf4 , CGRectGetMaxY(icon.frame)+\cf7 20\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .redBackV.frame.size.width-\cf7 40\cf4 , \cf7 28\cf4 )];\ tint.text = greetings;\ tint.font = SYSFONT(\cf7 25\cf4 );\ tint.textAlignment = NSTextAlignmentCenter;\ tint.textColor = HEXCOLOR(\cf7 0xFEDCA2\cf4 );\ [ \f2\b \cf8 self \f0\b0 \cf4 .redBackV addSubview:tint];\ _tintLab = tint;\ \ CGFloat b = (h / JX_SCREEN_HEIGHT) * (h-\cf7 88\cf4 );\ \f2\b \cf8 self \f0\b0 \cf4 .openImgV = [[UIImageView alloc] initWithFrame:CGRectMake((JX_SCREEN_WIDTH-\cf7 40\cf4 -\cf7 100\cf4 )/\cf7 2\cf4 , b, \cf7 100\cf4 , \cf7 100\cf4 )];\ \f2\b \cf8 self \f0\b0 \cf4 .openImgV.userInteractionEnabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .openImgV.image = [UIImage imageNamed:\cf6 @"icon_open_red_packet1"\cf4 ];\ [ \f2\b \cf8 self \f0\b0 \cf4 .redBackV addSubview: \f2\b \cf8 self \f0\b0 \cf4 .openImgV];\ UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget: \f2\b \cf8 self \f0\b0 \cf4 action: \f2\b \cf8 @selector \f0\b0 \cf4 (openReadPacket)];\ [ \f2\b \cf8 self \f0\b0 \cf4 .openImgV addGestureRecognizer:tap];\ \ UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(( \f2\b \cf8 self \f0\b0 \cf4 .redBackV.frame.size.width-\cf7 140\cf4 )/\cf7 2\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .redBackV.frame.size.height-\cf7 18\cf4 -\cf7 40\cf4 , \cf7 140\cf4 , \cf7 18\cf4 )];\ label.textAlignment = NSTextAlignmentCenter;\ label.userInteractionEnabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ label.textColor = HEXCOLOR(\cf7 0xFEDCA2\cf4 );\ label.font = SYSFONT(\cf7 15\cf4 );\ label.text = Localized(\cf6 @"JX_CheckTheClaimDetails>"\cf4 );\ label.hidden = [userId intValue] != [MY_USER_ID intValue];\ [ \f2\b \cf8 self \f0\b0 \cf4 .redBackV addSubview:label];\ _seeLab = label;\ \ UITapGestureRecognizer *tap1 = [[UITapGestureRecognizer alloc] initWithTarget: \f2\b \cf8 self \f0\b0 \cf4 action: \f2\b \cf8 @selector \f0\b0 \cf4 (CheckTheDetails)];\ [label addGestureRecognizer:tap1];\ \ UIView *canView = [[UIView alloc] initWithFrame:CGRectMake((JX_SCREEN_WIDTH-\cf7 40\cf4 )/\cf7 2\cf4 , (JX_SCREEN_HEIGHT-CGRectGetMaxY( \f2\b \cf8 self \f0\b0 \cf4 .redBackV.frame)-\cf7 40\cf4 )/\cf7 2\cf4 +CGRectGetMaxY( \f2\b \cf8 self \f0\b0 \cf4 .redBackV.frame)-\cf7 10\cf4 , \cf7 40\cf4 , \cf7 40\cf4 )];\ canView.backgroundColor = [UIColor clearColor];\ canView.layer.masksToBounds = \f2\b \cf8 YES \f0\b0 \cf4 ;\ canView.layer.cornerRadius = canView.frame.size.width/\cf7 2\cf4 ;\ canView.layer.borderWidth = \cf7 2.f\cf4 ;\ canView.layer.borderColor = HEXCOLOR(\cf7 0xE8C66A\cf4 ).CGColor;\ [ \f2\b \cf8 self \f0\b0 \cf4 .redBaseView addSubview:canView];\ UITapGestureRecognizer *tapC = [[UITapGestureRecognizer alloc] initWithTarget: \f2\b \cf8 self \f0\b0 \cf4 action: \f2\b \cf8 @selector \f0\b0 \cf4 (cancelOpenRedPacket)];\ [canView addGestureRecognizer:tapC];\ \ UIImageView *cancelImgV = [[UIImageView alloc] initWithFrame:CGRectMake(\cf7 10\cf4 , \cf7 10\cf4 , \cf7 20\cf4 , \cf7 20\cf4 )];\ cancelImgV.image = [UIImage imageNamed:\cf6 @"icon_red_packet_close"\cf4 ];\ cancelImgV.userInteractionEnabled = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [canView addSubview:cancelImgV];\ \ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 CheckTheDetails\cf4 \{\ [_redBaseView removeFromSuperview];\ \ JXredPacketDetailVC * redPacketDetailVC = [[JXredPacketDetailVC alloc]init];\ redPacketDetailVC.dataDict = [[NSDictionary alloc]initWithDictionary: \f2\b \cf8 self \f0\b0 \cf4 .redPacketDict];\ redPacketDetailVC.isGroup = \f2\b \cf8 self \f0\b0 \cf4 .room.roomId.length > \cf7 0\cf4 ;\ [g_navigation pushViewController:redPacketDetailVC animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 cancelOpenRedPacket\cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 .redBaseView removeFromSuperview];\ \}\ \ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 openReadPacket\cf4 \{\ NSMutableArray *imagesArray = [NSMutableArray array];\ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i = \cf7 1\cf4 ; i < \cf7 12\cf4 ; i++) \{\ NSString *imageName = [NSString stringWithFormat:\cf6 @"icon_open_red_packet%d"\cf4 , i];\ UIImage *image = [UIImage imageNamed:imageName];\ [imagesArray addObject:image];\ \}\ _openImgV.animationImages = imagesArray;\ _openImgV.animationDuration = \cf7 0.7f\cf4 ;\ _openImgV.animationRepeatCount = \cf7 0\cf4 ;\ [_openImgV startAnimating];\ \ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(\cf7 .6f\cf4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^\{\ [_openImgV stopAnimating];\ \cf2 // [self cancelOpenRedPacket];\cf4 \ [g_server openRedPacket: \f2\b \cf8 self \f0\b0 \cf4 .redPacketDict[\cf6 @"packet"\cf4 ][\cf6 @"id"\cf4 ] toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \});\ \}\ \ \cf5 #pragma mark \f2\b \cf16 ------- \f4 \'d5\'d5\'c6\'ac\'b2\'e9\'bf\'b4 \f0\b0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onDidImage\cf4 :(NSNotification*)notification\{\ \f2\b \cf8 if \f0\b0 \cf4 (recording) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 self \f0\b0 \cf4 .indexNum = [notification.object intValue];\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ JXMessageObject *msg = [_array objectAtIndex:[notification.object intValue]];\ \cf2 // \f1 \'cd\'bc\'c6\'ac\'c2\'b7\'be\'b6\'ca\'fd\'d7\'e9 \f0 \cf4 \ NSMutableArray *imagePathArr = [[NSMutableArray alloc]init];\ NSMutableArray *msgArray = [NSMutableArray array];\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.isReadDel boolValue] || [msg.content rangeOfString:\cf6 @".gif"\cf4 ].location != NSNotFound) \{\cf2 // \f1 \'ca\'c7\'d4\'c4\'ba\'f3\'bc\'b4\'b7\'d9 \f0 gif \f1 \'cd\'bc\'c6\'ac \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (msg.content) \{\ [msgArray addObject:msg];\ [imagePathArr addObject:msg.content];\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // \f1 \'bb\'f1\'c8\'a1\'cb\'f9\'d3\'d0\'c1\'c4\'cc\'ec\'bc\'c7\'c2\'bc \f0 \cf4 \ NSString* s;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\ s = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ \f2\b \cf8 else \f0\b0 \cf4 \ s = chatPerson.userId;\ \f2\b \cf8 if \f0\b0 \cf4 (msg.isMySend) \{\ _allChatImageArr = [msg fetchImageMessageListWithUser:s];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ _allChatImageArr = [msg fetchImageMessageListWithUser:s];\ \}\ \ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i = \cf7 0\cf4 ; i < [_allChatImageArr count]; i++) \{\ JXMessageObject * msgP = [_allChatImageArr objectAtIndex:i];\ \f2\b \cf8 if \f0\b0 \cf4 (![msgP.isReadDel boolValue] && [msgP.content rangeOfString:\cf6 @".gif"\cf4 ].location == NSNotFound) \{\cf2 // \f1 \'b5\'c3\'b5\'bd\'b5\'c4\'cf\'fb\'cf\'a2\'d6\'d0\'ba\'ac\'d3\'d0\'d4\'c4\'ba\'f3\'bc\'b4\'b7\'d9 \f0 \f1 \'bb\'f2 \f0 gif \f1 \'cd\'bc\'c6\'ac \f0 \f1 \'b5\'c4\'cc\'de\'b3\'fd\'b5\'f4 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (msgP.content) \{\ [msgArray addObject:msgP];\ NSString* url;\ \f2\b \cf8 if \f0\b0 \cf4 (msgP.isMySend && isFileExist(msgP.fileName))\ url = msgP.fileName;\ \f2\b \cf8 else \f0\b0 \cf4 \ url = msgP.content;\ [imagePathArr addObject:url];\ \}\ \}\ \}\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .courseId.length > \cf7 0\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 (msg.content) \{\ [msgArray addObject:msg];\ NSString* url;\ \f2\b \cf8 if \f0\b0 \cf4 (msg.isMySend && isFileExist(msg.fileName))\ url = msg.fileName;\ \f2\b \cf8 else \f0\b0 \cf4 \ url = msg.content;\ [imagePathArr addObject:url];\ \}\ \}\ NSMutableArray *array = [NSMutableArray array];\ NSMutableArray *arrayURL = [NSMutableArray array];\ \ \f2\b \cf8 if \f0\b0 \cf4 (msg.content == \f2\b \cf8 nil \f0\b0 \cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ [arrayURL addObject:msg.content];\ [array addObject:msg];\ \ \f2\b \cf8 if \f0\b0 \cf4 (array.count < \cf7 1\cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \cf2 // [ImageBrowserViewController show:self delegate:self type:PhotoBroswerVCTypeModal contentArray:array index:0 imagesBlock:^NSArray *\{\cf4 \ \cf2 // return arrayURL;\cf4 \ \cf2 // \}];\cf4 \ [ImageBrowserViewController show: \f2\b \cf8 self \f0\b0 \cf4 delegate: \f2\b \cf8 self \f0\b0 \cf4 isReadDel: \f2\b \cf8 YES \f0\b0 \cf4 type:PhotoBroswerVCTypeModal contentArray:array index:\cf7 0\cf4 imagesBlock:^NSArray *\{\ \f2\b \cf8 return \f0\b0 \cf4 arrayURL;\ \}];\ \cf2 // \f1 \'b2\'e9\'b5\'bd\'b5\'b1\'c7\'b0\'b5\'e3\'bb\'f7\'b5\'c4\'cd\'bc\'c6\'ac\'b5\'c4\'ce\'bb\'d6\'c3 \f0 \cf4 \ \cf2 // for (int i = 0; i < [msgArray count]; i++) \{\cf4 \ \cf2 // JXMessageObject * msgObj = [msgArray objectAtIndex:i];\cf4 \ \cf2 // if ([msg.messageId isEqualToString:msgObj.messageId]) \{\cf4 \ \cf2 //\cf4 \ \cf2 // [ImageBrowserViewController show:self delegate:self isReadDel:[msgObj.isReadDel boolValue] type:PhotoBroswerVCTypeModal contentArray:msgArray index:i imagesBlock:^NSArray *\{\cf4 \ \cf2 // return imagePathArr;\cf4 \ \cf2 // \}];\cf4 \ \cf2 //\cf4 \ \cf2 // \}\cf4 \ \cf2 // \}\cf4 \ imagePathArr = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 imageBrowserVCQRCodeAction\cf4 :(NSString *)stringValue \{\ \ NSRange range = [stringValue rangeOfString:\cf6 @"shikuId"\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (range.location != NSNotFound) \{\ \ NSString * idStr = [stringValue substringFromIndex:range.location + range.length + \cf7 1\cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 ([stringValue rangeOfString:\cf6 @"=user"\cf4 ].location != NSNotFound) \{\ \cf2 // [g_server getUser:idStr toView:self];\cf4 \ [g_server userGetByAccountWithAccount:idStr toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ([stringValue rangeOfString:\cf6 @"=group"\cf4 ].location != NSNotFound) \{\ \ [g_server getRoom:idStr toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \cf2 // JXRoomMemberVC* vc = [JXRoomMemberVC alloc];\cf4 \ \cf2 // vc.roomId = idStr;\cf4 \ \cf2 // vc = [vc init];\cf4 \ \cf2 // [g_navigation pushViewController:vc animated:YES];\cf4 \ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ([stringValue rangeOfString:\cf6 @"=open"\cf4 ].location != NSNotFound) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([idStr rangeOfString:\cf6 @"http://"\cf4 ].location != NSNotFound && [idStr rangeOfString:\cf6 @"https://"\cf4 ].location != NSNotFound) \{\ webpageVC * webVC = [webpageVC alloc];\ webVC.url= idStr;\ webVC.isSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ webVC = [webVC init];\ [g_navigation.navigationView addSubview:webVC.view];\ \cf2 // [g_navigation pushViewController:webVC animated:YES];\cf4 \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [g_App showAlert:Localized(\cf6 @"JX_TheUrlNotOpen"\cf4 )];\ \}\ \}\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ NSRange idRange = [stringValue rangeOfString:\cf6 @"userId"\cf4 ];\ NSRange nameRange = [stringValue rangeOfString:\cf6 @"userName"\cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 ([stringValue hasPrefix:\cf6 @"http://"\cf4 ] || [stringValue hasPrefix:\cf6 @"https://"\cf4 ]) \{\ webpageVC * webVC = [webpageVC alloc];\ webVC.url= stringValue;\ webVC.isSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ webVC = [webVC init];\ [g_navigation.navigationView addSubview:webVC.view];\ \cf2 // [g_navigation pushViewController:webVC animated:YES];\cf4 \ \ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (stringValue.length == \cf7 20\cf4 && [ \f2\b \cf8 self \f0\b0 \cf4 isNumber:stringValue])\{\ \cf2 // \f1 \'b6\'d4\'c3\'e6\'b8\'b6\'bf\'ee\'a3\'ac \f0 \f1 \'bc\'ba\'b7\'bd\'ca\'d5\'bf\'ee \f0 \cf4 \ JXInputMoneyVC *inputVC = [[JXInputMoneyVC alloc] init];\ inputVC.type = JXInputMoneyTypeCollection;\ inputVC.paymentCode = stringValue;\ [g_navigation pushViewController:inputVC animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (idRange.location != NSNotFound && nameRange.location != NSNotFound) \{\ \cf2 // \f1 \'bc\'ba\'b7\'bd\'b8\'b6\'bf\'ee\'a3\'ac \f0 \f1 \'b6\'d4\'c3\'e6\'ca\'d5\'bf\'ee \f0 \cf4 \ SBJsonParser * resultParser = [[SBJsonParser alloc] init] ;\ NSDictionary *dict = [resultParser objectWithString:stringValue];\ JXInputMoneyVC *inputVC = [[JXInputMoneyVC alloc] init];\ inputVC.type = JXInputMoneyTypePayment;\ inputVC.userId = [dict objectForKey:\cf6 @"userId"\cf4 ];\ inputVC.userName = [dict objectForKey:\cf6 @"userName"\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 ([dict objectForKey:\cf6 @"money"\cf4 ]) \{\ inputVC.money = [dict objectForKey:\cf6 @"money"\cf4 ];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([dict objectForKey:\cf6 @"description"\cf4 ]) \{\ inputVC.desStr = [dict objectForKey:\cf6 @"description"\cf4 ];\ \}\ [g_navigation pushViewController:inputVC animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \}\ \}\ \ - ( \f2\b \cf8 BOOL \f0\b0 \cf4 )\cf11 isNumber\cf4 :(NSString *)strValue\ \{\ \f2\b \cf8 if \f0\b0 \cf4 (strValue == \f2\b \cf8 nil \f0\b0 \cf4 || [strValue length] <= \cf7 0\cf4 )\ \{\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:\cf6 @"0123456789"\cf4 ] invertedSet];\ NSString *filtered = [[strValue componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:\cf6 @""\cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 (![strValue isEqualToString:filtered])\ \{\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 dismissImageBrowserVC\cf4 \{\ JXImageCell *cell = [_table cellForRowAtIndexPath:[NSIndexPath indexPathForRow: \f2\b \cf8 self \f0\b0 \cf4 .indexNum inSection:\cf7 0\cf4 ]];\ \f2\b \cf8 if \f0\b0 \cf4 (!cell.msg.isMySend) \{\ [cell deleteReadMsg];\ \}\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 readTypeMsgCome\cf4 :(NSNotification*)notification\{\cf2 // \f1 \'b7\'a2\'cb\'cd\'b7\'bd\'ca\'d5\'b5\'bd\'d2\'d1\'b6\'c1\'c0\'e0\'d0\'cd\'a3\'ac\'b8\'c4\'b1\'e4\'cf\'fb\'cf\'a2\'cd\'bc\'c6\'ac\'ce\'aa\'d2\'d1\'b6\'c1 \f0 \cf4 \ \ \cf2 // \f1 \'b8\'fc\'d0\'c2 \f0 title \f1 \'d4\'da\'cf\'df\'d7\'b4\'cc\'ac \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (! \f2\b \cf8 self \f0\b0 \cf4 .roomJid && ! \f2\b \cf8 self \f0\b0 \cf4 .onlinestate) \{\ \f2\b \cf8 self \f0\b0 \cf4 .onlinestate = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 self \f0\b0 \cf4 .title = Localized(\cf6 @"JX_GroupHair"\cf4 );\ [ \f2\b \cf8 self \f0\b0 \cf4 setAudioIconFrame];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .courseId.length > \cf7 0\cf4 ) \{\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ([chatPerson.userId intValue]<\cf7 10100\cf4 && [chatPerson.userId intValue]>=\cf7 10000\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .title = chatPerson.userNickname;\ [ \f2\b \cf8 self \f0\b0 \cf4 setAudioIconFrame];\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // NSString *str = self.onlinestate ? Localized(@"JX_OnLine") : Localized(@"JX_OffLine");\cf4 \ \cf2 // self.title = [NSString stringWithFormat:@"%@(%@)",chatPerson.remarkName.length > 0 ? chatPerson.remarkName : chatPerson.userNickname,str];\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 setChatTitle:chatPerson.remarkName.length > \cf7 0\cf4 ? chatPerson.remarkName : chatPerson.userNickname];\ \ \}\ \}\ \ \}\ \}\ \ JXMessageObject * msg = (JXMessageObject *)notification.object;\ \f2\b \cf8 if \f0\b0 \cf4 (msg == \f2\b \cf8 nil \f0\b0 \cf4 )\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \ NSString * msgId = msg.content;\ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i = \cf7 0\cf4 ; i < [_array count]; i ++) \{\ JXMessageObject * p = [_array objectAtIndex:i];\ \f2\b \cf8 if \f0\b0 \cf4 ([p.messageId isEqualToString:msgId]) \{\ \f2\b \cf8 if \f0\b0 \cf4 (p.isMySend)\{\ p.isRead = [NSNumber numberWithInt:\cf7 1\cf4 ];\ p.isSend = [NSNumber numberWithInt:\cf7 1\cf4 ];\ \}\ p.readPersons = [NSNumber numberWithInt:[p.readPersons intValue] + \cf7 1\cf4 ];\ JXBaseChatCell* cell = [ \f2\b \cf8 self \f0\b0 \cf4 getCell:i];\ \f2\b \cf8 if \f0\b0 \cf4 (cell)\{\ [cell drawIsSend];\ \cf2 // [cell drawIsRead];\cf4 \ \}\ \ \ \f2\b \cf8 if \f0\b0 \cf4 ([p.isReadDel boolValue]) \{\ \ \f2\b \cf8 if \f0\b0 \cf4 (!cell) \{\ \ [ \f2\b \cf8 self \f0\b0 \cf4 readDeleWithUser:p];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 switch \f0\b0 \cf4 ([p.type intValue]) \{\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeImage:\{\ JXImageCell *imageCell = (JXImageCell *)cell;\ imageCell.isRemove = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [imageCell timeGo:p];\ \cf2 // [g_notify postNotificationName:kImageDidTouchEndNotification object:p];\cf4 \ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeCustomFace:\ \{\ JXFaceCustomCell *imageCell = (JXFaceCustomCell *)cell;\ imageCell.isRemove = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [imageCell timeGo:p];\ \cf2 // [g_notify postNotificationName:kImageDidTouchEndNotification object:p];\cf4 \ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeEmoji:\ \{\ JXEmojiCell *imageCell = (JXEmojiCell *)cell;\ imageCell.isRemove = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [imageCell timeGo:p];\ \cf2 // [g_notify postNotificationName:kImageDidTouchEndNotification object:p];\cf4 \ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeVoice:\{\ JXAudioCell *audioCell = (JXAudioCell *)cell;\ [audioCell timeGo:p.fileName];\ \}\ \ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeVideo:\{\ JXVideoCell *videoCell = (JXVideoCell *)cell;\ [videoCell timeGo:p.fileName];\ \}\ \ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeText:\{\ JXMessageCell *messageCell = (JXMessageCell *)cell;\ [messageCell deleteMsg:messageCell.msg];\ \cf2 // [self readDeleWithUser:messageCell.msg];\cf4 \ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeReply:\{\ JXReplyCell *replyCell = (JXReplyCell *)cell;\ [replyCell deleteMsg:replyCell.msg];\ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 default \f0\b0 \cf4 :\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \}\ \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 readTypeMsgReceipt\cf4 :(NSNotification*)notification\{\cf2 // \f1 \'bd\'d3\'ca\'d5\'b7\'bd\'ca\'d5\'b5\'bd\'d2\'d1\'b6\'c1\'cf\'fb\'cf\'a2\'b5\'c4\'bb\'d8\'d6\'b4\'a3\'ac\'b8\'c4\'b1\'e4\'b1\'ea\'d6\'be\'b1\'dc\'c3\'e2\'d6\'d8\'b8\'b4\'b7\'a2 \f0 \cf4 \ JXMessageObject * msg = (JXMessageObject *)notification.object;\ \f2\b \cf8 if \f0\b0 \cf4 (msg == \f2\b \cf8 nil \f0\b0 \cf4 )\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i = \cf7 0\cf4 ; i < [_array count]; i ++) \{\ JXMessageObject * p = [_array objectAtIndex:i];\ \f2\b \cf8 if \f0\b0 \cf4 ([p.messageId isEqualToString:msg.content])\{\ \f2\b \cf8 if \f0\b0 \cf4 (msg.isMySend)\{\ p.isRead = [NSNumber numberWithInt:\cf7 1\cf4 ];\ p.isSend = [NSNumber numberWithInt:\cf7 1\cf4 ];\ \}\ p.readPersons = [NSNumber numberWithInt:[p.readPersons intValue] + \cf7 1\cf4 ];\ JXBaseChatCell* cell = [ \f2\b \cf8 self \f0\b0 \cf4 getCell:i];\ \f2\b \cf8 if \f0\b0 \cf4 (cell)\{\ [cell drawIsSend];\ [cell drawIsRead];\ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \}\ \ \cf2 // \f1 \'bb\'f1\'c8\'a1\'bf\'da\'c1\'ee\'ba\'ec\'b0\'fc\'c1\'c4\'cc\'ec\'bc\'c7\'c2\'bc \f0 \cf4 \ -(NSMutableArray*)\cf11 fetchRedPacketListWithType\cf4 :( \f2\b \cf8 int \f0\b0 \cf4 )rpType\ \{\ NSString* myUserId = MY_USER_ID;\ \f2\b \cf8 if \f0\b0 \cf4 ([myUserId length]<=\cf7 0\cf4 )\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 nil \f0\b0 \cf4 ;\ FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:myUserId];\ \ NSMutableArray *messageList=[[NSMutableArray alloc]init];\ NSString *s;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\ s = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ \f2\b \cf8 else \f0\b0 \cf4 \ s = chatPerson.userId;\ \ NSString *queryString=[NSString stringWithFormat:\cf6 @"select * from msg_%@ where type=28 and fileName=3"\cf4 ,s];\ \ FMResultSet *rs=[db executeQuery:queryString];\ \f2\b \cf8 while \f0\b0 \cf4 ([rs next]) \{\ JXMessageObject *p=[[JXMessageObject alloc]init];\ [p fromRs:rs];\ [messageList addObject:p];\ \cf2 // [p release];\cf4 \ \}\ [rs close];\ db = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \ \f2\b \cf8 if \f0\b0 \cf4 ([messageList count]==\cf7 0\cf4 )\{\ \cf2 // [messageList release];\cf4 \ messageList = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 return \f0\b0 \cf4 messageList;\ \}\ \ \cf2 // \f1 \'b8\'c4\'b1\'e4\'ba\'ec\'b0\'fc\'b6\'d4\'d3\'a6\'cf\'fb\'cf\'a2\'b5\'c4\'b2\'bb\'bf\'c9\'bb\'f1\'c8\'a1 \f0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 changeMessageRedPacketStatus\cf4 :(NSString*)redPacketId\{\ NSString* myUserId = MY_USER_ID;\ \f2\b \cf8 if \f0\b0 \cf4 ([myUserId length]<=\cf7 0\cf4 )\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:myUserId];\ \ NSString * sufStr = \f2\b \cf8 self \f0\b0 \cf4 .roomJid ? \f2\b \cf8 self \f0\b0 \cf4 .roomJid : \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.userId;\ \ NSString * sql = [NSString stringWithFormat:\cf6 @"update msg_%@ set fileSize=2 where objectId=?"\cf4 ,sufStr];\ \ [db executeUpdate:sql,redPacketId];\ \ db = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \cf2 // \f1 \'b8\'c4\'b1\'e4\'ba\'ec\'b0\'fc\'cf\'fb\'cf\'a2\'b2\'bb\'bf\'c9\'bb\'f1\'c8\'a1 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 changeMessageArrFileSize\cf4 :(NSString *)redPackerId\{\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = _array.count - \cf7 1\cf4 ; i >= \cf7 0\cf4 ; i --) \{\ JXMessageObject *msg = _array[i];\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.objectId isEqualToString:redPackerId]) \{\ msg.fileSize = [NSNumber numberWithInt:\cf7 2\cf4 ];\ JXBaseChatCell *cell = [ \f2\b \cf8 self \f0\b0 \cf4 .tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:\cf7 0\cf4 ]];\ \f2\b \cf8 if \f0\b0 \cf4 (cell) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 .tableView reloadRow:( \f2\b \cf8 int \f0\b0 \cf4 )i section:\cf7 0\cf4 ];\ \}\ \}\ \}\ \f2\b \cf8 for \f0\b0 \cf4 (JXMessageObject * msg \f2\b \cf8 in \f0\b0 \cf4 _orderRedPacketArray) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.objectId isEqualToString:redPackerId]) \{\ msg.fileSize = [NSNumber numberWithInt:\cf7 2\cf4 ];\ \}\ \}\ \}\ \cf2 // \f1 \'b8\'fc\'d0\'c2\'d7\'aa\'d5\'cb\'d2\'d1\'c1\'ec\'c8\'a1\'d7\'b4\'cc\'ac \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 updateTransferMsgFileSize\cf4 :(NSNotification *)noti \{\ NSString *str = [NSString stringWithFormat:\cf6 @"%@"\cf4 ,noti.object];\ \ JXMessageObject *msg = [[JXMessageObject alloc] init];\ msg.objectId = str;\ msg.toUserId = \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.userId;\ NSMutableArray *msgs = [msg getMsgWithObjectId:str];\ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i = \cf7 0\cf4 ; i < msgs.count; i++) \{\ JXMessageObject *msg1 = msgs[i];\ msg1.fileSize = [NSNumber numberWithInt:\cf7 2\cf4 ];\ [msg1 updateFileSize];\ \}\ \ [ \f2\b \cf8 self \f0\b0 \cf4 changeMessageArrFileSize:str];\ \}\ \ -(JXBaseChatCell*)\cf11 getCell\cf4 :( \f2\b \cf8 long \f0\b0 \cf4 )index\{\ \f2\b \cf8 if \f0\b0 \cf4 (index<\cf7 0\cf4 && index >= [_array count])\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 nil \f0\b0 \cf4 ;\ NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:\cf7 0\cf4 ];\ \f2\b \cf8 return \f0\b0 \cf4 (JXBaseChatCell*)[_table cellForRowAtIndexPath:indexPath];\ \}\ \cf5 #pragma mark \f2\b \cf16 ------ \f4 \'d7\'d4\'b6\'af\'cf\'f2\'cf\'c2\'b2\'a5\'b7\'c5\'d3\'ef\'d2\'f4 \f0\b0 \cf4 \ -( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 audioPlayEnd\cf4 :(NSNotification*)notification\{\ JXAudioCell* cell = (JXAudioCell*)notification.object;\ JXMessageObject *msg=cell.msg;\ _lastIndex = cell.indexNum;\ \cf2 //msg.isReadDel = [NSNumber numberWithBool:YES];\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([msg.isReadDel boolValue]) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (_lastIndex >= _array.count)\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \ \f2\b \cf8 while \f0\b0 \cf4 (_lastIndex<_array.count) \{\ _lastIndex++;\ \f2\b \cf8 if \f0\b0 \cf4 (_lastIndex>=_array.count)\ \f2\b \cf8 break \f0\b0 \cf4 ;\ msg = [_array objectAtIndex:_lastIndex];\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeVoice && ![msg.isRead boolValue] && !msg.isMySend)\{\ JXAudioCell* nextCell = [_table cellForRowAtIndexPath:[NSIndexPath indexPathForRow:_lastIndex inSection:\cf7 0\cf4 ]];\ [nextCell.audioPlayer \f2\b \cf8 switch \f0\b0 \cf4 ];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \ msg = \f2\b \cf8 nil \f0\b0 \cf4 ;\ cell = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \ - ( \f2\b \cf8 BOOL \f0\b0 \cf4 )\cf11 canRecord\cf4 \ \{\ \f2\b \cf8 __block \f0\b0 \cf4 \f2\b \cf8 BOOL \f0\b0 \cf4 bCanRecord = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([[[UIDevice currentDevice]systemVersion]floatValue] >= \cf7 7.0\cf4 ) \{\ AVAudioSession *audioSession = [AVAudioSession sharedInstance];\ \f2\b \cf8 if \f0\b0 \cf4 ([audioSession respondsToSelector: \f2\b \cf8 @selector \f0\b0 \cf4 (requestRecordPermission:)]) \{\ [audioSession performSelector: \f2\b \cf8 @selector \f0\b0 \cf4 (requestRecordPermission:) withObject:^( \f2\b \cf8 BOOL \f0\b0 \cf4 granted) \{\ \f2\b \cf8 if \f0\b0 \cf4 (granted) \{\ bCanRecord = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ bCanRecord = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \}];\ \}\ \}\ \f2\b \cf8 return \f0\b0 \cf4 bCanRecord;\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 readDeleWithUser\cf4 :(JXMessageObject *)p\{\ \f2\b \cf8 self \f0\b0 \cf4 .readDelNum ++;\ \f2\b \cf8 if \f0\b0 \cf4 ([p.fromUserId isEqualToString:MY_USER_ID]) \{\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < _array.count; i ++) \{\ JXMessageObject *msg = _array[i];\ \f2\b \cf8 if \f0\b0 \cf4 ([p.messageId isEqualToString:msg.messageId]) \{\ msg.type = [NSNumber numberWithInt:kWCMessageTypeRemind];\ msg.content = Localized(\cf6 @"JX_OtherLookedYourReadingMsg"\cf4 );\ [msg update];\ \ [_table reloadData];\ \ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 deleteMsg:p];\ \}\ \ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(\cf7 2\cf4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^\{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .readDelNum > \cf7 5\cf4 ) \{\ \f2\b \cf8 self \f0\b0 \cf4 .readDelNum = \cf7 0\cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 .tableView reloadData];\ NSLog(\cf6 @"readDelNum ----- %d"\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .readDelNum);\ \}\ \});\ \}\ \ \cf2 //#pragma mark-------- \f1 \'b5\'c7\'c2\'bc\'d7\'b4\'cc\'ac\'b8\'c4\'b1\'e4 \f0 \cf4 \ \cf2 //-(void)onLoginChanged:(NSNotification *)notifacation\{\cf4 \ \cf2 // [_wait stop];\cf4 \ \cf2 // if (_isShowLoginChange) \{\cf4 \ \cf2 // switch ([JXXMPP sharedInstance].isLogined)\{\cf4 \ \cf2 // case login_status_ing:\cf4 \ \cf2 // // \f1 \'c1\'ac\'bd\'d3\'ca\'a7\'b0\'dc \f0 \cf4 \ \cf2 // [JXMyTools showTipView:Localized(@"JX_ConnectFailed")];\cf4 \ \cf2 // break;\cf4 \ \cf2 // case login_status_no:\cf4 \ \cf2 // // \f1 \'c1\'ac\'bd\'d3\'ca\'a7\'b0\'dc \f0 \cf4 \ \cf2 // [JXMyTools showTipView:Localized(@"JX_ConnectFailed")];\cf4 \ \cf2 // break;\cf4 \ \cf2 // case login_status_yes:\cf4 \ \cf2 // // \f1 \'c1\'ac\'bd\'d3\'b3\'c9\'b9\'a6 \f0 \cf4 \ \cf2 // [JXMyTools showTipView:Localized(@"JX_ConnectSuccessfully")];\cf4 \ \cf2 // break;\cf4 \ \cf2 // \}\cf4 \ \cf2 // \}\cf4 \ \cf2 //\}\cf4 \ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onBackForRecordBtnLeft\cf4 \{\ \f2\b \cf8 self \f0\b0 \cf4 .objToMsg = \f2\b \cf8 nil \f0\b0 \cf4 ;\ [_recordBtnLeft setBackgroundImage:[UIImage imageNamed:\cf6 @"im_input_ptt_normal"\cf4 ] forState:UIControlStateNormal];\ [_recordBtnLeft setBackgroundImage:[UIImage imageNamed:\cf6 @"im_input_keyboard_normal"\cf4 ] forState:UIControlStateSelected];\ [_recordBtnLeft removeTarget: \f2\b \cf8 self \f0\b0 \cf4 action: \f2\b \cf8 @selector \f0\b0 \cf4 (onBackForRecordBtnLeft) forControlEvents:UIControlEventTouchUpInside];\ [_recordBtnLeft addTarget: \f2\b \cf8 self \f0\b0 \cf4 action: \f2\b \cf8 @selector \f0\b0 \cf4 (recordSwitch:) forControlEvents:UIControlEventTouchUpInside];\ _messageText.textColor = [UIColor blackColor];\ _messageText.text = \f2\b \cf8 nil \f0\b0 \cf4 ;\ _hisReplyMsg = \f2\b \cf8 nil \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 textViewDidChange:_messageText];\ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 getTextViewWatermark\cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 (_hisReplyMsg.length <= \cf7 0\cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ [_messageText becomeFirstResponder];\ \cf2 // \f1 \'b3\'a4\'b0\'b4\'bb\'d8\'b8\'b4 \f0 \f1 \'cf\'d4\'ca\'be\'cb\'ae\'d3\'a1 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (![ \f2\b \cf8 self \f0\b0 \cf4 changeEmjoyText:_hisReplyMsg textColor:[UIColor lightGrayColor]]) \{\ [_messageText.textStorage insertAttributedString:[[NSAttributedString alloc] initWithString:_hisReplyMsg attributes:\cf7 @\{\cf4 NSFontAttributeName:SYSFONT(\cf7 18\cf4 ),NSForegroundColorAttributeName:[UIColor lightGrayColor]\cf7 \}\cf4 ] atIndex:_messageText.selectedRange.location];\ \}\ _messageText.textColor = [UIColor lightGrayColor];\ _messageText.selectedRange = NSMakeRange(\cf7 0\cf4 , \cf7 0\cf4 );\ [ \f2\b \cf8 self \f0\b0 \cf4 setTableFooterFrame:_messageText];\ \}\ \ \cf2 // \f1 \'b3\'a4\'b0\'b4\'bb\'d8\'b8\'b4 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 chatCell\cf4 :(JXBaseChatCell *)chatCell \cf11 replyIndexNum\cf4 :( \f2\b \cf8 int \f0\b0 \cf4 )indexNum \{\ \f2\b \cf8 if \f0\b0 \cf4 (!_messageText.userInteractionEnabled) \{\ [JXMyTools showTipView:\cf6 @" \f1 \'c4\'fa\'d2\'d1\'b1\'bb\'bd\'fb\'d6\'b9\'b7\'a2\'d1\'d4 \f0 "\cf4 ];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ JXMessageObject *msg = _array[indexNum];\ \f2\b \cf8 if \f0\b0 \cf4 (_recordBtnLeft.selected) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 recordSwitch:_recordBtnLeft];\ \}\ [_messageText becomeFirstResponder];\ [_recordBtnLeft setBackgroundImage:[UIImage imageNamed:\cf6 @"chat_back_reply"\cf4 ] forState:UIControlStateNormal];\ [_recordBtnLeft removeTarget: \f2\b \cf8 self \f0\b0 \cf4 action: \f2\b \cf8 @selector \f0\b0 \cf4 (recordSwitch:) forControlEvents:UIControlEventTouchUpInside];\ [_recordBtnLeft addTarget: \f2\b \cf8 self \f0\b0 \cf4 action: \f2\b \cf8 @selector \f0\b0 \cf4 (onBackForRecordBtnLeft) forControlEvents:UIControlEventTouchUpInside];\ _hisReplyMsg = [NSString stringWithFormat:\cf6 @"%@%@:%@"\cf4 ,Localized(\cf6 @"JX_Reply"\cf4 ),msg.fromUserName,[msg getTypeName]];\ \cf2 // \f1 \'cf\'d4\'ca\'be\'cb\'ae\'d3\'a1 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 getTextViewWatermark];\ \cf2 // \f1 \'d7\'aa\'b3\'c9 \f0 json \f1 \'ca\'fd\'be\'dd \f0 \cf4 \ SBJsonWriter * OderJsonwriter = [SBJsonWriter \f2\b \cf8 new \f0\b0 \cf4 ];\ NSString * jsonString = [OderJsonwriter stringWithObject:[msg toDictionary]];\ \f2\b \cf8 self \f0\b0 \cf4 .objToMsg = jsonString;\ \}\ \ \cf2 // \f1 \'b3\'a4\'b0\'b4\'d7\'aa\'b7\'a2 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 chatCell\cf4 :(JXBaseChatCell *)chatCell \cf11 RelayIndexNum\cf4 :( \f2\b \cf8 int \f0\b0 \cf4 )indexNum \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ memberData *data = [ \f2\b \cf8 self \f0\b0 \cf4 .room getMember:g_myself.userId];\ \f2\b \cf8 if \f0\b0 \cf4 ([data.role integerValue] == \cf7 4\cf4 ) \{\ [JXMyTools showTipView:\cf6 @" \f1 \'d2\'fe\'c9\'ed\'c8\'cb\'b2\'bb\'c4\'dc\'d7\'aa\'b7\'a2\'cf\'fb\'cf\'a2 \f0 "\cf4 ];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ JXMessageObject *msg = _array[indexNum];\ JXRelayVC *vc = [[JXRelayVC alloc] init];\ vc.chatPerson = \f2\b \cf8 self \f0\b0 \cf4 .chatPerson;\ vc.roomJid = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ vc.isMoreSel = \f2\b \cf8 YES \f0\b0 \cf4 ;\ vc.chatVC2 = \f2\b \cf8 self \f0\b0 \cf4 ;\ NSMutableArray *array = [NSMutableArray arrayWithObject:msg];\ \cf2 // vc.msg = msg;\cf4 \ vc.relayMsgArray = array;\ \cf2 // [g_window addSubview:vc.view];\cf4 \ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 setRelayMsgArray\cf4 :(NSMutableArray *)relayMsgArray \{\ _relayMsgArray = relayMsgArray;\ \f2\b \cf8 self \f0\b0 \cf4 .friendStatus = friend_status_friend;\ \f2\b \cf8 if \f0\b0 \cf4 (! \f2\b \cf8 self \f0\b0 \cf4 .roomJid) \{\ \f2\b \cf8 for \f0\b0 \cf4 (JXMessageObject *msg \f2\b \cf8 in \f0\b0 \cf4 relayMsgArray) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeRedPacket) \{\ msg.type = [NSNumber numberWithInt:kWCMessageTypeText];\ msg.content = [NSString stringWithFormat:\cf6 @"[%@]"\cf4 , Localized(\cf6 @"JX_RED"\cf4 )];\ msg.chatMsgHeight = \cf6 @"0"\cf4 ;\ \ \}\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeAudioMeetingInvite || [msg.type intValue] == kWCMessageTypeVideoMeetingInvite || [msg.type intValue] == kWCMessageTypeAudioChatCancel || [msg.type intValue] == kWCMessageTypeAudioChatEnd || [msg.type intValue] == kWCMessageTypeVideoChatCancel || [msg.type intValue] == kWCMessageTypeVideoChatEnd || [msg.type intValue] == kWCMessageTypeAVBusy) \{\ \ msg.type = [NSNumber numberWithInt:kWCMessageTypeText];\ msg.content = [NSString stringWithFormat:\cf6 @"[%@]"\cf4 , Localized(\cf6 @"JX_AudioAndVideoCalls"\cf4 )];\ msg.chatMsgHeight = \cf6 @"0"\cf4 ;\ \}\ [ \f2\b \cf8 self \f0\b0 \cf4 relay:msg];\ \}\ \cf2 // [self relay];\cf4 \ \}\ \}\ \ \cf2 //- (void)setRelayMsg:(JXMessageObject *)relayMsg \{\cf4 \ \cf2 // _relayMsg = relayMsg;\cf4 \ \cf2 // self.friendStatus = friend_status_friend;\cf4 \ \cf2 // if (!self.roomJid) \{\cf4 \ \cf2 // [self relay];\cf4 \ \cf2 // \}\cf4 \ \cf2 //\}\cf4 \ \ - ( \f2\b \cf8 void \f0\b0 \cf4 ) \cf11 relay\cf4 :(\cf9 JXMessageObject\cf4 *)msg\{\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 \cf15 showDisableSay\cf4 ])\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 \cf15 sendMsgCheck\cf4 ])\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (msg.\cf15 content\cf4 .\cf14 length\cf4 > \cf7 0\cf4 ) \{\ \cf9 JXMessageObject\cf4 *msg1 = [[\cf9 JXMessageObject\cf4 \cf14 alloc\cf4 ]\cf14 init\cf4 ];\ msg1 = [msg \cf14 copy\cf4 ];\ msg1.\cf15 messageId\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ msg1.\cf15 timeSend\cf4 = [\cf10 NSDate\cf4 \cf14 date\cf4 ];\ msg1.\cf15 fromId\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ msg1.\cf15 fileSize\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ msg1.\cf15 fileName\cf4 = \f2\b \cf8 nil \f0\b0 \cf4 ;\ msg1.\cf15 fromUserId\cf4 = \cf5 MY_USER_ID\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 \cf14 length\cf4 ]>\cf7 0\cf4 )\{\ msg1.\cf15 toUserId\cf4 = \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ;\ msg1.\cf15 isGroup\cf4 = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg1.\cf15 fromUserName\cf4 = \cf15 _userNickName\cf4 ;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ msg1.\cf15 toUserId\cf4 = \cf15 chatPerson\cf4 .\cf15 userId\cf4 ;\ msg1.\cf15 isGroup\cf4 = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \cf2 // msg.content = relayMsg.content;\cf4 \ \cf2 // msg.type = relayMsg.type;\cf4 \ msg1.\cf15 isSend\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 :\cf5 transfer_status_ing\cf4 ];\ msg1.\cf15 isRead\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithBool\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg1.\cf15 isReadDel\cf4 = [\cf10 NSNumber\cf4 \cf14 numberWithInt\cf4 : \f2\b \cf8 NO \f0\b0 \cf4 ];\ \cf2 // \f1 \'b7\'a2\'cd\'f9\'c4\'c4\'c0\'ef \f0 \cf4 \ [msg1 \cf15 insert\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ];\ [\cf5 g_xmpp\cf4 \cf15 sendMessage\cf4 :msg1 \cf15 roomName\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 roomJid\cf4 ];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 \cf15 showOneMsg\cf4 :msg1];\ \f2\b \cf8 if \f0\b0 \cf4 (\cf15 _table\cf4 .\cf14 contentSize\cf4 .\cf14 height\cf4 > (\cf5 JX_SCREEN_HEIGHT\cf4 + \f2\b \cf8 self \f0\b0 \cf4 .\cf15 deltaHeight\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 - \cf7 64\cf4 - \cf7 40\cf4 - \cf7 20\cf4 )) \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 deltaY\cf4 >= \cf7 0\cf4 ) \{\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 tableFooter\cf4 .\cf14 frame\cf4 .\cf14 origin\cf4 .\cf14 y\cf4 != \cf5 JX_SCREEN_HEIGHT\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 ) \{\ [\cf10 CATransaction\cf4 \cf14 begin\cf4 ];\ [\cf10 UIView\cf4 \cf14 animateWithDuration\cf4 :\cf7 0.1f\cf4 \cf14 animations\cf4 :^\{\ \cf2 // self.tableFooter.frame = CGRectMake(0, self.view.frame.size.height+deltaY-self.heightFooter, JX_SCREEN_WIDTH, self.heightFooter);\cf4 \ [\cf15 _table\cf4 \cf14 setFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 0\cf4 , \cf7 0\cf4 +\cf15 _noticeHeight\cf4 , \cf15 _table\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 width\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .\cf14 view\cf4 .\cf14 frame\cf4 .\cf14 size\cf4 .\cf14 height\cf4 + \f2\b \cf8 self \f0\b0 \cf4 .\cf15 deltaHeight\cf4 - \f2\b \cf8 self \f0\b0 \cf4 .\cf15 heightFooter\cf4 -\cf15 _noticeHeight\cf4 )];\ \cf2 // [_table gotoLastRow:NO];\cf4 \ \} \cf14 completion\cf4 :^( \f2\b \cf8 BOOL \f0\b0 \cf4 finished) \{\ \}];\ [\cf10 CATransaction\cf4 \cf14 commit\cf4 ];\ \}\ \ \}\ \ \}\ \}\ \ [\cf15 _messageText\cf4 \cf14 setText\cf4 : \f2\b \cf8 nil \f0\b0 \cf4 ];\ \ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .\cf15 isShare\cf4 && \f2\b \cf8 self \f0\b0 \cf4 .\cf15 shareSchemes\cf4 ) \{\ \ \cf14 dispatch_after\cf4 (\cf14 dispatch_time\cf4 (\cf5 DISPATCH_TIME_NOW\cf4 , (\cf10 int64_t\cf4 )(\cf7 1\cf4 * \cf5 NSEC_PER_SEC\cf4 )), \cf14 dispatch_get_main_queue\cf4 (), ^\{\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 shareView\cf4 = [[\cf10 UIView\cf4 \cf14 alloc\cf4 ] \cf14 initWithFrame\cf4 :\cf14 CGRectMake\cf4 (\cf7 0\cf4 , \cf7 0\cf4 , \cf5 JX_SCREEN_WIDTH\cf4 , \cf5 JX_SCREEN_HEIGHT\cf4 )];\ \f2\b \cf8 self \f0\b0 \cf4 .\cf15 shareView\cf4 .\cf14 backgroundColor\cf4 = [\cf10 UIColor\cf4 \cf14 colorWithWhite\cf4 :\cf7 0\cf4 \cf14 alpha\cf4 :\cf7 .3\cf4 ];\ [\cf5 g_window\cf4 \cf14 addSubview\cf4 : \f2\b \cf8 self \f0\b0 \cf4 .\cf15 shareView\cf4 ];\ \ \cf10 UIView\cf4 *view = [[UIView alloc] initWithFrame:CGRectMake(\cf7 0\cf4 , \cf7 0\cf4 , JX_SCREEN_WIDTH - \cf7 100\cf4 , \cf7 220\cf4 )];\ view.backgroundColor = [UIColor whiteColor];\ view.center = CGPointMake( \f2\b \cf8 self \f0\b0 \cf4 .shareView.frame.size.width / \cf7 2\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .shareView.frame.size.height / \cf7 2\cf4 );\ view.layer.cornerRadius = \cf7 3.0\cf4 ;\ view.layer.masksToBounds = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 .shareView addSubview:view];\ \ UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(\cf7 0\cf4 , \cf7 25\cf4 , \cf7 50\cf4 , \cf7 50\cf4 )];\ \ imageView.image = [UIImage imageNamed:\cf6 @"ALOGO_120"\cf4 ];\ imageView.center = CGPointMake(view.frame.size.width / \cf7 2\cf4 , imageView.center.y);\ [view addSubview:imageView];\ \ UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(\cf7 0\cf4 , CGRectGetMaxY(imageView.frame) + \cf7 5\cf4 , view.frame.size.width, \cf7 30\cf4 )];\ label.font = [UIFont systemFontOfSize:\cf7 18\cf4 ];\ label.text = Localized(\cf6 @"JX_Sended"\cf4 );\ label.textAlignment = NSTextAlignmentCenter;\ [view addSubview:label];\ \ UIView *line = [[UIView alloc] initWithFrame:CGRectMake(\cf7 0\cf4 , view.frame.size.height - \cf7 90\cf4 , view.frame.size.width, LINE_WH)];\ line.backgroundColor = THE_LINE_COLOR;\ [view addSubview:line];\ \ UIButton *btn1 = [[UIButton alloc] initWithFrame:CGRectMake(\cf7 0\cf4 , line.frame.origin.y, line.frame.size.width, \cf7 45\cf4 )];\ [btn1 setTitle:Localized(\cf6 @"JX_Return"\cf4 ) forState:UIControlStateNormal];\ [btn1 setTitleColor:THEMECOLOR forState:UIControlStateNormal];\ [btn1 addTarget: \f2\b \cf8 self \f0\b0 \cf4 action: \f2\b \cf8 @selector \f0\b0 \cf4 (shareBackBtnAction) forControlEvents:UIControlEventTouchUpInside];\ [view addSubview:btn1];\ \ line = [[UIView alloc] initWithFrame:CGRectMake(\cf7 0\cf4 , view.frame.size.height - \cf7 45\cf4 , view.frame.size.width, LINE_WH)];\ line.backgroundColor = THE_LINE_COLOR;\ [view addSubview:line];\ \ UIButton *btn2 = [[UIButton alloc] initWithFrame:CGRectMake(\cf7 0\cf4 , line.frame.origin.y, line.frame.size.width, \cf7 45\cf4 )];\ [btn2 setTitle:[NSString stringWithFormat:\cf6 @"%@%@"\cf4 ,Localized(\cf6 @"JX_ToStayIn"\cf4 ),APP_NAME] forState:UIControlStateNormal];\ [btn2 setTitleColor:THEMECOLOR forState:UIControlStateNormal];\ [btn2 addTarget: \f2\b \cf8 self \f0\b0 \cf4 action: \f2\b \cf8 @selector \f0\b0 \cf4 (shareKeepBtnAction) forControlEvents:UIControlEventTouchUpInside];\ [view addSubview:btn2];\ \});\ \}\ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 shareBackBtnAction\cf4 \{\ NSString *str = [NSString stringWithFormat:\cf6 @"%@://type=%@"\cf4 , \f2\b \cf8 self \f0\b0 \cf4 .shareSchemes,\cf6 @"Share"\cf4 ];\ [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]] options: \f2\b \cf8 nil \f0\b0 \cf4 completionHandler:^( \f2\b \cf8 BOOL \f0\b0 \cf4 success) \{\ \}];\ \ \f2\b \cf8 self \f0\b0 \cf4 .shareView.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 .shareView removeFromSuperview];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 shareKeepBtnAction\cf4 \{\ \f2\b \cf8 self \f0\b0 \cf4 .shareView.hidden = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 .shareView removeFromSuperview];\ \}\ \ \cf2 // \f1 \'b3\'a4\'b0\'b4\'c9\'be\'b3\'fd \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 chatCell\cf4 :(JXBaseChatCell *)chatCell \cf11 deleteIndexNum\cf4 :( \f2\b \cf8 int \f0\b0 \cf4 )indexNum \{\ memberData *data = [ \f2\b \cf8 self \f0\b0 \cf4 .room getMember:g_myself.userId];\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomId.length > \cf7 0\cf4 &&([data.role intValue] == \cf7 1\cf4 || [data.role intValue] == \cf7 2\cf4 )) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 sendMsgCheck]) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ JXMessageObject *msg = _array[indexNum];\ \f2\b \cf8 self \f0\b0 \cf4 .withdrawIndex = indexNum;\ \f2\b \cf8 int \f0\b0 \cf4 type = \cf7 1\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid) \{\ type = \cf7 2\cf4 ;\ \}\ [g_server tigaseDeleteMsgWithMessageId:msg.messageId type:type deleteType:\cf7 2\cf4 roomJid: \f2\b \cf8 self \f0\b0 \cf4 .roomJid deleteOrWithdraw:kWCMessageTypeSuperDelete toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ JXMessageObject *msg = _array[indexNum];\ NSString* s;\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .roomJid length]>\cf7 0\cf4 )\ s = \f2\b \cf8 self \f0\b0 \cf4 .roomJid;\ \f2\b \cf8 else \f0\b0 \cf4 \ s = chatPerson.userId;\ \ \ \f2\b \cf8 if \f0\b0 \cf4 (indexNum == _array.count - \cf7 1\cf4 ) \{\ JXMessageObject *newLastMsg;\ \f2\b \cf8 if \f0\b0 \cf4 (indexNum == \cf7 0\cf4 ) \{\ newLastMsg = [_array firstObject];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ newLastMsg = _array[indexNum - \cf7 1\cf4 ];\ \}\ \f2\b \cf8 self \f0\b0 \cf4 .lastMsg.content = newLastMsg.content;\ [newLastMsg updateLastSend:UpdateLastSendType_None];\ \}\ \ \cf2 // \f1 \'c9\'be\'b3\'fd\'b1\'be\'b5\'d8\'c1\'c4\'cc\'ec\'bc\'c7\'c2\'bc \f0 \cf4 \ [_array removeObjectAtIndex:indexNum];\ [msg \f2\b \cf8 delete \f0\b0 \cf4 ];\ \ \cf2 // [_table deleteRow:indexNum section:0];\cf4 \ [_table reloadData];\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .courseId.length > \cf7 0\cf4 ) \{\ \cf2 // NSDictionary *dict = self.courseArray[indexNum];\cf4 \ [g_server userCourseUpdateWithCourseId: \f2\b \cf8 self \f0\b0 \cf4 .courseId MessageIds: \f2\b \cf8 nil \f0\b0 \cf4 CourseName: \f2\b \cf8 nil \f0\b0 \cf4 CourseMessageId:msg.messageId toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 int \f0\b0 \cf4 type = \cf7 1\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid) \{\ type = \cf7 2\cf4 ;\ \}\ \f2\b \cf8 self \f0\b0 \cf4 .withdrawIndex = -\cf7 1\cf4 ;\ \ \ \ \cf2 // [g_server tigaseDeleteMsgWithMessageId:msg.messageId type:type deleteType:2 roomJid:self.roomJid toView:self];\cf4 \ [g_server tigaseDeleteMsgWithMessageId:msg.messageId type:type deleteType:\cf7 2\cf4 roomJid: \f2\b \cf8 self \f0\b0 \cf4 .roomJid deleteOrWithdraw:kWCMessageTypeSuperDelete toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \}\ \}\ \ \cf2 // \f1 \'b3\'a4\'b0\'b4\'b3\'b7\'bb\'d8 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 chatCell\cf4 :(JXBaseChatCell *)chatCell \cf11 withdrawIndexNum\cf4 :( \f2\b \cf8 int \f0\b0 \cf4 )indexNum \{\ \ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 sendMsgCheck]) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ JXMessageObject *msg = _array[indexNum];\ \f2\b \cf8 self \f0\b0 \cf4 .withdrawIndex = indexNum;\ \f2\b \cf8 int \f0\b0 \cf4 type = \cf7 1\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid) \{\ type = \cf7 2\cf4 ;\ \}\ \cf2 // \f1 \'ca\'b5\'cf\'d6\'b7\'c0\'b3\'b7\'bb\'d8 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid.length > \cf7 0\cf4 && _isAttritionRecall) \{\ memberData *data = [ \f2\b \cf8 self \f0\b0 \cf4 .room getMember:g_myself.userId];\ \f2\b \cf8 if \f0\b0 \cf4 ([data.role intValue] == \cf7 1\cf4 || [data.role intValue] == \cf7 2\cf4 ) \{\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [JXMyTools showTipView:\cf6 @" \f1 \'b8\'c3\'cf\'fb\'cf\'a2\'b2\'bb\'c4\'dc\'b3\'b7\'bb\'d8 \f0 "\cf4 ];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \}\ \cf2 // [g_server tigaseDeleteMsgWithMessageId:msg.messageId type:type deleteType:2 roomJid:self.roomJid toView:self];\cf4 \ \ \cf2 // \f1 \'c8\'ba\'b9\'dc\'c0\'ed \f0 \cf4 \ memberData *data = [ \f2\b \cf8 self \f0\b0 \cf4 .room getMember:g_myself.userId];\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid.length > \cf7 0\cf4 && _isAttritionRecall) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([data.role intValue] == \cf7 1\cf4 || [data.role intValue] == \cf7 2\cf4 ) \{\ [g_server tigaseDeleteMsgWithMessageId:msg.messageId type:type deleteType:\cf7 2\cf4 roomJid: \f2\b \cf8 self \f0\b0 \cf4 .roomJid deleteOrWithdraw:kWCMessageTypeSuperDelete toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [JXMyTools showTipView:\cf6 @" \f1 \'b8\'c3\'cf\'fb\'cf\'a2\'b2\'bb\'c4\'dc\'b3\'b7\'bb\'d8 \f0 "\cf4 ];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ([data.role intValue] == \cf7 1\cf4 || [data.role intValue] == \cf7 2\cf4 ) \{\ [g_server tigaseDeleteMsgWithMessageId:msg.messageId type:type deleteType:\cf7 2\cf4 roomJid: \f2\b \cf8 self \f0\b0 \cf4 .roomJid deleteOrWithdraw:kWCMessageTypeSuperDelete toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [g_server tigaseDeleteMsgWithMessageId:msg.messageId type:type deleteType:\cf7 2\cf4 roomJid: \f2\b \cf8 self \f0\b0 \cf4 .roomJid deleteOrWithdraw:kWCMessageTypeWithdraw toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \}\ \ \ \}\ \ \cf2 // \f1 \'b3\'a4\'b0\'b4\'ca\'d5\'b2\'d8 \f0 && \f1 \'b3\'a4\'b0\'b4\'cc\'ed\'bc\'d3\'b1\'ed\'c7\'e9 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 chatCell\cf4 :(JXBaseChatCell *)chatCell \cf11 favoritIndexNum\cf4 :( \f2\b \cf8 int \f0\b0 \cf4 )indexNum \cf11 type\cf4 :(CollectType)collectType\{\ JXMessageObject *msg = _array[indexNum];\ NSMutableArray *emoji = [[NSMutableArray alloc] init];\ \f2\b \cf8 if \f0\b0 \cf4 (collectType == CollectTypeEmoji) \{\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < g_myself.favorites.count; i ++) \{\ NSDictionary *dict = g_myself.favorites[i];\ NSString *url = dict[\cf6 @"url"\cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 ([msg.content isEqualToString:url]) \{\ \ [JXMyTools showTipView:Localized(\cf6 @"JX_ExpressionAdded"\cf4 )];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \}\ \}\ NSString *type = [NSString stringWithFormat:\cf6 @"%ld"\cf4 ,collectType];\ NSMutableDictionary *dataDict = [[NSMutableDictionary alloc] init];\ \f2\b \cf8 if \f0\b0 \cf4 (collectType != CollectTypeEmoji) \{\ [dataDict setValue:msg.messageId forKey:\cf6 @"msgId"\cf4 ];\ \}\ [dataDict setValue:msg.content forKey:\cf6 @"msg"\cf4 ];\ [dataDict setValue:type forKey:\cf6 @"type"\cf4 ];\ [dataDict setValue: \f2\b \cf8 self \f0\b0 \cf4 .roomJid forKey:\cf6 @"roomJid"\cf4 ];\ [dataDict setValue:\cf7 @0\cf4 forKey:\cf6 @"collectType"\cf4 ];\ [dataDict setValue:msg.content forKey:\cf6 @"url"\cf4 ];\ \ [emoji addObject:dataDict];\ \cf2 // NSString * jsonString = [[SBJsonWriter new] stringWithObject:[msg toDictionary]];\cf4 \ \cf2 // [g_server addFavoriteWithContent:jsonString type:collectType toView:self];\cf4 \ \ \f2\b \cf8 if \f0\b0 \cf4 (collectType == CollectTypeEmoji)\{\ \cf2 // \f1 \'cc\'ed\'bc\'d3\'b5\'a5\'b8\'f6\'b1\'ed\'c7\'e9 \f0 \cf4 \ NSDate* date = [NSDate dateWithTimeIntervalSinceNow:\cf7 0\cf4 ];\ NSTimeInterval time = [date timeIntervalSince1970]*\cf7 1000\cf4 ;\ NSString *mixString = [NSString stringWithFormat:\cf6 @"%.0f"\cf4 , time];\ NSString *faceName = [NSString stringWithFormat:\cf6 @"%@.jpg"\cf4 , mixString];\ [g_server addFaceClollect:\cf6 @""\cf4 faceName:\cf6 @"noFacename"\cf4 url:msg.content View: \f2\b \cf8 self \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // \f1 \'ca\'d5\'b2\'d8 \f0 \cf4 \ [g_server addFavoriteWithEmoji:emoji toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \ \ \cf2 // [g_server userEmojiAddWithUrl:msg.content toView:self];\cf4 \ \ \ \ \}\ \ \cf2 // \f1 \'b6\'e0\'d1\'a1 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 chatCell\cf4 :(JXBaseChatCell *)chatCell \cf11 selectMoreIndexNum\cf4 :( \f2\b \cf8 int \f0\b0 \cf4 )indexNum \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \f2\b \cf8 self \f0\b0 \cf4 .isSelectMore = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .selectMoreView.hidden = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 .gotoBackBtn setBackgroundImage: \f2\b \cf8 nil \f0\b0 \cf4 forState:UIControlStateNormal];\ [ \f2\b \cf8 self \f0\b0 \cf4 .gotoBackBtn setTitle:Localized(\cf6 @"JX_Cencal"\cf4 ) forState:UIControlStateNormal];\ [ \f2\b \cf8 self \f0\b0 \cf4 enableCell];\ [ \f2\b \cf8 self \f0\b0 \cf4 .tableView reloadData];\ \}\ \ \cf2 // \f1 \'b6\'e0\'d1\'a1\'d1\'a1\'d4\'f1 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 chatCell\cf4 :(JXBaseChatCell *)chatCell \cf11 checkBoxSelectIndexNum\cf4 :( \f2\b \cf8 int \f0\b0 \cf4 )indexNum \cf11 isSelect\cf4 :( \f2\b \cf8 BOOL \f0\b0 \cf4 )isSelect \{\ \ JXMessageObject *msg = _array[indexNum];\ \ \f2\b \cf8 if \f0\b0 \cf4 ([msg.isReadDel boolValue]) \{\ chatCell.checkBox.selected = \f2\b \cf8 NO \f0\b0 \cf4 ;\ [g_App showAlert:Localized(\cf6 @"JX_MessageBurningNo"\cf4 )];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (isSelect) \{\ [_selectMoreArr addObject:_array[indexNum]];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [_selectMoreArr removeObject:_array[indexNum]];\ \}\ \}\ \ \cf2 // \f1 \'b3\'a4\'b0\'b4\'bf\'aa\'ca\'bc\'c2\'bc\'d6\'c6 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 chatCell\cf4 :(JXBaseChatCell *)chatCell \cf11 startRecordIndexNum\cf4 :( \f2\b \cf8 int \f0\b0 \cf4 )indexNum \{\ [_recordArray removeAllObjects];\ \f2\b \cf8 self \f0\b0 \cf4 .isRecording = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .recordStarNum = indexNum;\ \f2\b \cf8 self \f0\b0 \cf4 .title = Localized(\cf6 @"JX_StopRecording"\cf4 );\ [ \f2\b \cf8 self \f0\b0 \cf4 setAudioIconFrame];\ \}\ \ \cf2 // \f1 \'b3\'a4\'b0\'b4\'bd\'e1\'ca\'f8\'c2\'bc\'d6\'c6 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 chatCell\cf4 :(JXBaseChatCell *)chatCell \cf11 stopRecordIndexNum\cf4 :( \f2\b \cf8 int \f0\b0 \cf4 )indexNum \{\ \ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \f2\b \cf8 self \f0\b0 \cf4 .recordStarNum; i<= indexNum; i ++) \{\ \f2\b \cf8 if \f0\b0 \cf4 (i >= _array.count) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ JXMessageObject *msg = _array[i];\ \ \f2\b \cf8 if \f0\b0 \cf4 ([msg isVisible] && [msg.type intValue]!=kWCMessageTypeIsRead && [msg.fromUserId isEqualToString:MY_USER_ID] && [msg.isReadDel intValue] != \cf7 1\cf4 &&[msg.type intValue]!=kWCMessageTypeAudioChatCancel&&[msg.type intValue]!=kWCMessageTypeAudioChatEnd&&[msg.type intValue]!=kWCMessageTypeAudioMeetingInvite&&[msg.type intValue]!=kWCMessageTypeVideoMeetingInvite&&[msg.type intValue]!=kWCMessageTypeVideoChatCancel&&[msg.type intValue]!=kWCMessageTypeVideoChatEnd&&[msg.type intValue]!=kWCMessageTypeRedPacket&&[msg.type intValue]!=kWCMessageTypeTransfer&&[msg.type intValue]!=kWCMessageTypeAVBusy)\ \f2\b \cf8 if \f0\b0 \cf4 (msg.messageId) \{\ [_recordArray addObject:msg.messageId];\ \}\ \}\ \ UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:Localized(\cf6 @"JX_InputCourseName"\cf4 ) message: \f2\b \cf8 nil \f0\b0 \cf4 delegate: \f2\b \cf8 self \f0\b0 \cf4 cancelButtonTitle:Localized(\cf6 @"JX_Cencal"\cf4 ) otherButtonTitles:Localized(\cf6 @"JX_Confirm"\cf4 ), \f2\b \cf8 nil \f0\b0 \cf4 ];\ alertView.alertViewStyle = UIAlertViewStylePlainTextInput;\ [alertView show];\ \ \cf2 // NSString *str = self.onlinestate ? Localized(@"JX_OnLine") : Localized(@"JX_OffLine");\cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid || ([chatPerson.userId intValue]<\cf7 10100\cf4 && [chatPerson.userId intValue]>=\cf7 10000\cf4 )) \{\ \f2\b \cf8 self \f0\b0 \cf4 .title = chatPerson.userNickname;\ [ \f2\b \cf8 self \f0\b0 \cf4 setAudioIconFrame];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ \cf2 // self.title = [NSString stringWithFormat:@"%@(%@)",chatPerson.remarkName.length > 0 ? chatPerson.remarkName : chatPerson.userNickname,str];\cf4 \ [ \f2\b \cf8 self \f0\b0 \cf4 setChatTitle:chatPerson.remarkName.length > \cf7 0\cf4 ? chatPerson.remarkName : chatPerson.userNickname];\ \}\ \f2\b \cf8 self \f0\b0 \cf4 .isRecording = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .recordStarNum = \cf7 0\cf4 ;\ \ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \cf2 // \f1 \'cf\'fb\'cf\'a2\'d6\'d8\'b7\'a2 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 chatCell\cf4 :(JXBaseChatCell *)chatCell \cf11 resendIndexNum\cf4 :( \f2\b \cf8 int \f0\b0 \cf4 )indexNum \{\ JXActionSheetVC *actionVC = [[JXActionSheetVC alloc] initWithImages:\cf7 @[]\cf4 names:\cf7 @[\cf4 Localized(\cf6 @"JX_Delete"\cf4 ),Localized(\cf6 @"JXBaseChatCell_SendAngin"\cf4 )\cf7 ]\cf4 ];\ actionVC.tag = \cf7 1111\cf4 ;\ actionVC.delegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .indexNum = indexNum;\ [ \f2\b \cf8 self \f0\b0 \cf4 presentViewController:actionVC animated: \f2\b \cf8 NO \f0\b0 \cf4 completion: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 chatCell\cf4 :(JXBaseChatCell *)chatCell \cf11 audioPlayChangeIndexNum\cf4 :( \f2\b \cf8 int \f0\b0 \cf4 )indexNum \{\ \f2\b \cf8 BOOL \f0\b0 \cf4 flag = [g_default boolForKey:kChatVCMessageAudioIsNotPlayback];\ \f2\b \cf8 if \f0\b0 \cf4 (!flag) \{\ \cf2 // \f1 \'cc\'fd\'cd\'b2\'b2\'a5\'b7\'c5 \f0 \cf4 \ [g_default setBool: \f2\b \cf8 YES \f0\b0 \cf4 forKey:kChatVCMessageAudioIsNotPlayback];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // \f1 \'d1\'ef\'c9\'f9\'c6\'f7\'b2\'a5\'b7\'c5 \f0 \cf4 \ [g_default setBool: \f2\b \cf8 NO \f0\b0 \cf4 forKey:kChatVCMessageAudioIsNotPlayback];\ \}\ \ [ \f2\b \cf8 self \f0\b0 \cf4 setAudioIconFrame];\ \}\ \ - ( \f2\b \cf8 BOOL \f0\b0 \cf4 )\cf11 getRecording\cf4 \{\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 self \f0\b0 \cf4 .isRecording;\ \}\ - (NSInteger)\cf11 getRecordStarNum\cf4 \{\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 self \f0\b0 \cf4 .recordStarNum;\ \}\ \ \cf2 // \f1 \'b7\'a2\'cb\'cd\'bf\'ce\'b3\'cc \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendCourseAction\cf4 \{\ \ \f2\b \cf8 if \f0\b0 \cf4 (_array.count <= \cf7 0\cf4 ) \{\ [JXMyTools showTipView:Localized(\cf6 @"JX_ThisCourseEmpty"\cf4 )];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (g_commonService.courseTimer) \{\ [JXMyTools showTipView:Localized(\cf6 @"JX_SendingPleaseWait"\cf4 )];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ JXRelayVC *vc = [[JXRelayVC alloc] init];\ vc.isCourse = \f2\b \cf8 YES \f0\b0 \cf4 ;\ vc.relayDelegate = \f2\b \cf8 self \f0\b0 \cf4 ;\ \cf2 // [g_window addSubview:vc.view];\cf4 \ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 sendCourse\cf4 :(NSTimer *) timer\{\ \ JXMsgAndUserObject *obj = timer.userInfo;\ \f2\b \cf8 BOOL \f0\b0 \cf4 isRoom;\ \f2\b \cf8 if \f0\b0 \cf4 ([obj.user.roomFlag intValue] > \cf7 0\cf4 || obj.user.roomId.length > \cf7 0\cf4 ) \{\ isRoom = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ isRoom = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 self \f0\b0 \cf4 .sendIndex ++;\ \cf2 // [_chatWait start:[NSString stringWithFormat:@" \f1 \'d5\'fd\'d4\'da\'b7\'a2\'cb\'cd\'a3\'ba \f0 %d/%ld",self.sendIndex,_array.count] inView:g_window];\cf4 \ [_chatWait setCaption:[NSString stringWithFormat:\cf6 @"%@ \f1 \'a3\'ba \f0 %d/%ld"\cf4 ,Localized(\cf6 @"JX_SendNow"\cf4 ), \f2\b \cf8 self \f0\b0 \cf4 .sendIndex,_array.count]];\ [_chatWait update];\ \ JXMessageObject *msg= _array[ \f2\b \cf8 self \f0\b0 \cf4 .sendIndex - \cf7 1\cf4 ];\ msg.messageId = \f2\b \cf8 nil \f0\b0 \cf4 ;\ msg.timeSend = [NSDate date];\ msg.fromId = \f2\b \cf8 nil \f0\b0 \cf4 ;\ msg.fromUserId = MY_USER_ID;\ \f2\b \cf8 if \f0\b0 \cf4 (isRoom)\{\ msg.toUserId = obj.user.userId;\ msg.isGroup = \f2\b \cf8 YES \f0\b0 \cf4 ;\ msg.fromUserName = g_myself.userNickname;\ \}\ \f2\b \cf8 else \f0\b0 \cf4 \{\ msg.toUserId = obj.user.userId;\ msg.isGroup = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \cf2 // msg.content = relayMsg.content;\cf4 \ \cf2 // msg.type = relayMsg.type;\cf4 \ msg.isSend = [NSNumber numberWithInt:transfer_status_ing];\ msg.isRead = [NSNumber numberWithBool: \f2\b \cf8 NO \f0\b0 \cf4 ];\ msg.isReadDel = [NSNumber numberWithInt: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \cf2 // \f1 \'b7\'a2\'cd\'f9\'c4\'c4\'c0\'ef \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (isRoom) \{\ [msg insert:obj.user.userId];\ [g_xmpp sendMessage:msg roomName:obj.user.userId];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [msg insert: \f2\b \cf8 nil \f0\b0 \cf4 ];\ [g_xmpp sendMessage:msg roomName: \f2\b \cf8 nil \f0\b0 \cf4 ];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (_array.count == \f2\b \cf8 self \f0\b0 \cf4 .sendIndex) \{\ [_chatWait stop];\ [_timer invalidate];\ _timer = \f2\b \cf8 nil \f0\b0 \cf4 ;\ [JXMyTools showTipView:Localized(\cf6 @"JXAlert_SendOK"\cf4 )];\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 relay\cf4 :(JXRelayVC *)relayVC \cf11 MsgAndUserObject\cf4 :(JXMsgAndUserObject *)obj \{\ \ \cf2 // [g_subWindow addSubview:_suspensionBtn];\cf4 \ \cf2 // g_subWindow.hidden = YES;\cf4 \ \cf2 // _chatWait.view.frame = CGRectMake(0, 0, 50, 50);\cf4 \ \cf2 // [_chatWait start:[NSString stringWithFormat:@"%@ \f1 \'a3\'ba \f0 1/%ld",Localized(@"JX_SendNow"),_array.count] inView:g_subWindow];\cf4 \ \ dispatch_async(dispatch_get_global_queue(\cf7 0\cf4 , \cf7 0\cf4 ), ^\{\ \ [g_commonService sendCourse:obj Array:_array];\ \});\ \ \cf2 // _timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(sendCourse:) userInfo:obj repeats:YES];\cf4 \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 alertView\cf4 :(UIAlertView *)alertView \cf11 clickedButtonAtIndex\cf4 :(NSInteger)buttonIndex \{\ \ \f2\b \cf8 if \f0\b0 \cf4 (alertView.tag == \cf7 2457\cf4 ) \{\ \ \f2\b \cf8 if \f0\b0 \cf4 (buttonIndex == \cf7 1\cf4 ) \{\ \ \cf2 // NSMutableString *msgIds = [NSMutableString string];\cf4 \ \cf2 // NSMutableString *types = [NSMutableString string];\cf4 \ NSMutableArray *emoji = [[NSMutableArray alloc] init];\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < \f2\b \cf8 self \f0\b0 \cf4 .selectMoreArr.count; i ++) \{\ JXMessageObject *msg = \f2\b \cf8 self \f0\b0 \cf4 .selectMoreArr[i];\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeText || [msg.type intValue] == kWCMessageTypeImage || [msg.type intValue] == kWCMessageTypeCustomFace || [msg.type intValue] == kWCMessageTypeEmoji || [msg.type intValue] == kWCMessageTypeVoice || [msg.type intValue] == kWCMessageTypeVideo || [msg.type intValue] == kWCMessageTypeFile) \{\ \ CollectType collectType = CollectTypeDefult;\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeImage) \{\ collectType = CollectTypeImage;\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeCustomFace) \{\ collectType = CollectTypeEmoji;\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeEmoji) \{\ collectType = CollectTypeEmoji;\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeVideo) \{\ collectType = CollectTypeVideo;\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeFile) \{\ collectType = CollectTypeFile;\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeVoice) \{\ collectType = CollectTypeVoice;\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeText) \{\ collectType = CollectTypeText;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \ \}\ \f2\b \cf8 if \f0\b0 \cf4 (collectType == CollectTypeDefult) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \cf2 // NSDictionary *dict = g_myself.favorites[i];\cf4 \ \cf2 // NSString *url = dict[@"url"];\cf4 \ \cf2 // if ([msg.content isEqualToString:url]) \{\cf4 \ \cf2 // continue;\cf4 \ \cf2 // \}\cf4 \ \ NSString *type = [NSString stringWithFormat:\cf6 @"%ld"\cf4 ,collectType];\ NSMutableDictionary *dataDict = [[NSMutableDictionary alloc] init];\ [dataDict setValue:msg.messageId forKey:\cf6 @"msgId"\cf4 ];\ [dataDict setValue:msg.content forKey:\cf6 @"msg"\cf4 ];\ [dataDict setValue:type forKey:\cf6 @"type"\cf4 ];\ [dataDict setValue: \f2\b \cf8 self \f0\b0 \cf4 .roomJid forKey:\cf6 @"roomJid"\cf4 ];\ [dataDict setValue:\cf7 @0\cf4 forKey:\cf6 @"collectType"\cf4 ];\ \ [emoji addObject:dataDict];\ \ \cf2 // if (msgIds.length <= 0) \{\cf4 \ \cf2 // [msgIds appendString:msg.messageId];\cf4 \ \cf2 // [types appendString:[NSString stringWithFormat:@"%ld",collectType]];\cf4 \ \cf2 // \}else \{\cf4 \ \cf2 // [msgIds appendFormat:@",%@", msg.messageId];\cf4 \ \cf2 // [types appendFormat:@",%@", [NSString stringWithFormat:@"%ld",collectType]];\cf4 \ \cf2 // \}\cf4 \ \ \}\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (emoji.count > \cf7 0\cf4 ) \{\ [g_server addFavoriteWithEmoji:emoji toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isSelectMore) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 actionQuit];\ \}\ \}\ \ \}\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (alertView.tag == \cf7 2458\cf4 ) \{\ \ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < \f2\b \cf8 self \f0\b0 \cf4 .selectMoreArr.count; i ++) \{\ JXMessageObject *msg = \f2\b \cf8 self \f0\b0 \cf4 .selectMoreArr[i];\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] == kWCMessageTypeImage || [msg.type intValue] == kWCMessageTypeCustomFace|| [msg.type intValue] == kWCMessageTypeEmoji) \{\ UIImageView *imageView = [[UIImageView alloc] init];\ NSURL* url;\ \f2\b \cf8 if \f0\b0 \cf4 (msg.isMySend && isFileExist(msg.fileName))\ url = [NSURL fileURLWithPath:msg.fileName];\ \f2\b \cf8 else \f0\b0 \cf4 \ url = [NSURL URLWithString:msg.content];\ [imageView sd_setImageWithURL:url completed:^(UIImage * \f2\b \cf8 _Nullable \f0\b0 \cf4 image, NSError * \f2\b \cf8 _Nullable \f0\b0 \cf4 error, SDImageCacheType cacheType, NSURL * \f2\b \cf8 _Nullable \f0\b0 \cf4 imageURL) \{\ \ \f2\b \cf8 if \f0\b0 \cf4 (!error) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 saveImageToPhotos:imageView.image];\ \}\ \}];\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type integerValue] == kWCMessageTypeVideo) \{\ \ \f2\b \cf8 if \f0\b0 \cf4 ([msg.content rangeOfString:\cf6 @"http"\cf4 ].location != NSNotFound) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 playerDownload:msg.content];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 saveVideo:msg.content];\ \}\ \ \}\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isSelectMore) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 actionQuit];\ \}\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (alertView.tag == \cf7 3457\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 (buttonIndex == \cf7 1\cf4 ) \{\ \ NSMutableArray *selects = [NSMutableArray array];\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < \f2\b \cf8 self \f0\b0 \cf4 .selectMoreArr.count; i ++) \{\ JXMessageObject *msg = [ \f2\b \cf8 self \f0\b0 \cf4 .selectMoreArr[i] copy];\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.type intValue] != kWCMessageTypeRedPacket && [msg.type intValue] != kWCMessageTypeTransfer) \{\ [selects addObject:msg];\ \}\ \}\ \ JXRelayVC *vc = [[JXRelayVC alloc] init];\ vc.relayMsgArray = [NSMutableArray arrayWithArray:selects];\ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 (buttonIndex == \cf7 1\cf4 ) \{\ UITextField *tf = [alertView textFieldAtIndex:\cf7 0\cf4 ];\ \f2\b \cf8 if \f0\b0 \cf4 (tf.text.length <= \cf7 0\cf4 ) \{\ [g_App showAlert:Localized(\cf6 @"JX_InputCourseName"\cf4 )];\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ _recordName = tf.text;\ NSMutableString *recordStr = [NSMutableString string];\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < _recordArray.count; i ++) \{\ NSString *str = _recordArray[i];\ \f2\b \cf8 if \f0\b0 \cf4 (i == _recordArray.count - \cf7 1\cf4 ) \{\ [recordStr appendString:str];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [recordStr appendFormat:\cf6 @"%@,"\cf4 ,str];\ \}\ \}\ \ [g_server userCourseAddWithMessageIds:recordStr CourseName:_recordName RoomJid: \f2\b \cf8 self \f0\b0 \cf4 .roomJid toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 saveImageToPhotos\cf4 :(UIImage*)savedImage\ \{\ UIImageWriteToSavedPhotosAlbum(savedImage, \f2\b \cf8 self \f0\b0 \cf4 , \f2\b \cf8 @selector \f0\b0 \cf4 (image:didFinishSavingWithError:contextInfo:), \f2\b \cf8 NULL \f0\b0 \cf4 );\ \}\ \ \ \cf2 // \f1 \'d6\'b8\'b6\'a8\'bb\'d8\'b5\'f7\'b7\'bd\'b7\'a8 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 image\cf4 : (UIImage *) image \cf11 didFinishSavingWithError\cf4 : (NSError *) error \cf11 contextInfo\cf4 : ( \f2\b \cf8 void \f0\b0 \cf4 *) contextInfo\{\ \ \f2\b \cf8 if \f0\b0 \cf4 (!error) \{\ \ [JXMyTools showTipView:Localized(\cf6 @"JX_SaveSuessed"\cf4 )];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [JXMyTools showTipView:Localized(\cf6 @"JX_SaveFiled"\cf4 )];\ \}\ \}\ \ \cf2 //----- \f1 \'cf\'c2\'d4\'d8\'ca\'d3\'c6\'b5 \f0 --\cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 playerDownload\cf4 :(NSString *)url\{\ \ \ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, \f2\b \cf8 YES \f0\b0 \cf4 );\ NSString *documentsDirectory = [paths objectAtIndex:\cf7 0\cf4 ];\ \ AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];\ NSString *fullPath = [NSString stringWithFormat:\cf6 @"%@/%@"\cf4 , documentsDirectory, \cf6 @"jaibaili.mp4"\cf4 ];\ NSURL *urlNew = [NSURL URLWithString:url];\ NSURLRequest *request = [NSURLRequest requestWithURL:urlNew];\ NSURLSessionDownloadTask *task =\ [manager downloadTaskWithRequest:request\ progress: \f2\b \cf8 nil \f0\b0 \cf4 destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) \{\ \f2\b \cf8 return \f0\b0 \cf4 [NSURL fileURLWithPath:fullPath];\ \}\ completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 saveVideo:fullPath];\ \}];\ [task resume];\ \ \}\ \ \ \cf2 // \f1 \'b7\'a2\'cb\'cd\'d5\'fd\'d4\'da\'ca\'e4\'c8\'eb \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 ) \cf11 sendEntering\cf4 \{\ JXMessageObject *msg=[[JXMessageObject alloc]init];\ msg.timeSend = [NSDate date];\ msg.fromUserId = MY_USER_ID;\ \ msg.toUserId = chatPerson.userId;\ msg.type = [NSNumber numberWithInt:kWCMessageTypeRelay];\ [g_xmpp sendMessage:msg roomName: \f2\b \cf8 self \f0\b0 \cf4 .roomJid];\cf2 // \f1 \'b7\'a2\'cb\'cd\'cf\'fb\'cf\'a2 \f0 \cf4 \ \}\ \ \cf2 // \f1 \'c8\'ba\'b8\'fc\'b8\'c4\'ea\'c7\'b3\'c6 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 setNickName\cf4 :(NSString *)nickName \{\ _userNickName = nickName.length > \cf7 0\cf4 ? nickName : _userNickName;\ [_table reloadData];\ \}\ \cf2 // \f1 \'b7\'a2\'cb\'cd\'d1\'fb\'c7\'eb\'c8\'ba\'b3\'c9\'d4\'b1\'d1\'e9\'d6\'a4 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 needVerify\cf4 :(JXMessageObject *)msg \{\ [ \f2\b \cf8 self \f0\b0 \cf4 showOneMsg:msg];\ \}\ \ \cf2 // \f1 \'b5\'a5\'cc\'f5\'cd\'bc\'ce\'c4\'b5\'e3\'bb\'f7 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 ) \cf11 onDidSystemImage1\cf4 :(NSNotification *)notif \{\ \f2\b \cf8 if \f0\b0 \cf4 (recording) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ JXMessageObject *msg = notif.object;\ SBJsonParser * parser = [[SBJsonParser alloc] init] ;\ \f2\b \cf8 id \f0\b0 \cf4 content = [parser objectWithString:msg.content];\ NSString *url = [(NSDictionary *)content objectForKey:\cf6 @"url"\cf4 ];\ \ webpageVC *webVC = [webpageVC alloc];\ webVC.isGotoBack= \f2\b \cf8 YES \f0\b0 \cf4 ;\ webVC.isSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ webVC.title = [(NSDictionary *)content objectForKey:\cf6 @"title"\cf4 ];\ webVC.url = url;\ webVC = [webVC init];\ [g_navigation.navigationView addSubview:webVC.view];\ \cf2 // [g_navigation pushViewController:webVC animated:YES];\cf4 \ \ \}\ \ \cf2 // \f1 \'b6\'e0\'cc\'f5\'cd\'bc\'ce\'c4\'b5\'e3\'bb\'f7 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 ) \cf11 onDidSystemImage2\cf4 :(NSNotification *)notif \{\ \f2\b \cf8 if \f0\b0 \cf4 (recording) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ NSDictionary *dic = notif.object;\ NSString *url = [dic objectForKey:\cf6 @"url"\cf4 ];\ \ webpageVC *webVC = [webpageVC alloc];\ webVC.isGotoBack= \f2\b \cf8 YES \f0\b0 \cf4 ;\ webVC.isSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ webVC.title = [dic objectForKey:\cf6 @"title"\cf4 ];\ webVC.url = url;\ webVC = [webVC init];\ [g_navigation.navigationView addSubview:webVC.view];\ \cf2 // [g_navigation pushViewController:webVC animated:YES];\cf4 \ \ \}\ \ \cf2 // \f1 \'d2\'f4\'ca\'d3\'c6\'b5\'cd\'a8\'bb\'b0\'d7\'b4\'cc\'ac \f0 cell \f1 \'b5\'e3\'bb\'f7 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 ) \cf11 onDidAVCall\cf4 :(NSNotification *)notif \{\ \f2\b \cf8 if \f0\b0 \cf4 (recording) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ JXMessageObject *msg = notif.object;\ \ \f2\b \cf8 BOOL \f0\b0 \cf4 isMeeting = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 switch \f0\b0 \cf4 ([msg.type intValue]) \{\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeAudioMeetingInvite:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeAudioChatCancel:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeAudioChatEnd: \{\ \f2\b \cf8 self \f0\b0 \cf4 .isAudioMeeting = \f2\b \cf8 YES \f0\b0 \cf4 ;\ isMeeting = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \cf2 // [self onChatAudio:msg];\cf4 \ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeVideoMeetingInvite:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeVideoChatCancel:\ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeVideoChatEnd: \{\ \f2\b \cf8 self \f0\b0 \cf4 .isAudioMeeting = \f2\b \cf8 NO \f0\b0 \cf4 ;\ isMeeting = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \cf2 // [self onChatVideo:msg];\cf4 \ \f2\b \cf8 break \f0\b0 \cf4 ;\ \ \f2\b \cf8 case \f0\b0 \cf4 kWCMessageTypeAVBusy: \{\ \f2\b \cf8 if \f0\b0 \cf4 ([msg.objectId isEqualToString:\cf6 @"1"\cf4 ]) \{\ \f2\b \cf8 self \f0\b0 \cf4 .isAudioMeeting = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 self \f0\b0 \cf4 .isAudioMeeting = \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \}\ \ \f2\b \cf8 default \f0\b0 \cf4 :\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (isMeeting && [g_config.isOpenCluster integerValue] == \cf7 1\cf4 ) \{\ \ [g_server userOpenMeetWithToUserId:chatPerson.userId toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isAudioMeeting) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 onChatAudio:msg];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 onChatVideo:msg];\ \}\ \}\ \}\ \ \cf2 // \f1 \'ce\'c4\'bc\'fe \f0 cell \f1 \'b5\'e3\'bb\'f7 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 ) \cf11 onDidFile\cf4 :(NSNotification *)notif \{\ \f2\b \cf8 if \f0\b0 \cf4 (recording) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ JXMessageObject *msg = notif.object;\ JXShareFileObject *obj = [[JXShareFileObject alloc] init];\ obj.fileName = [msg.fileName lastPathComponent];\ obj.url = msg.content;\ obj.size = msg.fileSize;\ \ JXFileDetailViewController *vc = [[JXFileDetailViewController alloc] init];\ vc.shareFile = obj;\ \cf2 // [g_window addSubview:vc.view];\cf4 \ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \}\ \ \cf2 // \f1 \'c1\'b4\'bd\'d3 \f0 cell \f1 \'b5\'e3\'bb\'f7 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 ) \cf11 onDidLink\cf4 :(NSNotification *)notif \{\ \f2\b \cf8 if \f0\b0 \cf4 (recording) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ [_messageText resignFirstResponder];\ \ JXMessageObject *msg = notif.object;\ SBJsonParser * parser = [[SBJsonParser alloc] init] ;\ \f2\b \cf8 id \f0\b0 \cf4 content = [parser objectWithString:msg.content];\ NSString *url = [(NSDictionary *)content objectForKey:\cf6 @"url"\cf4 ];\ \ webpageVC *webVC = [webpageVC alloc];\ webVC.isGotoBack= \f2\b \cf8 YES \f0\b0 \cf4 ;\ webVC.isSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ webVC.title = [(NSDictionary *)content objectForKey:\cf6 @"title"\cf4 ];\ webVC.url = url;\ webVC = [webVC init];\ [g_navigation.navigationView addSubview:webVC.view];\ \cf2 // [g_navigation pushViewController:webVC animated:YES];\cf4 \ \ \}\ \ \cf2 // \f1 \'b4\'c1\'d2\'bb\'b4\'c1\'b5\'e3\'bb\'f7 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onDidShake\cf4 :(NSNotification *)notif \{\ JXMessageObject *msg = notif.object;\ \ \f2\b \cf8 int \f0\b0 \cf4 value = \cf7 0\cf4 ;\ \f2\b \cf8 if \f0\b0 \cf4 (msg.isMySend) \{\ value = -\cf7 50\cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ value = \cf7 50\cf4 ;\ \}\ CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:\cf6 @"transform.translation.x"\cf4 ];\cf12 /// \f1 \cf2 \'ba\'e1\'cf\'f2\'d2\'c6\'b6\'af \f0 \cf4 \ \ animation.toValue = [NSNumber numberWithInt:value];\ \ animation.duration = \cf7 .5\cf4 ;\ \ animation.removedOnCompletion = \f2\b \cf8 YES \f0\b0 \cf4 ;\cf2 //yes \f1 \'b5\'c4\'bb\'b0\'a3\'ac\'d3\'d6\'b7\'b5\'bb\'d8\'d4\'ad\'ce\'bb\'d6\'c3\'c1\'cb\'a1\'a3 \f0 \cf4 \ \ animation.repeatCount = \cf7 2\cf4 ;\ \ animation.fillMode = kCAFillModeForwards;\ \ \cf2 // \f1 \'cc\'ed\'bc\'d3\'d5\'f1\'b6\'af \f0 \cf4 \ \cf2 // AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);\cf4 \ AudioServicesPlaySystemSound(\cf7 1521\cf4 );\ [_messageText.inputView.superview.layer addAnimation:animation forKey: \f2\b \cf8 nil \f0\b0 \cf4 ];\ [g_window.layer addAnimation:animation forKey: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \ \cf2 // \f1 \'ba\'cf\'b2\'a2\'d7\'aa\'b7\'a2\'b5\'e3\'bb\'f7 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onDidMergeRelay\cf4 :(NSNotification *)notif \{\ JXMessageObject *msg = notif.object;\ SBJsonParser * parser = [[SBJsonParser alloc] init] ;\ NSArray *content = [parser objectWithString:msg.content];\ NSMutableArray *array = [NSMutableArray array];\ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i = \cf7 0\cf4 ; i < content.count; i ++) \{\ NSString *str = content[i];\ NSDictionary *dict = [parser objectWithString:str];\ JXMessageObject *msg = [[JXMessageObject alloc] init];\ [msg fromDictionary:dict];\ msg.isNotUpdateHeight = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [array addObject:msg];\ \}\ \ JXChatLogVC *vc = [[JXChatLogVC alloc] init];\ \ vc.array = array;\ vc.title = msg.objectId;\ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \}\ \ \cf2 // \f1 \'b7\'d6\'cf\'ed \f0 cell \f1 \'b5\'e3\'bb\'f7 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onDidShare\cf4 :(NSNotification *)notif \{\ \f2\b \cf8 if \f0\b0 \cf4 (recording) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ JXMessageObject *msg = notif.object;\ NSDictionary * msgDict = [[[SBJsonParser alloc]init]objectWithString:msg.objectId];\ \ NSString *url = [msgDict objectForKey:\cf6 @"url"\cf4 ];\ NSString *downloadUrl = [msgDict objectForKey:\cf6 @"downloadUrl"\cf4 ];\ \ \f2\b \cf8 if \f0\b0 \cf4 ([url rangeOfString:\cf6 @"http"\cf4 ].location == NSNotFound) \{\ \ [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url] options: \f2\b \cf8 nil \f0\b0 \cf4 completionHandler:^( \f2\b \cf8 BOOL \f0\b0 \cf4 success) \{\ \ \f2\b \cf8 if \f0\b0 \cf4 (!success) \{\ \ webpageVC *webVC = [webpageVC alloc];\ webVC.isGotoBack= \f2\b \cf8 YES \f0\b0 \cf4 ;\ webVC.isSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ webVC.titleString = [msgDict objectForKey:\cf6 @"title"\cf4 ];\ webVC.url = downloadUrl;\ webVC = [webVC init];\ [g_navigation.navigationView addSubview:webVC.view];\ \cf2 // [g_navigation pushViewController:webVC animated:YES];\cf4 \ \}\ \ \}];\ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ webpageVC *webVC = [webpageVC alloc];\ webVC.isGotoBack= \f2\b \cf8 YES \f0\b0 \cf4 ;\ webVC.isSend = \f2\b \cf8 YES \f0\b0 \cf4 ;\ webVC.titleString = [msgDict objectForKey:\cf6 @"title"\cf4 ];\ webVC.url = url;\ webVC = [webVC init];\ [g_navigation.navigationView addSubview:webVC.view];\ \cf2 // [g_navigation pushViewController:webVC animated:YES];\cf4 \ \}\ \ \}\ \ \cf2 // \f1 \'bf\'d8\'d6\'c6\'cf\'fb\'cf\'a2\'b5\'e3\'bb\'f7 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onDidRemind\cf4 :(NSNotification *)notif \{\ JXMessageObject *msg = notif.object;\ \ \f2\b \cf8 if \f0\b0 \cf4 ([msg.remindType intValue] == kRoomRemind_NeedVerify) \{\ JXVerifyDetailVC *vc = [[JXVerifyDetailVC alloc] init];\ vc.chatVC2 = \f2\b \cf8 self \f0\b0 \cf4 ;\ vc.msg = msg;\ vc.room = \f2\b \cf8 self \f0\b0 \cf4 .room;\ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ([msg.remindType intValue] == kWCMessageTypeRedPacketReceive) \{\ \f2\b \cf8 self \f0\b0 \cf4 .isDidRedPacketRemind = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [g_server getRedPacket:msg.objectId toView: \f2\b \cf8 self \f0\b0 \cf4 ];\ \}\ \}\ \ \cf2 // \f1 \'bb\'d8\'b8\'b4\'cf\'fb\'cf\'a2\'b5\'e3\'bb\'f7 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onDidReply\cf4 :(NSNotification *)notif \{\ \f2\b \cf8 int \f0\b0 \cf4 indexNum = [notif.object intValue];\ JXMessageObject *msg = _array[indexNum];\ \ JXMessageObject *msgObj = [[JXMessageObject alloc] init];\ SBJsonParser *jsonParser = [[SBJsonParser alloc] init];\ NSDictionary *dict = [jsonParser objectWithString:msg.objectId];\ [msgObj fromDictionary:dict];\ \f2\b \cf8 for \f0\b0 \cf4 (JXMessageObject *msg1 \f2\b \cf8 in \f0\b0 \cf4 _array) \{\ \f2\b \cf8 if \f0\b0 \cf4 ([msgObj.messageId isEqualToString:msg1.messageId]) \{\ NSUInteger index = [_array indexOfObject:msg1];\ [_table scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:index inSection:\cf7 0\cf4 ] atScrollPosition:UITableViewScrollPositionTop animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \}\ \}\ \ \}\ \ \cf2 // \f1 \'ce\'c4\'b1\'be\'cf\'fb\'cf\'a2\'d4\'c4\'ba\'f3\'bc\'b4\'b7\'d9 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 onDidMessageReadDel\cf4 :(NSNotification *)notif \{\ \cf2 // int indexNum = [notif.object intValue];\cf4 \ \cf2 // [_table reloadRow:indexNum section:0];\cf4 \ [_table reloadData];\ \ \}\ \ \cf2 // \f1 \'cf\'fb\'cf\'a2\'b3\'b7\'bb\'d8 \f0 \cf4 \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 withdrawNotifi\cf4 :(NSNotification *) notif \{\ JXMessageObject *msg = notif.object;\ \ \f2\b \cf8 for \f0\b0 \cf4 (NSInteger i=[_array count]-\cf7 1\cf4 ;i>=\cf7 0\cf4 ;i--)\{\ JXMessageObject *p=[_array objectAtIndex:i];\ \f2\b \cf8 if \f0\b0 \cf4 ([p.messageId isEqualToString:msg.messageId])\{\cf2 // \f1 \'c8\'e7\'b9\'fb\'d5\'d2\'b5\'bd\'b1\'bb\'b3\'b7\'bb\'d8\'b5\'c4\'c4\'c7\'cc\'f5\'cf\'fb\'cf\'a2 \f0 \cf4 \ p.content = msg.content;\ p.type = msg.type;\ [_table reloadRow:( \f2\b \cf8 int \f0\b0 \cf4 )i section:\cf7 0\cf4 ];\ \}\ p = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 enableCell\cf4 \{\ \f2\b \cf8 for \f0\b0 \cf4 ( \f2\b \cf8 int \f0\b0 \cf4 i = \cf7 0\cf4 ; i < _array.count; i++) \{\ JXBaseChatCell *cell = [_table cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:\cf7 0\cf4 ]];\ cell.bubbleBg.userInteractionEnabled = ! \f2\b \cf8 self \f0\b0 \cf4 .isSelectMore;\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 createRoom\cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 (recording) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ JXChatSettingVC *vc = [[JXChatSettingVC alloc] init];\ vc.user = \f2\b \cf8 self \f0\b0 \cf4 .chatPerson;\ vc.room = \f2\b \cf8 self \f0\b0 \cf4 .room;\ vc.chatRoom = \f2\b \cf8 self \f0\b0 \cf4 .chatRoom;\ [g_navigation pushViewController:vc animated: \f2\b \cf8 YES \f0\b0 \cf4 ];\ \ \cf2 // JXSelFriendVC* vc = [JXSelFriendVC alloc];\cf4 \ \cf12 /// \f3 \cf2 / vc.chatRoom = _chatRoom; \f0 \cf4 \ \cf2 // vc.room = _room;\cf4 \ \cf2 // vc.isNewRoom = YES;\cf4 \ \cf2 // vc.isForRoom = YES;\cf4 \ \cf2 // vc.forRoomUser = chatPerson;\cf4 \ \cf2 // vc = [vc init];\cf4 \ \cf12 /// \f3 \cf2 / [g_window addSubview:vc.view]; \f0 \cf4 \ \cf2 // [g_navigation pushViewController:vc animated:YES];\cf4 \ \}\ \ - ( \f2\b \cf8 BOOL \f0\b0 \cf4 )\cf11 sendMsgCheck\cf4 \{\ \cf2 // \f1 \'d1\'e9\'d6\'a4 \f0 XMPP \f1 \'ca\'c7\'b7\'f1\'d4\'da\'cf\'df \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (g_xmpp.isLogined == login_status_no)\{\ \cf2 // [self hideKeyboard:NO];\cf4 \ \cf2 // [g_xmpp showXmppOfflineAlert];\cf4 \ \cf2 // return YES;\cf4 \ \ \cf2 // [g_xmpp logout];\cf4 \ [g_xmpp login];\ \ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .roomJid) \{\ NSString *s;\ \cf2 // \f1 \'d1\'e9\'d6\'a4\'c8\'ba\'d7\'e9\'ca\'c7\'b7\'f1\'d3\'d0\'d0\'a7 \f0 \cf4 \ \f2\b \cf8 switch \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .groupStatus intValue]) \{\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 0\cf4 :\ s = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 1\cf4 :\ s = Localized(\cf6 @"JX_OutOfTheGroup1"\cf4 );\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \f2\b \cf8 case \f0\b0 \cf4 \cf7 2\cf4 :\ s = Localized(\cf6 @"JX_DissolutionGroup1"\cf4 );\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \ \f2\b \cf8 default \f0\b0 \cf4 :\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (!s || s.length <= \cf7 0\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 (![g_xmpp.roomPool getRoom: \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.userId] && [ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.groupStatus intValue] == \cf7 0\cf4 ) \{\ [g_xmpp.roomPool joinRoom:chatPerson.userId title:chatPerson.userNickname lastDate: \f2\b \cf8 nil \f0\b0 \cf4 isNew: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \cf2 // s = Localized(@"JX_GroupConnectionFailed");\cf4 \ chatRoom = [[JXXMPP sharedInstance].roomPool joinRoom:chatPerson.userId title:chatPerson.userNickname lastDate: \f2\b \cf8 nil \f0\b0 \cf4 isNew: \f2\b \cf8 NO \f0\b0 \cf4 ];\ \}\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isDisable) \{\ s = Localized(\cf6 @"JX_GroupNotUse"\cf4 );\ \}\ \ \f2\b \cf8 if \f0\b0 \cf4 (s.length > \cf7 0\cf4 ) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 hideKeyboard: \f2\b \cf8 NO \f0\b0 \cf4 ];\ [g_server showMsg:s];\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \ \cf2 // if (!chatRoom.isConnected) \{\cf4 \ \cf2 // [_wait start];\cf4 \ \cf2 // chatRoom = [[JXXMPP sharedInstance].roomPool joinRoom:chatPerson.userId title:chatPerson.userNickname isNew:NO];\cf4 \ \cf2 // return YES;\cf4 \ \cf2 // \}\cf4 \ \ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.userId intValue] <=\cf7 10100\cf4 && [ \f2\b \cf8 self \f0\b0 \cf4 .chatPerson.userId intValue] >=\cf7 10000\cf4 ) \{\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isGroupMessages) \{\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \cf2 // \f1 \'ca\'c7\'b7\'f1\'b1\'bb\'c0\'ad\'c8\'eb\'ba\'da\'c3\'fb\'b5\'a5 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .isBeenBlack > \cf7 0\cf4 ) \{\ [g_App showAlert:Localized(\cf6 @"TO_BLACKLIST"\cf4 )];\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 YES \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \ \cf2 // if (self.friendStatus != 2 && self.friendStatus != 10) \{\cf4 \ \cf2 // [g_App showAlert:Localized(@"JX_NoFriendsWithMe")];\cf4 \ \cf2 // return YES;\cf4 \ \cf2 // \}else\cf4 \ \{\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \}\ \ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \ - ( \f2\b \cf8 BOOL \f0\b0 \cf4 )\cf11 checkCameraLimits\cf4 \{\ \cf12 ///\cf4 \f1 \cf2 \'cf\'c8\'c5\'d0\'b6\'cf\'c9\'e3\'cf\'f1\'cd\'b7\'d3\'b2\'bc\'fe\'ca\'c7\'b7\'f1\'ba\'c3\'d3\'c3 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])\ \{\ \cf2 // \f1 \'d3\'c3\'bb\'a7\'ca\'c7\'b7\'f1\'d4\'ca\'d0\'ed\'c9\'e3\'cf\'f1\'cd\'b7\'ca\'b9\'d3\'c3 \f0 \cf4 \ NSString * mediaType = AVMediaTypeVideo;\ AVAuthorizationStatus authorizationStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];\ \cf2 // \f1 \'b2\'bb\'d4\'ca\'d0\'ed\'b5\'af\'b3\'f6\'cc\'e1\'ca\'be\'bf\'f2 \f0 \cf4 \ \f2\b \cf8 if \f0\b0 \cf4 (authorizationStatus == AVAuthorizationStatusRestricted|| authorizationStatus == AVAuthorizationStatusDenied) \{\ \ UIAlertController * alert = [UIAlertController alertControllerWithTitle:Localized(\cf6 @"JX_CameraNotTake"\cf4 ) message: \f2\b \cf8 nil \f0\b0 \cf4 preferredStyle:UIAlertControllerStyleAlert];\ UIAlertAction * action = [UIAlertAction actionWithTitle:Localized(\cf6 @"JXSettingVC_Set"\cf4 ) style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) \{\ \cf2 // \f1 \'ce\'de\'c8\'a8\'cf\'de \f0 \f1 \'d2\'fd\'b5\'bc\'c8\'a5\'bf\'aa\'c6\'f4 \f0 \cf4 \ NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];\ \f2\b \cf8 if \f0\b0 \cf4 ([[UIApplication sharedApplication] canOpenURL:url]) \{\ [[UIApplication sharedApplication] openURL:url];\ \}\ \}];\ UIAlertAction * actionCancel = [UIAlertAction actionWithTitle:Localized(\cf6 @"JX_Cencal"\cf4 ) style:UIAlertActionStyleCancel handler:^(UIAlertAction * \f2\b \cf8 _Nonnull \f0\b0 \cf4 action) \{\ \}];\ [alert addAction:action];\ [alert addAction:actionCancel];\ \ [ \f2\b \cf8 self \f0\b0 \cf4 presentViewController:alert animated: \f2\b \cf8 YES \f0\b0 \cf4 completion: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 NO \f0\b0 \cf4 ;\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // \f1 \'d5\'e2\'c0\'ef\'ca\'c7\'c9\'e3\'cf\'f1\'cd\'b7\'bf\'c9\'d2\'d4\'ca\'b9\'d3\'c3\'b5\'c4\'b4\'a6\'c0\'ed\'c2\'df\'bc\'ad \f0 \cf4 \ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 YES \f0\b0 \cf4 ;\ \}\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ \cf2 // \f1 \'d3\'b2\'bc\'fe\'ce\'ca\'cc\'e2\'cc\'e1\'ca\'be \f0 \cf4 \ [g_App showAlert:Localized(\cf6 @"JX_CameraBad"\cf4 )];\ \f2\b \cf8 return \f0\b0 \cf4 \f2\b \cf8 NO \f0\b0 \cf4 ;\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 showCallMsg\cf4 :(NSNotification *)notifice\{\ JXMessageObject *msg = (JXMessageObject *)notifice.object;\ \f2\b \cf8 if \f0\b0 \cf4 (msg== \f2\b \cf8 nil \f0\b0 \cf4 )\{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ _messageText.text = msg.content;\ [ \f2\b \cf8 self \f0\b0 \cf4 sendIt: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 addWaitGroupSendViewWithMsgNum\cf4 :(NSInteger )msgNum \cf11 withType\cf4 :(NSInteger )type\{\ _sendedNum = \cf7 0\cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .groupMessagesIndex = \cf7 0\cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .groupSendMsgArray = \f2\b \cf8 nil \f0\b0 \cf4 ;\ _groupSendType = type;\ \f2\b \cf8 self \f0\b0 \cf4 .groupSendAllNum = \f2\b \cf8 self \f0\b0 \cf4 .userIds.count * msgNum;\ _isGroupSendCancel = \f2\b \cf8 NO \f0\b0 \cf4 ;\ \f2\b \cf8 self \f0\b0 \cf4 .imgsAndVideosDic = \f2\b \cf8 nil \f0\b0 \cf4 ;\ \ \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendView = [[UIView alloc] initWithFrame: \f2\b \cf8 self \f0\b0 \cf4 .view.bounds];\ \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendView.backgroundColor = [UIColor clearColor];\ [ \f2\b \cf8 self \f0\b0 \cf4 .view addSubview: \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendView];\ [ \f2\b \cf8 self \f0\b0 \cf4 .view bringSubviewToFront: \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendView];\ \ UIView *centerView = [[UIView alloc] initWithFrame:CGRectMake(\cf7 0\cf4 , \cf7 0\cf4 , \cf7 100\cf4 , \cf7 80\cf4 )];\ centerView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:\cf7 0.5\cf4 ];\ centerView.layer.cornerRadius = \cf7 5.f\cf4 ;\ centerView.layer.masksToBounds = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendView addSubview:centerView];\ centerView.center = \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendView.center;\ \ UILabel *lab = [[UILabel alloc] initWithFrame:CGRectMake(\cf7 0\cf4 , \cf7 20\cf4 , \cf7 100\cf4 , \cf7 20\cf4 )];\ [lab setTextColor:[UIColor whiteColor]];\ [lab setFont:g_factory.font12];\ [lab setText:\cf6 @" \f1 \'d5\'fd\'d4\'da\'b7\'a2\'cb\'cd\'a3\'ba \f0 "\cf4 ];\ [lab setTextAlignment:NSTextAlignmentCenter];\ [lab setBackgroundColor:[UIColor clearColor]];\ [centerView addSubview:lab];\ \ \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendLable = [[UILabel alloc] initWithFrame:CGRectMake(\cf7 0\cf4 , \cf7 40\cf4 , \cf7 100\cf4 , \cf7 20\cf4 )];\ [ \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendLable setTextAlignment:NSTextAlignmentCenter];\ [ \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendLable setBackgroundColor:[UIColor clearColor]];\ [ \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendLable setTextColor:[UIColor whiteColor]];\ [ \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendLable setFont:g_factory.font12];\ [ \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendLable setText:[NSString stringWithFormat:\cf6 @"%ld/%ld"\cf4 ,( \f2\b \cf8 long \f0\b0 \cf4 )_sendedNum,( \f2\b \cf8 long \f0\b0 \cf4 ) \f2\b \cf8 self \f0\b0 \cf4 .groupSendAllNum]];\ [centerView addSubview: \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendLable];\ \ UIButton *cancelButton = [[UIButton alloc] initWithFrame:CGRectMake(\cf7 85\cf4 , \cf7 5\cf4 , \cf7 10\cf4 , \cf7 10\cf4 )];\ [cancelButton setImage:[UIImage imageNamed:\cf6 @"close_preview"\cf4 ] forState:UIControlStateNormal];\ [cancelButton addTarget: \f2\b \cf8 self \f0\b0 \cf4 action: \f2\b \cf8 @selector \f0\b0 \cf4 (groupSendCancel) forControlEvents:UIControlEventTouchUpInside];\ [centerView addSubview:cancelButton];\ \ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 groupSendCancel\cf4 \{\ UIAlertController *alert = [[UIAlertController alloc] init];\ alert.title = \cf6 @" \f1 \'ca\'c7\'b7\'f1\'cd\'a3\'d6\'b9\'b7\'a2\'cb\'cd \f0 "\cf4 ;\ UIAlertAction *cancel = [UIAlertAction actionWithTitle:\cf6 @" \f1 \'c8\'a1\'cf\'fb \f0 "\cf4 style:UIAlertActionStyleCancel handler: \f2\b \cf8 nil \f0\b0 \cf4 ];\ UIAlertAction *ok = [UIAlertAction actionWithTitle:\cf6 @" \f1 \'c8\'b7\'c8\'cf \f0 "\cf4 style:UIAlertActionStyleDefault handler:^(UIAlertAction * \f2\b \cf8 _Nonnull \f0\b0 \cf4 action) \{\ _isGroupSendCancel = \f2\b \cf8 YES \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendView removeFromSuperview];\ \}];\ [alert addAction:cancel];\ [alert addAction:ok];\ [ \f2\b \cf8 self \f0\b0 \cf4 presentViewController:alert animated: \f2\b \cf8 YES \f0\b0 \cf4 completion: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 keepOnGroupSend\cf4 :(NSNotification *)notifice\{\ _sendedNum ++;\ JXMessageObject *msg = (JXMessageObject *)notifice.object;\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendView) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendLable setText:[NSString stringWithFormat:\cf6 @"%ld/%ld"\cf4 ,( \f2\b \cf8 long \f0\b0 \cf4 )_sendedNum,( \f2\b \cf8 long \f0\b0 \cf4 ) \f2\b \cf8 self \f0\b0 \cf4 .groupSendAllNum]];\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (_sendedNum == \f2\b \cf8 self \f0\b0 \cf4 .groupSendAllNum) \{\ \f2\b \cf8 if \f0\b0 \cf4 ( \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendView) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendView removeFromSuperview];\ [g_App showAlert:Localized(\cf6 @"JX_SendComplete"\cf4 )];\ \}\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 if \f0\b0 \cf4 (msg.isLastGroupSend) \{\ \f2\b \cf8 switch \f0\b0 \cf4 (_groupSendType) \{\ \f2\b \cf8 case \f0\b0 \cf4 groupsend_msgType_text:\{\ [ \f2\b \cf8 self \f0\b0 \cf4 sendIt: \f2\b \cf8 nil \f0\b0 \cf4 ];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 case \f0\b0 \cf4 groupsend_msgType_shake:\{\ [ \f2\b \cf8 self \f0\b0 \cf4 onShake];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 case \f0\b0 \cf4 groupsend_msgType_addressbook:\{\ JXSelectAddressBookVC *selectVC = \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray.lastObject;\ [ \f2\b \cf8 self \f0\b0 \cf4 selectAddressBookVC:selectVC doneAction: \f2\b \cf8 self \f0\b0 \cf4 .groupSendMsgArray];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 case \f0\b0 \cf4 groupsend_msgType_card:\{\ JXSelectFriendsVC *vc = \f2\b \cf8 self \f0\b0 \cf4 .groupSendMsgArray.lastObject;\ [ \f2\b \cf8 self \f0\b0 \cf4 onAfterAddMember:vc];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 case \f0\b0 \cf4 groupsend_msgType_collect:\{\ \f2\b \cf8 if \f0\b0 \cf4 ([ \f2\b \cf8 self \f0\b0 \cf4 .groupSendMsgArray.lastObject isKindOfClass:[WeiboData \f2\b \cf8 class \f0\b0 \cf4 ]]) \{\ WeiboData *data = \f2\b \cf8 self \f0\b0 \cf4 .groupSendMsgArray.lastObject;\ WeiboViewControlle *vc = \f2\b \cf8 nil \f0\b0 \cf4 ;\ [ \f2\b \cf8 self \f0\b0 \cf4 weiboVC:vc didSelectWithData:data];\ \} \f2\b \cf8 else \f0\b0 \cf4 \{\ [ \f2\b \cf8 self \f0\b0 \cf4 collectionMsgSendAll: \f2\b \cf8 self \f0\b0 \cf4 .groupSendMsgArray];\ \}\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 case \f0\b0 \cf4 groupsend_msgType_location:\{\ [ \f2\b \cf8 self \f0\b0 \cf4 onSelLocation: \f2\b \cf8 self \f0\b0 \cf4 .mapData];\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \f2\b \cf8 default \f0\b0 \cf4 :\ \f2\b \cf8 break \f0\b0 \cf4 ;\ \}\ \}\ \}\ \ - ( \f2\b \cf8 void \f0\b0 \cf4 )\cf11 keepOnUplpadGroupSend\cf4 \{\ _sendedNum++;\ \f2\b \cf8 if \f0\b0 \cf4 (_sendedNum > \f2\b \cf8 self \f0\b0 \cf4 .groupSendAllNum) \{\ \f2\b \cf8 return \f0\b0 \cf4 ;\ \}\ [ \f2\b \cf8 self \f0\b0 \cf4 .waitGroupSendLable setText:[NSString stringWithFormat:\cf6 @"%ld/%ld"\cf4 ,( \f2\b \cf8 long \f0\b0 \cf4 )_sendedNum,( \f2\b \cf8 long \f0\b0 \cf4 ) \f2\b \cf8 self \f0\b0 \cf4 .groupSendAllNum]];\ \f2\b \cf8 if \f0\b0 \cf4 (_sendedNum % \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray.count == \cf7 0\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 ((_sendedNum / \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray.count) % _onceSendNum == \cf7 0\cf4 ) \{\ \f2\b \cf8 if \f0\b0 \cf4 (_groupSendType == groupsend_msgType_image) \{\ [ \f2\b \cf8 self \f0\b0 \cf4 sendPhotos: \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray withOriginal:_isOriginal];\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (_groupSendType == groupsend_msgType_video)\{\ [ \f2\b \cf8 self \f0\b0 \cf4 sendMedias: \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray isSave:_isOriginal];\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (_groupSendType == groupsend_msgType_audio)\{\ [ \f2\b \cf8 self \f0\b0 \cf4 sendVoices: \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray];\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (_groupSendType == groupsend_msgType_file)\{\ [ \f2\b \cf8 self \f0\b0 \cf4 sendFiles: \f2\b \cf8 self \f0\b0 \cf4 .groupUploadObjArray];\ \} \f2\b \cf8 else \f0\b0 \cf4 \f2\b \cf8 if \f0\b0 \cf4 (_groupSendType == groupsend_msgType_imagesAndVideos)\{\ [ \f2\b \cf8 self \f0\b0 \cf4 sendImagesAndVideos: \f2\b \cf8 self \f0\b0 \cf4 .imgsAndVideosDic];\ \}\ \}\ \}\ \}\ \cf2 //\cf4 \ \cf2 //\cf4 \ \cf2 //\cf4 \ \f2\b \cf8 @end \f0\b0 \cf4 \ }