package com.juns.wechat;
import java.util.Timer;
import java.util.TimerTask;
import java.util.UUID;
import org.apache.http.message.BasicNameValuePair;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.easemob.EMConnectionListener;
import com.easemob.EMError;
import com.easemob.chat.CmdMessageBody;
import com.easemob.chat.EMChat;
import com.easemob.chat.EMChatManager;
import com.easemob.chat.EMConversation;
import com.easemob.chat.EMGroupManager;
import com.easemob.chat.EMMessage;
import com.easemob.chat.EMMessage.ChatType;
import com.easemob.chat.EMMessage.Type;
import com.easemob.chat.EMNotifier;
import com.easemob.chat.GroupChangeListener;
import com.easemob.chat.TextMessageBody;
import com.easemob.util.EMLog;
import com.easemob.util.NetUtils;
import com.juns.wechat.bean.InviteMessage;
import com.juns.wechat.bean.InviteMessage.InviteMesageStatus;
import com.juns.wechat.bean.User;
import com.juns.wechat.chat.ChatActivity;
import com.juns.wechat.common.Utils;
import com.juns.wechat.dialog.WarnTipDialog;
import com.juns.wechat.dialog.TitleMenu.ActionItem;
import com.juns.wechat.dialog.TitleMenu.TitlePopup;
import com.juns.wechat.dialog.TitleMenu.TitlePopup.OnItemOnClickListener;
import com.juns.wechat.view.UpdateService;
import com.juns.wechat.view.activity.AddGroupChatActivity;
import com.juns.wechat.view.activity.GetMoneyActivity;
import com.juns.wechat.view.activity.PublicActivity;
import com.juns.wechat.view.fragment.Fragment_Dicover;
import com.juns.wechat.view.fragment.Fragment_Friends;
import com.juns.wechat.view.fragment.Fragment_Msg;
import com.juns.wechat.view.fragment.Fragment_Profile;
import com.juns.wechat.zxing.CaptureActivity;
public class MainActivity extends FragmentActivity implements OnClickListener {
private TextView txt_title;
private ImageView img_right;
private WarnTipDialog Tipdialog;
private NewMessageBroadcastReceiver msgReceiver;
protected static final String TAG = "MainActivity";
private TitlePopup titlePopup;
private TextView unreaMsgdLabel;// 未读消息textview
private TextView unreadAddressLable;// 未读通讯录textview
private TextView unreadFindLable;// 发现
private Fragment[] fragments;
public Fragment_Msg homefragment;
private Fragment_Friends contactlistfragment;
private Fragment_Dicover findfragment;
private Fragment_Profile profilefragment;
private ImageView[] imagebuttons;
private TextView[] textviews;
private String connectMsg = "";;
private int index;
private int currentTabIndex;// 当前fragment的index
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
App.getInstance2().addActivity(this);
findViewById();
initViews();
initTabView();
// initVersion();
setOnListener();
initPopWindow();
initReceiver();
}
private void initTabView() {
unreaMsgdLabel = (TextView) findViewById(R.id.unread_msg_number);
unreadAddressLable = (TextView) findViewById(R.id.unread_address_number);
unreadFindLable = (TextView) findViewById(R.id.unread_find_number);
homefragment = new Fragment_Msg();
contactlistfragment = new Fragment_Friends();
findfragment = new Fragment_Dicover();
profilefragment = new Fragment_Profile();
fragments = new Fragment[] { homefragment, contactlistfragment,
findfragment, profilefragment };
imagebuttons = new ImageView[4];
imagebuttons[0] = (ImageView) findViewById(R.id.ib_weixin);
imagebuttons[1] = (ImageView) findViewById(R.id.ib_contact_list);
imagebuttons[2] = (ImageView) findViewById(R.id.ib_find);
imagebuttons[3] = (ImageView) findViewById(R.id.ib_profile);
imagebuttons[0].setSelected(true);
textviews = new TextView[4];
textviews[0] = (TextView) findViewById(R.id.tv_weixin);
textviews[1] = (TextView) findViewById(R.id.tv_contact_list);
textviews[2] = (TextView) findViewById(R.id.tv_find);
textviews[3] = (TextView) findViewById(R.id.tv_profile);
textviews[0].setTextColor(0xFF45C01A);
// 添加显示第一个fragment
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, homefragment)
.add(R.id.fragment_container, contactlistfragment)
.add(R.id.fragment_container, profilefragment)
.add(R.id.fragment_container, findfragment)
.hide(contactlistfragment).hide(profilefragment)
.hide(findfragment).show(homefragment).commit();
updateUnreadLabel();
}
public void onTabClicked(View view) {
img_right.setVisibility(View.GONE);
switch (view.getId()) {
case R.id.re_weixin:
img_right.setVisibility(View.VISIBLE);
index = 0;
if (homefragment != null) {
homefragment.refresh();
}
txt_title.setText(R.string.app_name);
img_right.setImageResource(R.drawable.icon_add);
break;
case R.id.re_contact_list:
index = 1;
txt_title.setText(R.string.contacts);
img_right.setVisibility(View.VISIBLE);
img_right.setImageResource(R.drawable.icon_titleaddfriend);
break;
case R.id.re_find:
index = 2;
txt_title.setText(R.string.discover);
break;
case R.id.re_profile:
index = 3;
txt_title.setText(R.string.me);
break;
}
if (currentTabIndex != index) {
FragmentTransaction trx = getSupportFragmentManager()
.beginTransaction();
trx.hide(fragments[currentTabIndex]);
if (!fragments[index].isAdded()) {
trx.add(R.id.fragment_container, fragments[index]);
}
trx.show(fragments[index]).commit();
}
imagebuttons[currentTabIndex].setSelected(false);
// 把当前tab设为选中状态
imagebuttons[index].setSelected(true);
textviews[currentTabIndex].setTextColor(0xFF999999);
textviews[index].setTextColor(0xFF45C01A);
currentTabIndex = index;
}
private void initPopWindow() {
// 实例化标题栏弹窗
titlePopup = new TitlePopup(this, LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
titlePopup.setItemOnClickListener(onitemClick);
// 给标题栏弹窗添加子类
titlePopup.addAction(new ActionItem(this, R.string.menu_groupchat,
R.drawable.icon_menu_group));
titlePopup.addAction(new ActionItem(this, R.string.menu_addfriend,
R.drawable.icon_menu_addfriend));
titlePopup.addAction(new ActionItem(this, R.string.menu_qrcode,
R.drawable.icon_menu_sao));
titlePopup.addAction(new ActionItem(this, R.string.menu_money,
R.drawable.abv));
}
private OnItemOnClickListener onitemClick = new OnItemOnClickListener() {
@Override
public void onItemClick(ActionItem item, int position) {
// mLoadingDialog.show();
switch (position) {
case 0:// 发起群聊
Utils.start_Activity(MainActivity.this,
AddGroupChatActivity.class);
break;
case 1:// 添加朋友
Utils.start_Activity(MainActivity.this, PublicActivity.class,
new BasicNameValuePair(Constants.NAME, "添加朋友"));
break;
case 2:// 扫一扫
Utils.start_Activity(MainActivity.this, CaptureActivity.class);
break;
case 3:// 收钱
Utils.start_Activity(MainActivity.this, GetMoneyActivity.class);
break;
default:
break;
}
}
};
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
private void findViewById() {
txt_title = (TextView) findViewById(R.id.txt_title);
img_right = (ImageView) findViewById(R.id.img_right);
}
private void initViews() {
// 设置消息页面为初始页面
img_right.setVisibility(View.VISIBLE);
img_right.setImageResource(R.drawable.icon_add);
}
private void setOnListener() {
img_right.setOnClickListener(this);
}
private int keyBackClickCount = 0;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
switch (keyBackClickCount++) {
case 0:
Toast.makeText(this, "再次按返回键退出", Toast.LENGTH_SHORT).show();
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
keyBackClickCount = 0;
}
}, 3000);
break;
case 1:
EMChatManager.getInstance().logout();// 退出环信聊天
App.getInstance2().exit();
finish();
overridePendingTransition(R.anim.push_up_in, R.anim.push_up_out);
break;
}
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.img_right:
if (index == 0) {
titlePopup.show(findViewById(R.id.layout_bar));
} else {
Utils.start_Activity(MainActivity.this, PublicActivity.class,
new BasicNameValuePair(Constants.NAME, "添加朋友"));
}
break;
default:
break;
}
}
private void initVersion() {
// TODO 检查版本更新
String versionInfo = Utils.getValue(this, Constants.VersionInfo);
if (!TextUtils.isEmpty(versionInfo)) {
Tipdialog = new WarnTipDialog(this,
"发现新版本: 1、更新啊阿三达到阿德阿 2、斯顿阿斯顿撒旦?");
Tipdialog.setBtnOkLinstener(onclick);
Tipdialog.show();
}
}
private DialogInterface.OnClickListener onclick = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Utils.showLongToast(MainActivity.this, "正在下载...");// TODO
Tipdialog.dismiss();
}
};
private void initReceiver() {
Intent intent = new Intent(this, UpdateService.class);
startService(intent);
registerReceiver(new MyBroadcastReceiver(), new IntentFilter(
"com.juns.wechat.Brodcast"));
// 注册一个接收消息的BroadcastReceiver
msgReceiver = new NewMessageBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter(EMChatManager
.getInstance().getNewMessageBroadcastAction());
intentFilter.setPriority(3);
registerReceiver(msgReceiver, intentFilter);
// 注册一个ack回执消息的BroadcastReceiver
IntentFilter ackMessageIntentFilter = new IntentFilter(EMChatManager
.getInstance().getAckMessageBroadcastAction());
ackMessageIntentFilter.setPriority(3);
registerReceiver(ackMessageReceiver, ackMessageIntentFilter);
// 注册一个透传消息的BroadcastReceiver
IntentFilter cmdMessageIntentFilter = new IntentFilter(EMChatManager
.getInstance().getCmdMessageBroadcastAction());
cmdMessageIntentFilter.setPriority(3);
registerReceiver(cmdMessageReceiver, cmdMessageIntentFilter);
// setContactListener监听联系人的变化等
// EMContactManager.getInstance().setContactListener(
// new MyContactListener());
// 注册一个监听连接状态的listener
// EMChatManager.getInstance().addConnectionListener(
// new MyConnectionListener());
// // 注册群聊相关的listener
EMGroupManager.getInstance().addGroupChangeListener(
new MyGroupChangeListener());
// 通知sdk,UI 已经初始化完毕,注册了相应的receiver和listener, 可以接受broadcast了
EMChat.getInstance().setAppInited();
}
// 自己联系人 群组数据返回监听
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Bundle bundle = intent.getExtras();
homefragment.refresh();
contactlistfragment.refresh();
}
}
/**
* 连接监听listener
*
*/
private class MyConnectionListener implements EMConnectionListener {
@Override
public void onConnected() {
runOnUiThread(new Runnable() {
@Override
public void run() {
connectMsg = getString(R.string.app_name);
txt_title.setText(connectMsg);
homefragment.errorItem.setVisibility(View.GONE);
}
});
}
@Override
public void onDisconnected(final int error) {
connectMsg = "微信(未连接)";
txt_title.setText(connectMsg);
final String st1 = getResources().getString(
R.string.Less_than_chat_server_connection);
final String st2 = getResources().getString(
R.string.the_current_network);
runOnUiThread(new Runnable() {
@Override
public void run() {
if (error == EMError.USER_REMOVED) {
// 显示帐号已经被移除
// showAccountRemovedDialog();
} else if (error == EMError.CONNECTION_CONFLICT) {
// 显示帐号在其他设备登陆dialog
// showConflictDialog();
} else {
homefragment.errorItem.setVisibility(View.VISIBLE);
if (NetUtils.hasNetwork(MainActivity.this))
homefragment.errorText.setText(st1);
else
homefragment.errorText.setText(st2);
}
}
});
}
}
/**
* 新消息广播接收者
*
*
*/
private class NewMessageBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 主页面收到消息后,主要为了提示未读,实际消息内容需要到chat页面查看
String from = intent.getStringExtra("from");
// 消息id
String msgId = intent.getStringExtra("msgid");
EMMessage message = EMChatManager.getInstance().getMessage(msgId);
if (ChatActivity.activityInstance != null) {
if (message.getChatType() == ChatType.GroupChat) {
if (message.getTo().equals(
ChatActivity.activityInstance.getToChatUsername()))
return;
} else {
if (from.equals(ChatActivity.activityInstance
.getToChatUsername()))
return;
}
}
// 注销广播接收者,否则在ChatActivity中会收到这个广播
abortBroadcast();
// 刷新bottom bar消息未读数
updateUnreadLabel();
if (currentTabIndex == 0) {
// 当前页面如果为聊天历史页面,刷新此页面
if (homefragment != null) {
homefragment.refresh();
}
}
}
}
/**
* 消息回执BroadcastReceiver
*/
private BroadcastReceiver ackMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
abortBroadcast();
// 刷新bottom bar消息未读数
updateUnreadLabel();
String msgid = intent.getStringExtra("msgid");
String from = intent.getStringExtra("from");
EMConversation conversation = EMChatManager.getInstance()
.getConversation(from);
if (conversation != null) {
// 把message设为已读
EMMessage msg = conversation.getMessage(msgid);
if (msg != null) {
if (ChatActivity.activityInstance != null) {
if (msg.getChatType() == ChatType.Chat) {
if (from.equals(ChatActivity.activityInstance
.getToChatUsername()))
return;
}
}
msg.isAcked = true;
}
}
}
};
/**
* MyGroupChangeListener
*/
private class MyGroupChangeListener implements GroupChangeListener {
@Override
public void onInvitationReceived(String groupId, String groupName,
String inviter, String reason) {
// 被邀请
String st3 = getResources().getString(
R.string.Invite_you_to_join_a_group_chat);
User user = GloableParams.Users.get(inviter);
if (user != null) {
EMMessage msg = EMMessage.createReceiveMessage(Type.TXT);
msg.setChatType(ChatType.GroupChat);
msg.setFrom(inviter);
msg.setTo(groupId);
msg.setMsgId(UUID.randomUUID().toString());
msg.addBody(new TextMessageBody(user.getUserName() + st3));
msg.setAttribute("useravatar", user.getHeadUrl());
msg.setAttribute("usernick", user.getUserName());
// 保存邀请消息
EMChatManager.getInstance().saveMessage(msg);
// 提醒新消息
EMNotifier.getInstance(getApplicationContext())
.notifyOnNewMsg();
}
runOnUiThread(new Runnable() {
public void run() {
updateUnreadLabel();
// 刷新ui
if (currentTabIndex == 0)
homefragment.refresh();
}
});
}
@Override
public void onInvitationAccpted(String groupId, String inviter,
String reason) {
}
@Override
public void onInvitationDeclined(String groupId, String invitee,
String reason) {
}
@Override
public void onUserRemoved(String groupId, String groupName) {
// 提示用户被T了 刷新ui
runOnUiThread(new Runnable() {
public void run() {
try {
updateUnreadLabel();
if (currentTabIndex == 0)
homefragment.refresh();
} catch (Exception e) {
EMLog.e(TAG, "refresh exception " + e.getMessage());
}
}
});
}
@Override
public void onGroupDestroy(String groupId, String groupName) {
// 群被解散 提示用户群被解散, 刷新ui
runOnUiThread(new Runnable() {
public void run() {
updateUnreadLabel();
if (currentTabIndex == 0)
homefragment.refresh();
}
});
}
@Override
public void onApplicationReceived(String groupId, String groupName,
String applyer, String reason) {
// 用户申请加入群聊
InviteMessage msg = new InviteMessage();
msg.setFrom(applyer);
msg.setTime(System.currentTimeMillis());
msg.setGroupId(groupId);
msg.setGroupName(groupName);
msg.setReason(reason);
Log.d(TAG, applyer + " 申请加入群聊:" + groupName);
msg.setStatus(InviteMesageStatus.BEAPPLYED);
// 提示有新消息
EMNotifier.getInstance(getApplicationContext()).notifyOnNewMsg();
}
@Override
public void onApplicationAccept(String groupId, String groupName,
String accepter) {
String st4 = getResources().getString(
R.string.Agreed_to_your_group_chat_application);
// 加群申请被同意
EMMessage msg = EMMessage.createReceiveMessage(Type.TXT);
msg.setChatType(ChatType.GroupChat);
msg.setFrom(accepter);
msg.setTo(groupId);
msg.setMsgId(UUID.randomUUID().toString());
msg.addBody(new TextMessageBody(accepter + st4));
// 保存同意消息
EMChatManager.getInstance().saveMessage(msg);
// 提醒新消息
EMNotifier.getInstance(getApplicationContext()).notifyOnNewMsg();
runOnUiThread(new Runnable() {
public void run() {
updateUnreadLabel();
// 刷新ui
if (currentTabIndex == 0)
homefragment.refresh();
// if (CommonUtils.getTopActivity(MainActivity.this).equals(
// GroupsActivity.class.getName())) {
// GroupsActivity.instance.onResume();
// }
}
});
}
@Override
public void onApplicationDeclined(String groupId, String groupName,
String decliner, String reason) {
// 加群申请被拒绝,demo未实现
}
};
/**
* 透传消息BroadcastReceiver
*/
private BroadcastReceiver cmdMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
abortBroadcast();
// 刷新bottom bar消息未读数
updateUnreadLabel();
EMLog.d(TAG, "收到透传消息");
// 获取cmd message对象
String msgId = intent.getStringExtra("msgid");
EMMessage message = intent.getParcelableExtra("message");
// 获取消息body
CmdMessageBody cmdMsgBody = (CmdMessageBody) message.getBody();
String action = cmdMsgBody.action;// 获取自定义action
// 获取扩展属性 此处省略
// message.getStringAttribute("");
EMLog.d(TAG,
String.format("透传消息:action:%s,message:%s", action,
message.toString()));
String st9 = getResources().getString(
R.string.receive_the_passthrough);
Toast.makeText(MainActivity.this, st9 + action, Toast.LENGTH_SHORT)
.show();
}
};
/**
* 获取未读消息数
*/
public void updateUnreadLabel() {
int count = 0;
count = EMChatManager.getInstance().getUnreadMsgsCount();
if (count > 0) {
unreaMsgdLabel.setText(String.valueOf(count));
unreaMsgdLabel.setVisibility(View.VISIBLE);
} else {
unreaMsgdLabel.setVisibility(View.INVISIBLE);
}
}
}