package com.mogujie.tt.ui.activity;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Dialog;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.text.Editable;
import android.text.Selection;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.TextView;
import android.widget.Toast;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener2;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import com.mogujie.tt.R;
import com.mogujie.tt.adapter.MessageAdapter;
import com.mogujie.tt.adapter.album.AlbumHelper;
import com.mogujie.tt.adapter.album.ImageBucket;
import com.mogujie.tt.app.IMEntrance;
import com.mogujie.tt.audio.biz.AudioPlayerHandler;
import com.mogujie.tt.audio.biz.AudioRecordHandler;
import com.mogujie.tt.biz.MessageHelper;
import com.mogujie.tt.biz.MessageNotifyCenter;
import com.mogujie.tt.cache.biz.CacheHub;
import com.mogujie.tt.config.HandlerConstant;
import com.mogujie.tt.config.SysConstant;
import com.mogujie.tt.entity.MessageInfo;
import com.mogujie.tt.entity.User;
import com.mogujie.tt.imlib.IMActions;
import com.mogujie.tt.imlib.IMContactManager;
import com.mogujie.tt.imlib.IMGroupManager;
import com.mogujie.tt.imlib.IMSession;
import com.mogujie.tt.imlib.proto.ContactEntity;
import com.mogujie.tt.imlib.proto.GroupEntity;
import com.mogujie.tt.imlib.service.IMService;
import com.mogujie.tt.imlib.utils.IMUIHelper;
import com.mogujie.tt.imlib.utils.IMUIHelper.SessionInfo;
import com.mogujie.tt.log.Logger;
import com.mogujie.tt.packet.MessageDispatchCenter;
import com.mogujie.tt.task.TaskCallback;
import com.mogujie.tt.task.TaskManager;
import com.mogujie.tt.task.biz.UploadImageTask;
import com.mogujie.tt.ui.base.TTBaseActivity;
import com.mogujie.tt.ui.tools.Emoparser;
import com.mogujie.tt.ui.tools.ImageTool;
import com.mogujie.tt.ui.utils.IMServiceHelper;
import com.mogujie.tt.ui.utils.IMServiceHelper.OnIMServiceListner;
import com.mogujie.tt.utils.CommonUtil;
import com.mogujie.tt.widget.EmoGridView;
import com.mogujie.tt.widget.EmoGridView.OnEmoGridViewItemClick;
import com.mogujie.tt.widget.MGProgressbar;
//import com.mogujie.tt.conn.ReconnectManager;
/**
* @Description 主消息界面
* @author Nana
* @date 2014-7-15
*/
public class MessageActivity extends TTBaseActivity
implements
OnRefreshListener2<ListView>,
View.OnClickListener,
OnTouchListener,
TextWatcher,
SensorEventListener,
OnIMServiceListner {
@Override
public void onIMServiceConnected() {
logger.d("messageactivity#onIMServiceConnected");
imService = imServiceHelper.getIMService();
// todo eric, this is unnecessary check, just assignment it
int sessionType = 0;
String sessionId = "";
// if (session.getSessionId().isEmpty()) {
// sessionType = getIntent().getIntExtra(SysConstant.SESSION_TYPE_KEY,
// 0);
// sessionId = getIntent().getStringExtra(SysConstant.SESSION_ID_KEY);
//
// session.setType(sessionType);
// session.setSessionId(sessionId);
// } else {
sessionType = session.getType();
sessionId = session.getSessionId();
// }
setTitleByUser2(sessionId, sessionType);
handleOnResume(true);
}
private void handleOnResume(boolean firstStart) {
int sessionType = session.getType();;
String sessionId = session.getSessionId();
handleUnreadMsgs(sessionId, sessionType);
loadHistoryMessage(sessionId, false, firstStart);
}
private void handleUnreadMsgs(String sessionId, int sessionType) {
logger.d("messageacitivity#handleUnreadMsgs sessionId:%s", sessionId);
IMService imService = imServiceHelper.getIMService();
if (imService != null) {
imService.getRecentSessionManager().resetUnreadMsgCnt(sessionId);
imService.getMessageManager().ReadUnreadMsgList(sessionId, sessionType);
}
}
// todo eric timeout and failed 2 statuses
private void onMsgAck(Intent intent) {
logger.d("messageactivity#onMsgAck");
// Bundle extras = intent.getExtras();
// MessageEntity msg = (MessageEntity)
// extras.getSerializable(SysConstant.MSG_KEY);
// if (msg == null) {
// logger.e("messageactivity#msg is null");
// return;
// }
//
// String curChatId = CacheHub.getInstance().getChatUser().getUserId();
// if (!msg.toId.equals(curChatId)) {
// logger.d("messageactivity#toid:%s is not current userid:%s, ignore",
// msg.toId, curChatId);
// return;
//
// }
//
MessageHelper.onReceiveMsgACK2(intent);
adapter.notifyDataSetChanged();
}
private void onMsgRecv(Intent intent, BroadcastReceiver broadcastReceiver) {
logger.d("messageactivity#onMsgRecv");
String sessionId = intent.getStringExtra(SysConstant.SESSION_ID_KEY);
if (!sessionId.equals(session.getSessionId())) {
logger.d("messageactivity#not this session msg -> id:%s", sessionId);
return;
}
// eat the message, so there woould be no notification in notification
// bar
broadcastReceiver.abortBroadcast();
if (imService == null) {
return;
}
imService.getRecentSessionManager().resetUnreadMsgCnt(sessionId);
List<MessageInfo> msgList = imService.getMessageManager().ReadUnreadMsgList(sessionId, session.getType());
if (msgList == null) {
logger.e("messageactivity#no any unread MessageInfo list");
return;
}
for (MessageInfo msgInfo : msgList) {
MessageHelper.onReceiveMessage2(msgInfo, imServiceHelper);
}
scrollToBottomListItem();
}
@Override
public void onAction(String action, Intent intent,
BroadcastReceiver broadcastReceiver) {
logger.d("messageactivity#onAction -> action:%s", action);
if (action.equals(IMActions.ACTION_MSG_ACK)) {
onMsgAck(intent);
} else if (action.equals(IMActions.ACTION_MSG_UNACK_TIMEOUT)) {
onMsgUnAckTimeout(intent);
} else if (action.equals(IMActions.ACTION_MSG_RECV)) {
if (!imServiceConnectionEnabled) {
logger.w("messageactivity#imServiceConnection Disabled, do nothing");
return;
}
onMsgRecv(intent, broadcastReceiver);
} else if (action.equals(IMActions.ACTION_NEW_MESSAGE_SESSION)) {
onResumeAgain();
} else if (action.equals(IMActions.ACTION_MSG_RESENT)) {
onMessageResent(intent);
} else if (action.equals(IMActions.ACTION_MSG_STATUS)) {
onMessageNewStatus(intent);
}
}
private void onMessageNewStatus(Intent intent) {
logger.d("chat#onMessageNewStatus");
if (intent == null) {
return;
}
// int newStatus = intent.getIntExtra(SysConstant.STATUS_KEY, SysConstant.MESSAGE_STATE_FINISH_SUCCESSED);
adapter.notifyDataSetChanged();
}
private void onMessageResent(Intent intent) {
logger.d("chat#resend#onMessageResent");
if (intent == null) {
return;
}
SessionInfo sessionInfoFromIntent = IMUIHelper.getSessionInfoFromIntent(intent);
if (sessionInfoFromIntent == null) {
return;
}
if (IMUIHelper.isSameSession(sessionInfoFromIntent, session)) {
logger.d("chat#resend#same session, reloading messages");
loadHistoryMessage(session.getSessionId(), true, false);
}
}
//the second and later time resume
private void onResumeAgain() {
logger.d("chat#onNewMessageSession");
SessionInfo sessionInfo = CacheHub.getInstance().getSessionInfo();
if (sessionInfo == null) {
return;
}
logger.d("chat#sessionInfo:%s", sessionInfo);
// different session
if (!(sessionInfo.getSessionId().equals(session.getSessionId()) && sessionInfo.getSessionType() == session.getType())) {
logger.w("chat#got new different session msg, close the current chat window");
IMUIHelper.openSessionChatActivity(logger, this, sessionInfo.getSessionId(), sessionInfo.getSessionType(), imService);
this.finish();
}
}
private void onMsgUnAckTimeout(Intent intent) {
String msgId = intent.getStringExtra(SysConstant.MSG_ID_KEY);
logger.d("chat#onMsgUnAckTimeout, msgId:%s", msgId);
updateMessageState(msgId, SysConstant.MESSAGE_STATE_FINISH_FAILED);
}
private static Handler uiHandler = null;// 处理界面消息
private static Handler msgHandler = null;// 处理协议消息
private PullToRefreshListView lvPTR = null;
private EditText messageEdt = null;
private TextView sendBtn = null;
private Button recordAudioBtn = null;
private ImageView keyboardInputImg = null;
private ImageView soundVolumeImg = null;
private LinearLayout soundVolumeLayout = null;
private static MessageAdapter adapter = null;
private ImageView audioInputImg = null;
private ImageView addPhotoBtn = null;
private ImageView addEmoBtn = null;
private EmoGridView emoGridView = null;
private String audioSavePath = null;
private InputMethodManager inputManager = null;
private boolean textChanged = false;
private AudioRecordHandler audioRecorderInstance = null;
private Thread audioRecorderThread = null;
private Dialog soundVolumeDialog = null;
private View unreadMessageNotifyView = null;
private View addOthersPanelView = null;
private AlbumHelper albumHelper = null;
private static List<ImageBucket> albumList = null;
MGProgressbar progressbar = null;
private boolean audioReday = false;
static private AudioManager audioManager = null;
static private SensorManager sensorManager = null;
static private Sensor sensor = null;
static private int audioPlayMode = SysConstant.AUDIO_PLAY_MODE_NORMAL;
// private int preAudioPlayMode = SysConstant.AUDIO_PLAY_MODE_NORMAL;
private String takePhotoSavePath = "";
// 避免用户信息与商品详情的重复请求
public static boolean requestingGoodsDetail = false;
public static boolean requestingUserInfo = false;
private Logger logger = Logger.getLogger(MessageActivity.class);
private IMServiceHelper imServiceHelper = new IMServiceHelper();
private IMService imService;
private IMSession session = new IMSession(imServiceHelper);
private int MSG_CNT_PER_PAGE = 15;
private int firstHistoryMsgTime = -1;
private boolean imServiceConnectionEnabled = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
initData();
initHandler();
registEvents();
initAudioSensor();
IMEntrance.getInstance().setContext(MessageActivity.this);
ArrayList<String> actions = new ArrayList<String>();
actions.add(IMActions.ACTION_MSG_ACK);
actions.add(IMActions.ACTION_MSG_RECV);
actions.add(IMActions.ACTION_MSG_UNACK_TIMEOUT);
actions.add(IMActions.ACTION_NEW_MESSAGE_SESSION);
actions.add(IMActions.ACTION_MSG_RESENT);
actions.add(IMActions.ACTION_MSG_STATUS);
imServiceHelper.connect(this, actions, IMServiceHelper.INTENT_MAX_PRIORITY, this);
logger.d("messageactivity#register im service");
int sessionType = getIntent().getIntExtra(SysConstant.SESSION_TYPE_KEY, 0);
String sessionId = getIntent().getStringExtra(SysConstant.SESSION_ID_KEY);
session.setType(sessionType);
session.setSessionId(sessionId);
}
@Override
protected void onResume() {
logger.d("messageactivity#onresume");
super.onResume();
imServiceConnectionEnabled = true;
firstHistoryMsgTime = 0;
NotificationManager notifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
if (notifyMgr != null) {
// notifyMgr.cancelAll();
notifyMgr.cancel(Integer.parseInt(session.getSessionId()));
}
// not the first time
if (imServiceHelper.getIMService() != null) {
onResumeAgain();
handleOnResume(false);
}
// 从联系人切换到消息界面时设置聊天界面信息
// fillMessageViewByContact(getIntent());
// 检测是否是黑名单用户
// MessageHelper.blockUserCheck(CacheHub.getInstance().getChatUserId(),
// uiHandler);
// 修改消息状态
setMessageState();
// 修改消息状态修改后,通知联系人列表更新列表信息
MessageNotifyCenter.getInstance().doNotify(SysConstant.EVENT_RECENT_INFO_CHANGED);
// 检测是否被踢下线
checkKickOff();
// 下面的标志用于防止用户信息与商品详情的重复请求
MessageActivity.requestingGoodsDetail = false;
MessageActivity.requestingUserInfo = false;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (RESULT_OK != resultCode)
return;
// // 拍照时如果断网直接提示,不进行图片消息的展示
// if (!StateManager.getInstance().isOnline()) {
// Toast.makeText(MessageActivity.this,
// getResources().getString(R.string.disconnected_by_server),
// Toast.LENGTH_LONG).show();
//
// return;
// }
switch (requestCode) {
case SysConstant.CAMERA_WITH_DATA :
handleTakePhotoData(data);
break;
case SysConstant.ALBUM_BACK_DATA :
logger.d("pic#ALBUM_BACK_DATA");
setIntent(data);
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
protected void initHandler() {
msgHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// switch (msg.what) {
// case ProtocolConstant.SID_MSG * 1000
// + ProtocolConstant.CID_MSG_DATA_ACK:
// MessageHelper.onReceiveMsgACK(msg.obj);
// break;
// case ProtocolConstant.SID_MSG * 1000
// + ProtocolConstant.CID_MSG_DATA:
// MessageHelper.onReceiveMessage(msg.obj);
// break;
// case ProtocolConstant.SID_OTHER * 1000
// + ProtocolConstant.CID_GET_USER_INFO_RESPONSE:
// MessageHelper.onGetUserInfo(msg.obj, uiHandler,
// MessageActivity.this);
// break;
// }
}
};
uiHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case HandlerConstant.HANDLER_RECORD_FINISHED :
onRecordVoiceEnd((Float) msg.obj);
break;
case HandlerConstant.HANDLER_NET_STATE_DISCONNECTED :
setTitle(getString(R.string.disconnected));
break;
case HandlerConstant.HANDLER_LOGIN_MSG_SERVER :
MessageHelper.onConnectedMsgServer(msgHandler, uiHandler);
break;
case HandlerConstant.HANDLER_IMAGE_UPLOAD_FAILD :
onUploadImageFaild(msg.obj);
break;
case HandlerConstant.HANDLER_IMAGE_UPLOAD_SUCESS :
logger.d("pic#upload image ok");
MessageHelper.onImageUploadFinish(msg.obj, uiHandler, msgHandler, imServiceHelper.getIMService().getMessageManager(), session.getType());
adapter.notifyDataSetChanged();
break;
case HandlerConstant.HANDLER_LOGIN_KICK :
if (CommonUtil.isTopActivy(MessageActivity.this, SysConstant.MESSAGE_ACTIVITY)) {
checkKickOff();
}
break;
case HandlerConstant.HANDLER_STOP_PLAY :
adapter.stopVoicePlayAnim((String) msg.obj);
break;
case HandlerConstant.RECEIVE_MAX_VOLUME :
onReceiveMaxVolume((Integer) msg.obj);
break;
case HandlerConstant.RECORD_AUDIO_TOO_LONG :
doFinishRecordAudio();
break;
case HandlerConstant.HANDLER_MESSAGES_NEW_MESSAGE_COME :
if (CommonUtil.isTopActivy(MessageActivity.this, SysConstant.MESSAGE_ACTIVITY)) {
// 设置消息状态并通知联系人列表更新列表信息
setMessageState();
MessageNotifyCenter.getInstance().doNotify(SysConstant.EVENT_RECENT_INFO_CHANGED);
}
break;
case HandlerConstant.HANDLER_SEND_MESSAGE_TIMEOUT :
adapter.updateMessageState((MessageInfo) msg.obj, SysConstant.MESSAGE_STATE_FINISH_FAILED);
break;
case HandlerConstant.HANDLER_SEND_MESSAGE_FAILED :
adapter.updateMessageState((MessageInfo) msg.obj, SysConstant.MESSAGE_STATE_FINISH_FAILED);
break;
case HandlerConstant.SHOULD_BLOCK_USER :
blockUser(true);
break;
case HandlerConstant.SHOULD_NOT_BLOCK_USER :
blockUser(false);
break;
case HandlerConstant.START_BLOCK_CHECK :
onStartBlockCheck();
break;
case HandlerConstant.SET_TITLE :
enableBottomView(true);
setTitleByUser((User) msg.obj);
break;
case HandlerConstant.REQUEST_CUSTOM_SERVICE_FAILED :
onRequestCustomServiceFailed();
break;
default :
break;
}
}
};
}
/**
* @Description 请求客服失败后处理
*/
private void onRequestCustomServiceFailed() {
enableBottomView(false);// 禁用输入框
setTitle(R.string.request_custom_service_failed);// 标题栏给出失败提示
}
/**
* @Description 是否禁用底部输入控件
* @param enabled
*/
private void enableBottomView(boolean enabled) {
sendBtn.setEnabled(enabled);
recordAudioBtn.setEnabled(enabled);
audioInputImg.setEnabled(enabled);
messageEdt.setEnabled(enabled);
keyboardInputImg.setEnabled(enabled);
addPhotoBtn.setEnabled(enabled);
addEmoBtn.setEnabled(enabled);
}
/**
* @Description 显示联系人界面
*/
private void showGroupManageActivity(boolean fromMessagePage) {
Intent i = new Intent(this, GroupManagermentActivity.class);
i.putExtra(SysConstant.SESSION_ID_KEY, session.getSessionId());
i.putExtra(SysConstant.SESSION_TYPE_KEY, session.getType());
startActivity(i);
}
/**
* @Description 注册事件
*/
private void registEvents() {
// 接收未读消息提示
MessageNotifyCenter.getInstance().register(SysConstant.EVENT_UNREAD_MSG, getUiHandler(), HandlerConstant.HANDLER_MESSAGES_NEW_MESSAGE_COME);
// // 接收网络状态通知
// NetStateDispach.getInstance()
// .register(MessageActivity.class, uiHandler);
}
/**
* @Description 取消事件注册
*/
private void unregistEvents() {
MessageDispatchCenter.getInstance().unRegister(uiHandler);
MessageNotifyCenter.getInstance().unregister(SysConstant.EVENT_UNREAD_MSG, getUiHandler(), HandlerConstant.HANDLER_MESSAGES_NEW_MESSAGE_COME);
}
/**
* @Description 初始化AudioManager,用于访问控制音量和钤声模式
*/
private void initAudioSensor() {
audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
/**
* @Description 初始化数据(相册,表情,数据库相关)
*/
private void initData() {
new Thread(new Runnable() {
@Override
public void run() {
albumHelper = AlbumHelper.getHelper(MessageActivity.this);
albumList = albumHelper.getImagesBucketList(false);
Emoparser.getInstance(MessageActivity.this);
}
}).start();
}
/**
* @Description 初始化界面控件
*/
private void initView() {
// 设置顶部标题栏
setLeftButton(R.drawable.tt_top_back);
setLeftText(getResources().getString(R.string.top_left_back));
topLeftBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
MessageActivity.this.finish();
}
});
// 绑定布局资源(注意放所有资源初始化之前)
LayoutInflater.from(this).inflate(R.layout.tt_activity_message, topContentView);
// 右上角联系人图标
setRightButton(R.drawable.tt_top_right_group_manager);
// 未读消息提示
unreadMessageNotifyView = new View(this);
unreadMessageNotifyView.setBackgroundResource(R.drawable.tt_unread_message_notify_bg);
final int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics());
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(width, width);
lp.gravity = Gravity.TOP | Gravity.RIGHT;
lp.topMargin = width - 4;
lp.rightMargin = width - 5;
unreadMessageNotifyView.setLayoutParams(lp);
topBar.addView(unreadMessageNotifyView, lp);
unreadMessageNotifyView.setVisibility(View.GONE);
// 输入对象
inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
// 表情
emoGridView = (EmoGridView) findViewById(R.id.emo_gridview);
emoGridView.setOnEmoGridViewItemClick(new OnEmoGridViewItemClick() {
@Override
public void onItemClick(int facesPos, int viewIndex) {
int deleteId = (++viewIndex) * (SysConstant.pageSize - 1);
if (deleteId > Emoparser.getInstance(MessageActivity.this).getResIdList().length) {
deleteId = Emoparser.getInstance(MessageActivity.this).getResIdList().length;
}
if (deleteId == facesPos) {
String msgContent = messageEdt.getText().toString();
if (msgContent.isEmpty())
return;
if (msgContent.contains("["))
msgContent = msgContent.substring(0, msgContent.lastIndexOf("["));
messageEdt.setText(msgContent);
} else {
int resId = Emoparser.getInstance(MessageActivity.this).getResIdList()[facesPos];
String pharse = Emoparser.getInstance(MessageActivity.this).getIdPhraseMap().get(resId);
int startIndex = messageEdt.getSelectionStart();
Editable edit = messageEdt.getEditableText();
if (startIndex < 0 || startIndex >= edit.length()) {
if (null != pharse) {
edit.append(pharse);
}
} else {
if (null != pharse) {
edit.insert(startIndex, pharse);
}
}
}
Editable edtable = messageEdt.getText();
int position = edtable.length();
Selection.setSelection(edtable, position);
}
});
emoGridView.setAdapter();
// 列表控件(开源PTR)
lvPTR = (PullToRefreshListView) this.findViewById(R.id.message_list);
Drawable loadingDrawable = getResources().getDrawable(R.drawable.pull_to_refresh_indicator);
final int indicatorWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 29, getResources().getDisplayMetrics());
loadingDrawable.setBounds(new Rect(0, indicatorWidth, 0, indicatorWidth));
lvPTR.getLoadingLayoutProxy().setLoadingDrawable(loadingDrawable);
lvPTR.getRefreshableView().setCacheColorHint(Color.WHITE);
lvPTR.getRefreshableView().setSelector(new ColorDrawable(Color.WHITE));
lvPTR.getRefreshableView().setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (emoGridView.getVisibility() == View.VISIBLE) {
emoGridView.setVisibility(View.GONE);
}
if (addOthersPanelView.getVisibility() == View.VISIBLE) {
addOthersPanelView.setVisibility(View.GONE);
}
inputManager.hideSoftInputFromWindow(messageEdt.getWindowToken(), 0);
}
return false;
}
});
lvPTR.getRefreshableView().addHeaderView(LayoutInflater.from(this).inflate(R.layout.tt_messagelist_header, lvPTR.getRefreshableView(), false));
adapter = new MessageAdapter(this);
adapter.setSession(session);
adapter.setIMServiceHelper(imServiceHelper);
lvPTR.setAdapter(adapter);
lvPTR.setOnRefreshListener(this);
// 界面底部输入框布局
sendBtn = (TextView) this.findViewById(R.id.send_message_btn);
recordAudioBtn = (Button) this.findViewById(R.id.record_voice_btn);
audioInputImg = (ImageView) this.findViewById(R.id.voice_btn);
messageEdt = (EditText) this.findViewById(R.id.message_text);
RelativeLayout.LayoutParams param = (LayoutParams) messageEdt.getLayoutParams();
param.addRule(RelativeLayout.LEFT_OF, R.id.show_add_photo_btn);
param.addRule(RelativeLayout.RIGHT_OF, R.id.show_emo_btn);
messageEdt.setOnFocusChangeListener(new android.view.View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
scrollToBottomListItem();
if (emoGridView.getVisibility() == View.VISIBLE) {
emoGridView.setVisibility(View.GONE);
}
if (addOthersPanelView.getVisibility() == View.VISIBLE) {
addOthersPanelView.setVisibility(View.GONE);
}
}
}
});
messageEdt.setOnClickListener(this);
keyboardInputImg = (ImageView) this.findViewById(R.id.show_keyboard_btn);
addPhotoBtn = (ImageView) this.findViewById(R.id.show_add_photo_btn);
addPhotoBtn.setOnClickListener(this);
addEmoBtn = (ImageView) this.findViewById(R.id.show_emo_btn);
addEmoBtn.setOnClickListener(this);
initSoundVolumeDlg();
addOthersPanelView = findViewById(R.id.add_others_panel);
View takePhotoBtn = findViewById(R.id.take_photo_btn);
takePhotoBtn.setOnClickListener(this);
View takeCameraBtn = findViewById(R.id.take_camera_btn);
takeCameraBtn.setOnClickListener(this);
// 初始化滚动条(注意放到最后)
View view = LayoutInflater.from(MessageActivity.this).inflate(R.layout.tt_progress_ly, null);
progressbar = (MGProgressbar) view.findViewById(R.id.tt_progress);
LayoutParams pgParms = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
pgParms.bottomMargin = 50;
addContentView(view, pgParms);
// 绑定各控件事件监听对象
messageEdt.addTextChangedListener(this);
keyboardInputImg.setOnClickListener(this);
audioInputImg.setOnClickListener(this);
recordAudioBtn.setOnTouchListener(this);
sendBtn.setOnClickListener(this);
topLeftBtn.setOnClickListener(this);
topRightBtn.setOnClickListener(this);
}
/**
* @Description 初始化音量对话框
*/
private void initSoundVolumeDlg() {
soundVolumeDialog = new Dialog(this, R.style.SoundVolumeStyle);
soundVolumeDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
soundVolumeDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
soundVolumeDialog.setContentView(R.layout.tt_sound_volume_dialog);
soundVolumeDialog.setCanceledOnTouchOutside(true);
soundVolumeImg = (ImageView) soundVolumeDialog.findViewById(R.id.sound_volume_img);
soundVolumeLayout = (LinearLayout) soundVolumeDialog.findViewById(R.id.sound_volume_bk);
}
private List<MessageInfo> loadHistory() {
List<MessageInfo> historyMsgInfo = imServiceHelper.getIMService().getDbManager().getHistoryMsg(session.getSessionId(), session.getType(), 0, MSG_CNT_PER_PAGE, firstHistoryMsgTime);
if (historyMsgInfo != null && !historyMsgInfo.isEmpty()) {
firstHistoryMsgTime = historyMsgInfo.get(0).getCreated();
logger.d("messageactivity#db#got the fristHistoryMsgTime:%d", firstHistoryMsgTime);
}
return historyMsgInfo;
}
private void loadHistoryMessage(String sessionId, boolean reset,
boolean firstStart) {
logger.d("chat#messageactivity#loadHistoryMessage sessionId:%s, reset:%s, showHistoryDivider:%s", sessionId, reset, firstStart);
if (imServiceHelper.getIMService() == null) {
logger.d("messageactivity#still not connected im");
return;
}
adapter.clearItem();
adapter.clearMsgIndexMap();
if (reset) {
firstHistoryMsgTime = 0;
}
List<MessageInfo> historyMsgInfo = loadHistory();
if (!historyMsgInfo.isEmpty()) {
logger.d("messageactivity#got historyMessage");
if (firstStart) {
adapter.addHistoryDivideTag();
}
// // 处理一些特殊情况SDCARD不可用
// if (!FileUtil.isSdCardAvailuable()) {
// for (MessageInfo info : historyMsgInfo) {
// if (info.getDisplayType() == SysConstant.DISPLAY_TYPE_IMAGE) {
// info.setMsgLoadState(SysConstant.MESSAGE_STATE_FINISH_FAILED);
// // CacheHub.getInstance().updateMsgStatus(info.getMsgId(),
// // SysConstant.MESSAGE_STATE_FINISH_FAILED);
// }
// }
// }
}
adapter.addItem(true, historyMsgInfo);
adapter.notifyDataSetChanged();
scrollToBottomListItem();
}
// /**
// * @Description 判断如果是从联系人界面切换到消息界面,则根据需要渲染消息界面
// * @param intent
// */
// private void fillMessageViewByContact(Intent intent) {
// logger.d("fillMessageViewByContact");
//
// if (null == intent)
// return;
//
// loadHistoryMessage(session.getSessionId());
// }
/**
* @Description 设置会话对象设置消息标题
* @param user
*/
private void setTitleByUser(User user) {
if (null == user) {
return;
}
if (!TextUtils.isEmpty(user.getNickName())) {
setTitle(user.getNickName());
} else if (!TextUtils.isEmpty(user.getName())) {
setTitle(user.getName());
} else {
setTitle(user.getUserId());
}
}
private void setTitleByGroup(String sessionId) {
IMGroupManager groupMgr = imServiceHelper.getIMService().getGroupManager();
if (groupMgr == null) {
return;
}
GroupEntity group = groupMgr.findGroup(sessionId);
if (sessionId == null) {
logger.e("messageactivity#findGroup failed.sessionid:%s", sessionId);
return;
}
setTitle(group.name);
}
// todo eric
private void setTitleByUser2(String sessionId, int sessionType) {
logger.d("setTitleByUser sessionId:%s, sessionType:%d", sessionId, sessionType);
if (sessionType == IMSession.SESSION_P2P) {
IMContactManager contactManager = imServiceHelper.getIMService().getContactManager();
ContactEntity contact = contactManager.findContact(sessionId);
if (contact == null) {
logger.e("messageactivity#findContact failed.sessionid:%s", sessionId);
return;
}
setTitle(contact.nickName);
} else {
setTitleByGroup(sessionId);
}
}
/**
* @Description 设置消息相关状态:未读消息计数,消息已读状态,界面未读消息提示
*/
private void setMessageState() {
User loginUser = CacheHub.getInstance().getLoginUser();
User chatUser = CacheHub.getInstance().getChatUser();
if (null != loginUser && null != chatUser) {
CacheHub.getInstance().clearUnreadCount(chatUser.getUserId());
CacheHub.getInstance().updateMsgReadStatus(loginUser.getUserId(), chatUser.getUserId(), SysConstant.MESSAGE_ALREADY_READ);
}
if (0 < CacheHub.getInstance().getUnreadCount()) {
unreadMessageNotifyView.setVisibility(View.VISIBLE);
} else {
unreadMessageNotifyView.setVisibility(View.GONE);
}
}
public void showProgress() {
progressbar.showProgress();
}
public void hideProgress() {
progressbar.hideProgress();
}
/**
* @Description 开始检测是否是黑名单用户时,界面显示状态
*/
private void onStartBlockCheck() {
showProgress();
enableBottomView(false);
}
/**
* @Description 根据是否是黑名单用户显示相关信息
* @param block
*/
private void blockUser(boolean block) {
hideProgress();
if (block) {
Toast.makeText(MessageActivity.this, getString(R.string.block_chat), Toast.LENGTH_LONG).show();
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
MessageActivity.this.finish();
}
}, 1000);
} else {
enableBottomView(true);
}
}
/**
* @Description 修改消息的文件保存路径
* @param msgId
* @param path
*/
public static void updateMessageSavePath(String msgId, String path) {
adapter.updateItemSavePath(msgId, path);
}
/**
* @Description 修改消息状态
*/
public static void updateMessageState(String msgId, int state) {
adapter.updateItemState(msgId, state);
}
/**
* @Description 修改消息状态
*/
public static void updateMessageState(MessageInfo msgInfo, int state) {
adapter.updateMessageState(msgInfo, state);
}
/**
* @Description 清空适配器
*/
public static void clearItem() {
adapter.clearItem();
adapter.notifyDataSetChanged();
}
/**
* @Description 向消息列表适配器中添加一条消息
* @param msgInfo
*/
public static void addItem(MessageInfo msgInfo) {
Logger logger = Logger.getLogger(MessageActivity.class);
logger.d("chat#addImte msgInfo:%s", msgInfo);
adapter.addItem(msgInfo);
adapter.notifyDataSetChanged();
}
/**
* @Description 向消息列表适配器中添加历史消息
* @param fromStart
* @param historyMsgInfo
*/
public static void addItem(boolean fromStart,
ArrayList<MessageInfo> historyMsgInfo) {
adapter.addItem(true, historyMsgInfo);
adapter.notifyDataSetChanged();
}
/**
* @Description 录音超时(60s),发消息调用该方法
*/
public void doFinishRecordAudio() {
try {
if (audioRecorderInstance.isRecording()) {
audioRecorderInstance.setRecording(false);
}
if (soundVolumeDialog.isShowing()) {
soundVolumeDialog.dismiss();
}
recordAudioBtn.setBackgroundResource(R.drawable.tt_pannel_btn_voiceforward_normal);
audioRecorderInstance.setRecordTime(SysConstant.MAX_SOUND_RECORD_TIME);
onRecordVoiceEnd(SysConstant.MAX_SOUND_RECORD_TIME);
} catch (Exception e) {
}
}
/**
* @Description 根据分贝值设置录音时的音量动画
* @param voiceValue
*/
private void onReceiveMaxVolume(int voiceValue) {
if (voiceValue < 200.0) {
soundVolumeImg.setImageResource(R.drawable.tt_sound_volume_01);
} else if (voiceValue > 200.0 && voiceValue < 600) {
soundVolumeImg.setImageResource(R.drawable.tt_sound_volume_02);
} else if (voiceValue > 600.0 && voiceValue < 1200) {
soundVolumeImg.setImageResource(R.drawable.tt_sound_volume_03);
} else if (voiceValue > 1200.0 && voiceValue < 2400) {
soundVolumeImg.setImageResource(R.drawable.tt_sound_volume_04);
} else if (voiceValue > 2400.0 && voiceValue < 10000) {
soundVolumeImg.setImageResource(R.drawable.tt_sound_volume_05);
} else if (voiceValue > 10000.0 && voiceValue < 28000.0) {
soundVolumeImg.setImageResource(R.drawable.tt_sound_volume_06);
} else if (voiceValue > 28000.0) {
soundVolumeImg.setImageResource(R.drawable.tt_sound_volume_07);
}
}
/**
* @Description 图片上传失败时界面的相关显示
* @param obj
*/
private void onUploadImageFaild(Object obj) {
logger.d("chat#pic#onUploadImageFaild");
if (obj == null)
return;
MessageInfo messageInfo = (MessageInfo) obj;
adapter.updateMessageState(messageInfo, SysConstant.MESSAGE_STATE_FINISH_FAILED);
}
@Override
public void onConfigurationChanged(Configuration config) {
super.onConfigurationChanged(config);
}
/**
* @Description 处理拍照后的数据
* @param data
*/
private void handleTakePhotoData(Intent data) {
Bitmap bitmap = null;
if (data == null) {
bitmap = ImageTool.createImageThumbnail(takePhotoSavePath);
} else {
Bundle extras = data.getExtras();
bitmap = extras == null ? null : (Bitmap) extras.get("data");
}
if (bitmap == null) {
return;
}
// 将图片发送至服务器
MessageInfo msg = new MessageInfo();
msg.setMsgFromUserId(CacheHub.getInstance().getLoginUserId());
msg.setIsSend(true);
msg.setMsgCreateTime((int) (System.currentTimeMillis() / 1000));
msg.setSavePath(takePhotoSavePath);
msg.setDisplayType(SysConstant.DISPLAY_TYPE_IMAGE);
msg.setMsgType(SysConstant.MESSAGE_TYPE_TELETEXT);
msg.setMsgContent("");
msg.setTargetId(session.getSessionId());
msg.setMsgReadStatus(SysConstant.MESSAGE_ALREADY_READ);
msg.setMsgLoadState(SysConstant.MESSAGE_STATE_LOADDING);
// int messageSendRequestNo = CacheHub.getInstance().obtainMsgId();
// msg.msgId(messageSendRequestNo);
CacheHub.getInstance().pushMsg(msg);
addItem(msg);
List<MessageInfo> messageList = new ArrayList<MessageInfo>();
messageList.add(msg);
if (imService != null) {
imService.getMessageManager().sendImages(session.getSessionId(), session.getType(), messageList);
}
}
/**
* @Description 录音结束后处理录音数据
* @param audioLen
*/
private void onRecordVoiceEnd(float audioLen) {
logger.d("messageactivity#chat#audio#onRecordVoiceEnd audioLen:%f", audioLen);
// User chatUser = CacheHub.getInstance().getChatUser();
// if (chatUser == null) {
// Toast.makeText(MessageActivity.this,
// getResources().getString(R.string.link_is_connecting),
// Toast.LENGTH_LONG).show();
//
// return;
// }
// 语音时长
int tLen = (int) (audioLen + 0.5);
tLen = tLen < 1 ? 1 : tLen;
if (tLen < audioLen) {
++tLen;
}
// 绘制到界面(不关心语音内容)
MessageInfo msg = new MessageInfo();
msg.setDisplayType(SysConstant.DISPLAY_TYPE_AUDIO);
msg.setMsgFromUserId(CacheHub.getInstance().getLoginUserId());
msg.setIsSend(true);
msg.setTargetId(session.getSessionId());
msg.setMsgCreateTime((int) (System.currentTimeMillis() / 1000));
msg.setMsgLoadState(SysConstant.MESSAGE_STATE_LOADDING);
msg.setSavePath(audioSavePath);
msg.setMsgContent("");
msg.setMsgAttachContent("");
msg.setMsgReadStatus(SysConstant.MESSAGE_ALREADY_READ);
msg.setPlayTime(tLen);
MessageHelper.setMsgAudioContent(msg);
byte msgType = SysConstant.MESSAGE_TYPE_AUDIO;
msg.setMsgType(msgType);
// int messageSendRequestNo = CacheHub.getInstance().obtainMsgId();
// msg.setMsgId(messageSendRequestNo);
CacheHub.getInstance().pushMsg(msg);
addItem(msg);
imServiceHelper.getIMService().getMessageManager().sendVoice(msg.getTargetId(), msg.getAudioContent(), session.getType(), msg);
// 设置语音内容,发送
// if (StateManager.getInstance().isOnline()) {
// SendAudioMessageTask sendTask = new SendAudioMessageTask(
// MessageActivity.this, msg, audioSavePath, tLen);
// sendTask.setCallBack(new TaskCallback() {
// @Override
// public void callback(Object result) {
// if (result == null) {
// Toast.makeText(
// MessageActivity.this,
// getResources().getString(
// R.string.write_audio_file_failed),
// Toast.LENGTH_LONG).show();
// }
// }
// });
// TaskManager.getInstance().trigger(sendTask);
// } else {
// Toast.makeText(MessageActivity.this,
// getResources().getString(R.string.disconnected_by_server),
// Toast.LENGTH_LONG).show();
// }
}
@Override
protected void onDestroy() {
imServiceHelper.disconnect(this);
unregistEvents();
adapter.clearItem();
super.onDestroy();
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
}
@Override
public void onPullDownToRefresh(
final PullToRefreshBase<ListView> refreshView) {
// 获取消息
refreshView.postDelayed(new Runnable() {
@Override
public void run() {
// User chatUser = CacheHub.getInstance().getChatUser();
// if (chatUser == null
// || CacheHub.getInstance().getLoginUser() == null) {
// return;
// }
// MessageInfo msgInfo = null;
// for (int i = 0; i < adapter.getCount(); i++) {
// if (adapter.getItem(i) instanceof MessageInfo) {
// msgInfo = (MessageInfo) adapter.getItem(i);
// break;
// }
// }
// todo eric what is startMsgId is here?
// int startMsgId = (null == msgInfo) ? 0 : msgInfo.getMsgId();
// // 如果为空,则从最近一条消息拉取
List<MessageInfo> historyMsgInfo = loadHistory();
adapter.addItem(true, historyMsgInfo);
adapter.notifyDataSetChanged();
ListView mlist = lvPTR.getRefreshableView();
if (!(mlist).isStackFromBottom()) {
mlist.setStackFromBottom(true);
}
mlist.setStackFromBottom(false);
refreshView.onRefreshComplete();
}
}, 200);
}
@Override
public void onClick(View v) {
final int id = v.getId();
if (id == R.id.left_btn) {
MessageActivity.this.finish();
} else if (id == R.id.right_btn) {
showGroupManageActivity(true);
} else if (id == R.id.show_add_photo_btn) {
if (addOthersPanelView.getVisibility() == View.VISIBLE) {
addOthersPanelView.setVisibility(View.GONE);
} else if (addOthersPanelView.getVisibility() == View.GONE) {
addOthersPanelView.setVisibility(View.VISIBLE);
inputManager.hideSoftInputFromWindow(messageEdt.getWindowToken(), 0);
}
if (null != emoGridView
&& emoGridView.getVisibility() == View.VISIBLE) {
emoGridView.setVisibility(View.GONE);
}
scrollToBottomListItem();
} else if (id == R.id.take_photo_btn) {
if (albumList.size() < 1) {
Toast.makeText(MessageActivity.this, getResources().getString(R.string.not_found_album), Toast.LENGTH_LONG).show();
return;
}
Intent intent = new Intent(MessageActivity.this, PickPhotoActivity.class);
intent.putExtra(SysConstant.EXTRA_CHAT_USER_ID, session.getSessionId());
startActivityForResult(intent, SysConstant.ALBUM_BACK_DATA);
MessageActivity.this.overridePendingTransition(R.anim.tt_album_enter, R.anim.tt_stay);
addOthersPanelView.setVisibility(View.GONE);
scrollToBottomListItem();
} else if (id == R.id.take_camera_btn) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePhotoSavePath = CommonUtil.getImageSavePath(String.valueOf(System.currentTimeMillis())
+ ".jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(takePhotoSavePath)));
startActivityForResult(intent, SysConstant.CAMERA_WITH_DATA);
addOthersPanelView.setVisibility(View.GONE);
scrollToBottomListItem();
} else if (id == R.id.show_emo_btn) {
inputManager.hideSoftInputFromWindow(messageEdt.getWindowToken(), 0);
if (emoGridView.getVisibility() == View.GONE) {
emoGridView.setVisibility(View.VISIBLE);
} else if (emoGridView.getVisibility() == View.VISIBLE) {
emoGridView.setVisibility(View.GONE);
}
if (addOthersPanelView.getVisibility() == View.VISIBLE) {
addOthersPanelView.setVisibility(View.GONE);
}
scrollToBottomListItem();
} else if (id == R.id.send_message_btn) {
// todo eric
// if (!StateManager.getInstance().isOnline()) {
// Toast.makeText(
// MessageActivity.this,
// getResources().getString(
// R.string.disconnected_by_server),
// Toast.LENGTH_LONG).show();
//
// return;
// }
logger.d("messageactivity#send btn clicked");
String content = messageEdt.getText().toString();
logger.e("messageactivity#chat content:%s", content);
if (content.trim().equals("")) {
Toast.makeText(MessageActivity.this, getResources().getString(R.string.message_null), Toast.LENGTH_LONG).show();
return;
}
MessageInfo msg = MessageHelper.obtainTextMessage(session.getSessionId(), content);
if (msg != null) {
addItem(msg);
if (session != null) {
session.sendText(session.getType(), msg);
}
messageEdt.setText("");
// emoGridView.setVisibility(View.GONE);
}
scrollToBottomListItem();
} else if (id == R.id.voice_btn) {
inputManager.hideSoftInputFromWindow(messageEdt.getWindowToken(), 0);
messageEdt.setVisibility(View.GONE);
audioInputImg.setVisibility(View.GONE);
recordAudioBtn.setVisibility(View.VISIBLE);
keyboardInputImg.setVisibility(View.VISIBLE);
emoGridView.setVisibility(View.GONE);
addOthersPanelView.setVisibility(View.GONE);
addEmoBtn.setVisibility(View.GONE);
messageEdt.setText("");
} else if (id == R.id.show_keyboard_btn) {
recordAudioBtn.setVisibility(View.GONE);
keyboardInputImg.setVisibility(View.GONE);
messageEdt.setVisibility(View.VISIBLE);
audioInputImg.setVisibility(View.VISIBLE);
addEmoBtn.setVisibility(View.VISIBLE);
} else if (id == R.id.message_text) {
if (addOthersPanelView.getVisibility() == View.VISIBLE) {
addOthersPanelView.setVisibility(View.GONE);
}
emoGridView.setVisibility(View.GONE);
}
}
@Override
public boolean onTouch(View v, MotionEvent event) {
int id = v.getId();
scrollToBottomListItem();
if (id == R.id.record_voice_btn) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (AudioPlayerHandler.getInstance().isPlaying())
AudioPlayerHandler.getInstance().stopPlayer();
y1 = event.getY();
recordAudioBtn.setBackgroundResource(R.drawable.tt_pannel_btn_voiceforward_pressed);
recordAudioBtn.setText(MessageActivity.this.getResources().getString(R.string.release_to_send_voice));
soundVolumeImg.setImageResource(R.drawable.tt_sound_volume_01);
soundVolumeImg.setVisibility(View.VISIBLE);
soundVolumeLayout.setBackgroundResource(R.drawable.tt_sound_volume_default_bk);
soundVolumeDialog.show();
audioSavePath = CommonUtil.getAudioSavePath(CacheHub.getInstance().getLoginUserId());
audioRecorderInstance = new AudioRecordHandler(audioSavePath, new TaskCallback() {
@Override
public void callback(Object result) {
logger.d("messageactivity#audio#in callback");
if (audioReday) {
if (msgHandler != null) {
logger.d("messageactivity#audio#send record finish message");
Message msg = uiHandler.obtainMessage();
msg.what = HandlerConstant.HANDLER_RECORD_FINISHED;
msg.obj = audioRecorderInstance.getRecordTime();
uiHandler.sendMessage(msg);
}
}
}
});
audioRecorderThread = new Thread(audioRecorderInstance);
audioReday = false;
audioRecorderInstance.setRecording(true);
logger.d("messageactivity#audio#audio record thread starts");
audioRecorderThread.start();
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
y2 = event.getY();
if (y1 - y2 > 50) {
soundVolumeImg.setVisibility(View.GONE);
soundVolumeLayout.setBackgroundResource(R.drawable.tt_sound_volume_cancel_bk);
} else {
soundVolumeImg.setVisibility(View.VISIBLE);
soundVolumeLayout.setBackgroundResource(R.drawable.tt_sound_volume_default_bk);
}
} else if (event.getAction() == MotionEvent.ACTION_UP) {
// if (!StateManager.getInstance().isOnline()) {
// Toast.makeText(
// MessageActivity.this,
// getResources().getString(
// R.string.disconnected_by_server),
// Toast.LENGTH_LONG).show();
// if (soundVolumeDialog.isShowing()) {
// soundVolumeDialog.dismiss();
// }
// return false;
// }
if (audioRecorderInstance.isRecording()) {
audioRecorderInstance.setRecording(false);
}
if (soundVolumeDialog.isShowing()) {
soundVolumeDialog.dismiss();
}
recordAudioBtn.setBackgroundResource(R.drawable.tt_pannel_btn_voiceforward_normal);
recordAudioBtn.setText(MessageActivity.this.getResources().getString(R.string.tip_for_voice_forward));
if (y1 - y2 <= 50) {
if (audioRecorderInstance.getRecordTime() >= 0.5) {
if (audioRecorderInstance.getRecordTime() < SysConstant.MAX_SOUND_RECORD_TIME) {
audioReday = true;
}
} else {
soundVolumeImg.setVisibility(View.GONE);
soundVolumeLayout.setBackgroundResource(R.drawable.tt_sound_volume_short_tip_bk);
soundVolumeDialog.show();
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
if (soundVolumeDialog.isShowing())
soundVolumeDialog.dismiss();
this.cancel();
}
}, 700);
}
}
}
}
return false;
}
@Override
protected void onStop() {
if (null != adapter) {
adapter.hidePopup();
}
if (AudioPlayerHandler.getInstance().isPlaying())
AudioPlayerHandler.getInstance().stopPlayer();
super.onStop();
}
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
scrollToBottomListItem();
if (s.length() > 0) {
String strMsg = messageEdt.getText().toString();
CharSequence emoCharSeq = Emoparser.getInstance(MessageActivity.this).emoCharsequence(strMsg);
if (!textChanged) {
textChanged = true;
messageEdt.setText(emoCharSeq);
Editable edtable = messageEdt.getText();
int position = edtable.length();
Selection.setSelection(edtable, position);
} else {
textChanged = false;
}
sendBtn.setVisibility(View.VISIBLE);
RelativeLayout.LayoutParams param = (LayoutParams) messageEdt.getLayoutParams();
param.addRule(RelativeLayout.LEFT_OF, R.id.send_message_btn);
addPhotoBtn.setVisibility(View.GONE);
} else {
addPhotoBtn.setVisibility(View.VISIBLE);
RelativeLayout.LayoutParams param = (LayoutParams) messageEdt.getLayoutParams();
param.addRule(RelativeLayout.LEFT_OF, R.id.show_add_photo_btn);
sendBtn.setVisibility(View.GONE);
}
}
/**
* @Description 滑动到列表底部
*/
private void scrollToBottomListItem() {
// todo eric, why use the last one index + 2 can real scroll to the
// bottom?
ListView lv = lvPTR.getRefreshableView();
if (lv != null) {
lv.setSelection(adapter.getCount() + 1);
}
}
@Override
protected void onPause() {
super.onPause();
imServiceConnectionEnabled = false;
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
}
@Override
public void onSensorChanged(SensorEvent arg0) {
// if (!adapter.isAudioPlaying()) {
// return;
// }
// float range = arg0.values[0];
// if (range == sensor.getMaximumRange()) {
// if (audioPlayMode == AudioManager.MODE_NORMAL) {
// audioManager.setMode(AudioManager.MODE_NORMAL);
// if (preAudioPlayMode == AudioManager.MODE_IN_CALL) {
// SpeekerToast.show(MessageActivity.this,
// MessageActivity.this
// .getText(R.string.audio_in_speeker),
// Toast.LENGTH_SHORT);
// }
//
// preAudioPlayMode = AudioManager.MODE_NORMAL;
// }
// } else {
// audioManager.setMode(AudioManager.MODE_IN_CALL);
// SpeekerToast.show(MessageActivity.this,
// MessageActivity.this.getText(R.string.audio_in_call),
// Toast.LENGTH_SHORT);
//
// preAudioPlayMode = AudioManager.MODE_IN_CALL;
// }
}
/**
* @Description 设置听筒模式
* @param mode
*/
public static void setAudioMode(int mode) {
// if (mode != SysConstant.AUDIO_PLAY_MODE_NORMAL
// && mode != SysConstant.AUDIO_PLAY_MODE_IN_CALL) {
// return;
// }
audioPlayMode = SysConstant.AUDIO_PLAY_MODE_NORMAL;
audioManager.setMode(audioPlayMode);
}
public static int getAudioMode() {
return audioPlayMode;
}
/**
* @Description 检查是否被踢下线
* @return
*/
private boolean checkKickOff() {
return false;
// if (ReconnectManager.getInstance().isKickOff()) {
// MGDialog.DialogBuilder builder = new MGDialog.DialogBuilder(
// MessageActivity.this);
// builder.setTitleText(getString(R.string.kick_off))
// .setPositiveButtonText(getString(R.string.reconnect));
// MGDialog dialog = builder.build();
// dialog.setOnButtonClickListener(new OnButtonClickListener() {
//
// @Override
// public void onOKButtonClick(MGDialog dialog) {
// ReconnectManager.getInstance().setKickOff(false);
// dialog.dismiss();
// }
//
// @Override
// public void onCancelButtonClick(MGDialog dialog) {
//
// }
// });
// dialog.show();
// return true;
// } else {
// return false;
// }
}
public static Handler getUiHandler() {
return uiHandler;
}
public static Handler getMsgHandler() {
return msgHandler;
}
}