package com.wyp.materialqqlite.ui;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import com.baoyz.widget.PullRefreshLayout;
import com.wyp.materialqqlite.AbsActivitySwipe;
import com.wyp.materialqqlite.AppData;
import com.wyp.materialqqlite.BubbleInfo;
import com.wyp.materialqqlite.BubbleManager;
import com.wyp.materialqqlite.FaceInfo;
import com.wyp.materialqqlite.FaceList;
import com.wyp.materialqqlite.FullScreenKeyboradBug;
import com.wyp.materialqqlite.HomeWatcher;
import com.wyp.materialqqlite.HomeWatcher.OnHomePressedListener;
import com.wyp.materialqqlite.R;
import com.wyp.materialqqlite.Utils;
import com.wyp.materialqqlite.qqclient.QQClient;
import com.wyp.materialqqlite.qqclient.QQUtils;
import com.wyp.materialqqlite.qqclient.msglog.BuddyMsgLog;
import com.wyp.materialqqlite.qqclient.msglog.GroupMsgLog;
import com.wyp.materialqqlite.qqclient.msglog.MessageLogger;
import com.wyp.materialqqlite.qqclient.msglog.SessMsgLog;
import com.wyp.materialqqlite.qqclient.protocol.protocoldata.BuddyInfo;
import com.wyp.materialqqlite.qqclient.protocol.protocoldata.BuddyList;
import com.wyp.materialqqlite.qqclient.protocol.protocoldata.BuddyMessage;
import com.wyp.materialqqlite.qqclient.protocol.protocoldata.Content;
import com.wyp.materialqqlite.qqclient.protocol.protocoldata.GroupList;
import com.wyp.materialqqlite.qqclient.protocol.protocoldata.GroupMessage;
import com.wyp.materialqqlite.qqclient.protocol.protocoldata.MessageList;
import com.wyp.materialqqlite.qqclient.protocol.protocoldata.QQCallBackMsg;
import com.wyp.materialqqlite.qqclient.protocol.protocoldata.SessMessage;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.support.v7.widget.Toolbar;
import android.text.SpannableString;
import android.text.style.ImageSpan;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.RelativeLayout.LayoutParams;
public class ChatActivity extends AbsActivitySwipe
implements OnClickListener, OnItemClickListener,
OnPageChangeListener, OnHomePressedListener {
public static final int IS_BUDDY = 0; // 好友聊天窗口
public static final int IS_GROUP = 1; // 群聊天窗口
public static final int IS_SESS = 2; // 临时会话聊天窗口
// private TextView m_txtName; // 好友名称或群名称标签
private String m_txtName;
private ListView m_lvMsg; // 聊天消息列表框
private PullRefreshLayout swipeRefreshLayout_chat;
private ImageButton m_btnFace; // “表情”按钮
// private ImageButton m_btnMore; // “更多”按钮
private EditText m_edtMsg; // 消息编辑框
private Button m_btnSend; // “发送”按钮
private View m_faceBar; // 表情栏
private ViewPager m_vpFace; // 表情页容器
private LinearLayout m_dotBar; // 圆点栏
private ChatMsgAdapter m_chatMsgAdapter; // 聊天消息适配器
private List<ChatMsg> m_lnkChatMsg; // 聊天消息链表
private List<View> m_arrFacePageView; // 表情页数组
private List<ImageView> m_arrDotView; // 圆点图片数组
private QQClient m_QQClient;
private MessageList m_msgList; // 消息列表
private MessageLogger m_msgLogger; // 消息记录
private FaceList m_faceList; // 表情列表
private BubbleManager m_bubbleMgr; // 气泡管理器
private HomeWatcher mHomeWatcher;
private int m_nMsgLogOffset = 0; // 读取消息记录的位移(从哪条消息记录开始读取)
private int m_nMsgLogRows = 15; // 一次读取消息记录的条数
private long m_lIntervalTime = 4*60; // 两条消息间隔时间(大于此间隔时间则显示一次时间)
private int m_nCurFacePage = 0; // 当前表情页
private int m_cxFace, m_cyFace;
private int m_nType = 0; // 聊天窗口类型
private int m_nUserUin = 0; // 用户Uin
private String m_strUserName = ""; // 用户名称
private int m_nGroupCode = 0; // 群代码
private int m_nGroupId = 0; // 群ID
private int m_nGroupNum = 0; // 群号码
private String m_strGroupName = "";// 群名称
private int m_nQQUin = 0; // 好友Uin
private int m_nQQNum = 0; // 好友号码
private String m_strBuddyName = ""; // 好友名称
private Toolbar toolbar;
private LinearLayout chat_inputbar;
private SharedPreferences sp;
private int color_theme;
private Handler m_Handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case QQCallBackMsg.UPDATE_BUDDY_NUMBER: // 更新好友号码
if (m_nType != IS_BUDDY || msg.arg1 != m_nQQUin)
return;
m_chatMsgAdapter.notifyDataSetChanged();
break;
case QQCallBackMsg.UPDATE_GMEMBER_NUMBER:// 更新群成员号码
if (m_nType == IS_GROUP && msg.arg1 == m_nGroupCode) {
m_chatMsgAdapter.notifyDataSetChanged();
} else if (m_nType == IS_SESS &&
msg.arg1 == m_nGroupCode && msg.arg2 == m_nQQUin) {
m_chatMsgAdapter.notifyDataSetChanged();
}
break;
case QQCallBackMsg.UPDATE_BUDDY_HEADPIC:// 更新好友头像
if (m_nType != IS_BUDDY || msg.arg1 != m_nQQUin)
return;
m_chatMsgAdapter.notifyDataSetChanged();
break;
case QQCallBackMsg.UPDATE_GMEMBER_HEADPIC:// 更新群成员头像
if (m_nType == IS_GROUP && msg.arg1 == m_nGroupCode) {
m_chatMsgAdapter.notifyDataSetChanged();
} else if (m_nType == IS_SESS &&
msg.arg1 == m_nGroupCode && msg.arg2 == m_nQQUin) {
m_chatMsgAdapter.notifyDataSetChanged();
}
break;
case QQCallBackMsg.BUDDY_MSG: { // 好友消息
if (m_nType != IS_BUDDY || msg.arg1 != m_nQQUin || null == msg.obj)
return;
BuddyMessage buddyMsg = (BuddyMessage)msg.obj;
m_msgList.emptyBuddyUnreadMsgCount(m_nQQUin);
BuddyList buddyList = m_QQClient.getBuddyList();
BuddyInfo buddyInfo = buddyList.getBuddy(m_nQQUin);
// 与最后一条消息的发送时间间隔m_lIntervalTime秒则显示一条时间
long lLastTime = getLastMsgLogTime();
long lTime = buddyMsg.m_nTime;
if (lTime - lLastTime > m_lIntervalTime) {
ChatMsg time = new ChatMsg();
time.m_nType = ChatMsg.TIME;
time.m_nTime = (int)lTime;
m_lnkChatMsg.add(time);
}
ChatMsg chatMsg = new ChatMsg();
chatMsg.m_nType = ChatMsg.LEFT_B;
chatMsg.m_nQQUin = m_nQQUin;
if (buddyInfo != null)
chatMsg.m_nBubble = buddyInfo.m_nQQNum % BubbleManager.MAX_COUNT;
if (chatMsg.m_nBubble != 0) {
BubbleInfo bubbleInfo = m_bubbleMgr.getBubbleInfo(ChatActivity.this, chatMsg.m_nBubble);
if (bubbleInfo != null) {
chatMsg.m_nColor = bubbleInfo.m_nColor;
chatMsg.m_nLinkColor = bubbleInfo.m_nLinkColor;
}
}
chatMsg.m_nMsgLogId = 0;
chatMsg.m_strName = m_strBuddyName;
chatMsg.m_arrContent = buddyMsg.m_arrContent;
chatMsg.m_nTime = buddyMsg.m_nTime;
m_lnkChatMsg.add(chatMsg);
m_chatMsgAdapter.notifyDataSetChanged();
break;
}
case QQCallBackMsg.GROUP_MSG: { // 群消息
if (m_nType != IS_GROUP || msg.arg1 != m_nGroupCode || null == msg.obj)
return;
GroupMessage groupMsg = (GroupMessage)msg.obj;
m_msgList.emptyGroupUnreadMsgCount(m_nGroupCode);
GroupList groupList = m_QQClient.getGroupList();
BuddyInfo buddyInfo = groupList.getGroupMemberByCode(m_nGroupCode, groupMsg.m_nSendUin);
// 与最后一条消息的发送时间间隔m_lIntervalTime秒则显示一条时间
long lLastTime = getLastMsgLogTime();
long lTime = groupMsg.m_nTime;
if (lTime - lLastTime > m_lIntervalTime) {
ChatMsg time = new ChatMsg();
time.m_nType = ChatMsg.TIME;
time.m_nTime = (int)lTime;
m_lnkChatMsg.add(time);
}
ChatMsg chatMsg = new ChatMsg();
chatMsg.m_nType = ChatMsg.LEFT_G;
chatMsg.m_nQQUin = groupMsg.m_nSendUin;
chatMsg.m_nMsgLogId = 0;
if (buddyInfo != null) {
chatMsg.m_nBubble = buddyInfo.m_nQQNum % BubbleManager.MAX_COUNT;
if (!Utils.isEmptyStr(buddyInfo.m_strGroupCard))
chatMsg.m_strName = buddyInfo.m_strGroupCard;
else
chatMsg.m_strName = buddyInfo.m_strNickName;
} else
chatMsg.m_strName = "";
if (chatMsg.m_nBubble != 0) {
BubbleInfo bubbleInfo = m_bubbleMgr.getBubbleInfo(ChatActivity.this, chatMsg.m_nBubble);
if (bubbleInfo != null) {
chatMsg.m_nColor = bubbleInfo.m_nColor;
chatMsg.m_nLinkColor = bubbleInfo.m_nLinkColor;
}
}
chatMsg.m_arrContent = groupMsg.m_arrContent;
chatMsg.m_nTime = groupMsg.m_nTime;
m_lnkChatMsg.add(chatMsg);
m_chatMsgAdapter.notifyDataSetChanged();
break;
}
case QQCallBackMsg.SESS_MSG: { // 群成员消息
if (m_nType != IS_SESS || msg.arg1 != m_nGroupCode ||
msg.arg2 != m_nQQUin || null == msg.obj)
return;
SessMessage sessMsg = (SessMessage)msg.obj;
m_msgList.emptySessUnreadMsgCount(m_nGroupCode, m_nQQUin);
GroupList groupList = m_QQClient.getGroupList();
BuddyInfo buddyInfo = groupList.getGroupMemberByCode(m_nGroupCode, m_nQQUin);
// 与最后一条消息的发送时间间隔m_lIntervalTime秒则显示一条时间
long lLastTime = getLastMsgLogTime();
long lTime = sessMsg.m_nTime;
if (lTime - lLastTime > m_lIntervalTime) {
ChatMsg time = new ChatMsg();
time.m_nType = ChatMsg.TIME;
time.m_nTime = (int)lTime;
m_lnkChatMsg.add(time);
}
ChatMsg chatMsg = new ChatMsg();
chatMsg.m_nType = ChatMsg.LEFT_B;
chatMsg.m_nQQUin = m_nQQUin;
if (buddyInfo != null)
chatMsg.m_nBubble = buddyInfo.m_nQQNum % BubbleManager.MAX_COUNT;
if (chatMsg.m_nBubble != 0) {
BubbleInfo bubbleInfo = m_bubbleMgr.getBubbleInfo(ChatActivity.this, chatMsg.m_nBubble);
if (bubbleInfo != null) {
chatMsg.m_nColor = bubbleInfo.m_nColor;
chatMsg.m_nLinkColor = bubbleInfo.m_nLinkColor;
}
}
chatMsg.m_nMsgLogId = 0;
chatMsg.m_strName = "";
chatMsg.m_arrContent = sessMsg.m_arrContent;
chatMsg.m_nTime = sessMsg.m_nTime;
m_lnkChatMsg.add(chatMsg);
m_chatMsgAdapter.notifyDataSetChanged();
break;
}
default:
break;
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
}
@Override
public void setUpViews() {
FullScreenKeyboradBug.assistActivity(this);
ViewCompat.setElevation(toolbar, getResources().getDimension(R.dimen.toolbar_elevation));
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
sp = getSharedPreferences("theme", MODE_PRIVATE);
color_theme = sp.getInt("color", -12627531);
initData(); // 初始化数据
initView(); // 初始化视图
}
@Override
protected void onResume() {
super.onResume();
m_QQClient.setCallBackHandler(m_Handler);
AppData.getAppData().cancelNotify(1);
mHomeWatcher = new HomeWatcher(this);
mHomeWatcher.setOnHomePressedListener(this);
mHomeWatcher.startWatch();
}
@Override
public void onStop() {
super.onStop();
m_QQClient.setNullCallBackHandler(m_Handler);
mHomeWatcher.setOnHomePressedListener(null);
mHomeWatcher.stopWatch();
}
@Override
public void onDestroy() {
super.onDestroy();
}
// 初始化数据
private void initData() {
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
if (bundle != null) {
m_nType = bundle.getInt("type");
m_nUserUin = bundle.getInt("useruin");
m_strUserName = bundle.getString("username");
m_nGroupCode = bundle.getInt("groupcode");
m_nGroupId = bundle.getInt("groupid");
m_nGroupNum = bundle.getInt("groupnum");
m_strGroupName = bundle.getString("groupname");
m_nQQUin = bundle.getInt("qquin");
m_nQQNum = bundle.getInt("qqnum");
m_strBuddyName = bundle.getString("buddyname");
}
m_bubbleMgr = AppData.getAppData().getBubbleMgr();
m_bubbleMgr.loadBubbleConfig(this);
m_QQClient = AppData.getAppData().getQQClient();
m_QQClient.setCallBackHandler(m_Handler);
m_msgList = m_QQClient.getMessageList();
m_msgLogger = m_QQClient.getMsgLogger();
if (!m_msgLogger.isOpen()) {
String strPath = m_QQClient.getMsgLogFullName(0);
m_msgLogger.open(strPath);
}
m_cxFace = (int)getResources().getDimension(R.dimen.cxFace);
m_cyFace = (int)getResources().getDimension(R.dimen.cyFace);
m_faceList = AppData.getAppData().getFaceList();
if (IS_BUDDY == m_nType) {
m_nMsgLogOffset = m_msgLogger.getBuddyMsgLogCount(m_nQQNum);
m_msgList.emptyBuddyUnreadMsgCount(m_nQQUin);
} else if (IS_GROUP == m_nType) {
m_nMsgLogOffset = m_msgLogger.getGroupMsgLogCount(m_nGroupNum);
m_msgList.emptyGroupUnreadMsgCount(m_nGroupCode);
} else if (IS_SESS == m_nType) {
m_nMsgLogOffset = m_msgLogger.getSessMsgLogCount(m_nQQNum);
m_msgList.emptySessUnreadMsgCount(m_nGroupCode, m_nQQUin);
}
}
// 初始化视图
@SuppressLint("NewApi")
private void initView() {
// m_txtName = (TextView)findViewById(R.id.chat_txtName);
m_lvMsg = (ListView)findViewById(R.id.chat_lvMsg);
swipeRefreshLayout_chat= (PullRefreshLayout) findViewById(R.id.swipeRefreshLayout_chat);
m_btnFace = (ImageButton)findViewById(R.id.chat_btnFace);
// m_btnMore = (ImageButton)findViewById(R.id.chat_btnMore);
m_edtMsg = (EditText) findViewById(R.id.chat_edtMsg);
m_btnSend = (Button) findViewById(R.id.chat_btnSend);
m_faceBar = findViewById(R.id.chat_facebar);
m_vpFace = (ViewPager)findViewById(R.id.chat_vpFace);
m_dotBar = (LinearLayout) findViewById(R.id.chat_dotbar);
m_btnFace.setOnClickListener(this);
m_edtMsg.setOnClickListener(this);
m_btnSend.setOnClickListener(this);
if (m_nType != IS_GROUP)
// m_txtName.setText(m_strBuddyName);
m_txtName=m_strBuddyName;
else
// m_txtName.setText(m_strGroupName);
m_txtName=m_strGroupName;
initChatMsgListView(); // 初始化聊天消息列表框
initFaceBar(); // 初始化表情栏
m_nCurFacePage = 0;
m_vpFace.setCurrentItem(1);
toolbar = (Toolbar) findViewById(R.id.toolbar_chat);
toolbar.setNavigationIcon(R.drawable.qqicon);
toolbar.setTitle(m_txtName);
setSupportActionBar(toolbar);
toolbar.setNavigationOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
chat_inputbar= (LinearLayout) findViewById(R.id.chat_inputbar);
toolbar.setBackgroundColor(color_theme);
chat_inputbar.setBackgroundColor(color_theme);
// 去除 ListView 上下边界蓝色或黄色阴影
// ListView actualListView = m_lvMsg.getRefreshableView();
// if (Integer.parseInt(Build.VERSION.SDK) >= 9) {
// actualListView.setOverScrollMode(View.OVER_SCROLL_NEVER);
// }
}
// 初始化聊天消息列表框
private void initChatMsgListView() {
m_lnkChatMsg = new LinkedList<ChatMsg>();
m_chatMsgAdapter = new ChatMsgAdapter(this, m_nGroupCode, m_lnkChatMsg);
m_lvMsg.setAdapter(m_chatMsgAdapter);
// m_lvMsg.getLoadingLayoutProxy().setPullLabel("");
// m_lvMsg.getLoadingLayoutProxy().setReleaseLabel("");
// m_lvMsg.getLoadingLayoutProxy().setRefreshingLabel("");
// m_lvMsg.getLoadingLayoutProxy().setLastUpdatedLabel("");
// m_lvMsg.getLoadingLayoutProxy().setQQMode(1);
// m_lvMsg.setOnRefreshListener(this);
swipeRefreshLayout_chat.setOnRefreshListener(new PullRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
new ReadMsgLogTask().execute();
swipeRefreshLayout_chat.postDelayed(new Runnable() {
@Override
public void run() {
swipeRefreshLayout_chat.setRefreshing(false);
//refresh();
m_chatMsgAdapter.notifyDataSetChanged();
}
}, 1000);
}
});
List<Object> arrMsgLog = readMsgLog();
updateChatMsgListView(arrMsgLog);
}
// 初始化表情选择栏
private void initFaceBar() {
m_arrFacePageView = new ArrayList<View>();
// 左侧添加空页
View nullView1 = new View(this);
nullView1.setBackgroundColor(Color.TRANSPARENT);
m_arrFacePageView.add(nullView1);
// 中间添加表情页
for (int i = 0; i < m_faceList.getPageCount(); i++) {
GridView view = new GridView(this);
List<FaceInfo> facePage = m_faceList.getFacePage(i);
FaceAdapter adapter = new FaceAdapter(this, facePage);
view.setAdapter(adapter);
view.setOnItemClickListener(this);
view.setNumColumns(7);
view.setBackgroundColor(Color.TRANSPARENT);
view.setHorizontalSpacing(1);
view.setVerticalSpacing(1);
view.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
view.setCacheColorHint(0);
view.setSelector(new ColorDrawable(Color.TRANSPARENT));
view.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
view.setGravity(Gravity.CENTER);
m_arrFacePageView.add(view);
}
// 右侧添加空页面
View nullView2 = new View(this);
nullView2.setBackgroundColor(Color.TRANSPARENT);
m_arrFacePageView.add(nullView2);
ViewPagerAdapter adapter = new ViewPagerAdapter(m_arrFacePageView);
m_vpFace.setAdapter(adapter);
m_vpFace.setOnPageChangeListener(this);
initDotBar(); // 初始化圆点栏
}
// 初始化圆点栏
private void initDotBar() {
m_arrDotView = new ArrayList<ImageView>();
if (m_arrFacePageView.size() <= 3)
return;
for (int i = 0; i < m_arrFacePageView.size()-2; i++) {
ImageView imgView = new ImageView(this);
imgView.setBackgroundResource(R.drawable.common_indicator_nor);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
params.leftMargin = (int)getResources().getDimension(R.dimen.dotLeftMargin);
params.rightMargin = (int)getResources().getDimension(R.dimen.dotRightMargin);
// params.width = 7;
// params.height = 7;
m_dotBar.addView(imgView, params);
m_arrDotView.add(imgView);
}
}
// 发送消息
private void send() {
if (m_edtMsg.getText().length() <= 0)
return;
String contString = m_edtMsg.getText().toString();
String strMsg = "";
int nStart = 0;
ImageSpan[] imgSpans = m_edtMsg.getText().getSpans(0, m_edtMsg.getText().length(), ImageSpan.class);
if (imgSpans.length > 0) {
for (ImageSpan span : imgSpans) {
int start = m_edtMsg.getText().getSpanStart(span);
int end = m_edtMsg.getText().getSpanEnd(span);
String str = contString.substring(nStart, start);
str = str.replace("/", "//");
strMsg += str;
str = contString.substring(start, end);
strMsg += str;
nStart = end;
}
if (nStart < contString.length()) {
String str = contString.substring(nStart, contString.length());
str = str.replace("/", "//");
strMsg += str;
}
} else {
strMsg = contString;
strMsg = strMsg.replace("/", "//");
}
strMsg += "/o[\"宋体,10,000000,0,0,0\"]";
if (strMsg.length() > 0) {
// 与最后一条消息的发送时间间隔m_lIntervalTime秒则显示一条时间
long lLastTime = getLastMsgLogTime();
long lTime = System.currentTimeMillis() / 1000;
if (lTime - lLastTime > m_lIntervalTime) {
ChatMsg time = new ChatMsg();
time.m_nType = ChatMsg.TIME;
time.m_nTime = (int)lTime;
m_lnkChatMsg.add(time);
}
List<Content> arrContent = new ArrayList<Content>();
QQUtils.createMsgContent(strMsg, arrContent);
ChatMsg chatMsg = new ChatMsg();
chatMsg.m_nType = ChatMsg.RIGHT;
chatMsg.m_nQQUin = m_nUserUin;
chatMsg.m_nBubble = AppData.getAppData().getBubbleMgr().getUserBubble();
if (chatMsg.m_nBubble != 0) {
BubbleInfo bubbleInfo = m_bubbleMgr.getBubbleInfo(ChatActivity.this, chatMsg.m_nBubble);
if (bubbleInfo != null) {
chatMsg.m_nColor = bubbleInfo.m_nColor;
chatMsg.m_nLinkColor = bubbleInfo.m_nLinkColor;
}
}
chatMsg.m_nMsgLogId = 0;
chatMsg.m_strName = m_strUserName;
chatMsg.m_arrContent = arrContent;
chatMsg.m_nTime = (int)lTime;
m_lnkChatMsg.add(chatMsg);
m_chatMsgAdapter.notifyDataSetChanged();
// ListView actualListView = m_lvMsg.getRefreshableView();
m_lvMsg.setSelection(m_lvMsg.getCount() - 1);
m_edtMsg.setText("");
if (IS_BUDDY == m_nType) {
m_QQClient.sendBuddyMsg(m_nQQUin, (int)lTime, strMsg);
} else if (IS_GROUP == m_nType) {
m_QQClient.sendGroupMsg(m_nGroupId, (int)lTime, strMsg);
} else {
m_QQClient.sendSessMsg(m_nGroupId, m_nQQUin, (int)lTime, strMsg);
}
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
int x = (int)event.getX();
int y = (int)event.getY();
if (Utils.ptInView(m_lvMsg, x, y)) {
if (m_faceBar.getVisibility() == View.VISIBLE) {
m_faceBar.setVisibility(View.GONE);
}
Utils.hideInputMethod(this, m_edtMsg);
} else if (Utils.ptInView(m_edtMsg, x, y)) {
if (m_faceBar.getVisibility() == View.VISIBLE) {
m_faceBar.setVisibility(View.GONE);
}
}
}
return super.dispatchTouchEvent(event);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK
&& m_faceBar.getVisibility() == View.VISIBLE) {
m_faceBar.setVisibility(View.GONE);
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.chat_btnSend: // “发送”按钮
send();
break;
case R.id.chat_btnFace: // “表情”按钮
Utils.hideInputMethod(this, m_edtMsg);
if (m_faceBar.getVisibility() == View.VISIBLE) {
m_faceBar.setVisibility(View.GONE);
} else {
m_faceBar.setVisibility(View.VISIBLE);
}
break;
}
}
@Override
public void onItemClick(AdapterView<?> parent,
View view, int position, long id) {
GridView gridView = (GridView)parent;
FaceInfo faceInfo = (FaceInfo)gridView.getItemAtPosition(position);
if (faceInfo.m_nResId == R.drawable.delete_button) { // “删除”按钮
final KeyEvent keyEventDown = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL);
m_edtMsg.onKeyDown(KeyEvent.KEYCODE_DEL, keyEventDown);
} else {
m_edtMsg.requestFocus();
int nIndex = m_edtMsg.getSelectionStart();
SpannableString spanStr = Utils.getSysFace(
this, faceInfo, m_cxFace, m_cyFace);
if (spanStr != null)
m_edtMsg.getText().insert(nIndex, spanStr);
}
}
@Override
public void onPageSelected(int arg0) {
m_nCurFacePage = arg0;
if (0 == arg0) {
m_vpFace.setCurrentItem(arg0 + 1);
} else if (arg0 == m_arrFacePageView.size() - 1){
m_vpFace.setCurrentItem(arg0 - 1);
} else {
setSelDot(m_nCurFacePage - 1);
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
private void setSelDot(int nSelIndex) {
for (int i = 0; i < m_arrDotView.size(); i++) {
if (nSelIndex == i) {
m_arrDotView.get(i).setBackgroundResource(R.drawable.common_indicator_checked);
} else {
m_arrDotView.get(i).setBackgroundResource(R.drawable.common_indicator_nor);
}
}
}
// @Override
// public void onRefresh(PullToRefreshBase<ListView> refreshView) {
// Do work to refresh the list here.
// new ReadMsgLogTask().execute();
// }
private long getFirstMsgLogTime() {
if (null == m_lnkChatMsg || m_lnkChatMsg.size() <= 0)
return 0;
ChatMsg chatMsg = m_lnkChatMsg.get(0);
if (null == chatMsg)
return 0;
return Utils.getUInt(chatMsg.m_nTime);
}
private long getLastMsgLogTime() {
if (null == m_lnkChatMsg || m_lnkChatMsg.size() <= 0)
return 0;
ChatMsg chatMsg = m_lnkChatMsg.get(m_lnkChatMsg.size()-1);
if (null == chatMsg)
return 0;
return Utils.getUInt(chatMsg.m_nTime);
}
private List<Object> readMsgLog() {
if (null == m_msgLogger || m_nMsgLogOffset <= 0)
return null;
if (m_nMsgLogOffset - m_nMsgLogRows > 0)
m_nMsgLogOffset -= m_nMsgLogRows;
else
m_nMsgLogOffset = 0;
List<Object> arrObj = new ArrayList<Object>();
if (IS_BUDDY == m_nType) {
List<BuddyMsgLog> arrMsgLog = new ArrayList<BuddyMsgLog>();
m_msgLogger.readBuddyMsgLog(m_nQQNum,
m_nMsgLogOffset, m_nMsgLogRows, arrMsgLog);
for (int i = 0; i < arrMsgLog.size(); i++) {
arrObj.add(arrMsgLog.get(i));
}
arrMsgLog.clear();
} else if (IS_GROUP == m_nType) {
ArrayList<GroupMsgLog> arrMsgLog = new ArrayList<GroupMsgLog>();
m_msgLogger.readGroupMsgLog(m_nGroupNum,
m_nMsgLogOffset, m_nMsgLogRows, arrMsgLog);
for (int i = 0; i < arrMsgLog.size(); i++) {
arrObj.add(arrMsgLog.get(i));
}
arrMsgLog.clear();
} else if (IS_SESS == m_nType) {
List<SessMsgLog> arrMsgLog = new ArrayList<SessMsgLog>();
m_msgLogger.readSessMsgLog(m_nQQNum,
m_nMsgLogOffset, m_nMsgLogRows, arrMsgLog);
for (int i = 0; i < arrMsgLog.size(); i++) {
arrObj.add(arrMsgLog.get(i));
}
arrMsgLog.clear();
}
return arrObj;
}
private void updateChatMsgListView(List<Object> arrMsgLog) {
if (null == arrMsgLog
|| arrMsgLog.size() <= 0
|| null == m_lnkChatMsg
|| null == m_chatMsgAdapter)
return;
int nSize = m_lnkChatMsg.size();
long lFirstTime = getFirstMsgLogTime();
// 先删除第一条消息上面的时间
if (m_lnkChatMsg.size() > 0)
m_lnkChatMsg.remove(0);
if (IS_BUDDY == m_nType) {
for (int i = arrMsgLog.size()-1; i >= 0; i--) {
BuddyMsgLog msgLog = (BuddyMsgLog)arrMsgLog.get(i);
// 两条消息相隔4分钟则加入一条时间显示
if (lFirstTime != 0 &&
lFirstTime - msgLog.m_nTime > m_lIntervalTime) {
ChatMsg time = new ChatMsg();
time.m_nType = ChatMsg.TIME;
time.m_nTime = (int)lFirstTime;
m_lnkChatMsg.add(0, time);
}
lFirstTime = msgLog.m_nTime;
List<Content> arrContent = new ArrayList<Content>();
QQUtils.createMsgContent(msgLog.m_strContent, arrContent);
ChatMsg chatMsg = new ChatMsg();
if (!msgLog.m_bSendFlag) { // 好友发的消息
chatMsg.m_nType = ChatMsg.LEFT_B;
chatMsg.m_nQQUin = m_nQQUin;
chatMsg.m_nBubble = msgLog.m_nQQNum % BubbleManager.MAX_COUNT;
}
else { // 用户自己发的消息
chatMsg.m_nType = ChatMsg.RIGHT;
chatMsg.m_nQQUin = m_nUserUin;
chatMsg.m_nBubble = AppData.getAppData().getBubbleMgr().getUserBubble();
}
if (chatMsg.m_nBubble != 0) {
BubbleInfo bubbleInfo = m_bubbleMgr.getBubbleInfo(ChatActivity.this, chatMsg.m_nBubble);
if (bubbleInfo != null) {
chatMsg.m_nColor = bubbleInfo.m_nColor;
chatMsg.m_nLinkColor = bubbleInfo.m_nLinkColor;
}
}
chatMsg.m_nMsgLogId = msgLog.m_nID;
chatMsg.m_strName = msgLog.m_strNickName;
chatMsg.m_arrContent = arrContent;
chatMsg.m_nTime = msgLog.m_nTime;
m_lnkChatMsg.add(0, chatMsg);
}
arrMsgLog.clear();
} else if (IS_GROUP == m_nType) {
for (int i = arrMsgLog.size()-1; i >= 0; i--) {
GroupMsgLog msgLog = (GroupMsgLog)arrMsgLog.get(i);
// 两条消息相隔4分钟则加入一条时间显示
if (lFirstTime != 0 &&
lFirstTime - msgLog.m_nTime > m_lIntervalTime) {
ChatMsg time = new ChatMsg();
time.m_nType = ChatMsg.TIME;
time.m_nTime = (int)lFirstTime;
m_lnkChatMsg.add(0, time);
}
lFirstTime = msgLog.m_nTime;
List<Content> arrContent = new ArrayList<Content>();
QQUtils.createMsgContent(msgLog.m_strContent, arrContent);
ChatMsg chatMsg = new ChatMsg();
if (m_nUserUin != msgLog.m_nQQNum) { // 群成员发的消息
chatMsg.m_nType = ChatMsg.LEFT_G;
GroupList groupList = m_QQClient.getGroupList();
BuddyInfo buddyInfo = groupList.getGroupMemberByNum(m_nGroupCode, msgLog.m_nQQNum);
if (buddyInfo != null)
chatMsg.m_nQQUin = buddyInfo.m_nQQUin;
chatMsg.m_nBubble = msgLog.m_nQQNum % BubbleManager.MAX_COUNT;
}
else { // 用户自己发的消息
chatMsg.m_nType = ChatMsg.RIGHT;
chatMsg.m_nQQUin = m_nUserUin;
chatMsg.m_nBubble = AppData.getAppData().getBubbleMgr().getUserBubble();
}
if (chatMsg.m_nBubble != 0) {
BubbleInfo bubbleInfo = m_bubbleMgr.getBubbleInfo(ChatActivity.this, chatMsg.m_nBubble);
if (bubbleInfo != null) {
chatMsg.m_nColor = bubbleInfo.m_nColor;
chatMsg.m_nLinkColor = bubbleInfo.m_nLinkColor;
}
}
chatMsg.m_nMsgLogId = msgLog.m_nID;
chatMsg.m_strName = msgLog.m_strNickName;
chatMsg.m_arrContent = arrContent;
chatMsg.m_nTime = msgLog.m_nTime;
m_lnkChatMsg.add(0, chatMsg);
}
arrMsgLog.clear();
} else if (IS_SESS == m_nType) {
for (int i = arrMsgLog.size()-1; i >= 0; i--) {
SessMsgLog msgLog = (SessMsgLog)arrMsgLog.get(i);
// 两条消息相隔4分钟则加入一条时间显示
if (lFirstTime != 0 &&
lFirstTime - msgLog.m_nTime > m_lIntervalTime) {
ChatMsg time = new ChatMsg();
time.m_nType = ChatMsg.TIME;
time.m_nTime = (int)lFirstTime;
m_lnkChatMsg.add(0, time);
}
lFirstTime = msgLog.m_nTime;
List<Content> arrContent = new ArrayList<Content>();
QQUtils.createMsgContent(msgLog.m_strContent, arrContent);
ChatMsg chatMsg = new ChatMsg();
if (!msgLog.m_bSendFlag) { // 好友发的消息
chatMsg.m_nType = ChatMsg.LEFT_B;
chatMsg.m_nQQUin = m_nQQUin;
chatMsg.m_nBubble = msgLog.m_nQQNum % BubbleManager.MAX_COUNT;
}
else { // 用户自己发的消息
chatMsg.m_nType = ChatMsg.RIGHT;
chatMsg.m_nQQUin = m_nUserUin;
chatMsg.m_nBubble = AppData.getAppData().getBubbleMgr().getUserBubble();
}
if (chatMsg.m_nBubble != 0) {
BubbleInfo bubbleInfo = m_bubbleMgr.getBubbleInfo(ChatActivity.this, chatMsg.m_nBubble);
if (bubbleInfo != null) {
chatMsg.m_nColor = bubbleInfo.m_nColor;
chatMsg.m_nLinkColor = bubbleInfo.m_nLinkColor;
}
}
chatMsg.m_nMsgLogId = msgLog.m_nID;
chatMsg.m_strName = msgLog.m_strNickName;
chatMsg.m_arrContent = arrContent;
chatMsg.m_nTime = msgLog.m_nTime;
m_lnkChatMsg.add(0, chatMsg);
}
arrMsgLog.clear();
} else {
return;
}
// 第一条消息的上面总是显示时间
ChatMsg time = new ChatMsg();
time.m_nType = ChatMsg.TIME;
time.m_nTime = (int)lFirstTime;
m_lnkChatMsg.add(0, time);
if (nSize <= 0) {
m_chatMsgAdapter.notifyDataSetChanged();
// ListView actualListView = m_lvMsg.getRefreshableView();
m_lvMsg.setSelection(m_lvMsg.getCount() - 1);
} else {
// ListView actualListView = m_lvMsg.getRefreshableView();
int nHeaderCnt = m_lvMsg.getHeaderViewsCount();
int nPos =m_lvMsg.getFirstVisiblePosition()+nHeaderCnt+1;
View view =m_lvMsg.getChildAt(nPos);
int nTop = (null == view) ? 0 : view.getTop();
nPos += (m_lnkChatMsg.size() - nSize);
m_chatMsgAdapter.notifyDataSetChanged();
m_lvMsg.setSelectionFromTop(nPos, nTop);
}
}
private class ReadMsgLogTask extends AsyncTask<Void, Void, Integer> {
private List<Object> m_arrMsgLog;
@Override
protected Integer doInBackground(Void... params) {
long nStartTime = System.currentTimeMillis();
m_arrMsgLog = readMsgLog();
long nEndTime = System.currentTimeMillis();
if (nEndTime - nStartTime < 1000*1) { // 读取时间少于1秒则再延时1秒
try {
Thread.sleep(1000*1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return 0;
}
@Override
protected void onPostExecute(Integer result) {
super.onPostExecute(result);
// m_lvMsg.onRefreshComplete();
swipeRefreshLayout_chat.setRefreshing(false);
updateChatMsgListView(m_arrMsgLog);
}
}
@Override
public void onHomePressed() {
String strTicker = getString(R.string.bgrun);
String strTitle = getString(R.string.app_name);
String strText = getString(R.string.nonewmsg);
AppData.getAppData().showNotify(1, this,
strTicker, strTitle, strText);
}
@Override
public void onHomeLongPressed() {
// do nothing
}
@TargetApi(19)
private void setTranslucentStatus(boolean on) {
Window win = getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
if (on) {
winParams.flags |= bits;
} else {
winParams.flags &= ~bits;
}
win.setAttributes(winParams);
}
}