package com.suan.weclient.activity;
import android.annotation.SuppressLint;
import android.app.Service;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.internal.view.menu.ActionMenuView;
import com.suan.weclient.R;
import com.suan.weclient.adapter.ChatListAdapter;
import com.suan.weclient.util.GlobalContext;
import com.suan.weclient.util.Util;
import com.suan.weclient.util.data.holder.ChatHolder;
import com.suan.weclient.util.data.DataManager;
import com.suan.weclient.util.data.DataManager.ChatItemChangeListener;
import com.suan.weclient.util.data.bean.MessageBean;
import com.suan.weclient.util.net.WechatManager.OnActionFinishListener;
import com.suan.weclient.view.ptr.PTRListview;
public class ChatActivity extends SherlockActivity {
private ActionBar actionBar;
private ImageView backButton;
private TextView titleTextView;
private PTRListview ptrListview;
private ChatListAdapter chatListAdapter;
private EditText contentEditText;
private ImageButton expressionButton;
private Button sendButton;
private DataManager mDataManager;
private ChatHandler chatHandler;
private static final int INPUT_OK = 0;
private static final int INPUT_NONE = 1;
private static final int INPUT_TOO_LONG = 2;
private static final int MAX_INPUT_LENGTH = 600;
private boolean updateThreadRun = true;
private RefreshThread refreshThread;
private static final int HANDLER_MSG_REFRESH_LIST = 3;
private static final int HANDLER_MSG_LOAD_LIST = 4;
private static final int HANDLER_MSG_UPDATE_CHAT = 5;
private long lastSendTime = 0;
public void onCreate(Bundle arg0) {
super.onCreate(arg0);
setContentView(R.layout.chat_layout);
initWidgets();
initData();
//actionbar should be inited after data ,cause nickname appear on actionbar
initActionBar();
}
private void initActionBar() {
actionBar = getSupportActionBar();
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayUseLogoEnabled(false);
LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Service.LAYOUT_INFLATER_SERVICE);
View customActionBarView = layoutInflater.inflate(R.layout.custom_actionbar_back_with_title, null);
backButton = (ImageView) customActionBarView.findViewById(R.id.actionbar_back_with_title_img_back);
backButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ChatActivity.this.finish();
ChatActivity.this.overridePendingTransition(R.anim.activity_movein_from_left_anim,R.anim.activity_moveout_to_right_anim);
}
});
titleTextView = (TextView) customActionBarView.findViewById(R.id.actionbar_back_with_title_text_title);
String targetUserName = mDataManager.getChatHolder().getToNickname();
titleTextView.setText(Util.getShortString(targetUserName, 10, 3));
ActionBar.LayoutParams layoutParams = new ActionBar.LayoutParams(ActionMenuView.LayoutParams.MATCH_PARENT,
ActionMenuView.LayoutParams.MATCH_PARENT);
actionBar.setCustomView(customActionBarView, layoutParams);
}
private void initWidgets() {
ptrListview = (PTRListview) findViewById(R.id.chat_layout_list);
ptrListview.setLoadEnable(false);
ptrListview.setRefreshEnable(false);
contentEditText = (EditText) findViewById(R.id.chat_edit_edit);
expressionButton = (ImageButton) findViewById(R.id.chat_button_expression);
sendButton = (Button) findViewById(R.id.chat_button_send);
sendButton.setOnClickListener(new SendClickListener());
}
private void initData() {
GlobalContext globalContext = (GlobalContext) getApplicationContext();
mDataManager = globalContext.getDataManager();
initListener();
chatHandler = new ChatHandler();
mDataManager.doListLoadStart();
mDataManager.getWechatManager().getChatList(
mDataManager.getCurrentPosition(),
new OnActionFinishListener() {
@Override
public void onFinish(int code, Object object) {
// TODO Auto-generated method stub
Message message = new Message();
message.arg1 = HANDLER_MSG_REFRESH_LIST;
message.obj = object;
chatHandler.sendMessage(message);
mDataManager.doListLoadEnd();
}
});
chatListAdapter = new ChatListAdapter(this, mDataManager);
ptrListview.setAdapter(chatListAdapter);
ptrListview.setSelection(chatListAdapter.getCount() - 1);
}
public class ChatHandler extends Handler {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch (msg.arg1) {
case HANDLER_MSG_REFRESH_LIST:
chatListAdapter.notifyDataSetChanged();
//scroll to bottom
ptrListview.setSelection(chatListAdapter.getCount() - 1);
break;
case HANDLER_MSG_LOAD_LIST:
chatListAdapter.notifyDataSetChanged();
break;
case HANDLER_MSG_UPDATE_CHAT:
mDataManager.getWechatManager().getChatList(
mDataManager.getCurrentPosition(),
new OnActionFinishListener() {
@Override
public void onFinish(int code, Object object) {
// TODO Auto-generated method stub
Message message = new Message();
message.arg1 = HANDLER_MSG_LOAD_LIST;
message.obj = object;
chatHandler.sendMessage(message);
}
});
break;
}
}
}
private void initListener() {
mDataManager.addChatItemChangeListenr(new ChatItemChangeListener() {
@Override
public void onItemGet() {
// TODO Auto-generated method stub
}
});
mDataManager.setListLoadingListener(new DataManager.ListLoadingListener() {
@Override
public void onLoadStart() {
ptrListview.onRefreshStart();
}
@Override
public void onLoadFinish() {
ptrListview.onRefreshComplete();
}
});
}
public class SendClickListener implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
int checkResult = checkInput();
switch (checkResult) {
case INPUT_NONE:
Toast.makeText(ChatActivity.this, "请输入内容", Toast.LENGTH_SHORT).show();
break;
case INPUT_OK:
lastSendTime = System.currentTimeMillis();
insertMessage();
break;
case INPUT_TOO_LONG:
Toast.makeText(ChatActivity.this, "输入内容超过字数限制", Toast.LENGTH_SHORT).show();
break;
}
}
}
private int checkInput() {
int result = INPUT_OK;
String inputString = contentEditText.getText().toString();
if (inputString.length() == 0) {
return INPUT_NONE;
} else if (inputString.length() >= MAX_INPUT_LENGTH) {
return INPUT_TOO_LONG;
}
return result;
}
private void insertMessage() {
MessageBean sendMessage = createMessage();
sendMessage.setSendState(MessageBean.MESSAGE_SEND_PREPARE);
ChatHolder chatHolder = mDataManager.getChatHolder();
//add is to the bottom
chatHolder.getMessageList().add(sendMessage);
chatListAdapter.notifyDataSetChanged();
sendMessage.setSendState(MessageBean.MESSAGE_SEND_ING);
contentEditText.setText("");
String lastMsgId = getLastMsgId(chatHolder);
ptrListview.setSelection(chatListAdapter.getCount() - 1);
sendMessage.sendMessage(mDataManager, lastMsgId, mDataManager.getCurrentUser(),
chatHolder.getToFakeId(), ChatActivity.this);
}
private String getLastMsgId(ChatHolder chatHolder) {
for (int i = 0; i < chatHolder.getMessageList().size(); i++) {
MessageBean nowMessage = chatHolder.getMessageList().get(chatHolder.getMessageList().size() - 1 - i);
if (nowMessage.getId().length() > 1) {
return nowMessage.getId();
}
}
return "";
}
private MessageBean createMessage() {
MessageBean sendMessage = new MessageBean();
sendMessage.setType(MessageBean.MESSAGE_TYPE_TEXT);
sendMessage.setContent(contentEditText.getText().toString());
sendMessage.setFakeId(mDataManager.getCurrentUser().getFakeId());
sendMessage.setNickName(mDataManager.getCurrentUser().getNickname());
String nowTime = (System.currentTimeMillis() + "").substring(0, 10);
sendMessage.setDateTime(nowTime);
return sendMessage;
}
@Override
public void onResume() {
super.onResume();
updateThreadRun = true;
refreshThread = new RefreshThread();
refreshThread.start();
}
@Override
public void onPause() {
super.onPause();
updateThreadRun = false;
}
public class RefreshThread extends Thread {
public void run() {
Looper.prepare();
while (updateThreadRun) {
try {
sleep(4000);
} catch (Exception e) {
}
if (System.currentTimeMillis() - lastSendTime < 100) {
try {
sleep(1000);
} catch (Exception e) {
}
}
Message message = new Message();
message.arg1 = HANDLER_MSG_UPDATE_CHAT;
chatHandler.sendMessage(message);
}
}
}
@Override
public void finish(){
super.finish();
overridePendingTransition(R.anim.activity_movein_from_left_anim,R.anim.activity_moveout_to_right_anim);
}
}