/**
* Copyright (C) 2016 Hyphenate Inc. All rights reserved.
* <p/>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.fanxin.huangfangyi.main.fragment;
import java.util.List;
import com.easemob.redpacketui.RedPacketConstant;
import com.easemob.redpacketui.utils.RedPacketUtil;
import com.fanxin.huangfangyi.Constant;
import com.fanxin.huangfangyi.DemoHelper;
import com.fanxin.huangfangyi.db.UserDao;
import com.fanxin.huangfangyi.main.activity.AddFriendsNextActivity;
import com.fanxin.huangfangyi.main.activity.AddFriendsPreActivity;
import com.fanxin.huangfangyi.main.activity.FeedBackActivity;
import com.fanxin.huangfangyi.main.activity.GroupAddMembersActivity;
import com.fanxin.huangfangyi.main.activity.LoginActivity;
import com.fanxin.huangfangyi.main.activity.ScanCaptureActivity;
import com.fanxin.huangfangyi.main.widget.FXPopWindow;
import com.fanxin.huangfangyi.runtimepermissions.PermissionsResultAction;
import com.fanxin.huangfangyi.ui.BaseActivity;
import com.fanxin.huangfangyi.main.activity.ChatActivity;
import com.fanxin.huangfangyi.ui.GroupsActivity;
import com.fanxin.easeui.utils.EaseCommonUtils;
import com.hyphenate.EMCallBack;
import com.hyphenate.EMContactListener;
import com.hyphenate.EMMessageListener;
import com.hyphenate.chat.EMClient;
import com.hyphenate.chat.EMCmdMessageBody;
import com.hyphenate.chat.EMConversation;
import com.hyphenate.chat.EMConversation.EMConversationType;
import com.hyphenate.chat.EMMessage;
import com.fanxin.huangfangyi.R;
import com.fanxin.huangfangyi.db.InviteMessgeDao;
import com.fanxin.huangfangyi.runtimepermissions.PermissionsManager;
import com.hyphenate.util.EMLog;
import com.umeng.analytics.MobclickAgent;
import com.umeng.update.UmengUpdateAgent;
import android.annotation.TargetApi;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.PowerManager;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.LocalBroadcastManager;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends BaseActivity {
protected static final String TAG = "MainActivity";
// textview for unread message count
private TextView unreadLabel;
// textview for unread event message
private TextView unreadAddressLable;
private Button[] mTabs;
private ContactListFragment contactListFragment;
private FragmentFind fragmentFind;
private FragmentProfile fragmentProfile;
private ConversationListFragment conversationListFragment;
private Fragment[] fragments;
private int index;
private int currentTabIndex;
// user logged into another device
public boolean isConflict = false;
// user account was removed
private boolean isCurrentAccountRemoved = false;
private static final String TAG_COVERSATION = "TAG_COVERSATION";
private static final String TAG_CONTACTS = "TAG_CONTACTS";
private static final String TAG_FIND = "TAG_FIND";
private static final String TAG_PROFILE = "TAG_PROFILE";
/**
* check if current user account was remove
*/
public boolean getCurrentAccountRemoved() {
return isCurrentAccountRemoved;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
String packageName = getPackageName();
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
if (!pm.isIgnoringBatteryOptimizations(packageName)) {
Intent intent = new Intent();
intent.setAction(android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
startActivity(intent);
}
}
//make sure activity will not in background if user is logged into another device or removed
if (savedInstanceState != null && savedInstanceState.getBoolean(Constant.ACCOUNT_REMOVED, false)) {
DemoHelper.getInstance().logout(false, null);
finish();
startActivity(new Intent(this, LoginActivity.class));
return;
} else if (savedInstanceState != null && savedInstanceState.getBoolean("isConflict", false)) {
finish();
startActivity(new Intent(this, LoginActivity.class));
return;
}
setContentView(R.layout.fx_activity_main);
// runtime permission for android 6.0, just require all permissions here for simple
requestPermissions();
initView();
//umeng api
MobclickAgent.updateOnlineConfig(this);
UmengUpdateAgent.setUpdateOnlyWifi(false);
UmengUpdateAgent.update(this);
if (getIntent().getBooleanExtra(Constant.ACCOUNT_CONFLICT, false) && !isConflictDialogShow) {
showConflictDialog();
} else if (getIntent().getBooleanExtra(Constant.ACCOUNT_REMOVED, false) && !isAccountRemovedDialogShow) {
showAccountRemovedDialog();
}
inviteMessgeDao = new InviteMessgeDao(this);
userDao = new UserDao(this);
// conversationListFragment=(ConversationListFragment)getSupportFragmentManager().findFragmentByTag(TAG_COVERSATION);
// contactListFragment=(ContactListFragment)getSupportFragmentManager().findFragmentByTag(TAG_CONTACTS);
// fragmentFind=(FragmentFind)getSupportFragmentManager().findFragmentByTag(TAG_FIND);
// fragmentProfile=(FragmentProfile)getSupportFragmentManager().findFragmentByTag(TAG_PROFILE);
// FragmentTransaction manager = getSupportFragmentManager().beginTransaction();
// if(conversationListFragment==null){
// conversationListFragment = new ConversationListFragment();
// manager.add(R.id.fragment_container, conversationListFragment, TAG_COVERSATION);
// }
// if(contactListFragment==null){
// contactListFragment = new ContactListFragment();
// manager.add(R.id.fragment_container, contactListFragment, TAG_CONTACTS);
// }
// if(fragmentFind==null){
// fragmentFind = new FragmentFind();
// manager.add(R.id.fragment_container, fragmentFind, TAG_FIND).hide(fragmentFind);
// }
// if(fragmentProfile==null){
// fragmentProfile = new FragmentProfile();
// manager.add(R.id.fragment_container, fragmentProfile, TAG_PROFILE).hide(fragmentProfile);
// }
// manager.show(conversationListFragment).hide(contactListFragment).hide(fragmentFind).hide(fragmentProfile).commit();
conversationListFragment=new ConversationListFragment();
contactListFragment = new ContactListFragment();
fragmentFind = new FragmentFind();
fragmentProfile = new FragmentProfile();
getSupportFragmentManager().beginTransaction().add(R.id.fragment_container,conversationListFragment).add(R.id.fragment_container,contactListFragment).hide(contactListFragment).show(conversationListFragment).commit();
fragments = new Fragment[]{conversationListFragment, contactListFragment, fragmentFind, fragmentProfile};
//register broadcast receiver to receive the change of group from DemoHelper
registerBroadcastReceiver();
EMClient.getInstance().contactManager().setContactListener(new MyContactListener());
//debug purpose only
registerInternalDebugReceiver();
}
@TargetApi(23)
private void requestPermissions() {
PermissionsManager.getInstance().requestAllManifestPermissionsIfNecessary(this, new PermissionsResultAction() {
@Override
public void onGranted() {
// Toast.makeText(MainActivity.this, "All permissions have been granted", Toast.LENGTH_SHORT).show();
}
@Override
public void onDenied(String permission) {
//Toast.makeText(MainActivity.this, "Permission " + permission + " has been denied", Toast.LENGTH_SHORT).show();
}
});
}
/**
* init views
*/
private void initView() {
unreadLabel = (TextView) findViewById(R.id.unread_msg_number);
unreadAddressLable = (TextView) findViewById(R.id.unread_address_number);
mTabs = new Button[4];
mTabs[0] = (Button) findViewById(R.id.btn_conversation);
mTabs[1] = (Button) findViewById(R.id.btn_address_list);
mTabs[2] = (Button) findViewById(R.id.btn_find);
mTabs[3] = (Button) findViewById(R.id.btn_profile);
// select first tab
mTabs[0].setSelected(true);
final ImageView ivAdd= (ImageView) findViewById(R.id.iv_add);
final ImageView iv_search= (ImageView) findViewById(R.id.iv_search);
//搜索按钮跳转添加好友下一步的操作
iv_search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, AddFriendsNextActivity.class));
}
});
final FXPopWindow fxPopWindow=new FXPopWindow(this,R.layout.fx_popupwindow_add,new FXPopWindow.OnItemClickListener(){
@Override
public void onClick(int position) {
switch (position){
//发起群聊
case 0:
startActivity(new Intent(MainActivity.this,GroupAddMembersActivity.class));
break;
//添加新的好友
case 1:
startActivity(new Intent(MainActivity.this,AddFriendsPreActivity.class));
break;
//扫一扫
case 2:
startActivity(new Intent(MainActivity.this, ScanCaptureActivity.class));
break;
//帮助及反馈
case 3:
startActivity(new Intent(MainActivity.this, FeedBackActivity.class));
break;
}
}
});
ivAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fxPopWindow.showPopupWindow(ivAdd);
}
});
}
/**
* on tab clicked
*
* @param view
*/
public void onTabClicked(View view) {
switch (view.getId()) {
case R.id.btn_conversation:
index = 0;
break;
case R.id.btn_address_list:
index = 1;
break;
case R.id.btn_find:
index = 2;
break;
case R.id.btn_profile:
index = 3;
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();
}
mTabs[currentTabIndex].setSelected(false);
// set current tab selected
mTabs[index].setSelected(true);
currentTabIndex = index;
}
EMMessageListener messageListener = new EMMessageListener() {
@Override
public void onMessageReceived(List<EMMessage> messages) {
// notify new message
for (EMMessage message : messages) {
if(message.getChatType()!= EMMessage.ChatType.ChatRoom){
DemoHelper.getInstance().getNotifier().onNewMsg(message);
}
}
refreshUIWithMessage();
}
@Override
public void onCmdMessageReceived(List<EMMessage> messages) {
//red packet code : 处理红包回执透传消息
for (EMMessage message : messages) {
EMCmdMessageBody cmdMsgBody = (EMCmdMessageBody) message.getBody();
final String action = cmdMsgBody.action();//获取自定义action
if (action.equals(RedPacketConstant.REFRESH_GROUP_RED_PACKET_ACTION)) {
RedPacketUtil.receiveRedPacketAckMessage(message);
}
}
//end of red packet code
refreshUIWithMessage();
}
@Override
public void onMessageReadAckReceived(List<EMMessage> messages) {
}
@Override
public void onMessageDeliveryAckReceived(List<EMMessage> message) {
}
@Override
public void onMessageChanged(EMMessage message, Object change) {
}
};
private void refreshUIWithMessage() {
runOnUiThread(new Runnable() {
public void run() {
// refresh unread count
updateUnreadLabel();
if (currentTabIndex == 0) {
// refresh conversation list
if (conversationListFragment != null) {
conversationListFragment.refresh();
}
}
}
});
}
@Override
public void back(View view) {
super.back(view);
}
private void registerBroadcastReceiver() {
broadcastManager = LocalBroadcastManager.getInstance(this);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Constant.ACTION_CONTACT_CHANAGED);
intentFilter.addAction(Constant.ACTION_GROUP_CHANAGED);
intentFilter.addAction(RedPacketConstant.REFRESH_GROUP_RED_PACKET_ACTION);
broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
updateUnreadLabel();
updateUnreadAddressLable();
if (currentTabIndex == 0) {
// refresh conversation list
if (conversationListFragment != null) {
conversationListFragment.refresh();
}
} else if (currentTabIndex == 1) {
if (contactListFragment != null) {
contactListFragment.refresh();
}
}
String action = intent.getAction();
if (action.equals(Constant.ACTION_GROUP_CHANAGED)) {
if (EaseCommonUtils.getTopActivity(MainActivity.this).equals(GroupsActivity.class.getName())) {
GroupsActivity.instance.onResume();
}
}
if (action.equals(RedPacketConstant.REFRESH_GROUP_RED_PACKET_ACTION)) {
if (conversationListFragment != null) {
conversationListFragment.refresh();
}
}
}
};
broadcastManager.registerReceiver(broadcastReceiver, intentFilter);
}
public class MyContactListener implements EMContactListener {
@Override
public void onContactAdded(String username) {
}
@Override
public void onContactDeleted(final String username) {
runOnUiThread(new Runnable() {
public void run() {
if (ChatActivity.activityInstance != null && ChatActivity.activityInstance.toChatUsername != null &&
username.equals(ChatActivity.activityInstance.toChatUsername)) {
String st10 = getResources().getString(R.string.have_you_removed);
Toast.makeText(MainActivity.this, ChatActivity.activityInstance.getToChatUsername() + st10, Toast.LENGTH_LONG)
.show();
ChatActivity.activityInstance.finish();
}
}
});
}
@Override
public void onContactInvited(String username, String reason) {
}
@Override
public void onContactAgreed(String username) {
}
@Override
public void onContactRefused(String username) {
}
}
private void unregisterBroadcastReceiver() {
broadcastManager.unregisterReceiver(broadcastReceiver);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (conflictBuilder != null) {
conflictBuilder.create().dismiss();
conflictBuilder = null;
}
unregisterBroadcastReceiver();
try {
unregisterReceiver(internalDebugReceiver);
} catch (Exception e) {
}
}
/**
* update unread message count
*/
public void updateUnreadLabel() {
int count = getUnreadMsgCountTotal();
if (count > 0) {
unreadLabel.setText(String.valueOf(count));
unreadLabel.setVisibility(View.VISIBLE);
} else {
unreadLabel.setVisibility(View.INVISIBLE);
}
}
/**
* update the total unread count
*/
public void updateUnreadAddressLable() {
runOnUiThread(new Runnable() {
public void run() {
int count = getUnreadAddressCountTotal();
if (count > 0) {
unreadAddressLable.setVisibility(View.VISIBLE);
} else {
unreadAddressLable.setVisibility(View.INVISIBLE);
}
}
});
}
/**
* get unread event notification count, including application, accepted, etc
*
* @return
*/
public int getUnreadAddressCountTotal() {
int unreadAddressCountTotal = 0;
unreadAddressCountTotal = inviteMessgeDao.getUnreadMessagesCount();
return unreadAddressCountTotal;
}
/**
* get unread message count
*
* @return
*/
public int getUnreadMsgCountTotal() {
int unreadMsgCountTotal = 0;
int chatroomUnreadMsgCount = 0;
unreadMsgCountTotal = EMClient.getInstance().chatManager().getUnreadMsgsCount();
for (EMConversation conversation : EMClient.getInstance().chatManager().getAllConversations().values()) {
if (conversation.getType() == EMConversationType.ChatRoom)
chatroomUnreadMsgCount = chatroomUnreadMsgCount + conversation.getUnreadMsgCount();
}
return unreadMsgCountTotal - chatroomUnreadMsgCount;
}
private InviteMessgeDao inviteMessgeDao;
private UserDao userDao;
@Override
protected void onResume() {
super.onResume();
if (!isConflict && !isCurrentAccountRemoved) {
updateUnreadLabel();
updateUnreadAddressLable();
}
// unregister this event listener when this activity enters the
// background
DemoHelper sdkHelper = DemoHelper.getInstance();
sdkHelper.pushActivity(this);
EMClient.getInstance().chatManager().addMessageListener(messageListener);
}
@Override
protected void onStop() {
EMClient.getInstance().chatManager().removeMessageListener(messageListener);
DemoHelper sdkHelper = DemoHelper.getInstance();
sdkHelper.popActivity(this);
super.onStop();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putBoolean("isConflict", isConflict);
outState.putBoolean(Constant.ACCOUNT_REMOVED, isCurrentAccountRemoved);
super.onSaveInstanceState(outState);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(false);
return true;
}
return super.onKeyDown(keyCode, event);
}
private android.app.AlertDialog.Builder conflictBuilder;
private android.app.AlertDialog.Builder accountRemovedBuilder;
private boolean isConflictDialogShow;
private boolean isAccountRemovedDialogShow;
private BroadcastReceiver internalDebugReceiver;
private BroadcastReceiver broadcastReceiver;
private LocalBroadcastManager broadcastManager;
/**
* show the dialog when user logged into another device
*/
private void showConflictDialog() {
isConflictDialogShow = true;
DemoHelper.getInstance().logout(false, null);
String st = getResources().getString(R.string.Logoff_notification);
if (!MainActivity.this.isFinishing()) {
// clear up global variables
try {
if (conflictBuilder == null)
conflictBuilder = new android.app.AlertDialog.Builder(MainActivity.this);
conflictBuilder.setTitle(st);
conflictBuilder.setMessage(R.string.connect_conflict);
conflictBuilder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
conflictBuilder = null;
finish();
Intent intent = new Intent(MainActivity.this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
});
conflictBuilder.setCancelable(false);
conflictBuilder.create().show();
isConflict = true;
} catch (Exception e) {
EMLog.e(TAG, "---------color conflictBuilder error" + e.getMessage());
}
}
}
/**
* show the dialog if user account is removed
*/
private void showAccountRemovedDialog() {
isAccountRemovedDialogShow = true;
DemoHelper.getInstance().logout(false, null);
String st5 = getResources().getString(R.string.Remove_the_notification);
if (!MainActivity.this.isFinishing()) {
// clear up global variables
try {
if (accountRemovedBuilder == null)
accountRemovedBuilder = new android.app.AlertDialog.Builder(MainActivity.this);
accountRemovedBuilder.setTitle(st5);
accountRemovedBuilder.setMessage(R.string.em_user_remove);
accountRemovedBuilder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
accountRemovedBuilder = null;
finish();
startActivity(new Intent(MainActivity.this, LoginActivity.class));
}
});
accountRemovedBuilder.setCancelable(false);
accountRemovedBuilder.create().show();
isCurrentAccountRemoved = true;
} catch (Exception e) {
EMLog.e(TAG, "---------color userRemovedBuilder error" + e.getMessage());
}
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent.getBooleanExtra(Constant.ACCOUNT_CONFLICT, false) && !isConflictDialogShow) {
showConflictDialog();
} else if (intent.getBooleanExtra(Constant.ACCOUNT_REMOVED, false) && !isAccountRemovedDialogShow) {
showAccountRemovedDialog();
}
}
/**
* debug purpose only, you can ignore this
*/
private void registerInternalDebugReceiver() {
internalDebugReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
DemoHelper.getInstance().logout(false, new EMCallBack() {
@Override
public void onSuccess() {
runOnUiThread(new Runnable() {
public void run() {
finish();
startActivity(new Intent(MainActivity.this, LoginActivity.class));
}
});
}
@Override
public void onProgress(int progress, String status) {
}
@Override
public void onError(int code, String message) {
}
});
}
};
IntentFilter filter = new IntentFilter(getPackageName() + ".em_internal_debug");
registerReceiver(internalDebugReceiver, filter);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
PermissionsManager.getInstance().notifyPermissionsChange(permissions, grantResults);
}
}