package com.fanxin.app.fx; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.annotation.SuppressLint; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.easemob.chat.EMChatManager; import com.easemob.chat.EMGroup; import com.easemob.chat.EMGroupManager; import com.fanxin.app.Constant; import com.fanxin.app.MYApplication; import com.fanxin.app.R; import com.fanxin.app.activity.FXAlertDialog; import com.fanxin.app.activity.BaseActivity; import com.fanxin.app.domain.User; import com.fanxin.app.fx.others.LoadDataFromServer; import com.fanxin.app.fx.others.LoadUserAvatar; import com.fanxin.app.fx.others.LocalUserInfo; import com.fanxin.app.fx.others.TopUser; import com.fanxin.app.fx.others.TopUserDao; import com.fanxin.app.fx.others.LoadDataFromServer.DataCallBack; import com.fanxin.app.fx.others.LoadUserAvatar.ImageDownloadedCallBack; import com.fanxin.app.widget.ExpandGridView; import com.easemob.exceptions.EaseMobException; import com.easemob.util.NetUtils; @SuppressLint({ "SimpleDateFormat", "SdCardPath", "ClickableViewAccessibility", "InflateParams" }) public class ChatRoomSettingActivity extends BaseActivity implements OnClickListener { private TextView tv_groupname; // 成员总数 private TextView tv_m_total; // 成员总数 int m_total = 0; // 成员列表 private ExpandGridView gridview; // 修改群名称、置顶、、、、 private RelativeLayout re_change_groupname; private RelativeLayout rl_switch_chattotop; private RelativeLayout rl_switch_block_groupmsg; private RelativeLayout re_clear; // 状态变化 private ImageView iv_switch_chattotop; private ImageView iv_switch_unchattotop; private ImageView iv_switch_block_groupmsg; private ImageView iv_switch_unblock_groupmsg; // 删除并退出 private Button exitBtn; private String hxid; // 群名称 private String group_name; // 是否是管理员 boolean is_admin = false; List<User> members = new ArrayList<User>(); String longClickUsername = null; private String groupId; private EMGroup group; private GridAdapter adapter; public static ChatRoomSettingActivity instance; private ProgressDialog progressDialog; private JSONObject jsonObject; private JSONArray jsonarray; // 置顶列表 private Map<String, TopUser> topMap = new HashMap<String, TopUser>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.social_groupchatsetting_activity); instance = this; hxid = LocalUserInfo.getInstance(ChatRoomSettingActivity.this) .getUserInfo("hxid"); topMap = MYApplication.getInstance().getTopUserList(); initView(); initData(); updateGroup(); } private void initView() { progressDialog = new ProgressDialog(ChatRoomSettingActivity.this); tv_groupname = (TextView) findViewById(R.id.tv_groupname); tv_m_total = (TextView) findViewById(R.id.tv_m_total); gridview = (ExpandGridView) findViewById(R.id.gridview); re_change_groupname = (RelativeLayout) findViewById(R.id.re_change_groupname); rl_switch_chattotop = (RelativeLayout) findViewById(R.id.rl_switch_chattotop); rl_switch_block_groupmsg = (RelativeLayout) findViewById(R.id.rl_switch_block_groupmsg); re_clear = (RelativeLayout) findViewById(R.id.re_clear); iv_switch_chattotop = (ImageView) findViewById(R.id.iv_switch_chattotop); iv_switch_unchattotop = (ImageView) findViewById(R.id.iv_switch_unchattotop); iv_switch_block_groupmsg = (ImageView) findViewById(R.id.iv_switch_block_groupmsg); iv_switch_unblock_groupmsg = (ImageView) findViewById(R.id.iv_switch_unblock_groupmsg); exitBtn = (Button) findViewById(R.id.btn_exit_grp); } private void initData() { // 获取传过来的groupid groupId = getIntent().getStringExtra("groupId"); // 获取本地该群数据 group = EMGroupManager.getInstance().getGroup(groupId); if (group == null) { try { // 去网络中查找该群 group = EMGroupManager.getInstance() .getGroupFromServer(groupId); if (group == null) { Toast.makeText(ChatRoomSettingActivity.this, "该群已经被解散...", Toast.LENGTH_SHORT).show(); setResult(100); finish(); return; } } catch (EaseMobException e) { e.printStackTrace(); return; } } // 获取封装的群名(里面封装了显示的群名和群组成员的信息) String group_name_temp = group.getGroupName(); // 转化成json,然后解析 jsonObject = JSONObject.parseObject(group_name_temp); // 获取显示的群名 group_name = jsonObject.getString("groupname"); // 获取群成员信息 jsonarray = jsonObject.getJSONArray("jsonArray"); tv_groupname.setText(group_name); m_total = jsonarray.size(); tv_m_total.setText("(" + String.valueOf(m_total) + ")"); // 解析群组成员信息 for (int i = 0; i < m_total; i++) { JSONObject json = jsonarray.getJSONObject(i); User user = new User(); user.setUsername(json.getString("hxid")); user.setAvatar(json.getString("avatar")); user.setNick(json.getString("nick")); members.add(user); } // 显示群组成员头像和昵称 showMembers(members); // 判断是否是群主,是群主有删成员的权限,并显示减号按钮 if (hxid.equals(group.getOwner())) { is_admin = true; } re_change_groupname.setOnClickListener(this); rl_switch_chattotop.setOnClickListener(this); rl_switch_block_groupmsg.setOnClickListener(this); re_clear.setOnClickListener(this); exitBtn.setOnClickListener(this); } // 显示群成员头像昵称的gridview @SuppressLint("ClickableViewAccessibility") private void showMembers(List<User> members) { adapter = new GridAdapter(this, members); gridview.setAdapter(adapter); // 设置OnTouchListener,为了让群主方便地推出删除模》 gridview.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (adapter.isInDeleteMode) { adapter.isInDeleteMode = false; adapter.notifyDataSetChanged(); return true; } break; default: break; } return false; } }); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.rl_switch_block_groupmsg: // 屏蔽群组 if (iv_switch_block_groupmsg.getVisibility() == View.VISIBLE) { System.out.println("change to unblock group msg"); try { EMGroupManager.getInstance().unblockGroupMessage(groupId); iv_switch_block_groupmsg.setVisibility(View.INVISIBLE); iv_switch_unblock_groupmsg.setVisibility(View.VISIBLE); } catch (Exception e) { e.printStackTrace(); // todo: 显示错误给用户 } } else { System.out.println("change to block group msg"); try { EMGroupManager.getInstance().blockGroupMessage(groupId); iv_switch_block_groupmsg.setVisibility(View.VISIBLE); iv_switch_unblock_groupmsg.setVisibility(View.INVISIBLE); } catch (Exception e) { e.printStackTrace(); // todo: 显示错误给用户 } } break; case R.id.re_clear: // 清空聊天记录 progressDialog.setMessage("正在清空群消息..."); progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); progressDialog.show(); // 按照你们要求必须有个提示,防止记录太少,删得太快,不提示 clearGroupHistory(); break; case R.id.re_change_groupname: showNameAlert(); break; case R.id.rl_switch_chattotop: // 当前状态是已经置顶,点击后取消置顶 if (iv_switch_chattotop.getVisibility() == View.VISIBLE) { iv_switch_chattotop.setVisibility(View.INVISIBLE); iv_switch_unchattotop.setVisibility(View.VISIBLE); if (topMap.containsKey(group.getGroupId())) { topMap.remove(group.getGroupId()); TopUserDao topUserDao = new TopUserDao( ChatRoomSettingActivity.this); topUserDao.deleteTopUser(group.getGroupId()); } } else { // 当前状态是未置顶点击后置顶 iv_switch_chattotop.setVisibility(View.VISIBLE); iv_switch_unchattotop.setVisibility(View.INVISIBLE); if (!topMap.containsKey(group.getGroupId())) { TopUser topUser = new TopUser(); topUser.setTime(System.currentTimeMillis()); // 1---表示是群组 topUser.setType(1); topUser.setUserName(group.getGroupId()); Map<String, TopUser> map = new HashMap<String, TopUser>(); map.put(group.getGroupId(), topUser); topMap.putAll(map); TopUserDao topUserDao = new TopUserDao( ChatRoomSettingActivity.this); topUserDao.saveTopUser(topUser); } } break; case R.id.btn_exit_grp: deleteMembersFromGroup(hxid); break; default: break; } } /** * 清空群聊天记录 */ public void clearGroupHistory() { EMChatManager.getInstance().clearConversation(group.getGroupId()); progressDialog.dismiss(); } /** * 群组成员gridadapter * * @author admin_new * */ private class GridAdapter extends BaseAdapter { public boolean isInDeleteMode; private List<User> objects; Context context; private LoadUserAvatar avatarLoader; public GridAdapter(Context context, List<User> objects) { this.objects = objects; this.context = context; isInDeleteMode = false; avatarLoader = new LoadUserAvatar(context, "/sdcard/fanxin/"); } @Override public View getView(final int position, View convertView, final ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(context).inflate( R.layout.social_chatsetting_gridview_item, null); } ImageView iv_avatar = (ImageView) convertView .findViewById(R.id.iv_avatar); TextView tv_username = (TextView) convertView .findViewById(R.id.tv_username); ImageView badge_delete = (ImageView) convertView .findViewById(R.id.badge_delete); // 最后一个item,减人按钮 if (position == getCount() - 1 && is_admin) { tv_username.setText(""); badge_delete.setVisibility(View.GONE); iv_avatar.setImageResource(R.drawable.icon_btn_deleteperson); if (isInDeleteMode) { // 正处于删除模式下,隐藏删除按钮 convertView.setVisibility(View.GONE); } else { convertView.setVisibility(View.VISIBLE); } iv_avatar.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { isInDeleteMode = true; notifyDataSetChanged(); } }); } else if ((is_admin && position == getCount() - 2) || (!is_admin && position == getCount() - 1)) { // 添加群组成员按钮 tv_username.setText(""); badge_delete.setVisibility(View.GONE); iv_avatar.setImageResource(R.drawable.jy_drltsz_btn_addperson); // 正处于删除模式下,隐藏添加按钮 if (isInDeleteMode) { convertView.setVisibility(View.GONE); } else { convertView.setVisibility(View.VISIBLE); } iv_avatar.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 进入选人页面 startActivity((new Intent( ChatRoomSettingActivity.this, CreatChatRoomActivity.class).putExtra( "groupId", groupId))); } }); } else { // 普通item,显示群组成员 User user = objects.get(position); String usernick = user.getNick(); final String userhid = user.getUsername(); final String useravatar = user.getAvatar(); tv_username.setText(usernick); iv_avatar.setImageResource(R.drawable.default_useravatar); iv_avatar.setTag(useravatar); if (useravatar != null && !useravatar.equals("")) { Bitmap bitmap = avatarLoader.loadImage(iv_avatar, useravatar, new ImageDownloadedCallBack() { @Override public void onImageDownloaded( ImageView imageView, Bitmap bitmap) { if (imageView.getTag() == useravatar) { imageView.setImageBitmap(bitmap); } } }); if (bitmap != null) { iv_avatar.setImageBitmap(bitmap); } } // demo群组成员的头像都用默认头像,需由开发者自己去设置头像 if (isInDeleteMode) { // 如果是删除模式下,显示减人图标 convertView.findViewById(R.id.badge_delete).setVisibility( View.VISIBLE); } else { convertView.findViewById(R.id.badge_delete).setVisibility( View.INVISIBLE); } iv_avatar.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (isInDeleteMode) { // 如果是删除自己,return if (EMChatManager.getInstance().getCurrentUser() .equals(userhid)) { startActivity(new Intent( ChatRoomSettingActivity.this, FXAlertDialog.class).putExtra("msg", "不能删除自己")); return; } if (!NetUtils.hasNetwork(getApplicationContext())) { Toast.makeText( getApplicationContext(), getString(R.string.network_unavailable), Toast.LENGTH_SHORT).show(); return; } deleteMembersFromGroup(userhid); } else { // 正常情况下点击user,可以进入用户详情或者聊天页面等等 // startActivity(new // Intent(GroupDetailsActivity.this, // ChatActivity.class).putExtra("userId", // user.getUsername())); } } }); } return convertView; } @Override public int getCount() { if (is_admin) { return objects.size() + 2; } else { return objects.size() + 1; } } @Override public Object getItem(int position) { // TODO Auto-generated method stub return objects.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } } protected void updateGroup() { new Thread(new Runnable() { public void run() { try { EMGroup returnGroup = EMGroupManager.getInstance() .getGroupFromServer(groupId); // 更新本地数据 EMGroupManager.getInstance().createOrUpdateLocalGroup( returnGroup); runOnUiThread(new Runnable() { public void run() { if (group != null) { System.out.println("group msg is blocked:" + group.getMsgBlocked()); // 设置初始屏蔽初始状态 if (group.getMsgBlocked()) { iv_switch_block_groupmsg .setVisibility(View.VISIBLE); iv_switch_unblock_groupmsg .setVisibility(View.INVISIBLE); } else { iv_switch_block_groupmsg .setVisibility(View.INVISIBLE); iv_switch_unblock_groupmsg .setVisibility(View.VISIBLE); } // 设置置顶的初始状态 if (topMap.containsKey(group.getGroupId())) { // 当前状态是已经置顶 iv_switch_chattotop .setVisibility(View.VISIBLE); iv_switch_unchattotop .setVisibility(View.INVISIBLE); } else { // 当前状态是未置顶 iv_switch_chattotop .setVisibility(View.INVISIBLE); iv_switch_unchattotop .setVisibility(View.VISIBLE); } } } }); } catch (Exception e) { runOnUiThread(new Runnable() { public void run() { } }); } } }).start(); } private void showNameAlert() { final AlertDialog dlg = new AlertDialog.Builder(this).create(); dlg.show(); Window window = dlg.getWindow(); // *** 主要就是在这里实现这种效果的. // 设置窗口的内容页面,shrew_exit_dialog.xml文件中定义view内容 window.setContentView(R.layout.social_alertdialog); // 设置能弹出输入法 dlg.getWindow().clearFlags( WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); // 为确认按钮添加事件,执行退出应用操作 Button ok = (Button) window.findViewById(R.id.btn_ok); final EditText ed_name = (EditText) window.findViewById(R.id.ed_name); ok.setOnClickListener(new View.OnClickListener() { @SuppressLint("ShowToast") public void onClick(View v) { final String newName = ed_name.getText().toString().trim(); if (TextUtils.isEmpty(newName)) { return; } try { JSONObject newJSON = new JSONObject(); newJSON.put("groupname", newName); newJSON.put("jsonArray", jsonarray); String updateStr = newJSON.toJSONString(); // 如果是群主直接调用本地SDK的API if (is_admin) { EMGroupManager.getInstance().changeGroupName(groupId, updateStr); } // 非群员成员需要调用服务器端代码... else { updateGroupName(groupId, updateStr); } progressDialog.dismiss(); tv_groupname.setText(newName); group_name = newName; Toast.makeText(ChatRoomSettingActivity.this, "修改成功", Toast.LENGTH_LONG).show(); } catch (EaseMobException e) { Toast.makeText(ChatRoomSettingActivity.this, "修改失败", Toast.LENGTH_LONG).show(); e.printStackTrace(); } dlg.cancel(); } }); // 关闭alert对话框架 Button cancel = (Button) window.findViewById(R.id.btn_cancel); cancel.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { dlg.cancel(); } }); } /** * 删除群成员 * * @param username */ protected void deleteMembersFromGroup(final String username) { final ProgressDialog deleteDialog = new ProgressDialog( ChatRoomSettingActivity.this); // 当删除的是自己的时候,意味着就是退群。群主退群是要解散群的,所以要有判断 if (hxid.equals(username)) { deleteDialog.setMessage("正在退出..."); deleteDialog.setCanceledOnTouchOutside(false); deleteDialog.show(); // 非群主退出 if (!is_admin) { try { JSONObject newJSON = new JSONObject(); newJSON.put("groupname", group_name); for (int n = 0; n < jsonarray.size(); n++) { JSONObject jsontemp = (JSONObject) jsonarray.get(n); if (jsontemp.getString("hxid").equals(username)) { jsonarray.remove(jsontemp); } } newJSON.put("jsonArray", jsonarray); String updateStr = newJSON.toJSONString(); // 群成员退出以后要更新群信息,也就封装的群名.. updateGroupName(groupId, updateStr); EMGroupManager.getInstance().exitFromGroup(groupId); deleteDialog.dismiss(); Toast.makeText(ChatRoomSettingActivity.this, "退出成功", Toast.LENGTH_LONG).show(); setResult(100); finish(); } catch (EaseMobException e) { deleteDialog.dismiss(); Toast.makeText(ChatRoomSettingActivity.this, "退出失败", Toast.LENGTH_LONG).show(); e.printStackTrace(); } } // 群主退群 else { try { EMGroupManager.getInstance().exitAndDeleteGroup(groupId); deleteDialog.dismiss(); Toast.makeText(ChatRoomSettingActivity.this, "退出成功", Toast.LENGTH_LONG).show(); setResult(100); finish(); } catch (EaseMobException e) { deleteDialog.dismiss(); Toast.makeText(ChatRoomSettingActivity.this, "退出失败", Toast.LENGTH_LONG).show(); e.printStackTrace(); }// 异步执行 } } // 群主删群成员操作 else { deleteDialog.setMessage("正在移除..."); deleteDialog.setCanceledOnTouchOutside(false); deleteDialog.show(); try { EMGroupManager.getInstance().removeUserFromGroup(groupId, username); for (int i = 0; i < members.size(); i++) { User user = members.get(i); if (user.getUsername().equals(username)) { // 移除被删成员信息 members.remove(user); adapter.notifyDataSetChanged(); m_total = members.size(); tv_m_total.setText("(" + String.valueOf(m_total) + ")"); JSONObject newJSON = new JSONObject(); newJSON.put("groupname", group_name); // 在封装数据里面取出删除成员,并且更新 for (int n = 0; n < jsonarray.size(); n++) { JSONObject jsontemp = (JSONObject) jsonarray.get(n); if (jsontemp.getString("hxid").equals(username)) { jsonarray.remove(jsontemp); } } newJSON.put("jsonArray", jsonarray); String updateStr = newJSON.toJSONString(); Log.e("updateStr------>>>>>0", updateStr); EMGroupManager.getInstance().changeGroupName(groupId, updateStr); } } deleteDialog.dismiss(); Toast.makeText(ChatRoomSettingActivity.this, "移除成功", Toast.LENGTH_LONG).show(); } catch (EaseMobException e) { deleteDialog.dismiss(); Toast.makeText(ChatRoomSettingActivity.this, "移除失败", Toast.LENGTH_LONG).show(); e.printStackTrace(); }// 异步执行 } } private void updateGroupName(String groupId, String updateStr) { Map<String, String> map = new HashMap<String, String>(); map.put("groupId", groupId); map.put("groupName", updateStr); LoadDataFromServer task = new LoadDataFromServer( ChatRoomSettingActivity.this, Constant.URL_UPDATE_Groupnanme, map); task.getData(new DataCallBack() { @Override public void onDataCallBack(JSONObject data) { if (data != null) { int code = data.getInteger("code"); if (code != 1) { // 通知管理员。。。 } } } }); } public void back(View view) { setResult(RESULT_OK); finish(); } @Override public void onBackPressed() { setResult(RESULT_OK); finish(); } @Override protected void onDestroy() { super.onDestroy(); instance = null; } }