package com.fanxin.app.fx; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import android.annotation.SuppressLint; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; 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.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.LoadDataFromServer.DataCallBack; import com.fanxin.app.fx.others.LoadUserAvatar.ImageDownloadedCallBack; import com.easemob.exceptions.EaseMobException; @SuppressLint({ "InflateParams", "SdCardPath" }) public class CreatChatRoomActivity extends BaseActivity { private ImageView iv_search; private TextView tv_checked; private ListView listView; /** 是否为一个新建的群组 */ protected boolean isCreatingNewGroup; /** 是否为单选 */ private boolean isSignleChecked; private PickContactAdapter contactAdapter; /** group中一开始就有的成员 */ private List<String> exitingMembers = new ArrayList<String>(); // 可滑动的显示选中用户的View private LinearLayout menuLinerLayout; // 选中用户总数,右上角显示 int total = 0; private String userId = null; private String groupId = null; private ProgressDialog progressDialog; private String groupname; // 添加的列表 private List<String> addList = new ArrayList<String>(); private String hxid; private EMGroup group; private Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_chatroom); hxid = LocalUserInfo.getInstance(CreatChatRoomActivity.this) .getUserInfo("hxid"); context=this; progressDialog = new ProgressDialog(this); groupId = getIntent().getStringExtra("groupId"); userId = getIntent().getStringExtra("userId"); tv_checked = (TextView) this.findViewById(R.id.tv_checked); if (groupId != null) { isCreatingNewGroup = false; group = EMGroupManager.getInstance().getGroup(groupId); if (group != null) { exitingMembers = group.getMembers(); groupname = group.getGroupName(); } } else if (userId != null) { isCreatingNewGroup = true; exitingMembers.add(userId); total = 1; addList.add(userId); } else { isCreatingNewGroup = true; } // 获取好友列表 final List<User> alluserList = new ArrayList<User>(); for (User user : MYApplication.getInstance().getContactList().values()) { if (!user.getUsername().equals(Constant.NEW_FRIENDS_USERNAME) & !user.getUsername().equals(Constant.GROUP_USERNAME)) alluserList.add(user); } // 对list进行排序 Collections.sort(alluserList, new PinyinComparator() { }); listView = (ListView) findViewById(R.id.list); LayoutInflater layoutInflater = LayoutInflater.from(this); View headerView = layoutInflater.inflate(R.layout.item_chatroom_header, null); TextView tv_header = (TextView) headerView.findViewById(R.id.tv_header); tv_header.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(CreatChatRoomActivity.this, ChatRoomActivity.class)); finish(); } }); menuLinerLayout = (LinearLayout) this .findViewById(R.id.linearLayoutMenu); final EditText et_search = (EditText) this.findViewById(R.id.et_search); et_search.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.length() > 0) { String str_s = et_search.getText().toString().trim(); List<User> users_temp = new ArrayList<User>(); for (User user : alluserList) { String usernick = user.getNick(); Log.e("usernick--->>>", usernick); Log.e("str_s--->>>", str_s); if (usernick.contains(str_s)) { users_temp.add(user); } contactAdapter = new PickContactAdapter( CreatChatRoomActivity.this, R.layout.item_contactlist_listview_checkbox, users_temp); listView.setAdapter(contactAdapter); } } else { contactAdapter = new PickContactAdapter( CreatChatRoomActivity.this, R.layout.item_contactlist_listview_checkbox, alluserList); listView.setAdapter(contactAdapter); } } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void afterTextChanged(Editable s) { } }); listView.addHeaderView(headerView); contactAdapter = new PickContactAdapter(this, R.layout.item_contactlist_listview_checkbox, alluserList); listView.setAdapter(contactAdapter); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkbox); checkBox.toggle(); } }); tv_checked.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { save(); } }); iv_search = (ImageView) this.findViewById(R.id.iv_search); } // 即时显示被选中用户的头像和昵称。 private void showCheckImage(Bitmap bitmap, User glufineid) { if (exitingMembers.contains(glufineid.getUsername()) && groupId != null) { return; } if (addList.contains(glufineid.getUsername())) { return; } total++; // 包含TextView的LinearLayout // 参数设置 android.widget.LinearLayout.LayoutParams menuLinerLayoutParames = new LinearLayout.LayoutParams( 108, 108, 1); View view = LayoutInflater.from(this).inflate( R.layout.item_chatroom_header_item, null); ImageView images = (ImageView) view.findViewById(R.id.iv_avatar); menuLinerLayoutParames.setMargins(6, 6, 6, 6); // 设置id,方便后面删除 view.setTag(glufineid); if (bitmap == null) { images.setImageResource(R.drawable.default_useravatar); } else { images.setImageBitmap(bitmap); } menuLinerLayout.addView(view, menuLinerLayoutParames); tv_checked.setText("确定(" + total + ")"); if (total > 0) { if (iv_search.getVisibility() == View.VISIBLE) { iv_search.setVisibility(View.GONE); } } addList.add(glufineid.getUsername()); } private void deleteImage(User glufineid) { View view = (View) menuLinerLayout.findViewWithTag(glufineid); menuLinerLayout.removeView(view); total--; tv_checked.setText("确定(" + total + ")"); addList.remove(glufineid.getUsername()); if (total < 1) { if (iv_search.getVisibility() == View.GONE) { iv_search.setVisibility(View.VISIBLE); } } } /** * 确认选择的members * * @param v */ public void save() { if (addList.size() == 0) { Toast.makeText(CreatChatRoomActivity.this, "请选择用户", Toast.LENGTH_LONG).show(); return; } // 如果只有一个用户说明只是单聊,并且不是从群组加人 if (addList.size() == 1 && isCreatingNewGroup) { String userId = addList.get(0); User user = MYApplication.getInstance().getContactList() .get(userId); if (user != null) { String userNick = user.getNick(); String userAvatar = user.getAvatar(); startActivity(new Intent(getApplicationContext(), ChatActivity.class).putExtra("userId", userId) .putExtra("userNick", userNick) .putExtra("userAvatar", userAvatar)); finish(); } } else { if (isCreatingNewGroup) { progressDialog.setMessage("正在创建群聊..."); } else { progressDialog.setMessage("正在加人..."); } progressDialog.show(); creatNewGroup(addList); } } /** * 创建新群组 * * @param newmembers */ private void creatNewGroup(List<String> members) { String nick = LocalUserInfo.getInstance(CreatChatRoomActivity.this) .getUserInfo("nick"); String avatar = LocalUserInfo.getInstance(CreatChatRoomActivity.this) .getUserInfo("avatar"); if (isCreatingNewGroup) { JSONObject myjson = new JSONObject(); myjson.put("hxid", hxid); myjson.put("nick", nick); myjson.put("avatar", avatar); JSONArray jsonArray = new JSONArray(); jsonArray.add(myjson); String groupName = nick; ; for (int i = 0; i < members.size(); i++) { User user = MYApplication.getInstance().getContactList() .get(members.get(i)); if (user != null) { JSONObject json_member = new JSONObject(); json_member.put("hxid", user.getUsername()); json_member.put("nick", user.getNick()); json_member.put("avatar", user.getAvatar()); jsonArray.add(json_member); if (i < 4) { groupName += "、" + user.getNick(); } else if (i == 4) { groupName += "..."; } } } JSONObject finalJson = new JSONObject(); finalJson.put("jsonArray", jsonArray); finalJson.put("groupname", "未命名"); String myDesc = "temp"; String groupJSON = finalJson.toJSONString(); Log.e("groupName----->>>>>", groupName); creatNewGroup(groupName, groupJSON, myDesc, members); } else { // 群主加人调用此方法 try { if (hxid.equals(group.getOwner())) { EMGroupManager.getInstance().addUsersToGroup(groupId, members.toArray(new String[0])); } else { EMGroupManager.getInstance().inviteUser(groupId, members.toArray(new String[0]), null); } JSONObject oldjson = JSONObject.parseObject(groupname); JSONArray oldjsonArray = oldjson.getJSONArray("jsonArray"); String groupName = oldjson.getString("groupname"); for (int i = 0; i < members.size(); i++) { User user = MYApplication.getInstance().getContactList() .get(members.get(i)); if (user != null) { JSONObject json_member = new JSONObject(); json_member.put("hxid", user.getUsername()); json_member.put("nick", user.getNick()); json_member.put("avatar", user.getAvatar()); oldjsonArray.add(json_member); } } JSONObject finalJson = new JSONObject(); finalJson.put("jsonArray", oldjsonArray); finalJson.put("groupname", groupName); String groupJSON = finalJson.toJSONString(); if (hxid.equals(group.getOwner())) { EMGroupManager.getInstance().changeGroupName(groupId, groupJSON);// } else { updateGroupName(groupId, groupJSON); } startActivity(new Intent(getApplicationContext(), ChatActivity.class).putExtra("groupId", groupId) .putExtra("chatType", ChatActivity.CHATTYPE_GROUP) .putExtra("groupName", groupName)); progressDialog.dismiss(); } catch (EaseMobException e) { progressDialog.dismiss(); Toast.makeText(CreatChatRoomActivity.this, "群聊加人失败。。。", Toast.LENGTH_LONG).show(); e.printStackTrace(); } } } private void creatNewGroup(final String groupName, final String groupJSON, final String myDesc, final List<String> members) { new Thread(new Runnable() { @Override public void run() { try { EMGroup group_temp = EMGroupManager.getInstance() .createPrivateGroup(groupJSON, myDesc, members.toArray(new String[0]), true); if (group_temp != null) { String group_temp_id = group_temp.getGroupId(); String group_temp_name = group_temp.getGroupName(); String group_temp_desc = group_temp.getDescription(); Log.e("group_temp_id----->>>>>", group_temp_id); Log.e("group_temp_name----->>>>>", group_temp_name); Log.e("group_temp_desc----->>>>>", group_temp_desc); ((Activity) context).runOnUiThread(new Runnable() { @Override public void run() { if (progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } } }); startActivity(new Intent(getApplicationContext(), ChatActivity.class) .putExtra("groupId", group_temp_id) .putExtra("chatType", ChatActivity.CHATTYPE_GROUP) .putExtra("groupName", groupName)); } } catch (EaseMobException e) { ((Activity) context).runOnUiThread(new Runnable() { @Override public void run() { if (progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } Toast.makeText(getApplicationContext(), "建群失败", Toast.LENGTH_SHORT).show(); } }); } } }).start(); } 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( CreatChatRoomActivity.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) { // 通知管理员。。。 } } } }); } /** * adapter */ private class PickContactAdapter extends BaseAdapter { private LayoutInflater layoutInflater; private boolean[] isCheckedArray; private Bitmap[] bitmaps; private LoadUserAvatar avatarLoader; private List<User> list = new ArrayList<User>(); private int res; public PickContactAdapter(Context context, int resource, List<User> users) { layoutInflater = LayoutInflater.from(context); avatarLoader = new LoadUserAvatar(context, "/sdcard/fanxin/"); this.res = resource; this.list = users; bitmaps = new Bitmap[list.size()]; isCheckedArray = new boolean[list.size()]; } public Bitmap getBitmap(int position) { return bitmaps[position]; } @SuppressLint("ViewHolder") @Override public View getView(final int position, View convertView, ViewGroup parent) { convertView = layoutInflater.inflate(res, null); ImageView iv_avatar = (ImageView) convertView .findViewById(R.id.iv_avatar); TextView tv_name = (TextView) convertView .findViewById(R.id.tv_name); TextView tvHeader = (TextView) convertView .findViewById(R.id.header); final User user = list.get(position); final String avater = user.getAvatar(); String name = user.getNick(); String header = user.getHeader(); final String username = user.getUsername(); tv_name.setText(name); iv_avatar.setImageResource(R.drawable.default_useravatar); iv_avatar.setTag(avater); Bitmap bitmap = null; if (avater != null && !avater.equals("")) { bitmap = avatarLoader.loadImage(iv_avatar, avater, new ImageDownloadedCallBack() { @Override public void onImageDownloaded(ImageView imageView, Bitmap bitmap) { if (imageView.getTag() == avater) { imageView.setImageBitmap(bitmap); } } }); if (bitmap != null) { iv_avatar.setImageBitmap(bitmap); } bitmaps[position] = bitmap; } if (position == 0 || header != null && !header.equals(getItem(position - 1))) { if ("".equals(header)) { tvHeader.setVisibility(View.GONE); } else { tvHeader.setVisibility(View.VISIBLE); tvHeader.setText(header); } } else { tvHeader.setVisibility(View.GONE); } // 选择框checkbox final CheckBox checkBox = (CheckBox) convertView .findViewById(R.id.checkbox); if (exitingMembers != null && exitingMembers.contains(username)) { checkBox.setButtonDrawable(R.drawable.btn_check); } else { checkBox.setButtonDrawable(R.drawable.check_blue); } if (addList != null && addList.contains(username)) { checkBox.setChecked(true); isCheckedArray[position] = true; } if (checkBox != null) { checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // 群组中原来的成员一直设为选中状态 if (exitingMembers.contains(username)) { isChecked = true; checkBox.setChecked(true); } isCheckedArray[position] = isChecked; // 如果是单选模式 if (isSignleChecked && isChecked) { for (int i = 0; i < isCheckedArray.length; i++) { if (i != position) { isCheckedArray[i] = false; } } contactAdapter.notifyDataSetChanged(); } if (isChecked) { // 选中用户显示在滑动栏显示 showCheckImage(contactAdapter.getBitmap(position), list.get(position)); } else { // 用户显示在滑动栏删除 deleteImage(list.get(position)); } } }); // 群组中原来的成员一直设为选中状态 if (exitingMembers.contains(username)) { checkBox.setChecked(true); isCheckedArray[position] = true; } else { checkBox.setChecked(isCheckedArray[position]); } } return convertView; } @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public String getItem(int position) { if (position < 0) { return ""; } String header = list.get(position).getHeader(); return header; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } } public void back(View view) { finish(); } @SuppressLint("DefaultLocale") public class PinyinComparator implements Comparator<User> { @SuppressLint("DefaultLocale") @Override public int compare(User o1, User o2) { // TODO Auto-generated method stub String py1 = o1.getHeader(); String py2 = o2.getHeader(); // 判断是否为空"" if (isEmpty(py1) && isEmpty(py2)) return 0; if (isEmpty(py1)) return -1; if (isEmpty(py2)) return 1; String str1 = ""; String str2 = ""; try { str1 = ((o1.getHeader()).toUpperCase()).substring(0, 1); str2 = ((o2.getHeader()).toUpperCase()).substring(0, 1); } catch (Exception e) { System.out.println("某个str为\" \" 空"); } return str1.compareTo(str2); } private boolean isEmpty(String str) { return "".equals(str.trim()); } } }