/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2014年 mob.com. All rights reserved.
*/
package cn.smssdk.gui;
import static com.mob.tools.utils.R.getStringRes;
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.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import cn.smssdk.EventHandler;
import cn.smssdk.SMSSDK;
import cn.smssdk.gui.layout.ContactListPageLayout;
import cn.smssdk.gui.layout.Res;
import cn.smssdk.utils.SMSLog;
import com.mob.tools.FakeActivity;
/** 联系人列表页面*/
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() {
if (pd != null && pd.isShowing()) {
pd.dismiss();
}
pd = CommonDialog.ProgressDialog(activity);
if (pd != null) {
pd.show();
}
// 初始化搜索引擎
SearchEngine.prepare(activity, new Runnable() {
public void run() {
afterPrepare();
}
});
}
private void afterPrepare() {
runOnUIThread(new Runnable() {
public void run() {
friendsInApp = new ArrayList<HashMap<String,Object>>();
contactsInMobile = new ArrayList<HashMap<String,Object>>();
ContactListPageLayout page = new ContactListPageLayout(activity);
LinearLayout layout = page.getLayout();
if (layout != null) {
activity.setContentView(layout);
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(){
listView = (ContactsListView) activity.findViewById(Res.id.clContact);
activity.findViewById(Res.id.ll_back).setOnClickListener(this);
activity.findViewById(Res.id.ivSearch).setOnClickListener(this);
activity.findViewById(Res.id.iv_clear).setOnClickListener(this);
TextView tv = (TextView) activity.findViewById(Res.id.tv_title);
int resId = getStringRes(activity, "smssdk_search_contact");
if (resId > 0) {
tv.setText(resId);
}
etSearch = (EditText) activity.findViewById(Res.id.et_put_identify);
etSearch.addTextChangedListener(this);
}
private void initData(){
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) {
// 请求获取本地联系人列表
ArrayList<HashMap<String,Object>> rawList = (ArrayList<HashMap<String,Object>>) data;
if (rawList == null) {
contactsInMobile = new ArrayList<HashMap<String,Object>>();
} else {
contactsInMobile = (ArrayList<HashMap<String,Object>>) rawList.clone();
}
refreshContactList();
} 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 boolean onKeyEvent(int keyCode, KeyEvent event) {
try {
int resId = Res.id.llSearch;
if (keyCode == KeyEvent.KEYCODE_BACK
&& event.getAction() == KeyEvent.ACTION_DOWN
&& activity.findViewById(resId).getVisibility() == View.VISIBLE) {
activity.findViewById(resId).setVisibility(View.GONE);
resId = Res.id.llTitle;
activity.findViewById(resId).setVisibility(View.VISIBLE);
etSearch.setText("");
return true;
}
} catch (Exception e) {
SMSLog.getInstance().w(e);
}
return super.onKeyEvent(keyCode, event);
}
public void onDestroy() {
// 销毁事件监听器
SMSSDK.unregisterEventHandler(handler);
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (adapter != null) {
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 = Res.id.ll_back;
int id_ivSearch = Res.id.ivSearch;
int id_iv_clear = Res.id.iv_clear;
if (id == id_ll_back) {
finish();
} else if (id == id_ivSearch) {
int id_llTitle = Res.id.llTitle;
activity.findViewById(id_llTitle).setVisibility(View.GONE);
int id_llSearch = Res.id.llSearch;
activity.findViewById(id_llSearch).setVisibility(View.VISIBLE);
etSearch.requestFocus();
etSearch.getText().clear();
} else if (id == id_iv_clear) {
etSearch.getText().clear();
}
}
// 获取联系人列表
@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);
}
}