com.xxjwd.chat.ChatActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.xxjwd.chat.ChatActivity.java

Source

/**
 * Copyright (C) 2013-2014 EaseMob Technologies. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *     http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.xxjwd.chat;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;

import com.xxjwd.chat.adapter.ExpressionAdapter;
import com.xxjwd.chat.adapter.ExpressionPagerAdapter;
import com.xxjwd.chat.adapter.MessageAdapter;
import com.xxjwd.chat.base.ChatContactManager;
import com.xxjwd.chat.base.ChatGroup;
import com.xxjwd.chat.base.ChatGroupManager;
import com.xxjwd.chat.base.ChatManager;
import com.xxjwd.chat.base.ChatMessage;
import com.xxjwd.chat.base.ChatMessage.ChatType;
import com.xxjwd.chat.base.ChatConversation;
import com.xxjwd.chat.base.ChatError;
import com.xxjwd.chat.base.ImageMessageBody;
import com.xxjwd.chat.base.LocationMessageBody;
import com.xxjwd.chat.base.NormalFileMessageBody;
import com.xxjwd.chat.base.TextMessageBody;
import com.xxjwd.chat.base.VideoMessageBody;
import com.xxjwd.chat.base.VoiceMessageBody;
import com.xxjwd.chat.listener.GroupReomveListener;
import com.xxjwd.chat.listener.VoicePlayClickListener;
import com.xxjwd.chat.util.ChatFileUtil;
import com.xxjwd.chat.util.ChatLog;
import com.xxjwd.chat.util.CommonUtils;
import com.xxjwd.chat.util.ImageUtils;
import com.xxjwd.chat.util.ChatFileUtil.FileType;
import com.xxjwd.chat.util.SmileUtils;
import com.xxjwd.chat.widget.ExpandGridView;
import com.xxjwd.chat.widget.PasteEditText;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.media.ThumbnailUtils;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.PowerManager;
import android.provider.MediaStore;
import android.support.v4.view.ViewPager;
import android.text.ClipboardManager;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.xxjwd.chat.base.AudioRecorder;
import com.xxjwd.chat.exception.ChatException;
import com.xxjwd.sjbg.R;

/**
 * ??
 * 
 */
public class ChatActivity extends BaseActivity implements OnClickListener {

   private static final int REQUEST_CODE_EMPTY_HISTORY = 2;
   public static final int REQUEST_CODE_CONTEXT_MENU = 3;
   private static final int REQUEST_CODE_MAP = 4;
   public static final int REQUEST_CODE_TEXT = 5;
   public static final int REQUEST_CODE_VOICE = 6;
   public static final int REQUEST_CODE_PICTURE = 7;
   public static final int REQUEST_CODE_LOCATION = 8;
   public static final int REQUEST_CODE_NET_DISK = 9;
   public static final int REQUEST_CODE_FILE = 10;
   public static final int REQUEST_CODE_COPY_AND_PASTE = 11;
   public static final int REQUEST_CODE_PICK_VIDEO = 12;
   public static final int REQUEST_CODE_DOWNLOAD_VIDEO = 13;
   public static final int REQUEST_CODE_VIDEO = 14;
   public static final int REQUEST_CODE_DOWNLOAD_VOICE = 15;
   public static final int REQUEST_CODE_SELECT_USER_CARD = 16;
   public static final int REQUEST_CODE_SEND_USER_CARD = 17;
   public static final int REQUEST_CODE_CAMERA = 18;
   public static final int REQUEST_CODE_LOCAL = 19;
   public static final int REQUEST_CODE_CLICK_DESTORY_IMG = 20;
   public static final int REQUEST_CODE_GROUP_DETAIL = 21;
   public static final int REQUEST_CODE_SELECT_VIDEO = 23;
   public static final int REQUEST_CODE_SELECT_FILE = 24;
   public static final int REQUEST_CODE_ADD_TO_BLACKLIST = 25;

   public static final int RESULT_CODE_COPY = 1;
   public static final int RESULT_CODE_DELETE = 2;
   public static final int RESULT_CODE_FORWARD = 3;
   public static final int RESULT_CODE_OPEN = 4;
   public static final int RESULT_CODE_DWONLOAD = 5;
   public static final int RESULT_CODE_TO_CLOUD = 6;
   public static final int RESULT_CODE_EXIT_GROUP = 7;

   public static final int CHATTYPE_SINGLE = 1;
   public static final int CHATTYPE_GROUP = 2;

   public static final String COPY_IMAGE = "EASEMOBIMG";
   private View recordingContainer;
   private ImageView micImage;
   private TextView recordingHint;
   private ListView listView;
   private PasteEditText mEditTextContent;
   private View buttonSetModeKeyboard;
   private View buttonSetModeVoice;
   private View buttonSend;
   private View buttonPressToSpeak;
   // private ViewPager expressionViewpager;
   private LinearLayout emojiIconContainer;
   private LinearLayout btnContainer;
   private ImageView locationImgview;
   private View more;
   private int position;
   private ClipboardManager clipboard;
   private ViewPager expressionViewpager;
   private InputMethodManager manager;
   private List<String> reslist;
   private Drawable[] micImages;
   private int chatType;
   private ChatConversation conversation;
   private NewMessageBroadcastReceiver receiver;
   public static ChatActivity activityInstance = null;
   // ????
   private String toChatUsername;
   private AudioRecorder AudioRecorder;
   private MessageAdapter adapter;
   private File cameraFile;
   static int resendPos;

   private GroupListener groupListener;

   private ImageView iv_emoticons_normal;
   private ImageView iv_emoticons_checked;
   private RelativeLayout edittext_layout;
   private ProgressBar loadmorePB;
   private boolean isloading;
   private final int pagesize = 20;
   private boolean haveMoreData = true;
   private Button btnMore;
   public String playMsgId;

   private Handler micImageHandler = new Handler() {
      @Override
      public void handleMessage(android.os.Message msg) {
         // ?msg?
         micImage.setImageDrawable(micImages[msg.what]);
      }
   };
   private ChatGroup group;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_chat);
      getActionBar().hide();
      initView();
      setUpView();
   }

   /**
    * initView
    */
   protected void initView() {
      recordingContainer = findViewById(R.id.recording_container);
      micImage = (ImageView) findViewById(R.id.mic_image);
      recordingHint = (TextView) findViewById(R.id.recording_hint);
      listView = (ListView) findViewById(R.id.list);
      mEditTextContent = (PasteEditText) findViewById(R.id.et_sendmessage);
      buttonSetModeKeyboard = findViewById(R.id.btn_set_mode_keyboard);
      edittext_layout = (RelativeLayout) findViewById(R.id.edittext_layout);
      buttonSetModeVoice = findViewById(R.id.btn_set_mode_voice);
      buttonSend = findViewById(R.id.btn_send);
      buttonPressToSpeak = findViewById(R.id.btn_press_to_speak);
      expressionViewpager = (ViewPager) findViewById(R.id.vPager);
      emojiIconContainer = (LinearLayout) findViewById(R.id.ll_face_container);
      btnContainer = (LinearLayout) findViewById(R.id.ll_btn_container);
      locationImgview = (ImageView) findViewById(R.id.btn_location);
      iv_emoticons_normal = (ImageView) findViewById(R.id.iv_emoticons_normal);
      iv_emoticons_checked = (ImageView) findViewById(R.id.iv_emoticons_checked);
      loadmorePB = (ProgressBar) findViewById(R.id.pb_load_more);
      btnMore = (Button) findViewById(R.id.btn_more);
      iv_emoticons_normal.setVisibility(View.VISIBLE);
      iv_emoticons_checked.setVisibility(View.INVISIBLE);
      more = findViewById(R.id.more);
      edittext_layout.setBackgroundResource(R.drawable.input_bar_bg_normal);

      // ?,
      micImages = new Drawable[] { getResources().getDrawable(R.drawable.record_animate_01),
            getResources().getDrawable(R.drawable.record_animate_02), getResources().getDrawable(R.drawable.record_animate_03),
            getResources().getDrawable(R.drawable.record_animate_04), getResources().getDrawable(R.drawable.record_animate_05),
            getResources().getDrawable(R.drawable.record_animate_06), getResources().getDrawable(R.drawable.record_animate_07),
            getResources().getDrawable(R.drawable.record_animate_08), getResources().getDrawable(R.drawable.record_animate_09),
            getResources().getDrawable(R.drawable.record_animate_10), getResources().getDrawable(R.drawable.record_animate_11),
            getResources().getDrawable(R.drawable.record_animate_12), getResources().getDrawable(R.drawable.record_animate_13),
            getResources().getDrawable(R.drawable.record_animate_14), };

      // list
      reslist = getExpressionRes(35);
      // ?viewpager
      List<View> views = new ArrayList<View>();
      View gv1 = getGridChildView(1);
      View gv2 = getGridChildView(2);
      views.add(gv1);
      views.add(gv2);
      expressionViewpager.setAdapter(new ExpressionPagerAdapter(views));
      edittext_layout.requestFocus();
      AudioRecorder = new AudioRecorder(this, micImageHandler);
      buttonPressToSpeak.setOnTouchListener(new PressToSpeakListen());
      mEditTextContent.setOnFocusChangeListener(new OnFocusChangeListener() {

         @Override
         public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
               edittext_layout.setBackgroundResource(R.drawable.input_bar_bg_active);
            } else {
               edittext_layout.setBackgroundResource(R.drawable.input_bar_bg_normal);
            }

         }
      });
      mEditTextContent.setOnClickListener(new OnClickListener() {

         @Override
         public void onClick(View v) {
            edittext_layout.setBackgroundResource(R.drawable.input_bar_bg_active);
            more.setVisibility(View.GONE);
            iv_emoticons_normal.setVisibility(View.VISIBLE);
            iv_emoticons_checked.setVisibility(View.INVISIBLE);
            emojiIconContainer.setVisibility(View.GONE);
            btnContainer.setVisibility(View.GONE);
         }
      });
      // ?
      mEditTextContent.addTextChangedListener(new TextWatcher() {

         @Override
         public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (!TextUtils.isEmpty(s)) {
               btnMore.setVisibility(View.GONE);
               buttonSend.setVisibility(View.VISIBLE);
            } else {
               btnMore.setVisibility(View.VISIBLE);
               buttonSend.setVisibility(View.GONE);
            }
         }

         @Override
         public void beforeTextChanged(CharSequence s, int start, int count, int after) {
         }

         @Override
         public void afterTextChanged(Editable s) {

         }
      });

   }

   private void setUpView() {
      activityInstance = this;
      iv_emoticons_normal.setOnClickListener(this);
      iv_emoticons_checked.setOnClickListener(this);
      // position = getIntent().getIntExtra("position", -1);
      clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
      manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
      getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
      wakeLock = ((PowerManager) getSystemService(Context.POWER_SERVICE)).newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "demo");
      // ???
      chatType = getIntent().getIntExtra("chatType", CHATTYPE_SINGLE);

      if (chatType == CHATTYPE_SINGLE) { // ??
         toChatUsername = getIntent().getStringExtra("userId");
         toChatUsername = "3974";
         ((TextView) findViewById(R.id.name)).setText(toChatUsername);
          conversation =    ChatManager.getInstance().getConversation(toChatUsername,false);
      } else {
         // ?
         findViewById(R.id.container_to_group).setVisibility(View.VISIBLE);
         findViewById(R.id.container_remove).setVisibility(View.GONE);
         findViewById(R.id.container_voice_call).setVisibility(View.GONE);
         toChatUsername = getIntent().getStringExtra("groupId");
         group = ChatGroupManager.getInstance().getGroup(toChatUsername);
         ((TextView) findViewById(R.id.name)).setText(group.getGroupName());
          conversation =
          ChatManager.getInstance().getConversation(toChatUsername,true);
      }
      conversation = ChatManager.getInstance().getConversation(toChatUsername);
      // ?0
      conversation.resetUnsetMsgCount();
      adapter = new MessageAdapter(this, toChatUsername, chatType);
      // ?
      listView.setAdapter(adapter);
      listView.setOnScrollListener(new ListScrollListener());
      int count = listView.getCount();
      if (count > 0) {
         listView.setSelection(count - 1);
      }

      listView.setOnTouchListener(new OnTouchListener() {

         @Override
         public boolean onTouch(View v, MotionEvent event) {
            hideKeyboard();
            more.setVisibility(View.GONE);
            iv_emoticons_normal.setVisibility(View.VISIBLE);
            iv_emoticons_checked.setVisibility(View.INVISIBLE);
            emojiIconContainer.setVisibility(View.GONE);
            btnContainer.setVisibility(View.GONE);
            return false;
         }
      });
//      // ?
//      receiver = new NewMessageBroadcastReceiver();
//      IntentFilter intentFilter = new IntentFilter(ChatManager.getInstance().getNewMessageBroadcastAction());
//      // Mainacitivity,??chat??????
//      intentFilter.setPriority(5);
//      registerReceiver(receiver, intentFilter);
//
//      // ack?BroadcastReceiver
//      IntentFilter ackMessageIntentFilter = new IntentFilter(ChatManager.getInstance().getAckMessageBroadcastAction());
//      ackMessageIntentFilter.setPriority(5);
//      registerReceiver(ackMessageReceiver, ackMessageIntentFilter);
//
//      // ??BroadcastReceiver
//      IntentFilter deliveryAckMessageIntentFilter = new IntentFilter(ChatManager.getInstance().getDeliveryAckMessageBroadcastAction());
//      deliveryAckMessageIntentFilter.setPriority(5);
//      registerReceiver(deliveryAckMessageReceiver, deliveryAckMessageIntentFilter);

      // ????T
      groupListener = new GroupListener();
      ChatGroupManager.getInstance().addGroupChangeListener(groupListener);

      // show forward message if the message is not null
      String forward_msg_id = getIntent().getStringExtra("forward_msg_id");
      if (forward_msg_id != null) {
         // ?????
         forwardMessage(forward_msg_id);
      }

   }

   

   /**
    * onActivityResult
    */
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
      if (resultCode == RESULT_CODE_EXIT_GROUP) {
         setResult(RESULT_OK);
         finish();
         return;
      }
      if (requestCode == REQUEST_CODE_CONTEXT_MENU) {
         switch (resultCode) {
         case RESULT_CODE_COPY: // ??
            ChatMessage copyMsg = ((ChatMessage) adapter.getItem(data.getIntExtra("position", -1)));
            // clipboard.setText(SmileUtils.getSmiledText(ChatActivity.this,
            // ((TextMessageBody) copyMsg.getBody()).getMessage()));
            clipboard.setText(((TextMessageBody) copyMsg.getBody()).getMessage());
            break;
         case RESULT_CODE_DELETE: // ?
            ChatMessage deleteMsg = (ChatMessage) adapter.getItem(data.getIntExtra("position", -1));
            conversation.removeMessage(deleteMsg.getMsgId());
            adapter.refresh();
            listView.setSelection(data.getIntExtra("position", adapter.getCount()) - 1);
            break;

         case RESULT_CODE_FORWARD: // ??
            ChatMessage forwardMsg = (ChatMessage) adapter.getItem(data.getIntExtra("position", 0));
            Intent intent = new Intent(this, ForwardMessageActivity.class);
            intent.putExtra("forward_msg_id", forwardMsg.getMsgId());
            startActivity(intent);

            break;

         default:
            break;
         }
      }
      if (resultCode == RESULT_OK) { // ?
         if (requestCode == REQUEST_CODE_EMPTY_HISTORY) {
            // ?
            ChatManager.getInstance().clearConversation(toChatUsername);
            adapter.refresh();
         } else if (requestCode == REQUEST_CODE_CAMERA) { // ??
            if (cameraFile != null && cameraFile.exists())
               sendPicture(cameraFile.getAbsolutePath());
         } else if (requestCode == REQUEST_CODE_SELECT_VIDEO) { // ??

            int duration = data.getIntExtra("dur", 0);
            String videoPath = data.getStringExtra("path");
            File file = new File(ChatFileUtil.getInstance(this).getChatFilePath(FileType.Picture), "thvideo" + System.currentTimeMillis());
            Bitmap bitmap = null;
            FileOutputStream fos = null;
            try {
               if (!file.getParentFile().exists()) {
                  file.getParentFile().mkdirs();
               }
               bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, 3);
               if (bitmap == null) {
                  ChatLog.d("chatactivity", "problem load video thumbnail bitmap,use default icon");
                  bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.app_panel_video_icon);
               }
               fos = new FileOutputStream(file);

               bitmap.compress(CompressFormat.JPEG, 100, fos);

            } catch (Exception e) {
               e.printStackTrace();
            } finally {
               if (fos != null) {
                  try {
                     fos.close();
                  } catch (IOException e) {
                     e.printStackTrace();
                  }
                  fos = null;
               }
               if (bitmap != null) {
                  bitmap.recycle();
                  bitmap = null;
               }

            }
            sendVideo(videoPath, file.getAbsolutePath(), duration / 1000);

         } else if (requestCode == REQUEST_CODE_LOCAL) { // ??
            if (data != null) {
               Uri selectedImage = data.getData();
               if (selectedImage != null) {
                  sendPicByUri(selectedImage);
               }
            }
         } else if (requestCode == REQUEST_CODE_SELECT_FILE) { // ??
            if (data != null) {
               Uri uri = data.getData();
               if (uri != null) {
                  sendFile(uri);
               }
            }

         } else if (requestCode == REQUEST_CODE_MAP) { // 
            double latitude = data.getDoubleExtra("latitude", 0);
            double longitude = data.getDoubleExtra("longitude", 0);
            String locationAddress = data.getStringExtra("address");
            if (locationAddress != null && !locationAddress.equals("")) {
               more(more);
               sendLocationMsg(latitude, longitude, "", locationAddress);
            } else {
               Toast.makeText(this, "????", 0).show();
            }
            // ???
         } else if (requestCode == REQUEST_CODE_TEXT) {
            resendMessage();
         } else if (requestCode == REQUEST_CODE_VOICE) {
            resendMessage();
         } else if (requestCode == REQUEST_CODE_PICTURE) {
            resendMessage();
         } else if (requestCode == REQUEST_CODE_LOCATION) {
            resendMessage();
         } else if (requestCode == REQUEST_CODE_VIDEO || requestCode == REQUEST_CODE_FILE) {
            resendMessage();
         } else if (requestCode == REQUEST_CODE_COPY_AND_PASTE) {
            // 
            if (!TextUtils.isEmpty(clipboard.getText())) {
               String pasteText = clipboard.getText().toString();
               if (pasteText.startsWith(COPY_IMAGE)) {
                  // ??path
                  sendPicture(pasteText.replace(COPY_IMAGE, ""));
               }

            }
         } else if (requestCode == REQUEST_CODE_ADD_TO_BLACKLIST) { // ???
            ChatMessage deleteMsg = (ChatMessage) adapter.getItem(data.getIntExtra("position", -1));
            addUserToBlacklist(deleteMsg.getFrom());
         } else if (conversation.getMsgCount() > 0) {
            adapter.refresh();
            setResult(RESULT_OK);
         } else if (requestCode == REQUEST_CODE_GROUP_DETAIL) {
            adapter.refresh();
         }
      }
   }

   /**
    * ?
    * 
    * @param view
    */
   @Override
   public void onClick(View view) {

      int id = view.getId();
      if (id == R.id.btn_send) {// ??(?)
         String s = mEditTextContent.getText().toString();
         sendText(s);
      } else if (id == R.id.btn_take_picture) {
         selectPicFromCamera();// 
      } else if (id == R.id.btn_picture) {
         selectPicFromLocal(); // 
      } else if (id == R.id.btn_location) { // ?
         startActivityForResult(new Intent(this, BaiduMapActivity.class), REQUEST_CODE_MAP);
      } else if (id == R.id.iv_emoticons_normal) { // 
         more.setVisibility(View.VISIBLE);
         iv_emoticons_normal.setVisibility(View.INVISIBLE);
         iv_emoticons_checked.setVisibility(View.VISIBLE);
         btnContainer.setVisibility(View.GONE);
         emojiIconContainer.setVisibility(View.VISIBLE);
         hideKeyboard();
      } else if (id == R.id.iv_emoticons_checked) { // ??
         iv_emoticons_normal.setVisibility(View.VISIBLE);
         iv_emoticons_checked.setVisibility(View.INVISIBLE);
         btnContainer.setVisibility(View.VISIBLE);
         emojiIconContainer.setVisibility(View.GONE);
         more.setVisibility(View.GONE);

      } else if (id == R.id.btn_video) {
         // ?
         Intent intent = new Intent(ChatActivity.this, ImageGridActivity.class);
         startActivityForResult(intent, REQUEST_CODE_SELECT_VIDEO);
      } else if (id == R.id.btn_file) { // 
         selectFileFromLocal();
      } else if (id == R.id.btn_voice_call) { // ?
         if (!ChatManager.getInstance().isConnected())
            Toast.makeText(this, "????", 0).show();
         else
            startActivity(new Intent(ChatActivity.this, VoiceCallActivity.class).putExtra("username", toChatUsername).putExtra(
                  "isComingCall", false));
      }
   }

   /**
    * ?
    */
   public void selectPicFromCamera() {
      if (!CommonUtils.isExitsSdcard()) {
         Toast.makeText(getApplicationContext(), "SD????", 0).show();
         return;
      }

      cameraFile = new File(ChatFileUtil.getInstance(this).getChatFilePath(FileType.Picture), 
             System.currentTimeMillis() + ".jpg");
      cameraFile.getParentFile().mkdirs();
      startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE).putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile)),
            REQUEST_CODE_CAMERA);
   }

   /**
    * 
    */
   private void selectFileFromLocal() {
      Intent intent = null;
      if (Build.VERSION.SDK_INT < 19) {
         intent = new Intent(Intent.ACTION_GET_CONTENT);
         intent.setType("*/*");
         intent.addCategory(Intent.CATEGORY_OPENABLE);

      } else {
         intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
      }
      startActivityForResult(intent, REQUEST_CODE_SELECT_FILE);
   }

   /**
    * ?
    */
   public 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);
   }

   /**
    * ???
    * 
    * @param content
    *            message content
    * @param isResend
    *            boolean resend
    */
   private void sendText(String content) {

      if (content.length() > 0) {
         ChatMessage message = ChatMessage.createSendMessage(ChatMessage.Type.TXT);
         // ?chattype,??
         if (chatType == CHATTYPE_GROUP)
            message.setChatType(ChatType.GroupChat);
         TextMessageBody txtBody = new TextMessageBody(content);
         // ?body
         message.addBody(txtBody);
         // ???,username?groupid
         message.setReceipt(toChatUsername);
         // messgageconversation
         conversation.addMessage(message);
         // adapter??adapter??message?sdk??
         adapter.refresh();
         listView.setSelection(listView.getCount() - 1);
         mEditTextContent.setText("");
         setResult(RESULT_OK);

      }
   }

   /**
    * ??
    * 
    * @param filePath
    * @param fileName
    * @param length
    * @param isResend
    */
   private void sendVoice(String filePath, String fileName, String length, boolean isResend) {
      if (!(new File(filePath).exists())) {
         return;
      }
      try {
         final ChatMessage message = ChatMessage.createSendMessage(ChatMessage.Type.VOICE);
         // ?chattype,??
         if (chatType == CHATTYPE_GROUP)
            message.setChatType(ChatType.GroupChat);
         message.setReceipt(toChatUsername);
         int len = Integer.parseInt(length);
         VoiceMessageBody body = new VoiceMessageBody(new File(filePath), len);
         message.addBody(body);

         conversation.addMessage(message);
         adapter.refresh();
         listView.setSelection(listView.getCount() - 1);
         setResult(RESULT_OK);
         // send file
         // sendVoiceSub(filePath, fileName, message);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }

   /**
    * ??
    * 
    * @param filePath
    */
   private void sendPicture(final String filePath) {
      String to = toChatUsername;
      // create and add image message in view
      final ChatMessage message = ChatMessage.createSendMessage(ChatMessage.Type.IMAGE);
      // ?chattype,??
      if (chatType == CHATTYPE_GROUP)
         message.setChatType(ChatType.GroupChat);

      message.setReceipt(to);
      ImageMessageBody body = new ImageMessageBody(new File(filePath));
      // 100k??????
      // body.setSendOriginalImage(true);
      message.addBody(body);
      conversation.addMessage(message);

      listView.setAdapter(adapter);
      adapter.refresh();
      listView.setSelection(listView.getCount() - 1);
      setResult(RESULT_OK);
      // more(more);
   }

   /**
    * ???
    */
   private void sendVideo(final String filePath, final String thumbPath, final int length) {
      final File videoFile = new File(filePath);
      if (!videoFile.exists()) {
         return;
      }
      try {
         ChatMessage message = ChatMessage.createSendMessage(ChatMessage.Type.VIDEO);
         // ?chattype,??
         if (chatType == CHATTYPE_GROUP)
            message.setChatType(ChatType.GroupChat);
         String to = toChatUsername;
         message.setReceipt(to);
         VideoMessageBody body = new VideoMessageBody(videoFile, thumbPath, length, videoFile.length());
         message.addBody(body);
         conversation.addMessage(message);
         listView.setAdapter(adapter);
         adapter.refresh();
         listView.setSelection(listView.getCount() - 1);
         setResult(RESULT_OK);
      } catch (Exception e) {
         e.printStackTrace();
      }

   }

   /**
    * ?uri??
    * 
    * @param selectedImage
    */
   private void sendPicByUri(Uri selectedImage) {
      // String[] filePathColumn = { MediaStore.Images.Media.DATA };
      Cursor cursor = getContentResolver().query(selectedImage, null, null, null, null);
      if (cursor != null) {
         cursor.moveToFirst();
         int columnIndex = cursor.getColumnIndex("_data");
         String picturePath = cursor.getString(columnIndex);
         cursor.close();
         cursor = null;

         if (picturePath == null || picturePath.equals("null")) {
            Toast toast = Toast.makeText(this, "?", Toast.LENGTH_SHORT);
            toast.setGravity(Gravity.CENTER, 0, 0);
            toast.show();
            return;
         }
         sendPicture(picturePath);
      } else {
         File file = new File(selectedImage.getPath());
         if (!file.exists()) {
            Toast toast = Toast.makeText(this, "?", Toast.LENGTH_SHORT);
            toast.setGravity(Gravity.CENTER, 0, 0);
            toast.show();
            return;

         }
         sendPicture(file.getAbsolutePath());
      }

   }

   /**
    * ????
    * 
    * @param latitude
    * @param longitude
    * @param imagePath
    * @param locationAddress
    */
   private void sendLocationMsg(double latitude, double longitude, String imagePath, String locationAddress) {
      ChatMessage message = ChatMessage.createSendMessage(ChatMessage.Type.LOCATION);
      // ?chattype,??
      if (chatType == CHATTYPE_GROUP)
         message.setChatType(ChatType.GroupChat);
      LocationMessageBody locBody = new LocationMessageBody(locationAddress, latitude, longitude);
      message.addBody(locBody);
      message.setReceipt(toChatUsername);
      conversation.addMessage(message);
      listView.setAdapter(adapter);
      adapter.notifyDataSetChanged();
      listView.setSelection(listView.getCount() - 1);
      setResult(RESULT_OK);

   }

   /**
    * ??
    * 
    * @param uri
    */
   private void sendFile(Uri uri) {
      String filePath = null;
      if ("content".equalsIgnoreCase(uri.getScheme())) {
         String[] projection = { "_data" };
         Cursor cursor = null;

         try {
            cursor = getContentResolver().query(uri, projection, 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(getApplicationContext(), "?", 0).show();
         return;
      }
      if (file.length() > 10 * 1024 * 1024) {
         Toast.makeText(getApplicationContext(), "?10M", 0).show();
         return;
      }

      // ?
      ChatMessage message = ChatMessage.createSendMessage(ChatMessage.Type.FILE);
      // ?chattype,??
      if (chatType == CHATTYPE_GROUP)
         message.setChatType(ChatType.GroupChat);

      message.setReceipt(toChatUsername);
      // add message body
      NormalFileMessageBody body = new NormalFileMessageBody(new File(filePath));
      message.addBody(body);
      conversation.addMessage(message);
      listView.setAdapter(adapter);
      adapter.refresh();
      listView.setSelection(listView.getCount() - 1);
      setResult(RESULT_OK);
   }

   /**
    * ???
    */
   private void resendMessage() {
      ChatMessage msg = null;
      msg = conversation.getMessage(resendPos);
      // msg.setBackSend(true);
      msg.status = ChatMessage.Status.CREATE;

      adapter.refresh();
      listView.setSelection(resendPos);
   }

   /**
    * 
    * 
    * @param view
    */
   public void setModeVoice(View view) {
      hideKeyboard();
      edittext_layout.setVisibility(View.GONE);
      more.setVisibility(View.GONE);
      view.setVisibility(View.GONE);
      buttonSetModeKeyboard.setVisibility(View.VISIBLE);
      buttonSend.setVisibility(View.GONE);
      btnMore.setVisibility(View.VISIBLE);
      buttonPressToSpeak.setVisibility(View.VISIBLE);
      iv_emoticons_normal.setVisibility(View.VISIBLE);
      iv_emoticons_checked.setVisibility(View.INVISIBLE);
      btnContainer.setVisibility(View.VISIBLE);
      emojiIconContainer.setVisibility(View.GONE);

   }

   /**
    * 
    * 
    * @param view
    */
   public void setModeKeyboard(View view) {
      // mEditTextContent.setOnFocusChangeListener(new OnFocusChangeListener()
      // {
      // @Override
      // public void onFocusChange(View v, boolean hasFocus) {
      // if(hasFocus){
      // getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
      // }
      // }
      // });
      edittext_layout.setVisibility(View.VISIBLE);
      more.setVisibility(View.GONE);
      view.setVisibility(View.GONE);
      buttonSetModeVoice.setVisibility(View.VISIBLE);
      // mEditTextContent.setVisibility(View.VISIBLE);
      mEditTextContent.requestFocus();
      // buttonSend.setVisibility(View.VISIBLE);
      buttonPressToSpeak.setVisibility(View.GONE);
      if (TextUtils.isEmpty(mEditTextContent.getText())) {
         btnMore.setVisibility(View.VISIBLE);
         buttonSend.setVisibility(View.GONE);
      } else {
         btnMore.setVisibility(View.GONE);
         buttonSend.setVisibility(View.VISIBLE);
      }

   }

   /**
    * ?
    * 
    * @param view
    */
   public void emptyHistory(View view) {
      startActivityForResult(
            new Intent(this, AlertDialog.class).putExtra("titleIsCancel", true).putExtra("msg", "??").putExtra("cancel", true),
            REQUEST_CODE_EMPTY_HISTORY);
   }

   /**
    * 
    * 
    * @param view
    */
   public void toGroupDetails(View view) {
      startActivityForResult((new Intent(this, GroupDetailsActivity.class).putExtra("groupId", toChatUsername)),
            REQUEST_CODE_GROUP_DETAIL);
   }

   /**
    * ??
    * 
    * @param view
    */
   public void more(View view) {
      if (more.getVisibility() == View.GONE) {
         System.out.println("more gone");
         hideKeyboard();
         more.setVisibility(View.VISIBLE);
         btnContainer.setVisibility(View.VISIBLE);
         emojiIconContainer.setVisibility(View.GONE);
      } else {
         if (emojiIconContainer.getVisibility() == View.VISIBLE) {
            emojiIconContainer.setVisibility(View.GONE);
            btnContainer.setVisibility(View.VISIBLE);
            iv_emoticons_normal.setVisibility(View.VISIBLE);
            iv_emoticons_checked.setVisibility(View.INVISIBLE);
         } else {
            more.setVisibility(View.GONE);
         }

      }

   }

   /**
    * 
    * 
    * @param v
    */
   public void editClick(View v) {
      listView.setSelection(listView.getCount() - 1);
      if (more.getVisibility() == View.VISIBLE) {
         more.setVisibility(View.GONE);
         iv_emoticons_normal.setVisibility(View.VISIBLE);
         iv_emoticons_checked.setVisibility(View.INVISIBLE);
      }

   }

   /**
    * ?
    * 
    */
   private class NewMessageBroadcastReceiver extends BroadcastReceiver {
      @Override
      public void onReceive(Context context, Intent intent) {
         // 
         abortBroadcast();

         String username = intent.getStringExtra("from");
         String msgid = intent.getStringExtra("msgid");
         // message?db?id?mesage
         ChatMessage message = ChatManager.getInstance().getMessage(msgid);
         // ???group id
         if (message.getChatType() == ChatType.GroupChat) {
            username = message.getTo();
         }
         if (!username.equals(toChatUsername)) {
            // ?????return
            return;
         }
         // conversation =
         // ChatManager.getInstance().getConversation(toChatUsername);
         // adapter?ui
         adapter.refresh();
         listView.setSelection(listView.getCount() - 1);

      }
   }

   /**
    * ?BroadcastReceiver
    */
   private BroadcastReceiver ackMessageReceiver = new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) {
         abortBroadcast();

         String msgid = intent.getStringExtra("msgid");
         String from = intent.getStringExtra("from");
         ChatConversation conversation = ChatManager.getInstance().getConversation(from);
         if (conversation != null) {
            // message
            ChatMessage msg = conversation.getMessage(msgid);
            if (msg != null) {
               msg.isAcked = true;
            }
         }
         adapter.notifyDataSetChanged();

      }
   };

   /**
    * ??BroadcastReceiver
    */
   private BroadcastReceiver deliveryAckMessageReceiver = new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) {
         abortBroadcast();

         String msgid = intent.getStringExtra("msgid");
         String from = intent.getStringExtra("from");
         ChatConversation conversation = ChatManager.getInstance().getConversation(from);
         if (conversation != null) {
            // message
            ChatMessage msg = conversation.getMessage(msgid);
            if (msg != null) {
               msg.isDelivered = true;
            }
         }

         adapter.notifyDataSetChanged();
      }
   };
   private PowerManager.WakeLock wakeLock;

   /**
    * ??listener
    * 
    */
   class PressToSpeakListen implements View.OnTouchListener {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
         switch (event.getAction()) {
         case MotionEvent.ACTION_DOWN:
            if (!CommonUtils.isExitsSdcard()) {
               Toast.makeText(ChatActivity.this, "???sdcard??", Toast.LENGTH_SHORT).show();
               return false;
            }
            try {
               v.setPressed(true);
               wakeLock.acquire();
               if (VoicePlayClickListener.isPlaying)
                  VoicePlayClickListener.currentPlayListener.stopPlayVoice();
               recordingContainer.setVisibility(View.VISIBLE);
               recordingHint.setText(getString(R.string.move_up_to_cancel));
               recordingHint.setBackgroundColor(Color.TRANSPARENT);
               AudioRecorder.startRecording( toChatUsername);
            } catch (Exception e) {
               e.printStackTrace();
               v.setPressed(false);
               if (wakeLock.isHeld())
                  wakeLock.release();
               if (AudioRecorder != null)
                  AudioRecorder.discardRecording();
               recordingContainer.setVisibility(View.INVISIBLE);
               Toast.makeText(ChatActivity.this, R.string.recoding_fail, Toast.LENGTH_SHORT).show();
               return false;
            }

            return true;
         case MotionEvent.ACTION_MOVE: {
            if (event.getY() < 0) {
               recordingHint.setText(getString(R.string.release_to_cancel));
               recordingHint.setBackgroundResource(R.drawable.recording_text_hint_bg);
            } else {
               recordingHint.setText(getString(R.string.move_up_to_cancel));
               recordingHint.setBackgroundColor(Color.TRANSPARENT);
            }
            return true;
         }
         case MotionEvent.ACTION_UP:
            v.setPressed(false);
            recordingContainer.setVisibility(View.INVISIBLE);
            if (wakeLock.isHeld())
               wakeLock.release();
            if (event.getY() < 0) {
               // discard the recorded audio.
               AudioRecorder.discardRecording();

            } else {
               // stop recording and send voice file
               try {
                  int length = AudioRecorder.stopRecoding();
                  if (length > 0) {
                     sendVoice(AudioRecorder.getVoiceFilePath(), AudioRecorder.getVoiceFileName(toChatUsername),
                           Integer.toString(length), false);
                  } else if (length == ChatError.INVALID_FILE) {
                     Toast.makeText(getApplicationContext(), "??", Toast.LENGTH_SHORT).show();
                  } else {
                     Toast.makeText(getApplicationContext(), "", Toast.LENGTH_SHORT).show();
                  }
               } catch (Exception e) {
                  e.printStackTrace();
                  Toast.makeText(ChatActivity.this, "????", Toast.LENGTH_SHORT).show();
               }

            }
            return true;
         default:
            recordingContainer.setVisibility(View.INVISIBLE);
            if (AudioRecorder != null)
               AudioRecorder.discardRecording();
            return false;
         }
      }
   }
   
   /**
    * ?gridview?view
    * 
    * @param i
    * @return
    */
   private View getGridChildView(int i) {
      View view = View.inflate(this, R.layout.chat_expression_gridview, null);
      ExpandGridView gv = (ExpandGridView) view.findViewById(R.id.gridview);
      List<String> list = new ArrayList<String>();
      if (i == 1) {
         List<String> list1 = reslist.subList(0, 20);
         list.addAll(list1);
      } else if (i == 2) {
         list.addAll(reslist.subList(20, reslist.size()));
      }
      list.add("delete_expression");
      final ExpressionAdapter expressionAdapter = new ExpressionAdapter(this, 1, list);
      gv.setAdapter(expressionAdapter);
      gv.setOnItemClickListener(new OnItemClickListener() {

         @Override
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String filename = expressionAdapter.getItem(position);
            try {
               // ????
               // ?????
               if (buttonSetModeKeyboard.getVisibility() != View.VISIBLE) {

                  if (filename != "delete_expression") { // ?
                     // ????SmileUtils
                     Class clz = Class.forName("com.easemob.chatuidemo.utils.SmileUtils");
                     Field field = clz.getField(filename);
                     mEditTextContent.append(SmileUtils.getSmiledText(ChatActivity.this, (String) field.get(null)));
                  } else { // 
                     if (!TextUtils.isEmpty(mEditTextContent.getText())) {

                        int selectionStart = mEditTextContent.getSelectionStart();// ??
                        if (selectionStart > 0) {
                           String body = mEditTextContent.getText().toString();
                           String tempStr = body.substring(0, selectionStart);
                           int i = tempStr.lastIndexOf("[");// ???
                           if (i != -1) {
                              CharSequence cs = tempStr.substring(i, selectionStart);
                              if (SmileUtils.containsKey(cs.toString()))
                                 mEditTextContent.getEditableText().delete(i, selectionStart);
                              else
                                 mEditTextContent.getEditableText().delete(selectionStart - 1, selectionStart);
                           } else {
                              mEditTextContent.getEditableText().delete(selectionStart - 1, selectionStart);
                           }
                        }
                     }

                  }
               }
            } catch (Exception e) {
            }

         }
      });
      return view;
   }

   public List<String> getExpressionRes(int getSum) {
      List<String> reslist = new ArrayList<String>();
      for (int x = 1; x <= getSum; x++) {
         String filename = "ee_" + x;

         reslist.add(filename);

      }
      return reslist;

   }


   @Override
   protected void onDestroy() {
      super.onDestroy();
      activityInstance = null;
      ChatGroupManager.getInstance().removeGroupChangeListener(groupListener);
      // 
      try {
         unregisterReceiver(receiver);
         receiver = null;
      } catch (Exception e) {
      }
      try {
         unregisterReceiver(ackMessageReceiver);
         ackMessageReceiver = null;
         unregisterReceiver(deliveryAckMessageReceiver);
         deliveryAckMessageReceiver = null;
      } catch (Exception e) {
      }
   }

   @Override
   protected void onResume() {
      super.onResume();
      adapter.refresh();
   }

   @Override
   protected void onPause() {
      super.onPause();
      if (wakeLock.isHeld())
         wakeLock.release();
      if (VoicePlayClickListener.isPlaying && VoicePlayClickListener.currentPlayListener != null) {
         // ?
         VoicePlayClickListener.currentPlayListener.stopPlayVoice();
      }

      try {
         // ?
         if (AudioRecorder.isRecording()) {
            AudioRecorder.discardRecording();
            recordingContainer.setVisibility(View.INVISIBLE);
         }
      } catch (Exception e) {
      }
   }

   /**
    * ??
    */
   private void hideKeyboard() {
      if (getWindow().getAttributes().softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) {
         if (getCurrentFocus() != null)
            manager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
      }
   }

   /**
    * ???
    * 
    * @param username
    */
   private void addUserToBlacklist(String username) {
      try {
         ChatContactManager.getInstance().addUserToBlackList(username, false);
         Toast.makeText(getApplicationContext(), "????", 0).show();
      } catch (Exception e) {//(ChatException e) {
         e.printStackTrace();
         Toast.makeText(getApplicationContext(), "???", 0).show();
      }
   }

   /**
    * 
    * 
    * @param view
    */
   public void back(View view) {
      finish();
   }

   /**
    * 
    */
   @Override
   public void onBackPressed() {
      if (more.getVisibility() == View.VISIBLE) {
         more.setVisibility(View.GONE);
         iv_emoticons_normal.setVisibility(View.VISIBLE);
         iv_emoticons_checked.setVisibility(View.INVISIBLE);
      } else {
         super.onBackPressed();
      }
   }

   /**
    * listview?listener
    * 
    */
   private class ListScrollListener implements OnScrollListener {

      @Override
      public void onScrollStateChanged(AbsListView view, int scrollState) {
         switch (scrollState) {
         case OnScrollListener.SCROLL_STATE_IDLE:
            if (view.getFirstVisiblePosition() == 0 && !isloading && haveMoreData) {
               loadmorePB.setVisibility(View.VISIBLE);
               // sdk??20?db?
               List<ChatMessage> messages;
               try {
                  // ?messgesdb?messages
                  // sdkconversation
                  if (chatType == CHATTYPE_SINGLE)
                     messages = conversation.loadMoreMsgFromDB(adapter.getItem(0).getMsgId(), pagesize);
                  else
                     messages = conversation.loadMoreGroupMsgFromDB(adapter.getItem(0).getMsgId(), pagesize);
               } catch (Exception e1) {
                  loadmorePB.setVisibility(View.GONE);
                  return;
               }
               try {
                  Thread.sleep(300);
               } catch (InterruptedException e) {
               }
               if (messages.size() != 0) {
                  // ui
                  adapter.notifyDataSetChanged();
                  listView.setSelection(messages.size() - 1);
                  if (messages.size() != pagesize)
                     haveMoreData = false;
               } else {
                  haveMoreData = false;
               }
               loadmorePB.setVisibility(View.GONE);
               isloading = false;

            }
            break;
         }
      }

      @Override
      public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

      }

   }

   @Override
   protected void onNewIntent(Intent intent) {
      // notification bar???????
      String username = intent.getStringExtra("userId");
      if (toChatUsername.equals(username))
         super.onNewIntent(intent);
      else {
         finish();
         startActivity(intent);
      }

   }
   
   /**
    * ??
    * 
    * @param forward_msg_id
    */
   protected void forwardMessage(String forward_msg_id) {
      ChatMessage forward_msg = ChatManager.getInstance().getMessage(forward_msg_id);
      ChatMessage.Type type = forward_msg.getType();
      switch (type) {
      case TXT:
         // ?????
         String content = ((TextMessageBody) forward_msg.getBody()).getMessage();
         sendText(content);
         break;
      case IMAGE:
         // ??
         String filePath = ((ImageMessageBody) forward_msg.getBody()).getLocalUrl();
         if (filePath != null) {
            File file = new File(filePath);
            if (!file.exists()) {
               // ???
               filePath = ImageUtils.getThumbnailImagePath(filePath);
            }
            sendPicture(filePath);
         }
         break;
      default:
         break;
      }
   }

   /**
    * T
    * 
    */
   class GroupListener extends GroupReomveListener {

      @Override
      public void onUserRemoved(final String groupId, String groupName) {
         runOnUiThread(new Runnable() {
            public void run() {
               if (toChatUsername.equals(groupId)) {
                  Toast.makeText(ChatActivity.this, "", 1).show();
                  if (GroupDetailsActivity.instance != null)
                     GroupDetailsActivity.instance.finish();
                  finish();
               }
            }
         });
      }

      @Override
      public void onGroupDestroy(final String groupId, String groupName) {
         // ???finish?
         runOnUiThread(new Runnable() {
            public void run() {
               if (toChatUsername.equals(groupId)) {
                  Toast.makeText(ChatActivity.this, "??", 1).show();
                  if (GroupDetailsActivity.instance != null)
                     GroupDetailsActivity.instance.finish();
                  finish();
               }
            }
         });
      }

   }

   public String getToChatUsername() {
      return toChatUsername;
   }

   public void handleNewMessage(String from, String txt) {
      // TODO Auto-generated method stub
       ChatMessage message = ChatMessage.createSendMessage(ChatMessage.Type.TXT);
       message.setFrom("3974");
       message.setTo("zcj");
       message.direct = ChatMessage.Direct.RECEIVE;
      // ?chattype,??
               if (chatType == CHATTYPE_GROUP)
                  message.setChatType(ChatType.GroupChat);
               TextMessageBody txtBody = new TextMessageBody(txt);
               // ?body
               message.addBody(txtBody);
               // messgageconversation
               conversation.addMessage(message);
               // adapter??adapter??message?sdk??
               adapter.refresh();
               listView.setSelection(listView.getCount() - 1);
               mEditTextContent.setText("");
               setResult(RESULT_OK);
   }

}