package com.tencent.hq.qq.ui;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.support.v4.view.ViewPager;
import android.text.Editable;
import android.text.Selection;
import android.text.Spannable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.Gravity;
import android.view.KeyEvent;
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.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import cn.bmob.im.BmobChatManager;
import cn.bmob.im.BmobNotifyManager;
import cn.bmob.im.BmobRecordManager;
import cn.bmob.im.bean.BmobChatUser;
import cn.bmob.im.bean.BmobInvitation;
import cn.bmob.im.bean.BmobMsg;
import cn.bmob.im.config.BmobConfig;
import cn.bmob.im.db.BmobDB;
import cn.bmob.im.inteface.EventListener;
import cn.bmob.im.inteface.OnRecordChangeListener;
import cn.bmob.im.inteface.UploadListener;
import cn.bmob.im.util.BmobLog;
import cn.bmob.v3.listener.PushListener;
import com.tencent.hq.qq.MyMessageReceiver;
import com.tencent.hq.qq.R;
import com.tencent.hq.qq.adapter.EmoViewPagerAdapter;
import com.tencent.hq.qq.adapter.EmoteAdapter;
import com.tencent.hq.qq.adapter.MessageChatAdapter;
import com.tencent.hq.qq.adapter.NewRecordPlayClickListener;
import com.tencent.hq.qq.config.BmobConstants;
import com.tencent.hq.qq.entity.FaceText;
import com.tencent.hq.qq.util.CommonUtils;
import com.tencent.hq.qq.util.FaceTextUtils;
import com.tencent.hq.qq.widget.EmoticonsEditText;
import com.tencent.hq.qq.widget.HeaderLayout;
import com.tencent.hq.qq.widget.dialog.DialogTips;
import com.tencent.hq.qq.widget.xlist.XListView;
import com.tencent.hq.qq.widget.xlist.XListView.IXListViewListener;
@SuppressLint({ "ClickableViewAccessibility", "InflateParams" })
public class ChatActivity extends ActivityBase implements OnClickListener,
IXListViewListener, EventListener {
private Button btn_chat_emo, btn_chat_send, btn_chat_add,btn_chat_keyboard, btn_speak, btn_chat_voice;
XListView mListView;
EmoticonsEditText edit_user_comment;
String targetId = "";
BmobChatUser targetUser;
private static int MsgPagerNum;
private LinearLayout layout_more, layout_emo, layout_add;
private ViewPager pager_emo;
private TextView tv_picture, tv_camera, tv_location;
RelativeLayout layout_record;
TextView tv_voice_tips;
ImageView iv_record;
private Drawable[] drawable_Anims;// ��Ͳ����
BmobRecordManager recordManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
manager = BmobChatManager.getInstance(this);
MsgPagerNum = 0;
targetUser = (BmobChatUser) getIntent().getSerializableExtra("user");
targetId = targetUser.getObjectId();
initNewMessageBroadCast();
initView();
}
private void initRecordManager(){
recordManager = BmobRecordManager.getInstance(this);
recordManager.setOnRecordChangeListener(new OnRecordChangeListener() {
@Override
public void onVolumnChanged(int value) {
// TODO Auto-generated method stub
iv_record.setImageDrawable(drawable_Anims[value]);
}
@Override
public void onTimeChanged(int recordTime, String localPath) {
// TODO Auto-generated method stub
BmobLog.i("voice", "已录音长度:" + recordTime);
if (recordTime >= BmobRecordManager.MAX_RECORD_TIME) {
btn_speak.setPressed(false);
btn_speak.setClickable(false);
layout_record.setVisibility(View.INVISIBLE);
sendVoiceMessage(localPath, recordTime);
handler.postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
btn_speak.setClickable(true);
}
}, 1000);
}else{
}
}
});
}
private void initView() {
mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);
mListView = (XListView) findViewById(R.id.mListView);
initTopBarForLeft("与" + targetUser.getUsername() + "对话");
initBottomView();
initXListView();
initVoiceView();
}
private void initVoiceView() {
layout_record = (RelativeLayout) findViewById(R.id.layout_record);
tv_voice_tips = (TextView) findViewById(R.id.tv_voice_tips);
iv_record = (ImageView) findViewById(R.id.iv_record);
btn_speak.setOnTouchListener(new VoiceTouchListen());
initVoiceAnimRes();
initRecordManager();
}
/**
*
* @ClassName: VoiceTouchListen
* @Description: TODO
* @author smile
* @date 2014-7-1 ����6:10:16
*/
class VoiceTouchListen implements View.OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (!CommonUtils.checkSdCard()) {
ShowToast("使用语音功能需要SD卡支持");
return false;
}
try {
v.setPressed(true);
layout_record.setVisibility(View.VISIBLE);
tv_voice_tips.setText(getString(R.string.voice_cancel_tips));
recordManager.startRecording(targetId);
} catch (Exception e) {
}
return true;
case MotionEvent.ACTION_MOVE: {
if (event.getY() < 0) {
tv_voice_tips
.setText(getString(R.string.voice_cancel_tips));
tv_voice_tips.setTextColor(Color.RED);
} else {
tv_voice_tips.setText(getString(R.string.voice_up_tips));
tv_voice_tips.setTextColor(Color.WHITE);
}
return true;
}
case MotionEvent.ACTION_UP:
v.setPressed(false);
layout_record.setVisibility(View.INVISIBLE);
try {
if (event.getY() < 0) {
recordManager.cancelRecording();
BmobLog.i("voice", "放弃发送语音");
} else {
int recordTime = recordManager.stopRecording();
if (recordTime > 1) {
BmobLog.i("voice", "发送语音");
sendVoiceMessage(
recordManager.getRecordFilePath(targetId),
recordTime);
} else {
layout_record.setVisibility(View.GONE);
showShortToast().show();
}
}
} catch (Exception e) {
// TODO: handle exception
}
return true;
default:
return false;
}
}
}
/**
*
* @Title: sendImageMessage
* @Description: TODO
* @param @param localPath
* @return void
* @throws
*/
private void sendVoiceMessage(String local, int length) {
manager.sendVoiceMessage(targetUser, local, length,
new UploadListener() {
@Override
public void onStart(BmobMsg msg) {
// TODO Auto-generated method stub
refreshMessage(msg);
}
@Override
public void onSuccess() {
// TODO Auto-generated method stub
mAdapter.notifyDataSetChanged();
}
@Override
public void onFailure(int error, String arg1) {
// TODO Auto-generated method stub
ShowLog("上传语音失败 -->arg1:" + arg1);
mAdapter.notifyDataSetChanged();
}
});
}
Toast toast;
/**
* Toast
* @Title: showShortToast
* @return void
* @throws
*/
private Toast showShortToast() {
if (toast == null) {
toast = new Toast(this);
}
View view = LayoutInflater.from(this).inflate(
R.layout.include_chat_voice_short, null);
toast.setView(view);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.setDuration(50);
return toast;
}
/**
*
* @Title: initVoiceAnimRes
* @Description: TODO
* @param
* @return void
* @throws
*/
private void initVoiceAnimRes() {
drawable_Anims = new Drawable[] {
getResources().getDrawable(R.drawable.chat_icon_voice2),
getResources().getDrawable(R.drawable.chat_icon_voice3),
getResources().getDrawable(R.drawable.chat_icon_voice4),
getResources().getDrawable(R.drawable.chat_icon_voice5),
getResources().getDrawable(R.drawable.chat_icon_voice6) };
}
private List<BmobMsg> initMsgData() {
List<BmobMsg> list = BmobDB.create(this).queryMessages(targetId,MsgPagerNum);
return list;
}
/**
*
* @Title: initOrRefresh
* @Description: TODO
* @param
* @return void
* @throws
*/
private void initOrRefresh() {
if (mAdapter != null) {
if (MyMessageReceiver.mNewNum != 0) {//
int news= MyMessageReceiver.mNewNum;//�п��������ڼ䣬����N����Ϣ,�����Ҫ������ʾ�ڽ�����
int size = initMsgData().size();
for(int i=(news-1);i>=0;i--){
mAdapter.add(initMsgData().get(size-(i+1)));// ������һ����Ϣ��������ʾ
}
mListView.setSelection(mAdapter.getCount() - 1);
} else {
mAdapter.notifyDataSetChanged();
}
} else {
mAdapter = new MessageChatAdapter(this, initMsgData());
mListView.setAdapter(mAdapter);
}
}
private void initAddView() {
tv_picture = (TextView) findViewById(R.id.tv_picture);
tv_camera = (TextView) findViewById(R.id.tv_camera);
tv_location = (TextView) findViewById(R.id.tv_location);
tv_picture.setOnClickListener(this);
tv_location.setOnClickListener(this);
tv_camera.setOnClickListener(this);
}
private void initBottomView() {
btn_chat_add = (Button) findViewById(R.id.btn_chat_add);
btn_chat_emo = (Button) findViewById(R.id.btn_chat_emo);
btn_chat_add.setOnClickListener(this);
btn_chat_emo.setOnClickListener(this);
btn_chat_keyboard = (Button) findViewById(R.id.btn_chat_keyboard);
btn_chat_voice = (Button) findViewById(R.id.btn_chat_voice);
btn_chat_voice.setOnClickListener(this);
btn_chat_keyboard.setOnClickListener(this);
btn_chat_send = (Button) findViewById(R.id.btn_chat_send);
btn_chat_send.setOnClickListener(this);
layout_more = (LinearLayout) findViewById(R.id.layout_more);
layout_emo = (LinearLayout) findViewById(R.id.layout_emo);
layout_add = (LinearLayout) findViewById(R.id.layout_add);
initAddView();
initEmoView();
btn_speak = (Button) findViewById(R.id.btn_speak);
edit_user_comment = (EmoticonsEditText) findViewById(R.id.edit_user_comment);
edit_user_comment.setOnClickListener(this);
edit_user_comment.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
if (!TextUtils.isEmpty(s)) {
btn_chat_send.setVisibility(View.VISIBLE);
btn_chat_keyboard.setVisibility(View.GONE);
btn_chat_voice.setVisibility(View.GONE);
} else {
if (btn_chat_voice.getVisibility() != View.VISIBLE) {
btn_chat_voice.setVisibility(View.VISIBLE);
btn_chat_send.setVisibility(View.GONE);
btn_chat_keyboard.setVisibility(View.GONE);
}
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
}
List<FaceText> emos;
/**
*
* @Title: initEmoView
* @Description: TODO
* @param
* @return void
* @throws
*/
private void initEmoView() {
pager_emo = (ViewPager) findViewById(R.id.pager_emo);
emos = FaceTextUtils.faceTexts;
List<View> views = new ArrayList<View>();
for (int i = 0; i < 2; ++i) {
views.add(getGridView(i));
}
pager_emo.setAdapter(new EmoViewPagerAdapter(views));
}
private View getGridView(final int i) {
View view = View.inflate(this, R.layout.include_emo_gridview, null);
GridView gridview = (GridView) view.findViewById(R.id.gridview);
List<FaceText> list = new ArrayList<FaceText>();
if (i == 0) {
list.addAll(emos.subList(0, 21));
} else if (i == 1) {
list.addAll(emos.subList(21, emos.size()));
}
final EmoteAdapter gridAdapter = new EmoteAdapter(ChatActivity.this,
list);
gridview.setAdapter(gridAdapter);
gridview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int position, long arg3) {
FaceText name = (FaceText) gridAdapter.getItem(position);
String key = name.text.toString();
try {
if (edit_user_comment != null && !TextUtils.isEmpty(key)) {
int start = edit_user_comment.getSelectionStart();
CharSequence content = edit_user_comment.getText()
.insert(start, key);
edit_user_comment.setText(content);
// �����
CharSequence info = edit_user_comment.getText();
if (info instanceof Spannable) {
Spannable spanText = (Spannable) info;
Selection.setSelection(spanText,
start + key.length());
}
}
} catch (Exception e) {
}
}
});
return view;
}
MessageChatAdapter mAdapter;
private void initXListView() {
mListView.setPullLoadEnable(false);
mListView.setPullRefreshEnable(true);
mListView.setXListViewListener(this);
mListView.pullRefreshing();
mListView.setDividerHeight(0);
initOrRefresh();
mListView.setSelection(mAdapter.getCount() - 1);
mListView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
// TODO Auto-generated method stub
hideSoftInputView();
layout_more.setVisibility(View.GONE);
layout_add.setVisibility(View.GONE);
btn_chat_voice.setVisibility(View.VISIBLE);
btn_chat_keyboard.setVisibility(View.GONE);
btn_chat_send.setVisibility(View.GONE);
return false;
}
});
mAdapter.setOnInViewClickListener(R.id.iv_fail_resend,
new MessageChatAdapter.onInternalClickListener() {
@Override
public void OnClickListener(View parentV, View v,
Integer position, Object values) {
showResendDialog(parentV, v, values);
}
});
}
/**
* showResendDialog
* @Title: showResendDialog
* @Description: TODO
* @param @param recent
* @return void
* @throws
*/
public void showResendDialog(final View parentV, View v, final Object values) {
DialogTips dialog = new DialogTips(this, "重新发送该消息", "是", "不", "提示",
true);
// ���óɹ��¼�
dialog.SetOnSuccessListener(new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int userId) {
if (((BmobMsg) values).getMsgType() == BmobConfig.TYPE_IMAGE
|| ((BmobMsg) values).getMsgType() == BmobConfig.TYPE_VOICE) {// ͼƬ���������͵IJ���
resendFileMsg(parentV, values);
} else {
resendTextMsg(parentV, values);
}
dialogInterface.dismiss();
}
});
dialog.show();
dialog = null;
}
private void resendTextMsg(final View parentV, final Object values) {
BmobChatManager.getInstance(ChatActivity.this).resendTextMessage(
targetUser, (BmobMsg) values, new PushListener() {
@Override
public void onSuccess() {
// TODO Auto-generated method stub
ShowLog("发送成功");
((BmobMsg) values)
.setStatus(BmobConfig.STATUS_SEND_SUCCESS);
parentV.findViewById(R.id.progress_load).setVisibility(
View.INVISIBLE);
parentV.findViewById(R.id.iv_fail_resend)
.setVisibility(View.INVISIBLE);
parentV.findViewById(R.id.tv_send_status)
.setVisibility(View.VISIBLE);
((TextView) parentV.findViewById(R.id.tv_send_status))
.setText("已发送");
}
@Override
public void onFailure(int arg0, String arg1) {
// TODO Auto-generated method stub
ShowLog("发送失败:" + arg1);
((BmobMsg) values)
.setStatus(BmobConfig.STATUS_SEND_FAIL);
parentV.findViewById(R.id.progress_load).setVisibility(
View.INVISIBLE);
parentV.findViewById(R.id.iv_fail_resend)
.setVisibility(View.VISIBLE);
parentV.findViewById(R.id.tv_send_status)
.setVisibility(View.INVISIBLE);
}
});
mAdapter.notifyDataSetChanged();
}
/**
*
* @Title: resendImageMsg
* @Description: TODO
* @param @param parentV
* @param @param values
* @return void
* @throws
*/
private void resendFileMsg(final View parentV, final Object values) {
BmobChatManager.getInstance(ChatActivity.this).resendFileMessage(
targetUser, (BmobMsg) values, new UploadListener() {
@Override
public void onStart(BmobMsg msg) {
// TODO Auto-generated method stub
}
@Override
public void onSuccess() {
// TODO Auto-generated method stub
((BmobMsg) values)
.setStatus(BmobConfig.STATUS_SEND_SUCCESS);
parentV.findViewById(R.id.progress_load).setVisibility(
View.INVISIBLE);
parentV.findViewById(R.id.iv_fail_resend)
.setVisibility(View.INVISIBLE);
if (((BmobMsg) values).getMsgType() == BmobConfig.TYPE_VOICE) {
parentV.findViewById(R.id.tv_send_status)
.setVisibility(View.GONE);
parentV.findViewById(R.id.tv_voice_length)
.setVisibility(View.VISIBLE);
} else {
parentV.findViewById(R.id.tv_send_status)
.setVisibility(View.VISIBLE);
((TextView) parentV
.findViewById(R.id.tv_send_status))
.setText("已发送");
}
}
@Override
public void onFailure(int arg0, String arg1) {
// TODO Auto-generated method stub
((BmobMsg) values)
.setStatus(BmobConfig.STATUS_SEND_FAIL);
parentV.findViewById(R.id.progress_load).setVisibility(
View.INVISIBLE);
parentV.findViewById(R.id.iv_fail_resend)
.setVisibility(View.VISIBLE);
parentV.findViewById(R.id.tv_send_status)
.setVisibility(View.INVISIBLE);
}
});
mAdapter.notifyDataSetChanged();
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.edit_user_comment:
mListView.setSelection(mListView.getCount() - 1);
if (layout_more.getVisibility() == View.VISIBLE) {
layout_add.setVisibility(View.GONE);
layout_emo.setVisibility(View.GONE);
layout_more.setVisibility(View.GONE);
}
break;
case R.id.btn_chat_emo:
if (layout_more.getVisibility() == View.GONE) {
showEditState(true);
} else {
if (layout_add.getVisibility() == View.VISIBLE) {
layout_add.setVisibility(View.GONE);
layout_emo.setVisibility(View.VISIBLE);
} else {
layout_more.setVisibility(View.GONE);
}
}
break;
case R.id.btn_chat_add:
if (layout_more.getVisibility() == View.GONE) {
layout_more.setVisibility(View.VISIBLE);
layout_add.setVisibility(View.VISIBLE);
layout_emo.setVisibility(View.GONE);
hideSoftInputView();
} else {
if (layout_emo.getVisibility() == View.VISIBLE) {
layout_emo.setVisibility(View.GONE);
layout_add.setVisibility(View.VISIBLE);
} else {
layout_more.setVisibility(View.GONE);
}
}
break;
case R.id.btn_chat_voice:
edit_user_comment.setVisibility(View.GONE);
layout_more.setVisibility(View.GONE);
btn_chat_voice.setVisibility(View.GONE);
btn_chat_keyboard.setVisibility(View.VISIBLE);
btn_speak.setVisibility(View.VISIBLE);
hideSoftInputView();
break;
case R.id.btn_chat_keyboard:
showEditState(false);
break;
case R.id.btn_chat_send:
final String msg = edit_user_comment.getText().toString();
if (msg.equals("")) {
ShowToast("消息不能为空!");
return;
}
boolean isNetConnected = CommonUtils.isNetworkAvailable(this);
if (!isNetConnected) {
ShowToast(R.string.network_tips);
// return;
}
BmobMsg message = BmobMsg.createTextSendMsg(this, targetId, msg);
message.setExtra("Bmob");
manager.sendTextMessage(targetUser, message);
refreshMessage(message);
break;
case R.id.tv_camera:
selectImageFromCamera();
break;
case R.id.tv_picture:
selectImageFromLocal();
break;
case R.id.tv_location:
selectLocationFromMap();
break;
default:
break;
}
}
/**
* ������ͼ
*
* @Title: selectLocationFromMap
* @Description: TODO
* @param
* @return void
* @throws
*/
private void selectLocationFromMap() {
Intent intent = new Intent(this, LocationActivity.class);
intent.putExtra("type", "select");
startActivityForResult(intent, BmobConstants.REQUESTCODE_TAKE_LOCATION);
}
private String localCameraPath = "";
/**
* startCamera
*
* @Title: startCamera
* @throws
*/
public void selectImageFromCamera() {
Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File dir = new File(BmobConstants.BMOB_PICTURE_PATH);
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir, String.valueOf(System.currentTimeMillis())
+ ".jpg");
localCameraPath = file.getPath();
Uri imageUri = Uri.fromFile(file);
openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(openCameraIntent,
BmobConstants.REQUESTCODE_TAKE_CAMERA);
}
/**
*
* @Title: selectImage
* @Description: TODO
* @param
* @return void
* @throws
*/
public void selectImageFromLocal() {
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, BmobConstants.REQUESTCODE_TAKE_LOCAL);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case BmobConstants.REQUESTCODE_TAKE_CAMERA:
ShowLog("本地图片地址" + localCameraPath);
sendImageMessage(localCameraPath);
break;
case BmobConstants.REQUESTCODE_TAKE_LOCAL:
if (data != null) {
Uri selectedImage = data.getData();
if (selectedImage != null) {
Cursor cursor = getContentResolver().query(
selectedImage, null, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex("_data");
String localSelectPath = cursor.getString(columnIndex);
cursor.close();
if (localSelectPath == null
|| localSelectPath.equals("null")) {
ShowToast("找不到图片");
return;
}
sendImageMessage(localSelectPath);
}
}
break;
case BmobConstants.REQUESTCODE_TAKE_LOCATION:
double latitude = data.getDoubleExtra("x", 0);
double longtitude = data.getDoubleExtra("y", 0);
String address = data.getStringExtra("address");
if (address != null && !address.equals("")) {
sendLocationMessage(address, latitude, longtitude);
} else {
ShowToast("无法获取到您的位置信息!");
}
break;
}
}
}
/**
*
* @Title: sendLocationMessage
* @Description: TODO
* @param @param address
* @param @param latitude
* @param @param longtitude
* @return void
* @throws
*/
private void sendLocationMessage(String address, double latitude,
double longtitude) {
if (layout_more.getVisibility() == View.VISIBLE) {
layout_more.setVisibility(View.GONE);
layout_add.setVisibility(View.GONE);
layout_emo.setVisibility(View.GONE);
}
BmobMsg message = BmobMsg.createLocationSendMsg(this, targetId,
address, latitude, longtitude);
manager.sendTextMessage(targetUser, message);
refreshMessage(message);
}
/**
* sendImageMessage
* @Title: sendImageMessage
* @Description: TODO
* @param @param localPath
* @return void
* @throws
*/
private void sendImageMessage(String local) {
if (layout_more.getVisibility() == View.VISIBLE) {
layout_more.setVisibility(View.GONE);
layout_add.setVisibility(View.GONE);
layout_emo.setVisibility(View.GONE);
}
manager.sendImageMessage(targetUser, local, new UploadListener() {
@Override
public void onStart(BmobMsg msg) {
// TODO Auto-generated method stub
ShowLog("开始上传" + msg.getContent() + "状态"
+ msg.getStatus());
refreshMessage(msg);
}
@Override
public void onSuccess() {
// TODO Auto-generated method stub
mAdapter.notifyDataSetChanged();
}
@Override
public void onFailure(int error, String arg1) {
// TODO Auto-generated method stub
ShowLog("上传失败-->arg1:" + arg1);
mAdapter.notifyDataSetChanged();
}
});
}
/**
*
* @Title: showEditState
* @Description: TODO
* @param @param isEmo:
* @return void
* @throws
*/
private void showEditState(boolean isEmo) {
edit_user_comment.setVisibility(View.VISIBLE);
btn_chat_keyboard.setVisibility(View.GONE);
btn_chat_voice.setVisibility(View.VISIBLE);
btn_speak.setVisibility(View.GONE);
edit_user_comment.requestFocus();
if (isEmo) {
layout_more.setVisibility(View.VISIBLE);
layout_more.setVisibility(View.VISIBLE);
layout_emo.setVisibility(View.VISIBLE);
layout_add.setVisibility(View.GONE);
hideSoftInputView();
} else {
layout_more.setVisibility(View.GONE);
showSoftInputView();
}
}
public void showSoftInputView() {
if (getWindow().getAttributes().softInputMode == WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) {
if (getCurrentFocus() != null)
((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE))
.showSoftInput(edit_user_comment, 0);
}
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
initOrRefresh();
MyMessageReceiver.ehList.add(this);
BmobNotifyManager.getInstance(this).cancelNotify();
BmobDB.create(this).resetUnread(targetId);
MyMessageReceiver.mNewNum=0;
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
MyMessageReceiver.ehList.remove(this);
if (recordManager.isRecording()) {
recordManager.cancelRecording();
layout_record.setVisibility(View.GONE);
}
if (NewRecordPlayClickListener.isPlaying
&& NewRecordPlayClickListener.currentPlayListener != null) {
NewRecordPlayClickListener.currentPlayListener.stopPlayRecord();
}
}
@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == NEW_MESSAGE) {
BmobMsg message = (BmobMsg) msg.obj;
String uid = message.getBelongId();
BmobMsg m = BmobChatManager.getInstance(ChatActivity.this).getMessage(message.getConversationId(), message.getMsgTime());
if (!uid.equals(targetId))
return;
mAdapter.add(m);
mListView.setSelection(mAdapter.getCount() - 1);
BmobDB.create(ChatActivity.this).resetUnread(targetId);
}
}
};
public static final int NEW_MESSAGE = 0x001;
NewBroadcastReceiver receiver;
private void initNewMessageBroadCast(){
receiver = new NewBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter(BmobConfig.BROADCAST_NEW_MESSAGE);
intentFilter.setPriority(5);
registerReceiver(receiver, intentFilter);
}
/**
*
*
*/
private class NewBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String from = intent.getStringExtra("fromId");
String msgId = intent.getStringExtra("msgId");
String msgTime = intent.getStringExtra("msgTime");
if(!TextUtils.isEmpty(from)&& !TextUtils.isEmpty(msgId)&& !TextUtils.isEmpty(msgTime)){
BmobMsg msg = BmobChatManager.getInstance(ChatActivity.this).getMessage(msgId, msgTime);
if (!from.equals(targetId))
return;
mAdapter.add(msg);
mListView.setSelection(mAdapter.getCount() - 1);
BmobDB.create(ChatActivity.this).resetUnread(targetId);
}
abortBroadcast();
}
}
/**
*
* @Title: refreshMessage
* @Description: TODO
* @param @param message
* @return void
* @throws
*/
private void refreshMessage(BmobMsg msg) {
mAdapter.add(msg);
mListView.setSelection(mAdapter.getCount() - 1);
edit_user_comment.setText("");
}
@Override
public void onMessage(BmobMsg message) {
// TODO Auto-generated method stub
Message handlerMsg = handler.obtainMessage(NEW_MESSAGE);
handlerMsg.obj = message;
handler.sendMessage(handlerMsg);
}
@Override
public void onNetChange(boolean isNetConnected) {
// TODO Auto-generated method stub
if (!isNetConnected) {
ShowToast(R.string.network_tips);
}
}
@Override
public void onAddUser(BmobInvitation invite) {
// TODO Auto-generated method stub
}
@Override
public void onOffline() {
// TODO Auto-generated method stub
showOfflineDialog(this);
}
@Override
public void onReaded(String conversionId, String msgTime) {
// TODO Auto-generated method stub
if (conversionId.split("&")[1].equals(targetId)) {
for (BmobMsg msg : mAdapter.getList()) {
if (msg.getConversationId().equals(conversionId)
&& msg.getMsgTime().equals(msgTime)) {
msg.setStatus(BmobConfig.STATUS_SEND_RECEIVERED);
}
mAdapter.notifyDataSetChanged();
}
}
}
public void onRefresh() {
// TODO Auto-generated method stub
handler.postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
MsgPagerNum++;
int total = BmobDB.create(ChatActivity.this).queryChatTotalCount(targetId);
BmobLog.i("记录总数" + total);
int currents = mAdapter.getCount();
if (total <= currents) {
ShowToast("聊天记录加载完成!");
} else {
List<BmobMsg> msgList = initMsgData();
mAdapter.setList(msgList);
mListView.setSelection(mAdapter.getCount() - currents - 1);
}
mListView.stopRefresh();
}
}, 1000);
}
@Override
public void onLoadMore() {
// TODO Auto-generated method stub
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (layout_more.getVisibility() == 0) {
layout_more.setVisibility(View.GONE);
return false;
} else {
return super.onKeyDown(keyCode, event);
}
} else {
return super.onKeyDown(keyCode, event);
}
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
hideSoftInputView();
try {
unregisterReceiver(receiver);
} catch (Exception e) {
}
}
}