package com.fanxin.easeui.ui; import android.app.Activity; import android.app.ProgressDialog; import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.provider.MediaStore; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener; import android.view.ContextThemeWrapper; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.ListView; import android.widget.Toast; import com.hyphenate.EMChatRoomChangeListener; import com.hyphenate.EMMessageListener; import com.hyphenate.EMValueCallBack; import com.hyphenate.chat.EMChatRoom; import com.hyphenate.chat.EMClient; import com.hyphenate.chat.EMConversation; import com.hyphenate.chat.EMGroup; import com.hyphenate.chat.EMImageMessageBody; import com.hyphenate.chat.EMMessage; import com.hyphenate.chat.EMMessage.ChatType; import com.hyphenate.chat.EMTextMessageBody; import com.fanxin.easeui.EaseConstant; import com.fanxin.easeui.controller.EaseUI; import com.fanxin.easeui.domain.EaseEmojicon; import com.fanxin.easeui.model.EaseAtMessageHelper; import com.fanxin.easeui.utils.EaseCommonUtils; import com.fanxin.easeui.utils.EaseUserUtils; import com.fanxin.easeui.widget.EaseAlertDialog; import com.fanxin.easeui.widget.EaseAlertDialog.AlertDialogUser; import com.fanxin.easeui.widget.EaseChatExtendMenu; import com.fanxin.easeui.widget.EaseChatInputMenu; import com.fanxin.easeui.widget.EaseChatInputMenu.ChatInputMenuListener; import com.fanxin.easeui.widget.EaseChatMessageList; import com.fanxin.easeui.widget.EaseVoiceRecorderView; import com.fanxin.easeui.widget.EaseVoiceRecorderView.EaseVoiceRecorderCallback; import com.fanxin.easeui.widget.chatrow.EaseCustomChatRowProvider; import com.hyphenate.easeui.R; import com.hyphenate.util.EMLog; import com.hyphenate.util.PathUtil; import java.io.File; import java.util.List; /** * you can new an EaseChatFragment to use or you can inherit it to expand. * You need call setArguments to pass chatType and userId * <br/> * <br/> * you can see ChatActivity in demo for your reference * */ public class EaseChatFragment extends EaseBaseFragment { protected static final String TAG = "EaseChatFragment"; protected static final int REQUEST_CODE_MAP = 1; protected static final int REQUEST_CODE_CAMERA = 2; protected static final int REQUEST_CODE_LOCAL = 3; /** * params to fragment */ protected Bundle fragmentArgs; protected int chatType; protected String toChatUsername; protected EaseChatMessageList messageList; protected EaseChatInputMenu inputMenu; protected EMConversation conversation; protected InputMethodManager inputManager; protected ClipboardManager clipboard; protected Handler handler = new Handler(); protected File cameraFile; protected EaseVoiceRecorderView voiceRecorderView; protected SwipeRefreshLayout swipeRefreshLayout; protected ListView listView; protected boolean isloading; protected boolean haveMoreData = true; protected int pagesize = 20; protected GroupListener groupListener; protected EMMessage contextMenuMessage; static final int ITEM_TAKE_PICTURE = 1; static final int ITEM_PICTURE = 2; static final int ITEM_LOCATION = 3; protected int[] itemStrings = { R.string.attach_take_pic, R.string.attach_picture, R.string.attach_location }; protected int[] itemdrawables = { R.drawable.ease_chat_takepic_selector, R.drawable.ease_chat_image_selector, R.drawable.ease_chat_location_selector }; protected int[] itemIds = { ITEM_TAKE_PICTURE, ITEM_PICTURE, ITEM_LOCATION }; private EMChatRoomChangeListener chatRoomChangeListener; public boolean isMessageListInited; protected MyItemClickListener extendMenuItemClickListener; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.ease_fragment_chat, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { fragmentArgs = getArguments(); // check if single chat or group chat chatType = fragmentArgs.getInt(EaseConstant.EXTRA_CHAT_TYPE, EaseConstant.CHATTYPE_SINGLE); // userId you are chat with or group id toChatUsername = fragmentArgs.getString(EaseConstant.EXTRA_USER_ID); super.onActivityCreated(savedInstanceState); } /** * init view */ protected void initView() { // hold to record voice voiceRecorderView = (EaseVoiceRecorderView) getView().findViewById(R.id.voice_recorder); // message list layout messageList = (EaseChatMessageList) getView().findViewById(R.id.message_list); if(chatType != EaseConstant.CHATTYPE_SINGLE) messageList.setShowUserNick(true); listView = messageList.getListView(); extendMenuItemClickListener = new MyItemClickListener(); inputMenu = (EaseChatInputMenu) getView().findViewById(R.id.input_menu); registerExtendMenuItem(); // init input menu inputMenu.init(null); inputMenu.setChatInputMenuListener(new ChatInputMenuListener() { @Override public void onSendMessage(String content) { sendTextMessage(content); } @Override public boolean onPressToSpeakBtnTouch(View v, MotionEvent event) { return voiceRecorderView.onPressToSpeakBtnTouch(v, event, new EaseVoiceRecorderCallback() { @Override public void onVoiceRecordComplete(String voiceFilePath, int voiceTimeLength) { sendVoiceMessage(voiceFilePath, voiceTimeLength); } }); } @Override public void onBigExpressionClicked(EaseEmojicon emojicon) { sendBigExpressionMessage(emojicon.getName(), emojicon.getIdentityCode()); } }); swipeRefreshLayout = messageList.getSwipeRefreshLayout(); swipeRefreshLayout.setColorSchemeResources(R.color.holo_blue_bright, R.color.holo_green_light, R.color.holo_orange_light, R.color.holo_red_light); inputManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE); getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); } protected void setUpView() { titleBar.setTitle(toChatUsername); if (chatType == EaseConstant.CHATTYPE_SINGLE) { // set title if(EaseUserUtils.getUserInfo(toChatUsername) != null){ titleBar.setTitle(EaseUserUtils.getUserInfo(toChatUsername).getNick()); } titleBar.setRightImageResource(R.drawable.ease_mm_title_remove); } else { titleBar.setRightImageResource(R.drawable.ease_to_group_details_normal); if (chatType == EaseConstant.CHATTYPE_GROUP) { //group chat EMGroup group = EMClient.getInstance().groupManager().getGroup(toChatUsername); if (group != null) titleBar.setTitle(group.getGroupName()); // listen the event that user moved out group or group is dismissed groupListener = new GroupListener(); EMClient.getInstance().groupManager().addGroupChangeListener(groupListener); } else { onChatRoomViewCreation(); } } if (chatType != EaseConstant.CHATTYPE_CHATROOM) { onConversationInit(); onMessageListInit(); } titleBar.setLeftLayoutClickListener(new OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } }); titleBar.setRightLayoutClickListener(new OnClickListener() { @Override public void onClick(View v) { if (chatType == EaseConstant.CHATTYPE_SINGLE) { emptyHistory(); } else { toGroupDetails(); } } }); setRefreshLayoutListener(); // show forward message if the message is not null String forward_msg_id = getArguments().getString("forward_msg_id"); if (forward_msg_id != null) { forwardMessage(forward_msg_id); } } /** * register extend menu, item id need > 3 if you override this method and keep exist item */ protected void registerExtendMenuItem(){ for(int i = 0; i < itemStrings.length; i++){ inputMenu.registerExtendMenuItem(itemStrings[i], itemdrawables[i], itemIds[i], extendMenuItemClickListener); } } protected void onConversationInit(){ conversation = EMClient.getInstance().chatManager().getConversation(toChatUsername, EaseCommonUtils.getConversationType(chatType), true); conversation.markAllMessagesAsRead(); // the number of messages loaded into conversation is getChatOptions().getNumberOfMessagesLoaded // you can change this number final List<EMMessage> msgs = conversation.getAllMessages(); int msgCount = msgs != null ? msgs.size() : 0; if (msgCount < conversation.getAllMsgCount() && msgCount < pagesize) { String msgId = null; if (msgs != null && msgs.size() > 0) { msgId = msgs.get(0).getMsgId(); } conversation.loadMoreMsgFromDB(msgId, pagesize - msgCount); } } protected void onMessageListInit(){ messageList.init(toChatUsername, chatType, chatFragmentHelper != null ? chatFragmentHelper.onSetCustomChatRowProvider() : null); setListItemClickListener(); messageList.getListView().setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { hideKeyboard(); inputMenu.hideExtendMenuContainer(); return false; } }); isMessageListInited = true; } protected void setListItemClickListener() { messageList.setItemClickListener(new EaseChatMessageList.MessageListItemClickListener() { @Override public void onUserAvatarClick(String username) { if(chatFragmentHelper != null){ chatFragmentHelper.onAvatarClick(username); } } @Override public void onUserAvatarLongClick(String username) { if(chatFragmentHelper != null){ chatFragmentHelper.onAvatarLongClick(username); } } @Override public void onResendClick(final EMMessage message) { new EaseAlertDialog(getActivity(), R.string.resend, R.string.confirm_resend, null, new AlertDialogUser() { @Override public void onResult(boolean confirmed, Bundle bundle) { if (!confirmed) { return; } resendMessage(message); } }, true).show(); } @Override public void onBubbleLongClick(EMMessage message) { contextMenuMessage = message; if(chatFragmentHelper != null){ chatFragmentHelper.onMessageBubbleLongClick(message); } } @Override public boolean onBubbleClick(EMMessage message) { if(chatFragmentHelper != null){ return chatFragmentHelper.onMessageBubbleClick(message); } return false; } }); } protected void setRefreshLayoutListener() { swipeRefreshLayout.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh() { new Handler().postDelayed(new Runnable() { @Override public void run() { if (listView.getFirstVisiblePosition() == 0 && !isloading && haveMoreData) { List<EMMessage> messages; try { if (chatType == EaseConstant.CHATTYPE_SINGLE) { messages = conversation.loadMoreMsgFromDB(messageList.getItem(0).getMsgId(), pagesize); } else { messages = conversation.loadMoreMsgFromDB(messageList.getItem(0).getMsgId(), pagesize); } } catch (Exception e1) { swipeRefreshLayout.setRefreshing(false); return; } if (messages.size() > 0) { messageList.refreshSeekTo(messages.size() - 1); if (messages.size() != pagesize) { haveMoreData = false; } } else { haveMoreData = false; } isloading = false; } else { Toast.makeText(getActivity(), getResources().getString(R.string.no_more_messages), Toast.LENGTH_SHORT).show(); } swipeRefreshLayout.setRefreshing(false); } }, 600); } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { if (requestCode == REQUEST_CODE_CAMERA) { // capture new image if (cameraFile != null && cameraFile.exists()) sendImageMessage(cameraFile.getAbsolutePath()); } else if (requestCode == REQUEST_CODE_LOCAL) { // send local image if (data != null) { Uri selectedImage = data.getData(); if (selectedImage != null) { sendPicByUri(selectedImage); } } } else if (requestCode == REQUEST_CODE_MAP) { // location double latitude = data.getDoubleExtra("latitude", 0); double longitude = data.getDoubleExtra("longitude", 0); String locationAddress = data.getStringExtra("address"); if (locationAddress != null && !locationAddress.equals("")) { sendLocationMessage(latitude, longitude, locationAddress); } else { Toast.makeText(getActivity(), R.string.unable_to_get_loaction, Toast.LENGTH_SHORT).show(); } } } } @Override public void onResume() { super.onResume(); if(isMessageListInited) messageList.refresh(); EaseUI.getInstance().pushActivity(getActivity()); // register the event listener when enter the foreground if(chatType == EaseConstant.CHATTYPE_GROUP){ EaseAtMessageHelper.get().removeAtMeGroup(toChatUsername); } } @Override public void onStop() { super.onStop(); // unregister this event listener when this activity enters the // background //EMClient.getInstance().chatManager().removeMessageListener(this); // remove activity from foreground activity list EaseUI.getInstance().popActivity(getActivity()); } @Override public void onDestroy() { super.onDestroy(); if (groupListener != null) { EMClient.getInstance().groupManager().removeGroupChangeListener(groupListener); } if(chatType == EaseConstant.CHATTYPE_CHATROOM){ EMClient.getInstance().chatroomManager().leaveChatRoom(toChatUsername); } if(chatRoomChangeListener != null){ EMClient.getInstance().chatroomManager().removeChatRoomChangeListener(chatRoomChangeListener); } } public void onBackPressed() { if (inputMenu.onBackPressed()) { getActivity().finish(); if(chatType == EaseConstant.CHATTYPE_GROUP){ EaseAtMessageHelper.get().removeAtMeGroup(toChatUsername); EaseAtMessageHelper.get().cleanToAtUserList(); } if (chatType == EaseConstant.CHATTYPE_CHATROOM) { EMClient.getInstance().chatroomManager().leaveChatRoom(toChatUsername); } } } protected void onChatRoomViewCreation() { final ProgressDialog pd = ProgressDialog.show(getActivity(), "", "Joining......"); EMClient.getInstance().chatroomManager().joinChatRoom(toChatUsername, new EMValueCallBack<EMChatRoom>() { @Override public void onSuccess(final EMChatRoom value) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { if(getActivity().isFinishing() || !toChatUsername.equals(value.getId())) return; pd.dismiss(); EMChatRoom room = EMClient.getInstance().chatroomManager().getChatRoom(toChatUsername); if (room != null) { titleBar.setTitle(room.getName()); EMLog.d(TAG, "join room success : " + room.getName()); } else { titleBar.setTitle(toChatUsername); } addChatRoomChangeListenr(); onConversationInit(); onMessageListInit(); } }); } @Override public void onError(final int error, String errorMsg) { // TODO Auto-generated method stub EMLog.d(TAG, "join room failure : " + error); getActivity().runOnUiThread(new Runnable() { @Override public void run() { pd.dismiss(); } }); getActivity().finish(); } }); } protected void addChatRoomChangeListenr() { chatRoomChangeListener = new EMChatRoomChangeListener() { @Override public void onChatRoomDestroyed(String roomId, String roomName) { if (roomId.equals(toChatUsername)) { showChatroomToast(" room : " + roomId + " with room name : " + roomName + " was destroyed"); getActivity().finish(); } } @Override public void onMemberJoined(String roomId, String participant) { showChatroomToast("member : " + participant + " join the room : " + roomId); } @Override public void onMemberExited(String roomId, String roomName, String participant) { showChatroomToast("member : " + participant + " leave the room : " + roomId + " room name : " + roomName); } @Override public void onMemberKicked(String roomId, String roomName, String participant) { if (roomId.equals(toChatUsername)) { String curUser = EMClient.getInstance().getCurrentUser(); if (curUser.equals(participant)) { EMClient.getInstance().chatroomManager().leaveChatRoom(toChatUsername); getActivity().finish(); }else{ showChatroomToast("member : " + participant + " was kicked from the room : " + roomId + " room name : " + roomName); } } } }; EMClient.getInstance().chatroomManager().addChatRoomChangeListener(chatRoomChangeListener); } protected void showChatroomToast(final String toastContent){ getActivity().runOnUiThread(new Runnable() { public void run() { Toast.makeText(getActivity(), toastContent, Toast.LENGTH_SHORT).show(); } }); } /** * handle the click event for extend menu * */ class MyItemClickListener implements EaseChatExtendMenu.EaseChatExtendMenuItemClickListener{ @Override public void onClick(int itemId, View view) { if(chatFragmentHelper != null){ if(chatFragmentHelper.onExtendMenuItemClick(itemId, view)){ return; } } switch (itemId) { case ITEM_TAKE_PICTURE: selectPicFromCamera(); break; case ITEM_PICTURE: selectPicFromLocal(); break; case ITEM_LOCATION: startActivityForResult(new Intent(getActivity(), EaseBaiduMapActivity.class), REQUEST_CODE_MAP); break; default: break; } } } /** * input @ * @param username */ protected void inputAtUsername(String username, boolean autoAddAtSymbol){ if(EMClient.getInstance().getCurrentUser().equals(username) || chatType != EaseConstant.CHATTYPE_GROUP){ return; } EaseAtMessageHelper.get().addAtUser(username); if(EaseUserUtils.getUserInfo(username) != null){ username = EaseUserUtils.getUserInfo(username).getNick(); } if(autoAddAtSymbol) inputMenu.insertText("@" + username + " "); else inputMenu.insertText(username + " "); } /** * input @ * @param username */ protected void inputAtUsername(String username){ inputAtUsername(username, true); } //send message protected void sendTextMessage(String content) { if(EaseAtMessageHelper.get().containsAtUsername(content)){ sendAtMessage(content); }else{ EMMessage message = EMMessage.createTxtSendMessage(content, toChatUsername); sendMessage(message); } } /** * send @ message, only support group chat message * @param content */ private void sendAtMessage(String content){ if(chatType != EaseConstant.CHATTYPE_GROUP){ EMLog.e(TAG, "only support group chat message"); return; } EMMessage message = EMMessage.createTxtSendMessage(content, toChatUsername); EMGroup group = EMClient.getInstance().groupManager().getGroup(toChatUsername); if(EMClient.getInstance().getCurrentUser().equals(group.getOwner()) && EaseAtMessageHelper.get().containsAtAll(content)){ message.setAttribute(EaseConstant.MESSAGE_ATTR_AT_MSG, EaseConstant.MESSAGE_ATTR_VALUE_AT_MSG_ALL); }else { message.setAttribute(EaseConstant.MESSAGE_ATTR_AT_MSG, EaseAtMessageHelper.get().atListToJsonArray(EaseAtMessageHelper.get().getAtMessageUsernames(content))); } sendMessage(message); } protected void sendBigExpressionMessage(String name, String identityCode){ EMMessage message = EaseCommonUtils.createExpressionMessage(toChatUsername, name, identityCode); sendMessage(message); } protected void sendVoiceMessage(String filePath, int length) { EMMessage message = EMMessage.createVoiceSendMessage(filePath, length, toChatUsername); sendMessage(message); } protected void sendImageMessage(String imagePath) { EMMessage message = EMMessage.createImageSendMessage(imagePath, false, toChatUsername); sendMessage(message); } protected void sendLocationMessage(double latitude, double longitude, String locationAddress) { EMMessage message = EMMessage.createLocationSendMessage(latitude, longitude, locationAddress, toChatUsername); sendMessage(message); } protected void sendVideoMessage(String videoPath, String thumbPath, int videoLength) { EMMessage message = EMMessage.createVideoSendMessage(videoPath, thumbPath, videoLength, toChatUsername); sendMessage(message); } protected void sendFileMessage(String filePath) { EMMessage message = EMMessage.createFileSendMessage(filePath, toChatUsername); sendMessage(message); } protected void sendMessage(EMMessage message){ if (message == null) { return; } if(chatFragmentHelper != null){ //set extension chatFragmentHelper.onSetMessageAttributes(message); } if (chatType == EaseConstant.CHATTYPE_GROUP){ message.setChatType(ChatType.GroupChat); }else if(chatType == EaseConstant.CHATTYPE_CHATROOM){ message.setChatType(ChatType.ChatRoom); } //send message EMClient.getInstance().chatManager().sendMessage(message); //refresh ui if(isMessageListInited) { messageList.refreshSelectLast(); } } public void resendMessage(EMMessage message){ message.setStatus(EMMessage.Status.CREATE); EMClient.getInstance().chatManager().sendMessage(message); messageList.refresh(); } //=================================================================================== /** * send image * * @param selectedImage */ protected void sendPicByUri(Uri selectedImage) { String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getActivity().getContentResolver().query(selectedImage, filePathColumn, null, null, null); if (cursor != null) { cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); cursor = null; if (picturePath == null || picturePath.equals("null")) { Toast toast = Toast.makeText(getActivity(), R.string.cant_find_pictures, Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); return; } sendImageMessage(picturePath); } else { File file = new File(selectedImage.getPath()); if (!file.exists()) { Toast toast = Toast.makeText(getActivity(), R.string.cant_find_pictures, Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); return; } sendImageMessage(file.getAbsolutePath()); } } /** * send file * @param uri */ protected void sendFileByUri(Uri uri){ String filePath = null; if ("content".equalsIgnoreCase(uri.getScheme())) { String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = null; try { cursor = getActivity().getContentResolver().query(uri, filePathColumn, null, null, null); int column_index = cursor.getColumnIndexOrThrow("_data"); if (cursor.moveToFirst()) { filePath = cursor.getString(column_index); } } catch (Exception e) { e.printStackTrace(); } } else if ("file".equalsIgnoreCase(uri.getScheme())) { filePath = uri.getPath(); } File file = new File(filePath); if (file == null || !file.exists()) { Toast.makeText(getActivity(), R.string.File_does_not_exist, 0).show(); return; } //limit the size < 10M if (file.length() > 10 * 1024 * 1024) { Toast.makeText(getActivity(), R.string.The_file_is_not_greater_than_10_m, 0).show(); return; } sendFileMessage(filePath); } /** * capture new image */ protected void selectPicFromCamera() { if (!EaseCommonUtils.isSdcardExist()) { Toast.makeText(getActivity(), R.string.sd_card_does_not_exist, 0).show(); return; } cameraFile = new File(PathUtil.getInstance().getImagePath(), EMClient.getInstance().getCurrentUser() + System.currentTimeMillis() + ".jpg"); cameraFile.getParentFile().mkdirs(); startActivityForResult( new Intent(MediaStore.ACTION_IMAGE_CAPTURE).putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile)), REQUEST_CODE_CAMERA); } /** * select local image */ protected void selectPicFromLocal() { Intent intent; if (Build.VERSION.SDK_INT < 19) { intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); } else { intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); } startActivityForResult(intent, REQUEST_CODE_LOCAL); } /** * clear the conversation history * */ protected void emptyHistory() { String msg = getResources().getString(R.string.Whether_to_empty_all_chats); new EaseAlertDialog(getActivity(),null, msg, null,new AlertDialogUser() { @Override public void onResult(boolean confirmed, Bundle bundle) { if(confirmed){ EMClient.getInstance().chatManager().deleteConversation(toChatUsername, true); messageList.refresh(); } } }, true).show();; } /** * open group detail * */ protected void toGroupDetails() { if (chatType == EaseConstant.CHATTYPE_GROUP) { EMGroup group = EMClient.getInstance().groupManager().getGroup(toChatUsername); if (group == null) { Toast.makeText(getActivity(), R.string.gorup_not_found, 0).show(); return; } if(chatFragmentHelper != null){ chatFragmentHelper.onEnterToChatDetails(); } }else if(chatType == EaseConstant.CHATTYPE_CHATROOM){ if(chatFragmentHelper != null){ chatFragmentHelper.onEnterToChatDetails(); } } } /** * hide */ protected void hideKeyboard() { if (getActivity().getWindow().getAttributes().softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) { if (getActivity().getCurrentFocus() != null) inputManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } /** * forward message * * @param forward_msg_id */ protected void forwardMessage(String forward_msg_id) { final EMMessage forward_msg = EMClient.getInstance().chatManager().getMessage(forward_msg_id); EMMessage.Type type = forward_msg.getType(); switch (type) { case TXT: if(forward_msg.getBooleanAttribute(EaseConstant.MESSAGE_ATTR_IS_BIG_EXPRESSION, false)){ sendBigExpressionMessage(((EMTextMessageBody) forward_msg.getBody()).getMessage(), forward_msg.getStringAttribute(EaseConstant.MESSAGE_ATTR_EXPRESSION_ID, null)); }else{ // get the content and send it String content = ((EMTextMessageBody) forward_msg.getBody()).getMessage(); sendTextMessage(content); } break; case IMAGE: // send image String filePath = ((EMImageMessageBody) forward_msg.getBody()).getLocalUrl(); if (filePath != null) { File file = new File(filePath); if (!file.exists()) { // send thumb nail if original image does not exist filePath = ((EMImageMessageBody) forward_msg.getBody()).thumbnailLocalPath(); } sendImageMessage(filePath); } break; default: break; } if(forward_msg.getChatType() == EMMessage.ChatType.ChatRoom){ EMClient.getInstance().chatroomManager().leaveChatRoom(forward_msg.getTo()); } } /** * listen the group event * */ class GroupListener extends EaseGroupRemoveListener { @Override public void onUserRemoved(final String groupId, String groupName) { getActivity().runOnUiThread(new Runnable() { public void run() { if (toChatUsername.equals(groupId)) { Toast.makeText(getActivity(), R.string.you_are_group, 1).show(); getActivity().finish(); } } }); } @Override public void onGroupDestroy(final String groupId, String groupName) { // prompt group is dismissed and finish this activity getActivity().runOnUiThread(new Runnable() { public void run() { if (toChatUsername.equals(groupId)) { Toast.makeText(getActivity(), R.string.the_current_group, 1).show(); getActivity().finish(); } } }); } } protected EaseChatFragmentHelper chatFragmentHelper; public void setChatFragmentListener(EaseChatFragmentHelper chatFragmentHelper){ this.chatFragmentHelper = chatFragmentHelper; } public interface EaseChatFragmentHelper{ /** * set message attribute */ void onSetMessageAttributes(EMMessage message); /** * enter to chat detail */ void onEnterToChatDetails(); /** * on avatar clicked * @param username */ void onAvatarClick(String username); /** * on avatar long pressed * @param username */ void onAvatarLongClick(String username); /** * on message bubble clicked */ boolean onMessageBubbleClick(EMMessage message); /** * on message bubble long pressed */ void onMessageBubbleLongClick(EMMessage message); /** * on extend menu item clicked, return true if you want to override * @param view * @param itemId * @return */ boolean onExtendMenuItemClick(int itemId, View view); /** * on set custom chat row provider * @return */ EaseCustomChatRowProvider onSetCustomChatRowProvider(); } }