/*
* 官网地站:http://www.ShareSDK.cn
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 ShareSDK.cn. All rights reserved.
*/
package cn.smssdk.gui;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import android.app.Dialog;
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import cn.smssdk.framework.FakeActivity;
import cn.smssdk.EventHandler;
import cn.smssdk.SMSSDK;
import static cn.smssdk.framework.utils.R.*;
/** 联系人列表页面 */
public class ContactsPage extends FakeActivity implements OnClickListener, TextWatcher {
private EditText etSearch;
private ContactsListView listView;
private ContactsAdapter adapter;
private ContactItemMaker itemMaker;
private Dialog pd;
private EventHandler handler;
private ArrayList<HashMap<String, Object>> friendsInApp;
private ArrayList<HashMap<String, Object>> contactsInMobile;
@Override
public void onCreate() {
friendsInApp = new ArrayList<HashMap<String, Object>>();
contactsInMobile = new ArrayList<HashMap<String, Object>>();
int resId = getLayoutRes(activity, "smssdk_contact_list_page");
if (resId > 0) {
activity.setContentView(resId);
initView();
initData();
}
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onPause() {
super.onPause();
}
public void show(Context context) {
show(context, new DefaultContactViewItem());
}
public void show(Context context, ContactItemMaker maker) {
itemMaker = maker;
super.show(context, null);
}
private void initView() {
int resId = getIdRes(activity, "clContact");
if (resId > 0) {
listView = (ContactsListView) activity.findViewById(resId);
}
resId = getIdRes(activity, "ll_back");
if (resId > 0) {
activity.findViewById(resId).setOnClickListener(this);
}
resId = getIdRes(activity, "ivSearch");
if (resId > 0) {
activity.findViewById(resId).setOnClickListener(this);
}
resId = getIdRes(activity, "iv_clear");
if (resId > 0) {
activity.findViewById(resId).setOnClickListener(this);
}
resId = getIdRes(activity, "tv_title");
if (resId > 0) {
TextView tv = (TextView) activity.findViewById(resId);
resId = getStringRes(activity, "smssdk_search_contact");
if (resId > 0) {
tv.setText(resId);
}
}
resId = getIdRes(activity, "et_put_identify");
if (resId > 0) {
etSearch = (EditText) activity.findViewById(resId);
etSearch.addTextChangedListener(this);
}
}
private void initData() {
if (pd != null && pd.isShowing()) {
pd.dismiss();
}
pd = CommonDialog.ProgressDialog(activity);
if (pd != null) {
pd.show();
}
handler = new EventHandler() {
@SuppressWarnings("unchecked")
public void afterEvent(final int event, final int result, final Object data) {
if (result == SMSSDK.RESULT_COMPLETE) {
if (event == SMSSDK.EVENT_GET_CONTACTS) {
try {
// 请求获取本地联系人列表
ArrayList<HashMap<String, Object>> rawList = (ArrayList<HashMap<String, Object>>) data;
contactsInMobile = (ArrayList<HashMap<String, Object>>) rawList.clone();
refreshContactList();
} catch (Exception ex) {
ex.printStackTrace();
}
} else if (event == SMSSDK.EVENT_GET_FRIENDS_IN_APP) {
// 请求获取服务器上,应用内的朋友
friendsInApp = (ArrayList<HashMap<String, Object>>) data;
SMSSDK.getContacts(false);
}
} else {
runOnUIThread(new Runnable() {
public void run() {
if (pd != null && pd.isShowing()) {
pd.dismiss();
}
// 网络错误
int resId = getStringRes(activity, "smssdk_network_error");
if (resId > 0) {
Toast.makeText(activity, resId, Toast.LENGTH_SHORT).show();
}
}
});
}
}
};
// 注册事件监听器
SMSSDK.registerEventHandler(handler);
if (friendsInApp != null && friendsInApp.size() > 0) {
// 获取本地联系人
SMSSDK.getContacts(false);
} else {
// 获取应用内的好友列表
SMSSDK.getFriendsInApp();
}
}
public void onDestroy() {
// 销毁事件监听器
SMSSDK.unregisterEventHandler(handler);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.search(s.toString());
adapter.notifyDataSetChanged();
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void onClick(View v) {
int id = v.getId();
int id_ll_back = getIdRes(activity, "ll_back");
int id_ivSearch = getIdRes(activity, "ivSearch");
int id_iv_clear = getIdRes(activity, "iv_clear");
if (id == id_ll_back) {
finish();
} else if (id == id_ivSearch) {
int id_llTitle = getIdRes(activity, "llTitle");
activity.findViewById(id_llTitle).setVisibility(View.GONE);
int id_llSearch = getIdRes(activity, "llSearch");
activity.findViewById(id_llSearch).setVisibility(View.VISIBLE);
etSearch.requestFocus();
etSearch.getText().clear();
} else if (id == id_iv_clear) {
etSearch.getText().clear();
}
}
// TODO 获取联系人列表
@SuppressWarnings("unchecked")
private void refreshContactList() {
// 造一个“电话号码-联系人”映射表,加速查询
ArrayList<ContactEntry> phone2Contact = new ArrayList<ContactEntry>();
for (HashMap<String, Object> contact : contactsInMobile) {
ArrayList<HashMap<String, Object>> phones = (ArrayList<HashMap<String, Object>>) contact.get("phones");
if (phones != null && phones.size() > 0) {
for (HashMap<String, Object> phone : phones) {
String pn = (String) phone.get("phone");
ContactEntry ent = new ContactEntry(pn, contact);
phone2Contact.add(ent);
}
}
}
// 组织应用内好友分组
ArrayList<HashMap<String, Object>> tmpFia = new ArrayList<HashMap<String, Object>>();
int p2cSize = phone2Contact.size();
for (HashMap<String, Object> friend : friendsInApp) {
String phone = String.valueOf(friend.get("phone"));
if (phone != null) {
for (int i = 0; i < p2cSize; i++) {
ContactEntry ent = phone2Contact.get(i);
String cp = ent.getKey();
if (phone.equals(cp)) {
friend.put("contact", ent.getValue());
friend.put("fia", true);
tmpFia.add((HashMap<String, Object>) friend.clone());
}
}
}
}
friendsInApp = tmpFia;
// 移除本地联系人列表中,包含已加入APP的联系人
HashSet<HashMap<String, Object>> tmpCon = new HashSet<HashMap<String, Object>>();
for (ContactEntry ent : phone2Contact) {
String cp = ent.getKey();
HashMap<String, Object> con = ent.getValue();
if (cp != null && con != null) {
boolean shouldAdd = true;
for (HashMap<String, Object> friend : friendsInApp) {
String phone = String.valueOf(friend.get("phone"));
if (cp.equals(phone)) {
shouldAdd = false;
break;
}
}
if (shouldAdd) {
tmpCon.add(con);
}
}
}
contactsInMobile.clear();
contactsInMobile.addAll(tmpCon);
// 删除非应用内好友分组联系人电话列表中已经注册了的电话号码
for (HashMap<String, Object> friend : friendsInApp) {
HashMap<String, Object> contact = (HashMap<String, Object>) friend.remove("contact");
if (contact != null) {
String phone = String.valueOf(friend.get("phone"));
if (phone != null) {
ArrayList<HashMap<String, Object>> phones = (ArrayList<HashMap<String, Object>>) contact.get("phones");
if (phones != null && phones.size() > 0) {
ArrayList<HashMap<String, Object>> tmpPs = new ArrayList<HashMap<String, Object>>();
for (HashMap<String, Object> p : phones) {
String cp = (String) p.get("phone");
if (!phone.equals(cp)) {
tmpPs.add(p);
}
}
contact.put("phones", tmpPs);
}
}
// 添加本地联系人名称
friend.put("displayname", contact.get("displayname"));
}
}
// 更新listview
runOnUIThread(new Runnable() {
public void run() {
if (pd != null && pd.isShowing()) {
pd.dismiss();
}
adapter = new ContactsAdapter(listView, friendsInApp, contactsInMobile);
adapter.setContactItemMaker(itemMaker);
listView.setAdapter(adapter);
}
});
// if (pd != null && pd.isShowing()) {
// pd.dismiss();
// }
//
// try {
//
// // 造一个“电话号码-联系人”映射表,加速查询
// HashMap<String, HashMap<String, Object>> phone2Contact = new HashMap<String, HashMap<String,Object>>();
// for (HashMap<String, Object> contact : contactsInMobile) {
// ArrayList<HashMap<String, Object>> phones = (ArrayList<HashMap<String, Object>>) contact.get("phones");
// if (phones != null && phones.size() > 0) {
// for (HashMap<String, Object> phone : phones) {
// String pn = (String) phone.get("phone");
// //有号码,木有名字;名字 = 号码
// if(!contact.containsKey("displayname")){
// contact.put("displayname", pn);
// }
// phone2Contact.put(pn, contact);
// }
// }
// }
//
// // 移除本地联系人列表中,包含已加入APP的联系人
// ArrayList<HashMap<String, Object>> tmpList = new ArrayList<HashMap<String,Object>>();
// for (int i = 0; i < friendsInApp.size(); i++) {
// HashMap<String, Object> friend = friendsInApp.get(i);
// String phoneNum = String.valueOf(friend.get("phone"));
// HashMap<String, Object> contact = phone2Contact.remove(phoneNum);
// if (contact != null) {
// String namePhone = String.valueOf(contact.get("displayname"));
// if(TextUtils.isEmpty(namePhone)){
// namePhone = phoneNum;
// }
// // 已加入应用的联系人,显示contact name, 否则显示 phoneNumber
// friend.put("displayname", namePhone);
// tmpList.add(friend);
// }
// }
// friendsInApp = tmpList;
// //重新对号码进行过滤,排除重复的contact(一人多码)
// HashSet<HashMap<String, Object>> contactsSet = new HashSet<HashMap<String,Object>>(phone2Contact.values());
// contactsInMobile = new ArrayList<HashMap<String,Object>>(contactsSet);
//
// } catch (Exception e) {
// e.printStackTrace();
// }
//
// //TODO 更新listview
// adapter = new ContactsAdapter(listView, friendsInApp, contactsInMobile);
// adapter.setContactItemMaker(itemMaker);
// //adapter.setOnItemClickListener(this);
// listView.setAdapter(adapter);
}
}