├── .gitignore ├── ContacterModule ├── DB │ └── JCVerificationInfoDB.swift ├── Model │ └── JCVerificationInfo.swift ├── View │ ├── JCContacterCell.swift │ ├── JCDoubleButtonCell.swift │ ├── JCResaonCell.swift │ ├── JCSearchController.swift │ ├── JCTableViewCell.swift │ ├── JCUserAvatorCell.swift │ ├── JCUserInfoCell.swift │ └── JCVerificationCell.swift └── ViewController │ ├── JCAddFriendViewController.swift │ ├── JCContactsViewController.swift │ ├── JCFriendSettingViewController.swift │ ├── JCGroupDescViewController.swift │ ├── JCGroupListViewController.swift │ ├── JCGroupNameViewController.swift │ ├── JCIdentityVerificationViewController.swift │ ├── JCMoreResultViewController.swift │ ├── JCSearchFriendViewController.swift │ ├── JCSearchResultViewController.swift │ ├── JCUserInfoViewController.swift │ └── JCVerificationDetailViewController.swift ├── Images ├── 1.gif └── 2.jpg ├── JChat.xcodeproj ├── project.pbxproj └── project.xcworkspace │ └── contents.xcworkspacedata ├── JChat.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── JChat ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── iOS icon 120.png │ │ └── iOS icon 180.png │ ├── Contents.json │ └── LaunchImage.launchimage │ │ ├── Contents.json │ │ ├── ios_1125_2436.png │ │ ├── ios_1242-2208.png │ │ ├── ios_640-1136.png │ │ ├── ios_640-960-copy.png │ │ └── ios_750-1334.png ├── Info.plist ├── JChat-Bridging-Header.h ├── JChat.entitlements ├── Resources │ ├── Themes │ │ └── emoticons.bundle │ │ │ ├── cn.com.a-li │ │ │ ├── 285f3a4de507b1bd33c450aa7c003924@2x.png │ │ │ ├── 29cce34d5eefcb45926e85bec21ed2da@2x.png │ │ │ ├── 7102df423b57a50c8ab077b6f0358f18@2x.png │ │ │ ├── 74e369456ef0626c6c1a4c0e16994b9d@2x.png │ │ │ ├── 7ae989bacebdc5cdaf73293023b19b3c@2x.png │ │ │ ├── 84c4b60449c26dfebf83bda748be7853@2x.png │ │ │ ├── 940a83613ff938fb86f857c3baa0eeed@2x.png │ │ │ ├── Info.plist │ │ │ ├── aa50438bcbd8542b7eb05163d9506482@2x.png │ │ │ ├── f89ac3021df353b3c16b39e9725793c0@2x.png │ │ │ ├── fbd44750aeb9790f80f420bc333b221e@2x.png │ │ │ └── icon@2x.png │ │ │ ├── cn.jchat.guangguang │ │ │ ├── 01@3x.png │ │ │ ├── 02@3x.png │ │ │ ├── 03@3x.png │ │ │ ├── 04@3x.png │ │ │ ├── 05@3x.png │ │ │ ├── 06@3x.png │ │ │ ├── 07@3x.png │ │ │ ├── 08@3x.png │ │ │ ├── 09@3x.png │ │ │ ├── 10@3x.png │ │ │ ├── 11@3x.png │ │ │ ├── 12@3x.png │ │ │ ├── 13@3x.png │ │ │ ├── 14@3x.png │ │ │ ├── 15@3x.png │ │ │ ├── 16@3x.png │ │ │ ├── 17@3x.png │ │ │ ├── 18@3x.png │ │ │ ├── 19@3x.png │ │ │ ├── 20@3x.png │ │ │ ├── 21@3x.png │ │ │ ├── 22@3x.png │ │ │ ├── 23@3x.png │ │ │ ├── 24@3x.png │ │ │ ├── Info.plist │ │ │ └── icon.png │ │ │ ├── com.apple.emoji │ │ │ ├── Info.plist │ │ │ └── icon@2x.png │ │ │ ├── com.qq.classic │ │ │ ├── 001@2x.png │ │ │ ├── 002@2x.png │ │ │ ├── 003@2x.png │ │ │ ├── 004@2x.png │ │ │ ├── 005@2x.png │ │ │ ├── 006@2x.png │ │ │ ├── 007@2x.png │ │ │ ├── 008@2x.png │ │ │ ├── 009@2x.png │ │ │ ├── 010@2x.png │ │ │ ├── 011@2x.png │ │ │ ├── 012@2x.png │ │ │ ├── 013@2x.png │ │ │ ├── 014@2x.png │ │ │ ├── 015@2x.png │ │ │ ├── 016@2x.png │ │ │ ├── 017@2x.png │ │ │ ├── 018@2x.png │ │ │ ├── 019@2x.png │ │ │ ├── 020@2x.png │ │ │ ├── 021@2x.png │ │ │ ├── 022@2x.png │ │ │ ├── 023@2x.png │ │ │ ├── 024@2x.png │ │ │ ├── 025@2x.png │ │ │ ├── 026@2x.png │ │ │ ├── 027@2x.png │ │ │ ├── 028@2x.png │ │ │ ├── 029@2x.png │ │ │ ├── 030@2x.png │ │ │ ├── 031@2x.png │ │ │ ├── 032@2x.png │ │ │ ├── 033@2x.png │ │ │ ├── 034@2x.png │ │ │ ├── 035@2x.png │ │ │ ├── 036@2x.png │ │ │ ├── 037@2x.png │ │ │ ├── 038@2x.png │ │ │ ├── 039@2x.png │ │ │ ├── 040@2x.png │ │ │ ├── 041@2x.png │ │ │ ├── 042@2x.png │ │ │ ├── 043@2x.png │ │ │ ├── 044@2x.png │ │ │ ├── 045@2x.png │ │ │ ├── 046@2x.png │ │ │ ├── 047@2x.png │ │ │ ├── 048@2x.png │ │ │ ├── 049@2x.png │ │ │ ├── 050@2x.png │ │ │ ├── 051@2x.png │ │ │ ├── 052@2x.png │ │ │ ├── 053@2x.png │ │ │ ├── 054@2x.png │ │ │ ├── 055@2x.png │ │ │ ├── 056@2x.png │ │ │ ├── 057@2x.png │ │ │ ├── 058@2x.png │ │ │ ├── 059@2x.png │ │ │ ├── 060@2x.png │ │ │ ├── 061@2x.png │ │ │ ├── 062@2x.png │ │ │ ├── 063@2x.png │ │ │ ├── 064@2x.png │ │ │ ├── 065@2x.png │ │ │ ├── 066@2x.png │ │ │ ├── 067@2x.png │ │ │ ├── 068@2x.png │ │ │ ├── 069@2x.png │ │ │ ├── 070@2x.png │ │ │ ├── 071@2x.png │ │ │ ├── 072@2x.png │ │ │ ├── 073@2x.png │ │ │ ├── 074@2x.png │ │ │ ├── 075@2x.png │ │ │ ├── 076@2x.png │ │ │ ├── 077@2x.png │ │ │ ├── 078@2x.png │ │ │ ├── 079@2x.png │ │ │ ├── 080@2x.png │ │ │ ├── 081@2x.png │ │ │ ├── 082@2x.png │ │ │ ├── 083@2x.png │ │ │ ├── 084@2x.png │ │ │ ├── 085@2x.png │ │ │ ├── 086@2x.png │ │ │ ├── 087@2x.png │ │ │ ├── 088@2x.png │ │ │ ├── 089@2x.png │ │ │ ├── 090@2x.png │ │ │ ├── 091@2x.png │ │ │ ├── 092@2x.png │ │ │ ├── 093@2x.png │ │ │ ├── 094@2x.png │ │ │ ├── 095@2x.png │ │ │ ├── 096@2x.png │ │ │ ├── 097@2x.png │ │ │ ├── 098@2x.png │ │ │ ├── 099@2x.png │ │ │ ├── 100@2x.png │ │ │ ├── 101@2x.png │ │ │ ├── 102@2x.png │ │ │ ├── 103@2x.png │ │ │ ├── 104@2x.png │ │ │ ├── 105@2x.png │ │ │ ├── 106@2x.png │ │ │ ├── 107@2x.png │ │ │ ├── 108@2x.png │ │ │ ├── 109@2x.png │ │ │ ├── 110@2x.png │ │ │ ├── 111@2x.png │ │ │ ├── 112@2x.png │ │ │ ├── 113@2x.png │ │ │ ├── 114@2x.png │ │ │ ├── 115@2x.png │ │ │ ├── 116@2x.png │ │ │ ├── 117@2x.png │ │ │ ├── 118@2x.png │ │ │ ├── 119@2x.png │ │ │ ├── 120@2x.png │ │ │ ├── 121@2x.png │ │ │ ├── 122@2x.png │ │ │ ├── 123@2x.png │ │ │ ├── 124@2x.png │ │ │ ├── 125@2x.png │ │ │ ├── 126@2x.png │ │ │ ├── 127@2x.png │ │ │ ├── 128@2x.png │ │ │ ├── 129@2x.png │ │ │ ├── 130@2x.png │ │ │ ├── 131@2x.png │ │ │ ├── 132@2x.png │ │ │ ├── 133@2x.png │ │ │ ├── 134@2x.png │ │ │ ├── 135@2x.png │ │ │ ├── 136@2x.png │ │ │ ├── 137@2x.png │ │ │ ├── 138@2x.png │ │ │ ├── 139@2x.png │ │ │ ├── 140@2x.png │ │ │ ├── 141@2x.png │ │ │ ├── Info.plist │ │ │ └── icon@2x.png │ │ │ ├── emoticons.plist │ │ │ └── icon │ │ │ ├── com.apple.emoji@2x.png │ │ │ └── com.qq.classic@2x.png │ ├── yh_image_no_picked@2x.png │ ├── yh_image_no_picked@3x.png │ ├── yh_image_picked@2x.png │ └── yh_image_picked@3x.png └── Src │ ├── ChatModule │ ├── Chat │ │ ├── Model │ │ │ ├── JCCEmoticon.swift │ │ │ ├── JCCEmoticonGroup.swift │ │ │ ├── JCCEmoticonLarge.swift │ │ │ ├── JCDraft.swift │ │ │ ├── JCMessage.swift │ │ │ └── JCRemind.swift │ │ ├── Protocols │ │ │ ├── JCMessageContentViewType.swift │ │ │ ├── JCMessageOptions.swift │ │ │ ├── JCMessageType.swift │ │ │ └── JCUserType.swift │ │ ├── View │ │ │ ├── FileCell.swift │ │ │ ├── GroupAvatorCell.swift │ │ │ ├── ImageFileCell.swift │ │ │ ├── ImageFileHeader.swift │ │ │ ├── JCChatView.swift │ │ │ ├── JCChatViewCell.swift │ │ │ ├── JCChatViewData.swift │ │ │ ├── JCChatViewLayout.swift │ │ │ ├── JCChatViewLayoutAttributes.swift │ │ │ ├── JCChatViewLayoutAttributesInfo.swift │ │ │ ├── JCChatViewUpdate.swift │ │ │ ├── JCConversationCell.swift │ │ │ ├── JCGroupMemberCell.swift │ │ │ ├── JCGroupSettingCell.swift │ │ │ ├── JCMessageAvatarView.swift │ │ │ ├── JCMessageCardView.swift │ │ │ ├── JCMessageTipsView.swift │ │ │ ├── JCNetworkTipsCell.swift │ │ │ ├── JCSelectMemberCell.swift │ │ │ ├── JCSingleSettingCell.swift │ │ │ ├── JCUpdateMemberCell.swift │ │ │ ├── Message │ │ │ │ ├── JACMessageImageContentView.swift │ │ │ │ ├── JCBusinessCardContent.swift │ │ │ │ ├── JCBusinessCardContentView.swift │ │ │ │ ├── JCMessageFileContent.swift │ │ │ │ ├── JCMessageFileContentView.swift │ │ │ │ ├── JCMessageImageContent.swift │ │ │ │ ├── JCMessageLocationContent.swift │ │ │ │ ├── JCMessageLocationContentView.swift │ │ │ │ ├── JCMessageNoticeContent.swift │ │ │ │ ├── JCMessageNoticeContentView.swift │ │ │ │ ├── JCMessageTextContent.swift │ │ │ │ ├── JCMessageTextContentView.swift │ │ │ │ ├── JCMessageTimeLineContent.swift │ │ │ │ ├── JCMessageTimeLineContentView.swift │ │ │ │ ├── JCMessageVideoContent.swift │ │ │ │ ├── JCMessageVideoContentView.swift │ │ │ │ ├── JCMessageVoiceContent.swift │ │ │ │ └── JCMessageVoiceContentView.swift │ │ │ └── MorePopupView.swift │ │ └── ViewController │ │ │ ├── FileManagerViewController.swift │ │ │ ├── FileViewController.swift │ │ │ ├── FriendsBusinessCardViewController.swift │ │ │ ├── GroupAvatorViewController.swift │ │ │ ├── ImageFileViewController.swift │ │ │ ├── JCChatViewController.swift │ │ │ ├── JCConversationListViewController.swift │ │ │ ├── JCDocumentViewController.swift │ │ │ ├── JCFileDownloadViewController.swift │ │ │ ├── JCForwardViewController.swift │ │ │ ├── JCGroupMembersViewController.swift │ │ │ ├── JCGroupSettingViewController.swift │ │ │ ├── JCRemindListViewController.swift │ │ │ ├── JCRemoveMemberViewController.swift │ │ │ ├── JCSingleSettingViewController.swift │ │ │ ├── JCUpdateMemberViewController.swift │ │ │ ├── ScanQRCodeViewController.swift │ │ │ └── UnreadListViewController.swift │ └── Input │ │ ├── InputView │ │ └── Emoticon │ │ │ ├── JCEmoticon.swift │ │ │ ├── JCEmoticonBackgroundView.swift │ │ │ ├── JCEmoticonGroup.swift │ │ │ ├── JCEmoticonInputView.swift │ │ │ ├── JCEmoticonInputViewLayout.swift │ │ │ ├── JCEmoticonLine.swift │ │ │ ├── JCEmoticonPage.swift │ │ │ ├── JCEmoticonPageView.swift │ │ │ ├── JCEmoticonPreviewer.swift │ │ │ └── JCEmoticonTabItemView.swift │ │ └── Map │ │ ├── JCAddMapViewController.h │ │ ├── JCAddMapViewController.mm │ │ ├── Resources │ │ ├── icon_baidu_marker.png │ │ ├── jiantou2@2x.png │ │ ├── 定位1.png │ │ └── 定位2.png │ │ └── View │ │ ├── AddMapTableViewCell.h │ │ ├── AddMapTableViewCell.m │ │ └── AddMapTableViewCell.xib │ ├── ChatRoomModule │ ├── View │ │ ├── JCChatRoomInfoCell.swift │ │ ├── JCChatRoomListTableViewCell.swift │ │ └── JCChatRoomManagerListCell.swift │ └── ViewController │ │ ├── JCCRSearchResultViewController.swift │ │ ├── JCChatRoomAddManagerViewController.swift │ │ ├── JCChatRoomBlackOrSilentListViewController.swift │ │ ├── JCChatRoomChangeOwnerViewController.swift │ │ ├── JCChatRoomChatViewController.swift │ │ ├── JCChatRoomInfoTableViewController.swift │ │ ├── JCChatRoomInfoTableViewController.xib │ │ ├── JCChatRoomIntroduceViewController.swift │ │ ├── JCChatRoomIntroduceViewController.xib │ │ ├── JCChatRoomListViewController.swift │ │ ├── JCChatRoomManagerListViewController.swift │ │ ├── JCChatRoomNameInfoViewController.swift │ │ ├── JCChatRoomNameInfoViewController.xib │ │ └── JCSearchUserViewController.swift │ ├── ContacterModule │ ├── View │ │ └── JCSearchController.swift │ └── ViewController │ │ └── JCMoreResultViewController.swift │ ├── MainModule │ └── ViewController │ │ ├── JCMainTabBarController.swift │ │ └── JCNavigationController.swift │ ├── UserModule │ ├── Model │ │ └── UserDefaultValidationService.swift │ ├── Protocols │ │ └── UserProtocols.swift │ ├── View │ │ ├── JCButtonCell.swift │ │ ├── JCDatePickerViwe.swift │ │ ├── JCJChatInfoCell.swift │ │ ├── JCMineAvatorCell.swift │ │ ├── JCMineInfoCell.swift │ │ ├── JCMyAvatorCell.swift │ │ ├── JCMyInfoCell.swift │ │ └── JCPhotoBar.swift │ └── ViewController │ │ ├── JCFeedbackViewController.swift │ │ ├── JCJChatInfoViewController.swift │ │ ├── JCLoginViewController.swift │ │ ├── JCMineViewController.swift │ │ ├── JCMyInfoViewController.swift │ │ ├── JCNicknameViewController.swift │ │ ├── JCNoteNameViewController.swift │ │ ├── JCRegisterInfoViewController.swift │ │ ├── JCRegisterViewController.swift │ │ ├── JCSignatureViewController.swift │ │ ├── JCUpdatePassworkViewController.swift │ │ └── MyQRCodeViewController.swift │ └── Utilites │ ├── 3rdParty │ ├── AreaPickerView │ │ ├── JCAreaPickerView.swift │ │ ├── JCLocation.swift │ │ ├── addressCode │ │ └── area.plist │ ├── DLSlideView │ │ ├── DLCache │ │ │ ├── DLCacheProtocol.h │ │ │ ├── DLLRUCache.h │ │ │ └── DLLRUCache.m │ │ ├── DLCustomSlideView.h │ │ ├── DLCustomSlideView.m │ │ ├── DLSlideView.h │ │ ├── DLSlideView.m │ │ ├── DLTabbarView │ │ │ ├── DLFixedTabbarView.h │ │ │ ├── DLFixedTabbarView.m │ │ │ ├── DLScrollTabbarView.h │ │ │ ├── DLScrollTabbarView.m │ │ │ └── DLSlideTabbarProtocol.h │ │ ├── DLTabedSlideView.h │ │ ├── DLTabedSlideView.m │ │ ├── DLUtility.h │ │ └── DLUtility.m │ ├── ImageBrowser │ │ ├── JCImageBrowserViewController.swift │ │ ├── JCMessageImageCollectionViewCell.swift │ │ └── JCMessageImageCollectionViewCell.xib │ ├── InputBar │ │ ├── SAIInputAccessoryView.swift │ │ ├── SAIInputAccessoryViewLayout.swift │ │ ├── SAIInputBackgroundView.swift │ │ ├── SAIInputBar+Resource.swift │ │ ├── SAIInputBar.swift │ │ ├── SAIInputBarDisplayable.swift │ │ ├── SAIInputItem.swift │ │ ├── SAIInputItemView.swift │ │ ├── SAIInputTextField.swift │ │ ├── SAIInputTextFieldItem.swift │ │ ├── SAIInputView.swift │ │ ├── SAIToolboxInputView.swift │ │ ├── SAIToolboxInputViewLayout.swift │ │ ├── SAIToolboxItem.swift │ │ └── SAIToolboxItemView.swift │ ├── KILabel │ │ ├── KILabel.h │ │ └── KILabel.m │ └── RecordVoice │ │ ├── JCAudioPlayerHelper.swift │ │ ├── JCRecordVoiceHelper.swift │ │ └── JCRecordingView.swift │ ├── ExJMessage │ ├── Core │ │ └── ExJMessage.swift │ └── Extensions │ │ ├── JMSGConversation+.swift │ │ ├── JMSGMessage+.swift │ │ └── JMSGOptionalContent+.swift │ ├── Extension │ ├── Array+JChat.swift │ ├── Date+JChat.swift │ ├── MBProgressHUD+JChat.swift │ ├── NSLayoutConstraint+JChat.swift │ ├── String+JChat.swift │ ├── UIColor+JChat.swift │ ├── UIImage+JChat.swift │ ├── UISearchBar+JChat.swift │ ├── UITextInput+JChat.swift │ ├── UIView+JChat.swift │ └── UIViewController+JChat.swift │ ├── NetworkManager │ └── JCNetworkManager.swift │ ├── Reachability │ ├── Reachability.h │ └── Reachability.m │ ├── RxSwift │ └── Operators.swift │ ├── ThemeManager │ ├── Extensions.swift │ ├── Protocols.swift │ ├── ThemeManager.swift │ ├── blackTheme.bundle │ │ └── themeColor.txt │ └── defaultTheme.bundle │ │ ├── image │ │ ├── YH_KB_Emotion@3x.png │ │ ├── YH_KB_EmotionHL@3x.png │ │ ├── YH_KB_Keyboard@3x.png │ │ ├── YH_KB_KeyboardHL@3x.png │ │ ├── YH_KB_More@3x.png │ │ ├── YH_KB_MoreHL@3x.png │ │ ├── YH_KB_Voice@3x.png │ │ ├── YH_KB_VoiceHL@3x.png │ │ ├── chat_bubble_recive_nor@3x.png │ │ ├── chat_bubble_recive_press@3x.png │ │ ├── chat_bubble_send_nor@3x.png │ │ ├── chat_bubble_send_press@3x.png │ │ ├── chat_emoticon_btn_send_blue@2x.png │ │ ├── chat_emoticon_btn_send_blue_h@2x.png │ │ ├── chat_emoticon_btn_send_gray@2x.png │ │ ├── chat_emoticon_btn_setting@2x.png │ │ ├── chat_tool_businessCard@3x.png │ │ ├── chat_tool_camera@3x.png │ │ ├── chat_tool_location@3x.png │ │ ├── chat_tool_pic@3x.png │ │ ├── chat_tool_video_short@3x.png │ │ ├── chat_voice_receive_icon_1@3x.png │ │ ├── chat_voice_receive_icon_2@3x.png │ │ ├── chat_voice_receive_icon_3@3x.png │ │ ├── chat_voice_send_icon_1@3x.png │ │ ├── chat_voice_send_icon_2@3x.png │ │ ├── chat_voice_send_icon_3@3x.png │ │ ├── com_icon _selectList@3x.png │ │ ├── com_icon_80@3x.png │ │ ├── com_icon_about@3x.png │ │ ├── com_icon_add@3x.png │ │ ├── com_icon_add_65@3x.png │ │ ├── com_icon_add_65_pre@3x.png │ │ ├── com_icon_artboard@3x.png │ │ ├── com_icon_back@3x.png │ │ ├── com_icon_back_pre@3x.png │ │ ├── com_icon_birthday@3x.png │ │ ├── com_icon_chat@3x.png │ │ ├── com_icon_chat_pre@3x.png │ │ ├── com_icon_chatroom@3x.png │ │ ├── com_icon_chatroom_pre@3x.png │ │ ├── com_icon_contacter@3x.png │ │ ├── com_icon_contacter_pre@3x.png │ │ ├── com_icon_conv_group@3x.png │ │ ├── com_icon_conv_single@3x.png │ │ ├── com_icon_file_file@3x.png │ │ ├── com_icon_file_file_75@3x.png │ │ ├── com_icon_file_more@3x.png │ │ ├── com_icon_file_more_pre@3x.png │ │ ├── com_icon_file_music@3x.png │ │ ├── com_icon_file_other@3x.png │ │ ├── com_icon_file_photo@3x.png │ │ ├── com_icon_file_select@3x.png │ │ ├── com_icon_file_unselect@3x.png │ │ ├── com_icon_file_video@3x.png │ │ ├── com_icon_friend_add@3x.png │ │ ├── com_icon_friend_tip@3x.png │ │ ├── com_icon_gender@3x.png │ │ ├── com_icon_group_36@3x.png │ │ ├── com_icon_group_50@3x.png │ │ ├── com_icon_group_w@3x.png │ │ ├── com_icon_isSelect@3x.png │ │ ├── com_icon_mine@3x.png │ │ ├── com_icon_mine_pre@3x.png │ │ ├── com_icon_more@3x.png │ │ ├── com_icon_nickname@3x.png │ │ ├── com_icon_password@3x.png │ │ ├── com_icon_password_pre@3x.png │ │ ├── com_icon_play@3x.png │ │ ├── com_icon_play_pre@3x.png │ │ ├── com_icon_qrc_border@3x.png │ │ ├── com_icon_qrc_line@3x.png │ │ ├── com_icon_qrcode@3x.png │ │ ├── com_icon_record@3x.png │ │ ├── com_icon_record_cancel@3x.png │ │ ├── com_icon_record_error@3x.png │ │ ├── com_icon_region@3x.png │ │ ├── com_icon_remove@3x.png │ │ ├── com_icon_remove_pre@3x.png │ │ ├── com_icon_scan@3x.png │ │ ├── com_icon_select@3x.png │ │ ├── com_icon_send_error@3x.png │ │ ├── com_icon_shield@3x.png │ │ ├── com_icon_signature@3x.png │ │ ├── com_icon_single_add@3x.png │ │ ├── com_icon_single_add_per@3x.png │ │ ├── com_icon_unselect@3x.png │ │ ├── com_icon_upload@3x.png │ │ ├── com_icon_user_120@3x.png │ │ ├── com_icon_user_18@3x.png │ │ ├── com_icon_user_18_pre@3x.png │ │ ├── com_icon_user_36@3x.png │ │ ├── com_icon_user_40@3x.png │ │ ├── com_icon_user_50@3x.png │ │ ├── com_icon_user_65@3x.png │ │ ├── com_icon_user_80@3x.png │ │ ├── com_icon_user_w@3x.png │ │ ├── com_icon_username@3x.png │ │ ├── icon_icon_close@3x.png │ │ ├── icon_icon_close_pre@3x.png │ │ ├── icon_ios_add@3x.png │ │ └── location_address@3x.png │ │ └── themeColor.txt │ └── Utility │ ├── JCAlertView.swift │ ├── JCAppManager.swift │ ├── JCConstants.swift │ ├── JCFPSLabel.swift │ ├── JCFileManager.swift │ ├── JCVideoManager.swift │ └── Log.swift ├── JChatTests ├── Info.plist └── JChatTests.swift ├── JChatUITests ├── Info.plist └── JChatUITests.swift ├── LICENSE ├── Podfile └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | *.pbxuser 3 | !default.pbxuser 4 | *.mode1v3 5 | !default.mode1v3 6 | *.mode2v3 7 | !default.mode2v3 8 | *.perspectivev3 9 | !default.perspectivev3 10 | xcuserdata 11 | *.xccheckout 12 | *.moved-aside 13 | DerivedData 14 | *.hmap 15 | *.ipa 16 | *.xcuserstate 17 | Pods/ 18 | Podfile.lock 19 | 20 | -------------------------------------------------------------------------------- /ContacterModule/Model/JCVerificationInfo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCVerificationInfo.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 14/04/2017. 6 | // Copyright © 2017 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | 12 | enum JCVerificationType: Int { 13 | case wait 14 | case accept 15 | case reject 16 | case receive 17 | } 18 | 19 | 20 | class JCVerificationInfo: NSObject { 21 | var id = 0 22 | var username: String = "" 23 | var nickname: String = "" 24 | var appkey: String = "" 25 | var resaon: String = "" 26 | var state: Int = 0 27 | 28 | static func create(username: String, nickname: String?, appkey: String, resaon: String?, state: Int) -> JCVerificationInfo { 29 | let info = JCVerificationInfo() 30 | info.username = username 31 | info.nickname = nickname ?? "" 32 | info.appkey = appkey 33 | info.resaon = resaon ?? "" 34 | info.state = state 35 | return info 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /ContacterModule/View/JCResaonCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCResaonCell.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/5/25. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JCResaonCell: JCTableViewCell { 12 | 13 | var resaon: String? { 14 | get { 15 | return titleLabel.text 16 | } 17 | set { 18 | titleLabel.text = newValue 19 | } 20 | } 21 | 22 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { 23 | super.init(style: style, reuseIdentifier: reuseIdentifier) 24 | _init() 25 | } 26 | required init?(coder aDecoder: NSCoder) { 27 | super.init(coder: aDecoder) 28 | _init() 29 | } 30 | 31 | override func awakeFromNib() { 32 | super.awakeFromNib() 33 | _init() 34 | } 35 | 36 | private lazy var titleLabel: UILabel = UILabel() 37 | 38 | private func _init() { 39 | titleLabel.font = UIFont.systemFont(ofSize: 14) 40 | titleLabel.textColor = UIColor(netHex: 0x999999) 41 | 42 | addSubview(titleLabel) 43 | 44 | addConstraint(_JCLayoutConstraintMake(titleLabel, .centerY, .equal, contentView, .centerY)) 45 | addConstraint(_JCLayoutConstraintMake(titleLabel, .left, .equal, contentView, .left, 15)) 46 | addConstraint(_JCLayoutConstraintMake(titleLabel, .right, .equal, contentView, .right, -15)) 47 | addConstraint(_JCLayoutConstraintMake(titleLabel, .height, .equal, nil, .notAnAttribute, 20)) 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /ContacterModule/View/JCTableViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCTableViewCell.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/4/6. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JCTableViewCell: UITableViewCell { 12 | 13 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { 14 | super.init(style: style, reuseIdentifier: reuseIdentifier) 15 | _init() 16 | } 17 | required init?(coder aDecoder: NSCoder) { 18 | super.init(coder: aDecoder) 19 | _init() 20 | } 21 | 22 | override func awakeFromNib() { 23 | super.awakeFromNib() 24 | _init() 25 | } 26 | 27 | private lazy var line: UILabel = UILabel() 28 | 29 | private func _init() { 30 | line.backgroundColor = UIColor(netHex: 0xE8E8E8) 31 | line.layer.backgroundColor = UIColor(netHex: 0xE8E8E8).cgColor 32 | 33 | addSubview(line) 34 | 35 | addConstraint(_JCLayoutConstraintMake(line, .bottom, .equal, contentView, .bottom)) 36 | addConstraint(_JCLayoutConstraintMake(line, .left, .equal, self, .left, 15)) 37 | addConstraint(_JCLayoutConstraintMake(line, .right, .equal, self, .right, -15)) 38 | addConstraint(_JCLayoutConstraintMake(line, .height, .equal, nil, .notAnAttribute, 0.5)) 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /Images/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/Images/1.gif -------------------------------------------------------------------------------- /Images/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/Images/2.jpg -------------------------------------------------------------------------------- /JChat.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /JChat.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /JChat.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /JChat/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "29x29", 26 | "scale" : "3x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "40x40", 36 | "scale" : "3x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "57x57", 41 | "scale" : "1x" 42 | }, 43 | { 44 | "idiom" : "iphone", 45 | "size" : "57x57", 46 | "scale" : "2x" 47 | }, 48 | { 49 | "size" : "60x60", 50 | "idiom" : "iphone", 51 | "filename" : "iOS icon 120.png", 52 | "scale" : "2x" 53 | }, 54 | { 55 | "size" : "60x60", 56 | "idiom" : "iphone", 57 | "filename" : "iOS icon 180.png", 58 | "scale" : "3x" 59 | }, 60 | { 61 | "idiom" : "ios-marketing", 62 | "size" : "1024x1024", 63 | "scale" : "1x" 64 | } 65 | ], 66 | "info" : { 67 | "version" : 1, 68 | "author" : "xcode" 69 | } 70 | } -------------------------------------------------------------------------------- /JChat/Assets.xcassets/AppIcon.appiconset/iOS icon 120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Assets.xcassets/AppIcon.appiconset/iOS icon 120.png -------------------------------------------------------------------------------- /JChat/Assets.xcassets/AppIcon.appiconset/iOS icon 180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Assets.xcassets/AppIcon.appiconset/iOS icon 180.png -------------------------------------------------------------------------------- /JChat/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /JChat/Assets.xcassets/LaunchImage.launchimage/ios_1125_2436.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Assets.xcassets/LaunchImage.launchimage/ios_1125_2436.png -------------------------------------------------------------------------------- /JChat/Assets.xcassets/LaunchImage.launchimage/ios_1242-2208.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Assets.xcassets/LaunchImage.launchimage/ios_1242-2208.png -------------------------------------------------------------------------------- /JChat/Assets.xcassets/LaunchImage.launchimage/ios_640-1136.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Assets.xcassets/LaunchImage.launchimage/ios_640-1136.png -------------------------------------------------------------------------------- /JChat/Assets.xcassets/LaunchImage.launchimage/ios_640-960-copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Assets.xcassets/LaunchImage.launchimage/ios_640-960-copy.png -------------------------------------------------------------------------------- /JChat/Assets.xcassets/LaunchImage.launchimage/ios_750-1334.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Assets.xcassets/LaunchImage.launchimage/ios_750-1334.png -------------------------------------------------------------------------------- /JChat/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | zh_CN 7 | CFBundleDisplayName 8 | JChat 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 3.3.0 21 | CFBundleVersion 22 | 16 23 | LSRequiresIPhoneOS 24 | 25 | NSAppTransportSecurity 26 | 27 | NSAllowsArbitraryLoads 28 | 29 | 30 | NSCameraUsageDescription 31 | 32 | NSLocationWhenInUseUsageDescription 33 | 应用需要使用的地理位置信息 34 | NSMicrophoneUsageDescription 35 | 应用需要使用的麦克风 36 | NSPhotoLibraryAddUsageDescription 37 | 38 | NSPhotoLibraryUsageDescription 39 | 40 | UIRequiredDeviceCapabilities 41 | 42 | armv7 43 | 44 | UISupportedInterfaceOrientations 45 | 46 | UIInterfaceOrientationPortrait 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /JChat/JChat-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // BMKSwiftDemo-Bridging-Header.h 3 | // BMKSwiftDemo 4 | // 5 | // Created by wzy on 15/11/2. 6 | // Copyright © 2015年 baidu. All rights reserved. 7 | // 8 | 9 | #ifndef JChat_Bridging_Header_h 10 | #define JChat_Bridging_Header_h 11 | 12 | #import 13 | #import 14 | #import 15 | #import 16 | #import 17 | #import 18 | 19 | #import "JCAddMapViewController.h" 20 | #import 21 | #import "Reachability.h" 22 | #import "KILabel.h" 23 | #import "DLSlideView.h" 24 | #import "DLTabedSlideView.h" 25 | 26 | #endif /* JChat_Bridging_Header_h */ 27 | -------------------------------------------------------------------------------- /JChat/JChat.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | aps-environment 6 | development 7 | 8 | 9 | -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/285f3a4de507b1bd33c450aa7c003924@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/285f3a4de507b1bd33c450aa7c003924@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/29cce34d5eefcb45926e85bec21ed2da@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/29cce34d5eefcb45926e85bec21ed2da@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/7102df423b57a50c8ab077b6f0358f18@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/7102df423b57a50c8ab077b6f0358f18@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/74e369456ef0626c6c1a4c0e16994b9d@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/74e369456ef0626c6c1a4c0e16994b9d@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/7ae989bacebdc5cdaf73293023b19b3c@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/7ae989bacebdc5cdaf73293023b19b3c@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/84c4b60449c26dfebf83bda748be7853@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/84c4b60449c26dfebf83bda748be7853@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/940a83613ff938fb86f857c3baa0eeed@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/940a83613ff938fb86f857c3baa0eeed@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/aa50438bcbd8542b7eb05163d9506482@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/aa50438bcbd8542b7eb05163d9506482@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/f89ac3021df353b3c16b39e9725793c0@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/f89ac3021df353b3c16b39e9725793c0@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/fbd44750aeb9790f80f420bc333b221e@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/fbd44750aeb9790f80f420bc333b221e@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.com.a-li/icon@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/01@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/01@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/02@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/02@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/03@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/03@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/04@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/04@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/05@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/05@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/06@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/06@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/07@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/07@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/08@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/08@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/09@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/09@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/10@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/10@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/11@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/11@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/12@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/12@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/13@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/13@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/14@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/14@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/15@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/15@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/16@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/16@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/17@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/17@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/18@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/18@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/19@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/19@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/20@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/21@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/21@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/22@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/22@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/23@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/23@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/24@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/24@3x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/cn.jchat.guangguang/icon.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.apple.emoji/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.apple.emoji/icon@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/001@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/001@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/002@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/002@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/003@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/003@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/004@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/004@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/005@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/005@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/006@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/006@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/007@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/007@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/008@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/008@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/009@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/009@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/010@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/010@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/011@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/011@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/012@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/012@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/013@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/013@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/014@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/014@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/015@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/015@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/016@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/016@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/017@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/017@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/018@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/018@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/019@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/019@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/020@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/020@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/021@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/021@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/022@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/022@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/023@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/023@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/024@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/024@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/025@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/025@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/026@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/026@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/027@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/027@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/028@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/028@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/029@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/029@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/030@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/030@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/031@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/031@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/032@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/032@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/033@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/033@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/034@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/034@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/035@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/035@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/036@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/036@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/037@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/037@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/038@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/038@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/039@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/039@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/040@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/040@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/041@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/041@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/042@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/042@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/043@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/043@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/044@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/044@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/045@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/045@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/046@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/046@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/047@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/047@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/048@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/048@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/049@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/049@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/050@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/050@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/051@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/051@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/052@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/052@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/053@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/053@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/054@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/054@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/055@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/055@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/056@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/056@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/057@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/057@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/058@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/058@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/059@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/059@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/060@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/060@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/061@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/061@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/062@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/062@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/063@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/063@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/064@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/064@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/065@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/065@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/066@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/066@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/067@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/067@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/068@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/068@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/069@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/069@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/070@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/070@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/071@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/071@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/072@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/072@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/073@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/073@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/074@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/074@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/075@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/075@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/076@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/076@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/077@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/077@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/078@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/078@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/079@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/079@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/080@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/080@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/081@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/081@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/082@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/082@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/083@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/083@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/084@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/084@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/085@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/085@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/086@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/086@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/087@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/087@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/088@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/088@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/089@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/089@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/090@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/090@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/091@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/091@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/092@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/092@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/093@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/093@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/094@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/094@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/095@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/095@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/096@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/096@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/097@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/097@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/098@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/098@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/099@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/099@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/100@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/100@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/101@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/101@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/102@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/102@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/103@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/103@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/104@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/104@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/105@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/105@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/106@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/106@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/107@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/107@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/108@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/108@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/109@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/109@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/110@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/110@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/111@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/111@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/112@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/112@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/113@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/113@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/114@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/114@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/115@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/115@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/116@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/116@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/117@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/117@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/118@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/118@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/119@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/119@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/120@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/120@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/121@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/121@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/122@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/122@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/123@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/123@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/124@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/124@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/125@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/125@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/126@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/126@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/127@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/127@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/128@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/129@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/129@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/130@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/130@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/131@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/131@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/132@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/132@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/133@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/133@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/134@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/134@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/135@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/135@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/136@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/136@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/137@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/137@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/138@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/138@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/139@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/139@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/140@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/140@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/141@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/141@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/com.qq.classic/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/com.qq.classic/icon@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/emoticons.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | image 7 | icon/com.qq.default.png 8 | identifier 9 | com.qq.default 10 | is_default 11 | 12 | sub_groups 13 | 14 | 15 | image 16 | icon/com.apple.emoji.png 17 | identifier 18 | com.apple.emoji 19 | 20 | 21 | image 22 | icon/com.qq.classic.png 23 | identifier 24 | com.qq.classic 25 | is_default 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/icon/com.apple.emoji@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/icon/com.apple.emoji@2x.png -------------------------------------------------------------------------------- /JChat/Resources/Themes/emoticons.bundle/icon/com.qq.classic@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/Themes/emoticons.bundle/icon/com.qq.classic@2x.png -------------------------------------------------------------------------------- /JChat/Resources/yh_image_no_picked@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/yh_image_no_picked@2x.png -------------------------------------------------------------------------------- /JChat/Resources/yh_image_no_picked@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/yh_image_no_picked@3x.png -------------------------------------------------------------------------------- /JChat/Resources/yh_image_picked@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/yh_image_picked@2x.png -------------------------------------------------------------------------------- /JChat/Resources/yh_image_picked@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Resources/yh_image_picked@3x.png -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/Model/JCCEmoticon.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCCEmotiocon.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/3/9. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | open class JCCEmoticon: JCEmoticon { 12 | 13 | public required init?(object: NSDictionary) { 14 | guard let id = object["id"] as? String, let title = object["title"] as? String, let type = object["type"] as? Int else { 15 | return nil 16 | } 17 | 18 | self.id = id 19 | self.title = title 20 | 21 | super.init() 22 | 23 | self.image = object["image"] as? String 24 | self.preview = object["preview"] as? String 25 | 26 | if type == 1 { 27 | self.contents = object["contents"] 28 | } 29 | } 30 | 31 | public static func emoticons(with objects: NSArray, at directory: String) -> [JCCEmoticon] { 32 | return objects.compactMap { 33 | guard let dic = $0 as? NSDictionary else { 34 | return nil 35 | } 36 | guard let e = self.init(object: dic) else { 37 | return nil 38 | } 39 | if let name = e.preview { 40 | e.contents = UIImage(contentsOfFile: "\(directory)/\(name)") 41 | } 42 | return e 43 | } 44 | } 45 | 46 | var id: String 47 | var title: String 48 | 49 | var image: String? 50 | var preview: String? 51 | 52 | } 53 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/Model/JCCEmoticonGroup.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCCEmoticonGroup.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/3/9. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JCCEmoticonGroup: JCEmoticonGroup { 12 | @objc init?(contentsOfFile: String) { 13 | guard let dic = NSDictionary(contentsOfFile: contentsOfFile), let arr = dic["emoticons"] as? NSArray else { 14 | return nil 15 | } 16 | let directory = URL(fileURLWithPath: contentsOfFile).deletingLastPathComponent().path 17 | 18 | super.init() 19 | 20 | type = JCEmoticonType(rawValue: dic["type"] as? Int ?? 0) ?? .small 21 | rows = dic["rows"] as? Int ?? 3 22 | columns = dic["columns"] as? Int ?? 7 23 | rowsInLandscape = dic["rowsInLandscape"] as? Int ?? 2 24 | columnsInLandscape = dic["columnsInLandscape"] as? Int ?? 13 25 | 26 | if let img = dic["image"] as? String { 27 | thumbnail = UIImage(contentsOfFile: "\(directory)/\(img)") 28 | } 29 | 30 | if type.isSmall { 31 | emoticons = JCCEmoticon.emoticons(with: arr, at: directory) 32 | } else { 33 | emoticons = JCCEmoticonLarge.emoticons(with: arr, at: directory) 34 | } 35 | } 36 | 37 | convenience init?(identifier : String) { 38 | let bundle = Bundle.main 39 | guard let path = bundle.path(forResource: "emoticons.bundle/\(identifier)/Info", ofType: "plist") else { 40 | return nil 41 | } 42 | self.init(contentsOfFile: path) 43 | } 44 | 45 | open var rows: Int = 3 46 | open var columns: Int = 7 47 | open var rowsInLandscape: Int = 3 48 | open var columnsInLandscape: Int = 13 49 | } 50 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/Model/JCDraft.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCDraft.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/6/2. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JCDraft: NSObject { 12 | 13 | static var draftCache: Dictionary = Dictionary() 14 | 15 | static func update(text: String?, conversation: JMSGConversation) { 16 | let id = JCDraft.getDraftId(conversation) 17 | if text == nil || (text?.isEmpty)! { 18 | UserDefaults.standard.removeObject(forKey: id) 19 | draftCache.removeValue(forKey: id) 20 | return 21 | } 22 | UserDefaults.standard.set(text!, forKey: id) 23 | draftCache[id] = text! 24 | } 25 | 26 | static func getDraft(_ conversation: JMSGConversation) -> String? { 27 | let id = JCDraft.getDraftId(conversation) 28 | if let cache = draftCache[id] { 29 | return cache 30 | } 31 | let draft = UserDefaults.standard.object(forKey: id) as? String 32 | if draft != nil { 33 | draftCache[id] = draft 34 | } else { 35 | draftCache[id] = "" 36 | } 37 | return draft 38 | } 39 | 40 | static func getDraftId(_ conversation: JMSGConversation) -> String { 41 | var id = "" 42 | let me = JMSGUser.myInfo() 43 | if me.username.isEmpty { 44 | return "" 45 | } 46 | if conversation.ex.isGroup { 47 | guard let group = conversation.target as? JMSGGroup else { 48 | return "" 49 | } 50 | id = "\(me.username)\(me.appKey!)\(group.gid)" 51 | } else { 52 | guard let user = conversation.target as? JMSGUser else { 53 | return "" 54 | } 55 | guard let appkey = user.appKey else { 56 | return "" 57 | } 58 | id = "\(me.username)\(me.appKey!)\(user.username)\(appkey)" 59 | } 60 | return id 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/Model/JCRemind.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCRemind.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/7/19. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | class JCRemind: NSObject { 11 | 12 | var user: JMSGUser? 13 | var startIndex: Int 14 | var endIndex: Int 15 | var length: Int 16 | var isAtAll: Bool 17 | 18 | init(_ user: JMSGUser?, _ startIndex: Int, _ endIndex: Int, _ length: Int, _ isAtAll: Bool) { 19 | self.user = user 20 | self.startIndex = startIndex 21 | self.endIndex = endIndex 22 | self.length = length 23 | self.isAtAll = isAtAll 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/Protocols/JCMessageContentViewType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCMessageContentViewType.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 10/04/2017. 6 | // Copyright © 2017 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @objc public protocol JCMessageContentType: class { 12 | 13 | weak var delegate: JCMessageDelegate? { get } 14 | var layoutMargins: UIEdgeInsets { get } 15 | 16 | func sizeThatFits(_ size: CGSize) -> CGSize 17 | 18 | static var viewType: JCMessageContentViewType.Type { get } 19 | } 20 | 21 | @objc public protocol JCMessageContentViewType: class { 22 | 23 | init() 24 | func apply(_ message: JCMessageType) 25 | } 26 | 27 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/Protocols/JCMessageOptions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCMessageOptions.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/3/8. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import JMessage 11 | 12 | /// 消息类型 13 | @objc public enum JCMessageStyle: Int { 14 | case notice 15 | case bubble 16 | } 17 | 18 | /// 消息对齐方式 19 | @objc public enum JCMessageAlignment: Int { 20 | case left 21 | case right 22 | case center 23 | } 24 | 25 | @objc public enum JCMessageState: Int { 26 | case sending 27 | case sendError 28 | case sendSucceed 29 | case downloadFailed 30 | } 31 | 32 | /// 消息选项 33 | @objc open class JCMessageOptions: NSObject { 34 | 35 | public override init() { 36 | super.init() 37 | } 38 | 39 | public convenience init(with content: JCMessageContentType) { 40 | self.init() 41 | 42 | switch content { 43 | case is JCMessageNoticeContent: 44 | self.style = .notice 45 | self.alignment = .center 46 | self.showsCard = false 47 | self.showsAvatar = false 48 | self.showsBubble = true 49 | self.isUserInteractionEnabled = false 50 | 51 | case is JCMessageTimeLineContent: 52 | self.style = .notice 53 | self.alignment = .center 54 | self.showsCard = false 55 | self.showsAvatar = false 56 | self.showsBubble = false 57 | self.isUserInteractionEnabled = false 58 | 59 | // case is JCMessageImageContent: 60 | // self.showsTips = false 61 | 62 | default: 63 | break 64 | } 65 | } 66 | 67 | open var style: JCMessageStyle = .bubble 68 | open var alignment: JCMessageAlignment = .left 69 | 70 | open var isUserInteractionEnabled: Bool = true 71 | 72 | open var showsCard: Bool = false 73 | open var showsAvatar: Bool = true 74 | open var showsBubble: Bool = true 75 | open var showsTips: Bool = true 76 | open var state: JCMessageState = .sendSucceed 77 | 78 | internal func fix(with content: JCMessageContentType) { 79 | } 80 | } 81 | 82 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/Protocols/JCMessageType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCMessageType.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 10/04/2017. 6 | // Copyright © 2017 HXHG. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import JMessage 11 | 12 | @objc public enum MessageTargetType: Int { 13 | case single = 1 14 | case group = 2 15 | case chatRoom = 3 16 | } 17 | 18 | @objc public protocol JCMessageType: class { 19 | 20 | var name: String { get } 21 | var identifier: UUID { get } 22 | var msgId: String { get } 23 | var date: Date { get } 24 | var sender: JMSGUser? { get } 25 | var senderAvator: UIImage? { get } 26 | var receiver: JMSGUser? { get } 27 | var content: JCMessageContentType { get } 28 | var options: JCMessageOptions { get } 29 | var updateSizeIfNeeded: Bool { get } 30 | var unreadCount: Int { get } 31 | var targetType: MessageTargetType { get } 32 | var contentType: JMSGContentType { get } 33 | var jmessage: JMSGMessage? { get } 34 | } 35 | 36 | @objc public protocol JCMessageDelegate: NSObjectProtocol { 37 | @objc optional func message(message: JCMessageType, videoData data: Data?) 38 | @objc optional func message(message: JCMessageType, voiceData data: Data?, duration: Double) 39 | @objc optional func message(message: JCMessageType, fileData data: Data?, fileName: String?, fileType: String?) 40 | @objc optional func message(message: JCMessageType, location address: String?, lat: Double, lon: Double) 41 | @objc optional func message(message: JCMessageType, image: UIImage?) 42 | // user 对象是为了提高效率,如果 user 已经加载出来了,就直接使用,不需要重新去获取一次 43 | @objc optional func message(message: JCMessageType, user: JMSGUser?, businessCardName: String, businessCardAppKey: String) 44 | @objc optional func clickTips(message: JCMessageType) 45 | @objc optional func tapAvatarView(message: JCMessageType) 46 | @objc optional func longTapAvatarView(message: JCMessageType) 47 | @objc optional func tapUnreadTips(message: JCMessageType) 48 | } 49 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/Protocols/JCUserType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCUserType.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 10/04/2017. 6 | // Copyright © 2017 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @objc public protocol JCUserType: class { 12 | var identifier: String { get } 13 | var name: String? { get } 14 | var portrait: UIImage? { get } 15 | } 16 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/View/ImageFileHeader.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SHomeHeader.swift 3 | // 4 | // Created by wangjie on 16/5/4. 5 | // Copyright © 2016年 wangjie. All rights reserved. 6 | // 7 | 8 | import UIKit 9 | 10 | class ImageFileHeader: UICollectionReusableView { 11 | 12 | override init(frame: CGRect) { 13 | super.init(frame: frame) 14 | _init() 15 | } 16 | 17 | required init?(coder aDecoder: NSCoder) { 18 | fatalError("init(coder:) has not been implemented") 19 | } 20 | 21 | var titleLabel: UILabel! 22 | 23 | private func _init(){ 24 | titleLabel = UILabel(frame: CGRect(x: 16.5, y: 0, width: self.width, height: self.height)) 25 | titleLabel.textColor = UIColor(netHex: 0x808080) 26 | titleLabel.font = UIFont.systemFont(ofSize: 13) 27 | addSubview(titleLabel) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/View/JCChatViewData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCChatViewData.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 10/04/2017. 6 | // Copyright © 2017 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | internal class JCChatViewData: NSObject, NSCopying { 12 | 13 | internal override init() { 14 | self.elements = [] 15 | super.init() 16 | } 17 | internal init(elements: [JCMessageType]) { 18 | self.elements = elements 19 | super.init() 20 | } 21 | 22 | internal var count: Int { 23 | return elements.count 24 | } 25 | 26 | func copy(with zone: NSZone? = nil) -> Any { 27 | return JCChatViewData(elements: self.elements) 28 | } 29 | 30 | 31 | internal subscript(index: Int) -> JCMessageType { 32 | return elements[index] 33 | } 34 | 35 | 36 | internal func subarray(with subrange: Range) -> Array { 37 | return Array(elements[subrange]) 38 | } 39 | 40 | internal func replaceSubrange(_ subrange: Range, with collection: Array) { 41 | elements.replaceSubrange(subrange, with: collection) 42 | } 43 | 44 | 45 | internal var elements: [JCMessageType] 46 | } 47 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/View/JCChatViewLayoutAttributes.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCChatViewLayoutAttributes.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/3/1. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @objc public enum JCChatViewLayoutItem: Int { 12 | case all 13 | case card 14 | case avatar 15 | case bubble 16 | case content 17 | case tips 18 | } 19 | 20 | @objc open class JCChatViewLayoutAttributes: UICollectionViewLayoutAttributes { 21 | 22 | public override init() { 23 | super.init() 24 | } 25 | 26 | open override func copy(with zone: NSZone? = nil) -> Any { 27 | let new = super.copy(with: zone) 28 | if let new = new as? JCChatViewLayoutAttributes { 29 | new.info = info 30 | } 31 | return new 32 | } 33 | 34 | open var message: JCMessageType? { 35 | return info?.message 36 | } 37 | 38 | open var info: JCChatViewLayoutAttributesInfo? 39 | } 40 | 41 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/View/JCChatViewLayoutAttributesInfo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCChatViewLayoutAttributesInfo.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 10/04/2017. 6 | // Copyright © 2017 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @objc open class JCChatViewLayoutAttributesInfo: NSObject { 12 | 13 | public init(message: JCMessageType, size: CGSize, rects: [JCChatViewLayoutItem: CGRect], boxRects: [JCChatViewLayoutItem: CGRect]) { 14 | _message = message 15 | _cacheSize = size 16 | _allLayoutedRects = rects 17 | _allLayoutedBoxRects = boxRects 18 | super.init() 19 | } 20 | 21 | open var message: JCMessageType { 22 | return _message 23 | } 24 | 25 | open func layoutedRect(with item: JCChatViewLayoutItem) -> CGRect { 26 | return _allLayoutedRects[item] ?? .zero 27 | } 28 | open func layoutedBoxRect(with item: JCChatViewLayoutItem) -> CGRect { 29 | return _allLayoutedBoxRects[item] ?? .zero 30 | } 31 | 32 | private var _message: JCMessageType 33 | private var _cacheSize: CGSize 34 | 35 | private var _allLayoutedRects: [JCChatViewLayoutItem: CGRect] 36 | private var _allLayoutedBoxRects: [JCChatViewLayoutItem: CGRect] 37 | 38 | } 39 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/View/JCMessageCardView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCMessageCardView.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 10/04/2017. 6 | // Copyright © 2017 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | open class JCMessageCardView: UILabel, JCMessageContentViewType { 12 | 13 | public override init(frame: CGRect) { 14 | super.init(frame: frame) 15 | _commonInit() 16 | } 17 | public required init?(coder aDecoder: NSCoder) { 18 | super.init(coder: aDecoder) 19 | _commonInit() 20 | } 21 | 22 | open func apply(_ message: JCMessageType) { 23 | let isRight = message.options.alignment == .right 24 | text = message.name 25 | textAlignment = isRight ? .right : .left 26 | } 27 | 28 | private func _commonInit() { 29 | font = UIFont.systemFont(ofSize: 14) 30 | textColor = UIColor(netHex: 0xB3B3B3) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/View/JCNetworkTipsCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCNetworkTipsCell.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/6/12. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JCNetworkTipsCell: UITableViewCell { 12 | 13 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { 14 | super.init(style: style, reuseIdentifier: reuseIdentifier) 15 | _init() 16 | } 17 | required init?(coder aDecoder: NSCoder) { 18 | super.init(coder: aDecoder) 19 | _init() 20 | } 21 | 22 | override func awakeFromNib() { 23 | super.awakeFromNib() 24 | _init() 25 | } 26 | 27 | private lazy var statueView: UIImageView = { 28 | let statueView = UIImageView() 29 | statueView.image = UIImage.loadImage("com_icon_send_error") 30 | return statueView 31 | }() 32 | private lazy var tipsLabel: UILabel = { 33 | let tipsLabel = UILabel() 34 | tipsLabel.text = "当前网络不可用,请检查您的网络设置" 35 | tipsLabel.font = UIFont.systemFont(ofSize: 14) 36 | return tipsLabel 37 | }() 38 | 39 | //MARK: - private func 40 | private func _init() { 41 | backgroundColor = UIColor(netHex: 0xFFDFE0) 42 | 43 | contentView.addSubview(statueView) 44 | contentView.addSubview(tipsLabel) 45 | 46 | addConstraint(_JCLayoutConstraintMake(tipsLabel, .left, .equal, statueView, .right, 11.5)) 47 | addConstraint(_JCLayoutConstraintMake(tipsLabel, .centerY, .equal, contentView, .centerY)) 48 | addConstraint(_JCLayoutConstraintMake(tipsLabel, .right, .equal, contentView, .right)) 49 | addConstraint(_JCLayoutConstraintMake(tipsLabel, .height, .equal, contentView, .height)) 50 | 51 | addConstraint(_JCLayoutConstraintMake(statueView, .centerY, .equal, contentView, .centerY)) 52 | addConstraint(_JCLayoutConstraintMake(statueView, .left, .equal, contentView, .left, 15)) 53 | addConstraint(_JCLayoutConstraintMake(statueView, .height, .equal, nil, .notAnAttribute, 21)) 54 | addConstraint(_JCLayoutConstraintMake(statueView, .width, .equal, nil, .notAnAttribute, 21)) 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/View/JCUpdateMemberCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCUpdateMemberCell.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/5/11. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import JMessage 11 | 12 | class JCUpdateMemberCell: UICollectionViewCell { 13 | var avator: UIImage? { 14 | get { 15 | return avatorView.image 16 | } 17 | set { 18 | avatorView.image = newValue 19 | } 20 | } 21 | 22 | public override init(frame: CGRect) { 23 | super.init(frame: frame) 24 | _init() 25 | } 26 | 27 | public required init?(coder aDecoder: NSCoder) { 28 | super.init(coder: aDecoder) 29 | _init() 30 | } 31 | 32 | private var avatorView: UIImageView = UIImageView() 33 | private lazy var defaultUserIcon = UIImage.loadImage("com_icon_user_36") 34 | 35 | private func _init() { 36 | 37 | avatorView.image = defaultUserIcon 38 | 39 | addSubview(avatorView) 40 | 41 | addConstraint(_JCLayoutConstraintMake(avatorView, .centerY, .equal, contentView, .centerY)) 42 | addConstraint(_JCLayoutConstraintMake(avatorView, .width, .equal, nil, .notAnAttribute, 36)) 43 | addConstraint(_JCLayoutConstraintMake(avatorView, .height, .equal, nil, .notAnAttribute, 36)) 44 | addConstraint(_JCLayoutConstraintMake(avatorView, .centerX, .equal, contentView, .centerX)) 45 | 46 | } 47 | 48 | func bindDate(user: JMSGUser) { 49 | user.thumbAvatarData { (data, id, error) in 50 | if let data = data { 51 | let image = UIImage(data: data) 52 | self.avatorView.image = image 53 | } else { 54 | self.avatorView.image = self.defaultUserIcon 55 | } 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/View/Message/JCBusinessCardContent.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCBusinessCardContent.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/8/31. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JCBusinessCardContent: NSObject, JCMessageContentType { 12 | 13 | public weak var delegate: JCMessageDelegate? 14 | open var layoutMargins: UIEdgeInsets = .zero 15 | 16 | open class var viewType: JCMessageContentViewType.Type { 17 | return JCBusinessCardContentView.self 18 | } 19 | 20 | open var userName: String? 21 | open var appKey: String? 22 | 23 | open func sizeThatFits(_ size: CGSize) -> CGSize { 24 | return .init(width: 200, height: 87) 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/View/Message/JCMessageFileContent.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCMessageFileContent.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/7/20. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JCMessageFileContent: NSObject, JCMessageContentType { 12 | 13 | public weak var delegate: JCMessageDelegate? 14 | open var layoutMargins: UIEdgeInsets = .zero 15 | 16 | open class var viewType: JCMessageContentViewType.Type { 17 | return JCMessageFileContentView.self 18 | } 19 | 20 | open var data: Data? 21 | open var fileName: String? 22 | open var fileType: String? 23 | open var fileSize: String? 24 | 25 | open func sizeThatFits(_ size: CGSize) -> CGSize { 26 | return .init(width: 200, height: 95) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/View/Message/JCMessageImageContent.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCMessageImageContent.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/3/9. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | open class JCMessageImageContent: NSObject, JCMessageContentType { 12 | typealias uploadHandle = (_ percent: Float) -> () 13 | 14 | public weak var delegate: JCMessageDelegate? 15 | var upload: uploadHandle? 16 | var imageSize: CGSize? 17 | open var image: UIImage? 18 | open var layoutMargins: UIEdgeInsets = .zero 19 | 20 | open class var viewType: JCMessageContentViewType.Type { 21 | return JCMessageImageContentView.self 22 | } 23 | 24 | open func sizeThatFits(_ size: CGSize) -> CGSize { 25 | if image == nil { 26 | image = UIImage.createImage(color: UIColor(netHex: 0xCDD0D1), size: imageSize ?? CGSize(width: 160, height: 160)) 27 | } 28 | let size = imageSize ?? (image?.size)! 29 | let scale = min(min(160, size.width) / size.width, min(160, size.height) / size.height) 30 | let w = size.width * scale 31 | let h = size.height * scale 32 | return .init(width: w, height: h) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/View/Message/JCMessageLocationContent.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCMessageLocationContent.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/4/19. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JCMessageLocationContent: NSObject, JCMessageContentType { 12 | 13 | public weak var delegate: JCMessageDelegate? 14 | open var layoutMargins: UIEdgeInsets = .zero 15 | open class var viewType: JCMessageContentViewType.Type { 16 | return JCMessageLocationContentView.self 17 | } 18 | 19 | open var address: String? 20 | open var lon: Double? 21 | open var lat: Double? 22 | 23 | open func sizeThatFits(_ size: CGSize) -> CGSize { 24 | return .init(width: 141, height: 91) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/View/Message/JCMessageNoticeContent.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCMessageNoticeContent.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/3/9. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | open class JCMessageNoticeContent: NSObject, JCMessageContentType { 12 | public weak var delegate: JCMessageDelegate? 13 | 14 | open var layoutMargins: UIEdgeInsets = .zero 15 | 16 | open class var viewType: JCMessageContentViewType.Type { 17 | return JCMessageNoticeContentView.self 18 | } 19 | 20 | public init(text: String) { 21 | self.text = text 22 | super.init() 23 | } 24 | 25 | open var text: String 26 | 27 | open func sizeThatFits(_ size: CGSize) -> CGSize { 28 | 29 | let attr = NSMutableAttributedString(string: text, attributes: convertToOptionalNSAttributedStringKeyDictionary([ 30 | convertFromNSAttributedStringKey(NSAttributedString.Key.font): UIFont.systemFont(ofSize: 12), 31 | convertFromNSAttributedStringKey(NSAttributedString.Key.foregroundColor): UIColor.white, 32 | ])) 33 | let mattrSize = attr.boundingRect(with: CGSize(width: 250.0, height: Double(MAXFLOAT)), options: [.usesLineFragmentOrigin,.usesFontLeading], context: nil) 34 | let size = CGSize(width: mattrSize.size.width + 11, height: mattrSize.size.height + 4) 35 | return size 36 | } 37 | 38 | public static let unsupport: JCMessageNoticeContent = JCMessageNoticeContent(text: "The message does not support") 39 | } 40 | 41 | // Helper function inserted by Swift 4.2 migrator. 42 | fileprivate func convertToOptionalNSAttributedStringKeyDictionary(_ input: [String: Any]?) -> [NSAttributedString.Key: Any]? { 43 | guard let input = input else { return nil } 44 | return Dictionary(uniqueKeysWithValues: input.map { key, value in (NSAttributedString.Key(rawValue: key), value)}) 45 | } 46 | 47 | // Helper function inserted by Swift 4.2 migrator. 48 | fileprivate func convertFromNSAttributedStringKey(_ input: NSAttributedString.Key) -> String { 49 | return input.rawValue 50 | } 51 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/View/Message/JCMessageNoticeContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCMessageNoticeContentView.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/3/9. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | open class JCMessageNoticeContentView: UILabel, JCMessageContentViewType { 12 | 13 | public override init(frame: CGRect) { 14 | super.init(frame: frame) 15 | _commonInit() 16 | } 17 | public required init?(coder aDecoder: NSCoder) { 18 | super.init(coder: aDecoder) 19 | _commonInit() 20 | } 21 | 22 | 23 | open func apply(_ message: JCMessageType) { 24 | guard let content = message.content as? JCMessageNoticeContent else { 25 | return 26 | } 27 | text = content.text 28 | } 29 | 30 | private func _commonInit() { 31 | layer.cornerRadius = 2.5 32 | layer.borderWidth = 1.0 33 | layer.borderColor = UIColor(netHex: 0xD7DCE2).cgColor 34 | layer.masksToBounds = true 35 | font = UIFont.systemFont(ofSize: 12) 36 | backgroundColor = UIColor(netHex: 0xD7DCE2) 37 | textColor = .white 38 | textAlignment = .center 39 | numberOfLines = 0 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/View/Message/JCMessageTextContent.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCMessageTextContent.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/3/9. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | open class JCMessageTextContent: NSObject, JCMessageContentType { 12 | public weak var delegate: JCMessageDelegate? 13 | public override init() { 14 | let text = "this is a test text" 15 | self.text = NSAttributedString(string: text) 16 | super.init() 17 | } 18 | public init(text: String) { 19 | self.text = NSAttributedString(string: text) 20 | super.init() 21 | } 22 | public init(attributedText: NSAttributedString) { 23 | self.text = attributedText 24 | super.init() 25 | } 26 | 27 | open class var viewType: JCMessageContentViewType.Type { 28 | return JCMessageTextContentView.self 29 | } 30 | open var layoutMargins: UIEdgeInsets = .init(top: 9, left: 10, bottom: 9, right: 10) 31 | 32 | open var text: NSAttributedString 33 | 34 | open func sizeThatFits(_ size: CGSize) -> CGSize { 35 | let mattr = NSMutableAttributedString(attributedString: text) 36 | mattr.addAttribute(NSAttributedString.Key.font, value: UIFont.systemFont(ofSize: 16), range: NSMakeRange(0, mattr.length)) 37 | 38 | let mattrSize = mattr.boundingRect(with: CGSize(width: 220.0, height: Double(MAXFLOAT)), options: [.usesLineFragmentOrigin,.usesFontLeading], context: nil) 39 | self.text = mattr 40 | return .init(width: max(mattrSize.width, 15), height: max(mattrSize.height, 15)) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/View/Message/JCMessageTextContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCMessageTextContentView.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/3/9. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | open class JCMessageTextContentView: KILabel, JCMessageContentViewType { 12 | 13 | public override init(frame: CGRect) { 14 | super.init(frame: frame) 15 | _commonInit() 16 | } 17 | public required init?(coder aDecoder: NSCoder) { 18 | super.init(coder: aDecoder) 19 | _commonInit() 20 | } 21 | 22 | open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { 23 | return super.canPerformAction(action, withSender: sender) 24 | } 25 | 26 | open func apply(_ message: JCMessageType) { 27 | guard let content = message.content as? JCMessageTextContent else { 28 | return 29 | } 30 | self.attributedText = content.text 31 | self.linkDetectionTypes = KILinkTypeOption.URL 32 | self.urlLinkTapHandler = { label, url, range in 33 | if let Url = URL(string: url) { 34 | if UIApplication.shared.canOpenURL(Url) { 35 | UIApplication.shared.openURL(Url) 36 | } else { 37 | let newUrl = URL(string: "https://" + url) 38 | UIApplication.shared.openURL(newUrl!) 39 | } 40 | } 41 | } 42 | } 43 | 44 | private func _commonInit() { 45 | self.numberOfLines = 0 46 | } 47 | } 48 | 49 | 50 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/View/Message/JCMessageTimeLineContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCMessageTimeLineContentView.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/3/9. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | open class JCMessageTimeLineContentView: UILabel, JCMessageContentViewType { 12 | 13 | public override init(frame: CGRect) { 14 | super.init(frame: frame) 15 | _commonInit() 16 | } 17 | public required init?(coder aDecoder: NSCoder) { 18 | super.init(coder: aDecoder) 19 | _commonInit() 20 | } 21 | 22 | open func apply(_ message: JCMessageType) { 23 | guard let content = message.content as? JCMessageTimeLineContent else { 24 | return 25 | } 26 | text = content.text 27 | } 28 | 29 | private func _commonInit() { 30 | layer.cornerRadius = 2.5 31 | layer.borderWidth = 1.0 32 | layer.borderColor = UIColor(netHex: 0xD7DCE2).cgColor 33 | layer.masksToBounds = true 34 | font = UIFont.systemFont(ofSize: 12) 35 | backgroundColor = UIColor(netHex: 0xD7DCE2) 36 | textColor = .white 37 | textAlignment = .center 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/View/Message/JCMessageVideoContent.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCMessageVideoContent.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/3/9. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import JMessage 11 | 12 | let JC_VIDEO_MSG_IMAGE_WIDTH: CGFloat = 160.0 13 | let JC_VIDEO_MSG_IMAGE_HEIGHT: CGFloat = 120.0 14 | 15 | open class JCMessageVideoContent: NSObject, JCMessageContentType { 16 | 17 | typealias uploadVideoHandle = (_ percent: Float) -> () 18 | 19 | public weak var delegate: JCMessageDelegate? 20 | var uploadVideo: uploadVideoHandle? 21 | open var layoutMargins: UIEdgeInsets = .zero 22 | open class var viewType: JCMessageContentViewType.Type { 23 | return JCMessageVideoContentView.self 24 | } 25 | open var data: Data? 26 | open var image: UIImage? 27 | //open var fileContent: JMSGFileContent? 28 | open var videoContent: JMSGVideoContent? 29 | //由于andriod暂时不支持文件视频类型,故sdk对文件视频类的做了特殊处理 30 | open var videoFileContent: JMSGFileContent? 31 | 32 | open func sizeThatFits(_ size: CGSize) -> CGSize { 33 | printLog("viedeo") 34 | if image == nil { 35 | return .init(width: 140, height: 89) 36 | } 37 | //image = JCVideoManager.getFristImage(data: data!) 38 | let size = image?.size ?? .zero 39 | let scale = min(min(JC_VIDEO_MSG_IMAGE_WIDTH, size.width) / size.width, min(JC_VIDEO_MSG_IMAGE_HEIGHT, size.height) / size.height) 40 | 41 | let w = size.width * scale 42 | let h = size.height * scale 43 | return .init(width: w, height: h) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Chat/View/Message/JCMessageVoiceContent.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCMessageVoiceContent.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/3/9. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | open class JCMessageVoiceContent: NSObject, JCMessageContentType { 12 | 13 | public weak var delegate: JCMessageDelegate? 14 | open var layoutMargins: UIEdgeInsets = .init(top: 5, left: 10, bottom: 5, right: 10) 15 | open class var viewType: JCMessageContentViewType.Type { 16 | return JCMessageVoiceContentView.self 17 | } 18 | open var data: Data? 19 | open var duration: TimeInterval = 9999 20 | open var attributedText: NSAttributedString? 21 | 22 | open func sizeThatFits(_ size: CGSize) -> CGSize { 23 | // +---------------+ 24 | // | ||| 99'59'' | 25 | // +---------------+ 26 | let minute = Int(duration) / 60 27 | let second = Int(duration) % 60 28 | var string = "\(minute)'\(second)''" 29 | if minute == 0 { 30 | string = "\(second)''" 31 | } 32 | attributedText = NSAttributedString(string: string, attributes: convertToOptionalNSAttributedStringKeyDictionary([convertFromNSAttributedStringKey(NSAttributedString.Key.font): UIFont.systemFont(ofSize: 14)])) 33 | 34 | return .init(width: 20 + 38 + 20, height: 26) 35 | } 36 | } 37 | 38 | // Helper function inserted by Swift 4.2 migrator. 39 | fileprivate func convertToOptionalNSAttributedStringKeyDictionary(_ input: [String: Any]?) -> [NSAttributedString.Key: Any]? { 40 | guard let input = input else { return nil } 41 | return Dictionary(uniqueKeysWithValues: input.map { key, value in (NSAttributedString.Key(rawValue: key), value)}) 42 | } 43 | 44 | // Helper function inserted by Swift 4.2 migrator. 45 | fileprivate func convertFromNSAttributedStringKey(_ input: NSAttributedString.Key) -> String { 46 | return input.rawValue 47 | } 48 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Input/InputView/Emoticon/JCEmoticonGroup.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCEmoticonGroup.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/3/9. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public enum JCEmoticonType: Int { 12 | case small = 0 13 | case large = 1 14 | 15 | public var isSmall: Bool { 16 | return self == .small 17 | } 18 | 19 | public var isLarge: Bool { 20 | return self == .large 21 | } 22 | } 23 | 24 | open class JCEmoticonGroup: NSObject { 25 | 26 | open lazy var id: String = UUID().uuidString 27 | 28 | open var title: String? 29 | open var thumbnail: UIImage? 30 | open var type: JCEmoticonType = .small 31 | open var emoticons: [JCEmoticon] = [] 32 | 33 | } 34 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Input/InputView/Emoticon/JCEmoticonTabItemView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCEmoticonTabItemViewCollectionViewCell.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/3/9. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JCEmoticonTabItemView: UICollectionViewCell { 12 | 13 | private lazy var _imageView: UIImageView = UIImageView() 14 | private lazy var _line: CALayer = CALayer() 15 | var group: JCEmoticonGroup? { 16 | willSet { 17 | guard group !== newValue else { 18 | return 19 | } 20 | _imageView.image = newValue?.thumbnail 21 | } 22 | } 23 | 24 | override init(frame: CGRect) { 25 | super.init(frame: frame) 26 | _init() 27 | } 28 | required init?(coder aDecoder: NSCoder) { 29 | super.init(coder: aDecoder) 30 | _init() 31 | } 32 | 33 | override func layoutSubviews() { 34 | super.layoutSubviews() 35 | _imageView.center = CGPoint(x: bounds.midX, y: bounds.midY) 36 | _line.frame = CGRect(x: bounds.maxX - 0.25, y: 8, width: 0.5, height: bounds.height - 16) 37 | } 38 | 39 | private func _init() { 40 | 41 | _line.backgroundColor = UIColor(white: 0.9, alpha: 1.0).cgColor 42 | 43 | _imageView.contentMode = .scaleAspectFit 44 | _imageView.bounds = CGRect(x: 0, y: 0, width: 25, height: 25) 45 | 46 | contentView.addSubview(_imageView) 47 | contentView.layer.addSublayer(_line) 48 | 49 | selectedBackgroundView = UIView() 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Input/Map/JCAddMapViewController.h: -------------------------------------------------------------------------------- 1 | 2 | #import 3 | 4 | #import 5 | #import 6 | #import 7 | #import 8 | #import 9 | #import 10 | #import 11 | #import "AddMapTableViewCell.h" 12 | 13 | typedef void (^ MapAddress)(NSDictionary *dic); 14 | @interface JCAddMapViewController : UIViewController 15 | 16 | @property (nonatomic, copy) MapAddress addressBlock; 17 | @property (nonatomic, assign) BOOL isOnlyShowMap; 18 | @property (nonatomic, assign) double lon; 19 | @property (nonatomic, assign) double lat; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Input/Map/Resources/icon_baidu_marker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/ChatModule/Input/Map/Resources/icon_baidu_marker.png -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Input/Map/Resources/jiantou2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/ChatModule/Input/Map/Resources/jiantou2@2x.png -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Input/Map/Resources/定位1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/ChatModule/Input/Map/Resources/定位1.png -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Input/Map/Resources/定位2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/ChatModule/Input/Map/Resources/定位2.png -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Input/Map/View/AddMapTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // AddMapTableViewCell.h 3 | // 仿美团地图功能 4 | // 5 | // Created by chedeping on 16/3/4. 6 | // Copyright © 2016年 车德平. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AddMapTableViewCell : UITableViewCell 12 | 13 | @property (weak, nonatomic) IBOutlet UIImageView *cellImage; 14 | @property (weak, nonatomic) IBOutlet UILabel *cellLabelText; 15 | @property (weak, nonatomic) IBOutlet UILabel *cellDetailTextLabelText; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /JChat/Src/ChatModule/Input/Map/View/AddMapTableViewCell.m: -------------------------------------------------------------------------------- 1 | 2 | #import "AddMapTableViewCell.h" 3 | 4 | @implementation AddMapTableViewCell 5 | 6 | - (void)awakeFromNib { 7 | [super awakeFromNib]; 8 | } 9 | 10 | - (void)setSelected:(BOOL)selected animated:(BOOL)animated { 11 | [super setSelected:selected animated:animated]; 12 | } 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /JChat/Src/ChatRoomModule/View/JCChatRoomManagerListCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCChatRoomManagerListCell.swift 3 | // JChat 4 | // 5 | // Created by Allan on 2019/4/28. 6 | // Copyright © 2019 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JCChatRoomManagerListCell: JCContacterCell { 12 | 13 | override func awakeFromNib() { 14 | super.awakeFromNib() 15 | // Initialization code 16 | _init() 17 | } 18 | override func setSelected(_ selected: Bool, animated: Bool) { 19 | super.setSelected(selected, animated: animated) 20 | 21 | } 22 | 23 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { 24 | super.init(style: style, reuseIdentifier: reuseIdentifier) 25 | _init() 26 | } 27 | 28 | required init?(coder aDecoder: NSCoder) { 29 | super.init(coder: aDecoder) 30 | _init() 31 | fatalError("init(coder:) has not been implemented") 32 | } 33 | private func _init(){ 34 | self.isShowBadge = false 35 | self.contentView.addSubview(self.deletBtn) 36 | self.deletBtn.mas_makeConstraints { (make) in 37 | make?.centerY.equalTo()(self.contentView) 38 | make?.right.equalTo()(self.contentView)?.offset()(-10.0) 39 | make?.size.equalTo()(CGSize.init(width: 72, height: 25)) 40 | } 41 | } 42 | lazy var deletBtn: UIButton = { 43 | let deletBtn = UIButton.init() 44 | deletBtn.setTitle("移除", for: .normal) 45 | deletBtn.titleLabel?.font = UIFont.systemFont(ofSize: 14) 46 | let image = UIImage.createImage(color: UIColor(netHex: 0x2dd0cf), size: CGSize(width: 72, height: 25)) 47 | deletBtn.setBackgroundImage(image, for: .normal) 48 | deletBtn.layer.cornerRadius = 2 49 | deletBtn.layer.masksToBounds = true 50 | return deletBtn 51 | }() 52 | } 53 | -------------------------------------------------------------------------------- /JChat/Src/ChatRoomModule/ViewController/JCChatRoomBlackOrSilentListViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCChatRoomBlackOrSilentListViewController.swift 3 | // JChat 4 | // 5 | // Created by Allan on 2019/4/25. 6 | // Copyright © 2019 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JCChatRoomBlackOrSilentListViewController: UIViewController { 12 | open var isBlack: Bool! 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | view.backgroundColor = UIColor(netHex: 0xe8edf3) 16 | 17 | if(self.isBlack){ 18 | self.title = "黑名单" 19 | }else{ 20 | self.title = "禁言列表" 21 | } 22 | } 23 | 24 | 25 | } 26 | -------------------------------------------------------------------------------- /JChat/Src/ChatRoomModule/ViewController/JCChatRoomChangeOwnerViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCSetChatRoomOwnerViewController.swift 3 | // JChat 4 | // 5 | // Created by Allan on 2019/4/25. 6 | // Copyright © 2019 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JCChatRoomChangeOwnerViewController: JCSearchFriendViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | self.title = "设置房主" 16 | view.backgroundColor = UIColor(netHex: 0xe8edf3) 17 | addButton.setTitle("设置房主", for: .normal) 18 | addButton.addTarget(self, action: #selector(_setRoomOwner), for: .touchUpInside) 19 | 20 | } 21 | 22 | @objc func _setRoomOwner(){ 23 | 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /JChat/Src/ChatRoomModule/ViewController/JCChatRoomIntroduceViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCChatRoomIntroduceViewController.swift 3 | // JChat 4 | // 5 | // Created by Allan on 2019/4/25. 6 | // Copyright © 2019 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JCChatRoomIntroduceViewController: UIViewController { 12 | 13 | open var introduceText: String? 14 | @IBOutlet weak var introduceInfo: UITextView! 15 | open var roomIntroduceInfo: String? 16 | 17 | override func viewDidLoad() { 18 | super.viewDidLoad() 19 | self.title = "聊天室介绍" 20 | self.introduceInfo.text = self.introduceText 21 | view.backgroundColor = UIColor(netHex: 0xe8edf3) 22 | } 23 | 24 | 25 | } 26 | -------------------------------------------------------------------------------- /JChat/Src/ChatRoomModule/ViewController/JCChatRoomNameInfoViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCChatRoomNameInfoViewController.swift 3 | // JChat 4 | // 5 | // Created by Allan on 2019/4/25. 6 | // Copyright © 2019 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JCChatRoomNameInfoViewController: UIViewController { 12 | @IBOutlet weak var nameInfo: UITextView! 13 | 14 | open var roomName: String? 15 | override func viewDidLoad() { 16 | super.viewDidLoad() 17 | self.title = "聊天室名称" 18 | self.nameInfo.text = self.roomName 19 | view.backgroundColor = UIColor(netHex: 0xe8edf3) 20 | 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /JChat/Src/ChatRoomModule/ViewController/JCSearchUserViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCSearchUserViewController.swift 3 | // JChat 4 | // 5 | // Created by Allan on 2019/4/26. 6 | // Copyright © 2019 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JCSearchUserViewController: UIViewController { 12 | 13 | open var searchBar: UISearchBar! 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | self.searchBar = self.searchController.searchBar 17 | // Do any additional setup after loading the view. 18 | } 19 | 20 | fileprivate lazy var searchController: UISearchController = { 21 | let rootVC = JCCRSearchResultViewController() 22 | let resultNav = JCNavigationController(rootViewController:rootVC) 23 | var searchVC = UISearchController(searchResultsController:resultNav) 24 | searchVC.delegate = self 25 | searchVC.searchResultsUpdater = rootVC 26 | // 设置开始搜索时导航条是否隐藏 27 | searchVC.hidesNavigationBarDuringPresentation = true 28 | // 设置开始搜索时背景是否显示 29 | searchVC.dimsBackgroundDuringPresentation = false 30 | let searchBar = searchVC.searchBar 31 | searchBar.sizeToFit() 32 | searchBar.delegate = self 33 | searchBar.searchBarStyle = .minimal 34 | searchBar.placeholder = "请输入用户ID" 35 | searchVC.searchBar.returnKeyType = .search 36 | searchBar.setSearchFieldBackgroundImage(UIImage.createImage(color: .white, size: CGSize(width: UIScreen.main.bounds.size.width, height: 31)), for: .normal) 37 | 38 | return searchVC 39 | } () 40 | 41 | 42 | } 43 | 44 | 45 | extension JCSearchUserViewController: UISearchControllerDelegate,UISearchBarDelegate{ 46 | 47 | 48 | } 49 | -------------------------------------------------------------------------------- /JChat/Src/UserModule/Model/UserDefaultValidationService.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserDefaultValidationService.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/8/11. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | final class UserDefaultValidationService: UserValidationService { 12 | static let sharedValidationService = UserDefaultValidationService() 13 | 14 | private init () {} 15 | 16 | let maxCount = 128 17 | let minCount = 4 18 | 19 | func validateUsername(_ username: String) -> ValidationResult { 20 | 21 | if username.isEmpty { 22 | return .failed(message: "用户名不能为空") 23 | } 24 | 25 | if username.length < minCount || username.length > maxCount { 26 | return .failed(message: "用户名为4-128位字符") 27 | } 28 | 29 | let fristCharRegex = "^([a-zA-Z0-9])(.*)$" 30 | let fristCharPredicate = NSPredicate(format: "SELF MATCHES %@", fristCharRegex) 31 | if !fristCharPredicate.evaluate(with: username) { 32 | return .failed(message: "用户名以字母或数字开头") 33 | } 34 | 35 | if username.isContainsChinese { 36 | return .failed(message: "用户名不能包含中文字符") 37 | } 38 | 39 | if username.isExpectations { 40 | return .ok 41 | } 42 | 43 | return .failed(message: "用户名包含非法字符") 44 | } 45 | 46 | func validatePassword(_ password: String) -> ValidationResult { 47 | if password.isEmpty { 48 | return .failed(message: "密码不能为空") 49 | } 50 | if password.length < minCount || password.length > maxCount { 51 | return .failed(message: "密码为4-128位字符") 52 | } 53 | return .ok 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /JChat/Src/UserModule/Protocols/UserProtocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Protocols.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/8/11. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | func == (lhs: ValidationResult, rhs: ValidationResult) -> Bool { 12 | switch (lhs, rhs) { 13 | case (.ok, .ok): 14 | return true 15 | case (.empty, .empty): 16 | return true 17 | case (.validating, .validating): 18 | return true 19 | case (.failed, .failed): 20 | return true 21 | default: 22 | return false 23 | } 24 | } 25 | 26 | enum ValidationResult: CustomStringConvertible, Equatable { 27 | case ok 28 | case empty 29 | case validating 30 | case failed(message: String) 31 | 32 | var description: String { 33 | switch self { 34 | case .ok: 35 | return "" 36 | case .empty: 37 | return "" 38 | case .validating: 39 | return "validating ..." 40 | case let .failed(message): 41 | return message 42 | } 43 | } 44 | } 45 | 46 | protocol UserValidationService { 47 | func validateUsername(_ username: String) -> ValidationResult 48 | func validatePassword(_ password: String) -> ValidationResult 49 | } 50 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/3rdParty/AreaPickerView/JCLocation.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCLocation.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/5/3. 6 | // Copyright © 2017年 dengyonghao. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | @objc(JCLocation) 12 | public class JCLocation: NSObject { 13 | 14 | var country = "" 15 | var province = "" 16 | var city = "" 17 | var area = "" 18 | var street = "" 19 | 20 | var provinceCode = "" 21 | var cityCode = "" 22 | var areaCode = "" 23 | 24 | func decription() { 25 | print("\(province): \(provinceCode) \(city): \(cityCode) \(area): \(areaCode)") 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/3rdParty/DLSlideView/DLCache/DLCacheProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // DLCacheProtocol.h 3 | // DLSlideViewDemo 4 | // 5 | // Created by Dongle Su on 15-2-13. 6 | // Copyright (c) 2015年 dongle. All rights reserved. 7 | // 8 | 9 | #ifndef DLSlideViewDemo_DLCacheProtocol_h 10 | #define DLSlideViewDemo_DLCacheProtocol_h 11 | #import 12 | 13 | @protocol DLCacheProtocol 14 | - (void)setObject:(id)object forKey:(NSString *)key; 15 | - (id)objectForKey:(NSString *)key; 16 | @end 17 | 18 | #endif 19 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/3rdParty/DLSlideView/DLCache/DLLRUCache.h: -------------------------------------------------------------------------------- 1 | // 2 | // DLFIFOCache.h 3 | // DLSlideViewDemo 4 | // 5 | // Created by Dongle Su on 14-12-13. 6 | // Copyright (c) 2014年 dongle. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "DLCacheProtocol.h" 11 | 12 | @interface DLLRUCache : NSObject 13 | 14 | - (id)initWithCount:(NSInteger)count; 15 | 16 | - (void)setObject:(id)object forKey:(NSString *)key; 17 | - (id)objectForKey:(NSString *)key; 18 | @end 19 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/3rdParty/DLSlideView/DLCache/DLLRUCache.m: -------------------------------------------------------------------------------- 1 | // 2 | // DLFIFOCache.m 3 | // DLSlideViewDemo 4 | // 5 | // Created by Dongle Su on 14-12-13. 6 | // Copyright (c) 2014年 dongle. All rights reserved. 7 | // 8 | 9 | #import "DLLRUCache.h" 10 | 11 | @implementation DLLRUCache{ 12 | NSMutableDictionary *dic_; 13 | NSMutableArray *lruKeyList_; 14 | NSInteger capacity_; 15 | } 16 | 17 | - (id)initWithCount:(NSInteger)count{ 18 | if (self = [super init]) { 19 | capacity_ = count; 20 | dic_ = [NSMutableDictionary dictionaryWithCapacity:capacity_]; 21 | lruKeyList_ = [NSMutableArray arrayWithCapacity:capacity_]; 22 | } 23 | 24 | return self; 25 | } 26 | 27 | - (void)setObject:(id)object forKey:(NSString *)key{ 28 | if (![lruKeyList_ containsObject:key]) { 29 | if (lruKeyList_.count < capacity_) { 30 | [dic_ setValue:object forKey:key]; 31 | [lruKeyList_ addObject:key]; 32 | } 33 | else{ 34 | NSString *longTimeUnusedKey = [lruKeyList_ firstObject]; 35 | [dic_ setValue:nil forKey:longTimeUnusedKey]; 36 | [lruKeyList_ removeObjectAtIndex:0]; 37 | 38 | [dic_ setValue:object forKey:key]; 39 | [lruKeyList_ addObject:key]; 40 | } 41 | } 42 | else{ 43 | [dic_ setValue:object forKey:key]; 44 | [lruKeyList_ removeObject:key]; 45 | [lruKeyList_ addObject:key]; 46 | } 47 | } 48 | 49 | - (id)objectForKey:(NSString *)key{ 50 | if ([lruKeyList_ containsObject:key]) { 51 | [lruKeyList_ removeObject:key]; 52 | [lruKeyList_ addObject:key]; 53 | 54 | return [dic_ objectForKey:key]; 55 | } 56 | else{ 57 | return nil; 58 | } 59 | } 60 | @end 61 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/3rdParty/DLSlideView/DLCustomSlideView.h: -------------------------------------------------------------------------------- 1 | // 2 | // DLCustomSlideView.h 3 | // DLSlideViewDemo 4 | // 5 | // Created by Dongle Su on 15-2-12. 6 | // Copyright (c) 2015年 dongle. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "DLSlideTabbarProtocol.h" 12 | #import "DLSlideView.h" 13 | #import "DLTabedSlideView.h" 14 | #import "DLCacheProtocol.h" 15 | 16 | 17 | @class DLCustomSlideView; 18 | 19 | @protocol DLCustomSlideViewDelegate 20 | - (NSInteger)numberOfTabsInDLCustomSlideView:(DLCustomSlideView *)sender; 21 | - (UIViewController *)DLCustomSlideView:(DLCustomSlideView *)sender controllerAt:(NSInteger)index; 22 | @optional 23 | - (void)DLCustomSlideView:(DLCustomSlideView *)sender didSelectedAt:(NSInteger)index; 24 | @end 25 | 26 | 27 | 28 | @interface DLCustomSlideView : UIView 29 | @property(nonatomic, weak) UIViewController *baseViewController; 30 | @property(nonatomic, assign) NSInteger selectedIndex; 31 | 32 | // tabbar 33 | @property(nonatomic, strong) UIView *tabbar; 34 | @property(nonatomic, assign) float tabbarBottomSpacing; 35 | 36 | // cache properties 37 | @property(nonatomic, strong) id cache; 38 | 39 | // delegate 40 | @property(nonatomic, weak)IBOutlet iddelegate; 41 | 42 | // init method. 初始分方法 43 | - (void)setup; 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/3rdParty/DLSlideView/DLSlideView.h: -------------------------------------------------------------------------------- 1 | // 2 | // DLSlideView.h 3 | // DLSlideController 4 | // 5 | // Created by Dongle Su on 14-12-7. 6 | // Copyright (c) 2014年 dongle. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class DLSlideView; 12 | 13 | @protocol DLSlideViewDataSource 14 | - (NSInteger)numberOfControllersInDLSlideView:(DLSlideView *)sender; 15 | - (UIViewController *)DLSlideView:(DLSlideView *)sender controllerAt:(NSInteger)index; 16 | @end 17 | 18 | @protocol DLSlideViewDelegate 19 | @optional 20 | - (void)DLSlideView:(DLSlideView *)slide switchingFrom:(NSInteger)oldIndex to:(NSInteger)toIndex percent:(float)percent; 21 | - (void)DLSlideView:(DLSlideView *)slide didSwitchTo:(NSInteger)index; 22 | - (void)DLSlideView:(DLSlideView *)slide switchCanceled:(NSInteger)oldIndex; 23 | @end 24 | 25 | @interface DLSlideView : UIView 26 | //@property(nonatomic, strong) NSArray *viewControllers; 27 | @property(nonatomic, assign) NSInteger selectedIndex; 28 | @property(nonatomic, weak) UIViewController *baseViewController; 29 | @property(nonatomic, weak) iddelegate; 30 | @property(nonatomic, weak) iddataSource; 31 | - (void)switchTo:(NSInteger)index; 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/3rdParty/DLSlideView/DLTabbarView/DLFixedTabbarView.h: -------------------------------------------------------------------------------- 1 | // 2 | // DLFixedTabbarView.h 3 | // DLSlideController 4 | // 5 | // Created by Dongle Su on 14-12-8. 6 | // Copyright (c) 2014年 dongle. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "DLSlideTabbarProtocol.h" 11 | 12 | @interface DLFixedTabbarViewTabItem : NSObject 13 | @property(nonatomic, strong) NSString *title; 14 | @property(nonatomic, strong) UIImage *image; 15 | @property(nonatomic, strong) UIImage *selectedImage; 16 | @property(nonatomic, strong) UIColor *titleColor; 17 | @property(nonatomic, strong) UIColor *selectedTitleColor; 18 | @end 19 | 20 | @interface DLFixedTabbarView : UIView 21 | @property(nonatomic, strong) UIImage *backgroundImage; 22 | @property(nonatomic, strong) UIColor *trackColor; 23 | @property(nonatomic, strong) NSArray *tabbarItems; 24 | //- (void)addBarItemWithTitle:(NSString *)title titleColor:(UIColor *)titleColor image:(UIImage *)image selectedImage:(UIImage *)selectedImage; 25 | 26 | @property(nonatomic, assign) NSInteger selectedIndex; 27 | @property(nonatomic, readonly) NSInteger tabbarCount; 28 | @property(nonatomic, weak) id delegate; 29 | - (void)switchingFrom:(NSInteger)fromIndex to:(NSInteger)toIndex percent:(float)percent; 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/3rdParty/DLSlideView/DLTabbarView/DLScrollTabbarView.h: -------------------------------------------------------------------------------- 1 | // 2 | // DLScrollTabbarView.h 3 | // DLSlideViewDemo 4 | // 5 | // Created by Dongle Su on 15-2-12. 6 | // Copyright (c) 2015年 dongle. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "DLSlideTabbarProtocol.h" 11 | 12 | @interface DLScrollTabbarItem : NSObject 13 | @property(nonatomic, strong) NSString *title; 14 | @property(nonatomic, assign) CGFloat width; 15 | + (DLScrollTabbarItem *)itemWithTitle:(NSString *)title width:(CGFloat)width; 16 | @end 17 | 18 | @interface DLScrollTabbarView : UIView 19 | @property(nonatomic, strong) UIView *backgroundView; 20 | 21 | // tabbar属性 22 | @property (nonatomic, strong) UIColor *tabItemNormalColor UI_APPEARANCE_SELECTOR; 23 | @property (nonatomic, strong) UIColor *tabItemSelectedColor UI_APPEARANCE_SELECTOR; 24 | @property (nonatomic, assign) CGFloat tabItemNormalFontSize; 25 | @property(nonatomic, strong) UIColor *trackColor UI_APPEARANCE_SELECTOR; 26 | @property(nonatomic, strong) NSArray *tabbarItems; 27 | 28 | // DLSlideTabbarProtocol 29 | @property(nonatomic, assign) NSInteger selectedIndex; 30 | @property(nonatomic, readonly) NSInteger tabbarCount; 31 | @property(nonatomic, weak) id delegate; 32 | - (void)switchingFrom:(NSInteger)fromIndex to:(NSInteger)toIndex percent:(float)percent; 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/3rdParty/DLSlideView/DLTabbarView/DLSlideTabbarProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // DLSlideTabbarProtocol.h 3 | // DLSlideController 4 | // 5 | // Created by Dongle Su on 14-12-8. 6 | // Copyright (c) 2014年 dongle. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @protocol DLSlideTabbarDelegate 12 | - (void)DLSlideTabbar:(id)sender selectAt:(NSInteger)index; 13 | @end 14 | 15 | @protocol DLSlideTabbarProtocol 16 | @property(nonatomic, assign) NSInteger selectedIndex; 17 | @property(nonatomic, readonly) NSInteger tabbarCount; 18 | @property(nonatomic, weak) id delegate; 19 | - (void)switchingFrom:(NSInteger)fromIndex to:(NSInteger)toIndex percent:(float)percent; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/3rdParty/DLSlideView/DLTabedSlideView.h: -------------------------------------------------------------------------------- 1 | // 2 | // DLTabedSlideView.h 3 | // DLSlideController 4 | // 5 | // Created by Dongle Su on 14-12-8. 6 | // Copyright (c) 2014年 dongle. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "DLSlideTabbarProtocol.h" 11 | 12 | @interface DLTabedbarItem : NSObject 13 | @property (nonatomic, strong) NSString *title; 14 | @property(nonatomic, strong) UIImage *image; 15 | @property(nonatomic, strong) UIImage *selectedImage; 16 | 17 | + (DLTabedbarItem *)itemWithTitle:(NSString *)title image:(UIImage *)image selectedImage:(UIImage *)selectedImage; 18 | @end 19 | 20 | @class DLTabedSlideView; 21 | 22 | @protocol DLTabedSlideViewDelegate 23 | - (NSInteger)numberOfTabsInDLTabedSlideView:(DLTabedSlideView *)sender; 24 | - (UIViewController *)DLTabedSlideView:(DLTabedSlideView *)sender controllerAt:(NSInteger)index; 25 | @optional 26 | - (void)DLTabedSlideView:(DLTabedSlideView *)sender didSelectedAt:(NSInteger)index; 27 | @end 28 | 29 | @interface DLTabedSlideView : UIView 30 | //@property(nonatomic, strong) NSArray *viewControllers; 31 | @property(nonatomic, weak) UIViewController *baseViewController; 32 | @property(nonatomic, assign) NSInteger selectedIndex; 33 | 34 | 35 | //set tabbar properties. 36 | @property (nonatomic, strong) UIColor *tabItemNormalColor; 37 | @property (nonatomic, strong) UIColor *tabItemSelectedColor; 38 | @property(nonatomic, strong) UIImage *tabbarBackgroundImage; 39 | @property(nonatomic, strong) UIColor *tabbarTrackColor; 40 | @property(nonatomic, strong) NSArray *tabbarItems; 41 | @property(nonatomic, assign) float tabbarHeight; 42 | @property(nonatomic, assign) float tabbarBottomSpacing; 43 | 44 | // cache properties 45 | @property(nonatomic, assign) NSInteger cacheCount; 46 | 47 | - (void)buildTabbar; 48 | 49 | //@property(nonatomic, strong) IBOutlet id tabarView; 50 | 51 | 52 | @property(nonatomic, weak)IBOutlet iddelegate; 53 | 54 | @end 55 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/3rdParty/DLSlideView/DLUtility.h: -------------------------------------------------------------------------------- 1 | // 2 | // DLUtility.h 3 | // DLSlideViewDemo 4 | // 5 | // Created by Dongle Su on 15-2-12. 6 | // Copyright (c) 2015年 dongle. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface DLUtility : NSObject 13 | + (UIColor *)getColorOfPercent:(CGFloat)percent between:(UIColor *)color1 and:(UIColor *)color2; 14 | @end 15 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/3rdParty/DLSlideView/DLUtility.m: -------------------------------------------------------------------------------- 1 | // 2 | // DLUtility.m 3 | // DLSlideViewDemo 4 | // 5 | // Created by Dongle Su on 15-2-12. 6 | // Copyright (c) 2015年 dongle. All rights reserved. 7 | // 8 | 9 | #import "DLUtility.h" 10 | 11 | @implementation DLUtility 12 | + (UIColor *)getColorOfPercent:(CGFloat)percent between:(UIColor *)color1 and:(UIColor *)color2{ 13 | CGFloat red1, green1, blue1, alpha1; 14 | [color1 getRed:&red1 green:&green1 blue:&blue1 alpha:&alpha1]; 15 | 16 | CGFloat red2, green2, blue2, alpha2; 17 | [color2 getRed:&red2 green:&green2 blue:&blue2 alpha:&alpha2]; 18 | 19 | CGFloat p1 = percent; 20 | CGFloat p2 = 1.0 - percent; 21 | UIColor *mid = [UIColor colorWithRed:red1*p1+red2*p2 green:green1*p1+green2*p2 blue:blue1*p1+blue2*p2 alpha:1.0f]; 22 | return mid; 23 | } 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/3rdParty/InputBar/SAIInputBackgroundView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SAIInputBackgroundView.swift 3 | // SAIInputBar 4 | // 5 | // Created by SAGESSE on 8/31/16. 6 | // Copyright © 2016-2017 SAGESSE. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | internal class SAIInputBackgroundView: UIToolbar { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/3rdParty/InputBar/SAIToolboxItem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SAIToolboxItem.swift 3 | // SAC 4 | // 5 | // Created by SAGESSE on 9/15/16. 6 | // Copyright © 2016-2017 SAGESSE. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @objc open class SAIToolboxItem: NSObject { 12 | 13 | open var name: String 14 | open var identifier: String 15 | 16 | open var image: UIImage? 17 | open var highlightedImage: UIImage? 18 | 19 | public init(_ identifier: String, _ name: String, _ image: UIImage?, _ highlightedImage: UIImage? = nil) { 20 | self.identifier = identifier 21 | self.name = name 22 | self.image = image 23 | self.highlightedImage = highlightedImage 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/3rdParty/InputBar/SAIToolboxItemView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SAIToolboxItemView.swift 3 | // SAC 4 | // 5 | // Created by SAGESSE on 9/15/16. 6 | // Copyright © 2016-2017 SAGESSE. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | internal class SAIToolboxItemView: UICollectionViewCell { 12 | 13 | var item: SAIToolboxItem? { 14 | didSet { 15 | _titleLabel.text = item?.name 16 | _iconView.image = item?.image 17 | _iconView.highlightedImage = item?.highlightedImage 18 | } 19 | } 20 | 21 | weak var handler: AnyObject? 22 | 23 | private func _init() { 24 | 25 | _titleLabel.font = UIFont.systemFont(ofSize: 12) 26 | _titleLabel.textColor = .gray 27 | _titleLabel.textAlignment = .center 28 | _titleLabel.translatesAutoresizingMaskIntoConstraints = false 29 | 30 | _iconView.contentMode = .scaleAspectFit 31 | _iconView.translatesAutoresizingMaskIntoConstraints = false 32 | 33 | let view = UIView() 34 | view.backgroundColor = UIColor(white: 0, alpha: 0.2) 35 | view.layer.cornerRadius = 4 36 | selectedBackgroundView = view 37 | 38 | contentView.addSubview(_iconView) 39 | contentView.addSubview(_titleLabel) 40 | 41 | _iconView.mas_makeConstraints({ (make) in 42 | make?.centerX.equalTo()(_titleLabel.mas_centerX) 43 | make?.top.equalTo()(self.mas_top)?.offset()(8) 44 | make?.width.equalTo()(43) 45 | make?.height.equalTo()(43) 46 | }) 47 | _titleLabel.mas_makeConstraints { (make) in 48 | make?.top.equalTo()(_iconView.mas_bottom)?.offset()(5) 49 | make?.left.and()?.right().equalTo() 50 | make?.height.equalTo()(20) 51 | } 52 | } 53 | 54 | private lazy var _iconView: UIImageView = UIImageView() 55 | private lazy var _titleLabel: UILabel = UILabel() 56 | 57 | override init(frame: CGRect) { 58 | super.init(frame: frame) 59 | _init() 60 | } 61 | required init?(coder aDecoder: NSCoder) { 62 | super.init(coder: aDecoder) 63 | _init() 64 | } 65 | } 66 | 67 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/ExJMessage/Core/ExJMessage.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ExJMessage.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/10/1. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import JMessage 11 | 12 | public final class ExJMessage { 13 | public let base: Base 14 | public init(_ base: Base) { 15 | self.base = base 16 | } 17 | } 18 | 19 | /** 20 | A type that has ExJMessage extensions. 21 | */ 22 | public protocol ExJMessageCompatible { } 23 | 24 | public extension ExJMessageCompatible { 25 | public static var ex: ExJMessage.Type { 26 | get { return ExJMessage.self } 27 | } 28 | public var ex: ExJMessage { 29 | get { return ExJMessage(self) } 30 | } 31 | } 32 | 33 | extension JMSGConversation: ExJMessageCompatible { } 34 | extension JMSGMessage: ExJMessageCompatible { } 35 | extension JMSGOptionalContent: ExJMessageCompatible { } 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/ExJMessage/Extensions/JMSGOptionalContent+.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JMSGOptionalContent+.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/10/8. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension ExJMessage where Base: JMSGOptionalContent { 12 | 13 | /** 14 | default optional content 15 | */ 16 | static var `default`: JMSGOptionalContent { 17 | let optionalContent = JMSGOptionalContent() 18 | #if READ_VERSION 19 | optionalContent.needReadReceipt = true 20 | #else 21 | optionalContent.needReadReceipt = false 22 | #endif 23 | return optionalContent 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/Extension/Array+JChat.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Array+JChat.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/10/11. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: - JCMessageType 12 | extension Array where Element: JCMessageType { 13 | 14 | func index(_ message: JMSGMessage) -> Int? { 15 | return self.index(where: { (m) -> Bool in 16 | m.msgId == message.msgId 17 | }) 18 | } 19 | 20 | func index(_ message: JCMessageType) -> Int? { 21 | return self.index(where: { (m) -> Bool in 22 | m.msgId == message.msgId 23 | }) 24 | } 25 | } 26 | 27 | // MARK: - String 28 | extension Array where Element == String { 29 | func sortedKeys() -> [Element] { 30 | var array = self.sorted(by: { (str1, str2) -> Bool in 31 | return str1 < str2 32 | }) 33 | if let first = array.first { 34 | if first == "#" { 35 | array.removeFirst() 36 | array.append(first) 37 | } 38 | } 39 | return array 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/Extension/MBProgressHUD+JChat.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MBProgressHUD+JChat.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/3/16. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import MBProgressHUD 11 | 12 | class MBProgressHUD_JChat: MBProgressHUD { 13 | 14 | public static func showMessage(message: String, toView: UIView?) { 15 | DispatchQueue.main.async { 16 | var currentView = toView 17 | if toView == nil { 18 | currentView = UIApplication.shared.keyWindow 19 | } 20 | let hud = MBProgressHUD.showAdded(to: currentView!, animated: true) 21 | hud.label.text = message 22 | hud.label.textColor = UIColor(white: 1, alpha: 0.7) 23 | hud.bezelView.color = .black 24 | hud.activityIndicatorColor = UIColor(netHex: 0x9B9B9B) 25 | hud.removeFromSuperViewOnHide = true 26 | } 27 | } 28 | 29 | public static func show(text: String, view: UIView?, _ time: TimeInterval = 1.5) { 30 | DispatchQueue.main.async { 31 | var currentView = view 32 | if view == nil { 33 | currentView = UIApplication.shared.keyWindow 34 | } 35 | let hud = MBProgressHUD.showAdded(to: currentView!, animated: true) 36 | hud.label.text = text 37 | hud.bezelView.color = .black 38 | hud.mode = .customView 39 | hud.removeFromSuperViewOnHide = true 40 | hud.label.textColor = UIColor(white: 1, alpha: 0.7) 41 | hud.hide(animated: true, afterDelay: time) 42 | } 43 | } 44 | 45 | public static func hide(forView: UIView?, animated: Bool) { 46 | DispatchQueue.main.async { 47 | var currentView = forView 48 | if currentView == nil { 49 | currentView = UIApplication.shared.keyWindow 50 | } 51 | MBProgressHUD.hide(for: currentView!, animated: animated) 52 | } 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/Extension/NSLayoutConstraint+JChat.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/3/22. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @inline(__always) 12 | internal func _JCLayoutConstraintMake(_ item: AnyObject, _ attr1: NSLayoutConstraint.Attribute, _ related: NSLayoutConstraint.Relation, _ toItem: AnyObject? = nil, _ attr2: NSLayoutConstraint.Attribute = .notAnAttribute, _ constant: CGFloat = 0, priority: UILayoutPriority = UILayoutPriority(1000), multiplier: CGFloat = 1, output: UnsafeMutablePointer? = nil) -> NSLayoutConstraint { 13 | 14 | if let view = item as? UIView { 15 | view.translatesAutoresizingMaskIntoConstraints = false 16 | } 17 | 18 | if let view = item as? UIView { 19 | view.translatesAutoresizingMaskIntoConstraints = false 20 | } 21 | 22 | let c = NSLayoutConstraint(item:item, attribute:attr1, relatedBy:related, toItem:toItem, attribute:attr2, multiplier:multiplier, constant:constant) 23 | c.priority = priority 24 | if output != nil { 25 | output?.pointee = c 26 | } 27 | 28 | return c 29 | } 30 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/Extension/UIColor+JChat.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CCUIColorExtension.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/2/16. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIColor { 12 | 13 | static var random: UIColor { 14 | let maxValue: UInt32 = 24 15 | return UIColor(red: CGFloat(arc4random() % maxValue) / CGFloat(maxValue), 16 | green: CGFloat(arc4random() % maxValue) / CGFloat(maxValue) , 17 | blue: CGFloat(arc4random() % maxValue) / CGFloat(maxValue) , 18 | alpha: 1) 19 | } 20 | 21 | // convenience init(red: Int, green: Int, blue: Int) { 22 | // assert(red >= 0 && red <= 255, "Invalid red component") 23 | // assert(green >= 0 && green <= 255, "Invalid green component") 24 | // assert(blue >= 0 && blue <= 255, "Invalid blue component") 25 | // 26 | // self.init(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: 1.0) 27 | // } 28 | 29 | convenience init(netHex:Int) { 30 | self.init(red:(netHex >> 16) & 0xff, green:(netHex >> 8) & 0xff, blue:netHex & 0xff) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/Extension/UISearchBar+JChat.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UISearchBar+JChat.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/10/13. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UISearchBar { 12 | static var `default`: UISearchBar { 13 | let searchBar = UISearchBar() 14 | searchBar.placeholder = "搜索" 15 | searchBar.barStyle = .default 16 | searchBar.backgroundColor = .white 17 | searchBar.barTintColor = .white 18 | searchBar.autocapitalizationType = .none 19 | searchBar.layer.borderColor = UIColor.white.cgColor 20 | searchBar.layer.borderWidth = 1 21 | searchBar.layer.masksToBounds = true 22 | return searchBar 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/Extension/UITextInput+JChat.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITextInput+JChat.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/10/18. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | protocol TextProtocol { 12 | func limitNonMarkedTextSize(_ maxSize: Int) 13 | } 14 | 15 | extension UITextView: TextProtocol { 16 | func limitNonMarkedTextSize(_ maxSize: Int) { 17 | if self.markedTextRange != nil { 18 | return 19 | } 20 | let text = self.text! 21 | if text.count > maxSize { 22 | let range = text.startIndex ..< text.index(text.startIndex, offsetBy: maxSize) 23 | //let range = Range(text.startIndex ..< text.index(text.startIndex, offsetBy: maxSize)) 24 | let subText = text.substring(with: range) 25 | self.text = subText 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/Extension/UIView+JChat.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+JChat.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/3/22. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIView { 12 | 13 | var x: CGFloat { 14 | return frame.origin.x 15 | } 16 | 17 | var y: CGFloat { 18 | return frame.origin.y 19 | } 20 | 21 | var width: CGFloat { 22 | return frame.size.width 23 | } 24 | 25 | var height: CGFloat { 26 | return frame.size.height 27 | } 28 | 29 | var size: CGSize { 30 | return frame.size 31 | } 32 | 33 | var origin: CGPoint { 34 | return frame.origin 35 | } 36 | 37 | var centerX: CGFloat { 38 | return (frame.origin.x + frame.size.width) / 2 39 | } 40 | 41 | var centerY: CGFloat { 42 | return (frame.origin.y + frame.size.height) / 2 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/Extension/UIViewController+JChat.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+JChat.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/10/8. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIViewController { 12 | @objc func back(_ animated: Bool = true) { 13 | navigationController?.popViewController(animated: animated) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/NetworkManager/JCNetworkManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCNetworkManager.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/6/16. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JCNetworkManager: NSObject { 12 | 13 | static var isNotReachable: Bool { 14 | get { 15 | let reachability = Reachability.forInternetConnection() 16 | if let status = reachability?.currentReachabilityStatus() { 17 | switch status { 18 | case NotReachable: 19 | return true 20 | default : 21 | return false 22 | } 23 | } 24 | return false 25 | } 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/Reachability/Reachability.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2016 Apple Inc. All Rights Reserved. 3 | See LICENSE.txt for this sample’s licensing information 4 | 5 | Abstract: 6 | Basic demonstration of how to use the SystemConfiguration Reachablity APIs. 7 | */ 8 | 9 | #import 10 | #import 11 | #import 12 | 13 | 14 | typedef enum : NSInteger { 15 | NotReachable = 0, 16 | ReachableViaWiFi, 17 | ReachableViaWWAN 18 | } NetworkStatus; 19 | 20 | #pragma mark IPv6 Support 21 | //Reachability fully support IPv6. For full details, see ReadMe.md. 22 | 23 | 24 | extern NSString *kReachabilityChangedNotification; 25 | 26 | 27 | @interface Reachability : NSObject 28 | 29 | /*! 30 | * Use to check the reachability of a given host name. 31 | */ 32 | + (instancetype)reachabilityWithHostName:(NSString *)hostName; 33 | 34 | /*! 35 | * Use to check the reachability of a given IP address. 36 | */ 37 | + (instancetype)reachabilityWithAddress:(const struct sockaddr *)hostAddress; 38 | 39 | /*! 40 | * Checks whether the default route is available. Should be used by applications that do not connect to a particular host. 41 | */ 42 | + (instancetype)reachabilityForInternetConnection; 43 | 44 | 45 | #pragma mark reachabilityForLocalWiFi 46 | //reachabilityForLocalWiFi has been removed from the sample. See ReadMe.md for more information. 47 | //+ (instancetype)reachabilityForLocalWiFi; 48 | 49 | /*! 50 | * Start listening for reachability notifications on the current run loop. 51 | */ 52 | - (BOOL)startNotifier; 53 | - (void)stopNotifier; 54 | 55 | - (NetworkStatus)currentReachabilityStatus; 56 | 57 | /*! 58 | * WWAN may be available, but not active until a connection has been established. WiFi may require a connection for VPN on Demand. 59 | */ 60 | - (BOOL)connectionRequired; 61 | 62 | @end 63 | 64 | 65 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Extensions.swift 3 | // ThemeDemo 4 | // 5 | // Created by JIGUANG on 2017/8/24. 6 | // Copyright © 2017年 dengyonghao. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIImage { 12 | 13 | static func loadImage(_ imageName: String) -> UIImage? { 14 | return ThemeManager.instance.loadImage(imageName) 15 | } 16 | 17 | // 如果明确资源不受 theme 变化而变化,使用这个接口会更快 18 | static func loadDefaultImage(_ imageName: String) -> UIImage? { 19 | return ThemeManager.instance.loadImage(imageName, .default) 20 | } 21 | 22 | } 23 | 24 | extension UIColor { 25 | 26 | convenience init(red: Int, green: Int, blue: Int) { 27 | assert(red >= 0 && red <= 255, "Invalid red component") 28 | assert(green >= 0 && green <= 255, "Invalid green component") 29 | assert(blue >= 0 && blue <= 255, "Invalid blue component") 30 | 31 | self.init(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: 1.0) 32 | } 33 | 34 | convenience init(_ colorName: String) { 35 | let netHex = ThemeManager.instance.themeColor(colorName) 36 | self.init(red:(netHex >> 16) & 0xff, green:(netHex >> 8) & 0xff, blue:netHex & 0xff) 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/Protocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Protocoles.swift 3 | // ThemeDemo 4 | // 5 | // Created by JIGUANG on 2017/8/23. 6 | // Copyright © 2017年 dengyonghao. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | enum ThemeStyle: Int { 12 | case `default` = 0 13 | case black 14 | case online 15 | } 16 | 17 | protocol ThemeProtocol { 18 | 19 | } 20 | 21 | extension UIView { 22 | @objc func updateTheme() { 23 | print("update view theme") 24 | } 25 | } 26 | 27 | extension UIViewController { 28 | @objc func updateTheme() { 29 | print("update view controller theme") 30 | } 31 | } 32 | 33 | extension ThemeProtocol where Self: UIView { 34 | 35 | func addThemeObserver() { 36 | print("addViewThemeObserver") 37 | NotificationCenter.default.addObserver(self, selector: #selector(updateTheme), name: NSNotification.Name(rawValue: kUpdateTheme), object: nil) 38 | } 39 | 40 | func removeThemeObserver() { 41 | print("removeViewThemeObserver") 42 | NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: kUpdateTheme), object: nil) 43 | } 44 | 45 | } 46 | 47 | extension ThemeProtocol where Self: UIViewController { 48 | 49 | func addThemeObserver() { 50 | print("addViewControllerThemeObserver") 51 | NotificationCenter.default.addObserver(self, selector: #selector(updateTheme), name: NSNotification.Name(rawValue: kUpdateTheme), object: nil) 52 | } 53 | 54 | func removeThemeObserver() { 55 | print("removeViewControllerThemeObserver") 56 | NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: kUpdateTheme), object: nil) 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/blackTheme.bundle/themeColor.txt: -------------------------------------------------------------------------------- 1 | { 2 | "bg_main":"0x2dd0cf", 3 | "bg_testview":"0x2dd0af" 4 | } 5 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_Emotion@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_Emotion@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_EmotionHL@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_EmotionHL@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_Keyboard@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_Keyboard@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_KeyboardHL@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_KeyboardHL@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_More@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_More@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_MoreHL@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_MoreHL@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_Voice@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_Voice@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_VoiceHL@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/YH_KB_VoiceHL@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_bubble_recive_nor@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_bubble_recive_nor@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_bubble_recive_press@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_bubble_recive_press@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_bubble_send_nor@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_bubble_send_nor@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_bubble_send_press@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_bubble_send_press@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_emoticon_btn_send_blue@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_emoticon_btn_send_blue@2x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_emoticon_btn_send_blue_h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_emoticon_btn_send_blue_h@2x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_emoticon_btn_send_gray@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_emoticon_btn_send_gray@2x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_emoticon_btn_setting@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_emoticon_btn_setting@2x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_businessCard@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_businessCard@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_camera@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_camera@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_location@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_location@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_pic@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_pic@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_video_short@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_tool_video_short@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_receive_icon_1@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_receive_icon_1@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_receive_icon_2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_receive_icon_2@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_receive_icon_3@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_receive_icon_3@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_send_icon_1@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_send_icon_1@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_send_icon_2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_send_icon_2@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_send_icon_3@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/chat_voice_send_icon_3@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon _selectList@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon _selectList@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_80@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_80@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_about@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_about@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_add@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_add@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_add_65@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_add_65@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_add_65_pre@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_add_65_pre@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_artboard@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_artboard@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_back@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_back@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_back_pre@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_back_pre@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_birthday@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_birthday@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_chat@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_chat@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_chat_pre@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_chat_pre@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_chatroom@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_chatroom@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_chatroom_pre@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_chatroom_pre@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_contacter@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_contacter@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_contacter_pre@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_contacter_pre@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_conv_group@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_conv_group@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_conv_single@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_conv_single@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_file@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_file@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_file_75@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_file_75@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_more@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_more@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_more_pre@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_more_pre@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_music@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_music@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_other@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_other@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_photo@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_photo@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_select@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_select@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_unselect@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_unselect@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_video@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_file_video@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_friend_add@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_friend_add@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_friend_tip@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_friend_tip@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_gender@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_gender@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_group_36@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_group_36@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_group_50@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_group_50@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_group_w@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_group_w@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_isSelect@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_isSelect@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_mine@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_mine@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_mine_pre@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_mine_pre@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_more@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_more@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_nickname@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_nickname@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_password@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_password@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_password_pre@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_password_pre@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_play@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_play@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_play_pre@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_play_pre@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_qrc_border@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_qrc_border@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_qrc_line@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_qrc_line@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_qrcode@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_qrcode@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_record@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_record@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_record_cancel@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_record_cancel@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_record_error@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_record_error@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_region@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_region@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_remove@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_remove@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_remove_pre@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_remove_pre@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_scan@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_scan@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_select@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_select@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_send_error@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_send_error@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_shield@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_shield@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_signature@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_signature@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_single_add@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_single_add@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_single_add_per@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_single_add_per@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_unselect@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_unselect@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_upload@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_upload@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_120@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_120@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_18@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_18@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_18_pre@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_18_pre@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_36@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_36@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_40@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_50@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_50@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_65@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_65@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_80@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_80@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_w@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_user_w@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_username@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/com_icon_username@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/icon_icon_close@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/icon_icon_close@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/icon_icon_close_pre@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/icon_icon_close_pre@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/icon_ios_add@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/icon_ios_add@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/location_address@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jpush/jchat-swift/96fede75359ac45a3a3b7a1fbdb569ac86e55882/JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/image/location_address@3x.png -------------------------------------------------------------------------------- /JChat/Src/Utilites/ThemeManager/defaultTheme.bundle/themeColor.txt: -------------------------------------------------------------------------------- 1 | { 2 | "bg_main":"0xD7DCE2", 3 | "bg_testview":"0x2da4af" 4 | } 5 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/Utility/JCAppManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCAppManager.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/6/23. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JCAppManager { 12 | 13 | static func openAppSetter() { 14 | let url = URL(string: UIApplication.openSettingsURLString) 15 | if UIApplication.shared.canOpenURL(url!) { 16 | UIApplication.shared.openURL(url!) 17 | } 18 | } 19 | 20 | } 21 | 22 | 23 | var isIPhoneX: Bool { 24 | if UIScreen.main.bounds.height > 736 { 25 | return true 26 | } else { 27 | return false 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/Utility/JCConstants.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCConstants.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/2/16. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | let kCurrentUserName = "kJCCurrentUserName" 12 | let kCurrentUserPassword = "kCurrentUserPassword" 13 | let kUpdateUserInfo = "kUpdateUserInfo" 14 | let kUpdateConversation = "kUpdateConversation" 15 | let kUpdateFriendInfo = "kUpdateFriendInfo" 16 | let kUpdateGroupInfo = "kUpdateGroupInfo" 17 | let kLastUserName = "kLastUserName" 18 | let kLastUserAvator = "kLastUserAvator" 19 | let kUpdateFriendList = "kUpdateFriendList" 20 | let kUpdateVerification = "kUpdateVerification" 21 | let kDeleteAllMessage = "kDeleteAllMessage" 22 | let kReloadAllMessage = "kReloadAllMessage" 23 | let kUnreadInvitationCount = "kUnreadInvitationCount" 24 | let kUpdateFileMessage = "kUpdateFileMessage" 25 | 26 | 27 | extension UIDevice { 28 | func isAboveiPhoneX() ->Bool { 29 | let screenHeight = UIScreen.main.nativeBounds.size.height; 30 | if screenHeight == 2436 || screenHeight == 1792 || screenHeight == 2688 || screenHeight == 1624 { 31 | return true 32 | } 33 | return false 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/Utility/JCFileManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCFileManager.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/7/24. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class JCFileManager: NSObject { 12 | 13 | static func fileExists(atPath: String) -> Bool { 14 | let fileManager = FileManager.default 15 | return fileManager.fileExists(atPath: atPath) 16 | } 17 | 18 | static func saveFileToLocal(data: Data, savaPath: String) -> Bool { 19 | let fileManager = FileManager.default 20 | let exist = fileManager.fileExists(atPath: savaPath) 21 | if exist { 22 | try! fileManager.removeItem(atPath: savaPath) 23 | } 24 | if !fileManager.createFile(atPath: savaPath, contents: data, attributes: nil) { 25 | return false 26 | } 27 | return true 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/Utility/JCVideoManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JCVideoManager.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/4/26. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import AVFoundation 11 | import AVKit 12 | 13 | class JCVideoManager { 14 | 15 | static func playVideo(data: Data, _ fileType: String = "MOV", currentViewController: UIViewController) { 16 | let playVC = AVPlayerViewController() 17 | 18 | let filePath = "\(NSHomeDirectory())/Documents/abcd." + fileType 19 | 20 | if JCFileManager.saveFileToLocal(data: data, savaPath: filePath) { 21 | let url = URL(fileURLWithPath: filePath) 22 | let player = AVPlayer(url: url) 23 | playVC.player = player 24 | currentViewController.present(playVC, animated: true, completion: nil) 25 | } 26 | } 27 | 28 | static func playVideo(path: String, currentViewController: UIViewController) { 29 | let playVC = AVPlayerViewController() 30 | let url = URL(fileURLWithPath: path) 31 | let player = AVPlayer(url: url) 32 | playVC.player = player 33 | currentViewController.present(playVC, animated: true, completion: nil) 34 | } 35 | 36 | static func getFristImage(data: Data) -> UIImage? { 37 | let filePath = "\(NSHomeDirectory())/Documents/getImage.MOV" 38 | if !JCFileManager.saveFileToLocal(data: data, savaPath: filePath) { 39 | return nil 40 | } 41 | let videoURL = URL(fileURLWithPath: filePath) 42 | let avAsset = AVAsset(url: videoURL) 43 | let generator = AVAssetImageGenerator(asset: avAsset) 44 | generator.appliesPreferredTrackTransform = true 45 | let time = CMTimeMakeWithSeconds(0.0,preferredTimescale: 600) 46 | var actualTime = CMTimeMake(value: 0,timescale: 0) 47 | do { 48 | let imageRef = try generator.copyCGImage(at: time, actualTime: &actualTime) 49 | let frameImg = UIImage(cgImage: imageRef) 50 | return frameImg 51 | } catch { 52 | return UIImage.createImage(color: .gray, size: CGSize(width: 160, height: 120)) 53 | } 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /JChat/Src/Utilites/Utility/Log.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Log.swift 3 | // JChat 4 | // 5 | // Created by JIGUANG on 2017/10/5. 6 | // Copyright © 2017年 HXHG. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /** 12 | print log 13 | #file String 包含这个符号的文件的路径 14 | #line Int 符号出现处的行号 15 | #column Int 符号出现处的列 16 | #function String 包含这个符号的方法名字 17 | */ 18 | func printLog(_ message: T, 19 | file: String = #file, 20 | method: String = #function, 21 | line: Int = #line) 22 | { 23 | #if DEBUG 24 | print(" | JChat | D | [\((file as NSString).lastPathComponent)][\(line)] Func - \(method): \(message)") 25 | #endif 26 | } 27 | -------------------------------------------------------------------------------- /JChatTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /JChatTests/JChatTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JChatTests.swift 3 | // JChatTests 4 | // 5 | // Created by JIGUANG on 2017/3/28. 6 | // Copyright © 2017年 dengyonghao. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import JChat 11 | 12 | class JChatTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | // This is an example of a functional test case. 26 | // Use XCTAssert and related functions to verify your tests produce the correct results. 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measure { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /JChatUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /JChatUITests/JChatUITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JChatUITests.swift 3 | // JChatUITests 4 | // 5 | // Created by JIGUANG on 2017/3/28. 6 | // Copyright © 2017年 dengyonghao. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | 11 | class JChatUITests: XCTestCase { 12 | 13 | override func setUp() { 14 | super.setUp() 15 | 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | 18 | // In UI tests it is usually best to stop immediately when a failure occurs. 19 | continueAfterFailure = false 20 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 21 | XCUIApplication().launch() 22 | 23 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 24 | } 25 | 26 | override func tearDown() { 27 | // Put teardown code here. This method is called after the invocation of each test method in the class. 28 | super.tearDown() 29 | } 30 | 31 | func testExample() { 32 | // Use recording to get started writing UI tests. 33 | // Use XCTAssert and related functions to verify your tests produce the correct results. 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 极光推送/IM JPush/JMesage 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'JChat' do 5 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | pod 'MBProgressHUD' 9 | pod 'YHPopupView' 10 | pod 'YHPhotoKit' 11 | pod 'MJRefresh' 12 | pod 'JMessage','~> 3.8.1' 13 | pod 'FMDB' 14 | pod 'RxSwift','~> 4.2.0' 15 | pod 'RxCocoa','~> 4.4.1' 16 | pod 'BaiduMapKit','~> 4.1.1' 17 | pod 'Masonry' 18 | 19 | # Pods for JChat 20 | 21 | # target 'JChatTests' do 22 | # inherit! :search_paths 23 | # # Pods for testing 24 | # end 25 | # 26 | # target 'JChatUITests' do 27 | # inherit! :search_paths 28 | # # Pods for testing 29 | # end 30 | 31 | end 32 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JChat-Swift 2 | 3 | [![Support](https://img.shields.io/badge/support-iOS%208%2B%20-blue.svg?style=flat)](https://www.apple.com/nl/ios/) 4 | [![Language](http://img.shields.io/badge/language-swift-brightgreen.svg?style=flat 5 | )](https://developer.apple.com/swift) 6 | [![License](http://img.shields.io/badge/license-MIT-lightgrey.svg?style=flat 7 | )](http://mit-license.org) 8 | 9 | ​ 10 | ### 简介 11 | 12 | JChat 是基于 JMessage SDK 带有完整 UI 界面的即时通讯应用。 演示了完整的即时通讯功能,包括: 13 | 14 | * 单聊、群聊、会话列表、好友、通讯录; 15 | * 支持发送文本、图片、语音、表情、位置、小视频; 16 | * 提供用户管理、群组管理、黑名单、免打扰、消息漫游等功能; 17 | 18 | JChat 同时具备好友模式和无好友模式: 19 | 20 | * 无好友模式:无需将对方加为好友,通过搜索对方的用户名可直接发起聊天。 21 | * 好友模式:可申请将对方加为好友,对方会收到好友验证,验证通过则互为好友关系。 22 | 23 | 目前已覆盖 iOS、 [Android](https://github.com/jpush/jchat-android) 、 [Web](https://github.com/jpush/jchat-web) 和 [Windows](https://github.com/jpush/jchat-windows) 平台,开发者可参照 JChat 快速打造自己的 APP,提高开发效率。 24 | 25 | ![image](Images/1.gif) 26 | 27 | ### 应用截图 28 | 29 | ![image](Images/2.jpg) 30 | 31 | ### 环境配置 32 | 33 | 一、前提:安装 CocoaPods 34 | 35 | 在终端输入: 36 | 37 | ``` 38 | sudo gem install cocoapods 39 | ``` 40 | 如果安装成功,会有提示: 41 | 42 | ``` 43 | Successfully installed cocoaPods 44 | ``` 45 | 46 | 二、使用 CocoaPods 导入依赖库 47 | 48 | 在当前工程文件(.xcodeproj)所在文件夹下,打开终端,并执行: 49 | 50 | ``` 51 | pod install(这个可能比较慢,请耐心等待……) 52 | ``` 53 | 54 | ### 运行应用 55 | 56 | 一、打开项目文件 JChat.xcworkspace 57 | ​ 58 | 二、配置运行的基本属性 59 | 60 | 1. 填写项目工程中的 Bundle Identifier 61 | 2. 在 AppDelegate.swift 文件中,按提示填入自己项目的 AppKey。AppKey 是 JMessage SDK 运行的基本参数,如示未获取到应的 AppKey,请到极 [极光官方网站](https://jiguang.cn) 登录控制台创建应用获取。 62 | 63 | ### 功能配置 64 | 65 | 一、消息回执功能 66 | 67 | 如果不需要支持已读未读功能,在 Build Settings 中,找到 Swift Compiler - Custom Flags,并在其中的 Other Swift Flags 删除 -D READ_VERSION。 68 | 69 | ### JMessage 文档 70 | 71 | * [JMessage iOS 集成指南](https://docs.jiguang.cn/jmessage/client/jmessage_ios_guide/) 72 | * [JMessage iOS 开发指南](https://docs.jiguang.cn/jmessage/client/im_sdk_ios/) 73 | * [JMessage iOS API Docs](https://docs.jiguang.cn/jmessage/client/jmessage_ios_appledoc_html/) 74 | 75 | --------------------------------------------------------------------------------