package com.diandi.demo.ui.fragment;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.diandi.demo.CustomApplication;
import com.diandi.demo.R;
import com.diandi.demo.adapter.ContactAdapter;
import com.diandi.demo.model.User;
import com.diandi.demo.ui.activity.AddContactActivity;
import com.diandi.demo.ui.activity.NearPeopleActivity;
import com.diandi.demo.ui.activity.NewFriendActivity;
import com.diandi.demo.ui.activity.ProfileActivity;
import com.diandi.demo.util.CharacterParser;
import com.diandi.demo.util.CollectionUtils;
import com.diandi.demo.util.PinyinComparator;
import com.diandi.demo.widget.ClearEditText;
import com.diandi.demo.widget.HeaderLayout.onRightImageButtonClickListener;
import com.diandi.demo.widget.LetterView;
import com.diandi.demo.widget.LetterView.OnTouchingLetterChangedListener;
import com.diandi.demo.widget.dialog.DialogTips;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import cn.bmob.im.bean.BmobChatUser;
import cn.bmob.im.db.BmobDB;
import cn.bmob.v3.listener.UpdateListener;
/**
* *******************************************************************************
* ********* Author : klob(kloblic@gmail.com) .
* ********* Date : 2014-11-29 .
* ********* Time : 11:46 .
* ********* Project name : Diandi1.18 .
* ********* Version : 1.0
* ********* Copyright @ 2014, klob, All Rights Reserved
* *******************************************************************************
*/
@SuppressLint("DefaultLocale")
public class ContactFragment extends BaseFragment implements OnItemClickListener, OnItemLongClickListener {
LinearLayout mNewFriendLayout;
LinearLayout mNearPeopleLayout;
private ClearEditText mClearEditText;
private TextView mTextDialog;
private ListView mFriendListView;
private LetterView mRightLetters;
private ImageView mMsgTipImg;
private TextView mNewNameText;
private ContactAdapter mUserAdapter;
private List<User> mFriends = new ArrayList<User>();
/**
* 汉字转换成拼音的类
*/
private CharacterParser mCharacterParser;
/**
* 根据拼音来排列ListView里面的数据类
*/
private PinyinComparator mPinyinComparator;
private boolean mHidden;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_contacts, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
findView();
initView();
}
@Override
void findView() {
mClearEditText = (ClearEditText) findViewById(R.id.et_msg_search);
mFriendListView = (ListView) findViewById(R.id.list_friends);
RelativeLayout headView = (RelativeLayout) mInflater.inflate(R.layout.include_new_friend, null);
mMsgTipImg = (ImageView) headView.findViewById(R.id.iv_msg_tips);
mNewFriendLayout = (LinearLayout) headView.findViewById(R.id.layout_new);
mNearPeopleLayout = (LinearLayout) headView.findViewById(R.id.layout_near);
mFriendListView.addHeaderView(headView);
mRightLetters = (LetterView) findViewById(R.id.right_letter);
mTextDialog = (TextView) findViewById(R.id.text_dialog);
mRightLetters.setTextView(mTextDialog);
}
public void initView() {
bindEvent();
initTopBarForRight("联系人", R.drawable.base_action_bar_add_bg_selector,
new onRightImageButtonClickListener() {
@Override
public void onClick() {
startAnimActivity(AddContactActivity.class);
}
}
);
mCharacterParser = CharacterParser.getInstance();
mPinyinComparator = new PinyinComparator();
mUserAdapter = new ContactAdapter(getActivity(), mFriends);
mFriendListView.setAdapter(mUserAdapter);
}
@Override
void bindEvent() {
mClearEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// 当输入框里面的值为空,更新为原来的列表,否则为过滤数据列表
filterData(s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
mNewFriendLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(getActivity(), NewFriendActivity.class);
intent.putExtra("from", "contact");
startAnimActivity(intent);
}
});
mNearPeopleLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(getActivity(), NearPeopleActivity.class);
startAnimActivity(intent);
}
});
mFriendListView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// 隐藏软键盘
if (getActivity().getWindow().getAttributes().softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) {
if (getActivity().getCurrentFocus() != null) {
InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
}
}
return false;
}
});
mFriendListView.setOnItemClickListener(this);
mFriendListView.setOnItemLongClickListener(this);
mRightLetters.setOnTouchingLetterChangedListener(new LetterListViewListener());
}
/**
* 根据输入框中的值来过滤数据并更新ListView
*
* @param filterStr
*/
private void filterData(String filterStr) {
List<User> filterDateList = new ArrayList<User>();
if (TextUtils.isEmpty(filterStr)) {
filterDateList = mFriends;
} else {
filterDateList.clear();
for (User sortModel : mFriends) {
String name = sortModel.getUsername();
if (name != null) {
if (name.indexOf(filterStr.toString()) != -1
|| mCharacterParser.getSelling(name).startsWith(
filterStr.toString())) {
filterDateList.add(sortModel);
}
}
}
}
// 根据a-z进行排序
Collections.sort(filterDateList, mPinyinComparator);
mUserAdapter.updateListView(filterDateList);
}
private void filledData(List<BmobChatUser> datas) {
mFriends.clear();
int total = datas.size();
for (int i = 0; i < total; i++) {
BmobChatUser user = datas.get(i);
User sortModel = new User();
sortModel.setAvatar(user.getAvatar());
sortModel.setNick(user.getNick());
sortModel.setUsername(user.getUsername());
sortModel.setObjectId(user.getObjectId());
sortModel.setContacts(user.getContacts());
// 汉字转换成拼音
String username = sortModel.getUsername();
// 若没有username
if (username != null) {
String pinyin = mCharacterParser.getSelling(sortModel.getNick());
String sortString = pinyin.substring(0, 1).toUpperCase();
// 正则表达式,判断首字母是否是英文字母
if (sortString.matches("[A-Z]")) {
sortModel.setSortLetters(sortString.toUpperCase());
} else {
sortModel.setSortLetters("#");
}
} else {
sortModel.setSortLetters("#");
}
mFriends.add(sortModel);
}
// 根据a-z进行排序
Collections.sort(mFriends, mPinyinComparator);
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
if (isVisibleToUser) {
queryMymFriends();
}
super.setUserVisibleHint(isVisibleToUser);
}
private void queryMymFriends() {
//是否有新的好友请求
if (BmobDB.create(getActivity()).hasNewInvite()) {
mMsgTipImg.setVisibility(View.VISIBLE);
} else {
mMsgTipImg.setVisibility(View.GONE);
}
Map<String, BmobChatUser> users = CustomApplication.getInstance().getContactList();
//组装新的User
filledData(CollectionUtils.map2list(users));
if (mUserAdapter == null) {
mUserAdapter = new ContactAdapter(getActivity(), mFriends);
mFriendListView.setAdapter(mUserAdapter);
} else {
mUserAdapter.notifyDataSetChanged();
}
}
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
this.mHidden = hidden;
if (!hidden) {
refresh();
}
}
@Override
public void onResume() {
super.onResume();
if (!mHidden) {
refresh();
}
}
public void refresh() {
try {
getActivity().runOnUiThread(new Runnable() {
public void run() {
queryMymFriends();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
User user = (User) mUserAdapter.getItem(position - 1);
//先进入好友的详细资料页面
Intent intent = new Intent(getActivity(), ProfileActivity.class);
intent.putExtra("from", "other");
intent.putExtra("username", user.getUsername());
startAnimActivity(intent);
}
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
User user = (User) mUserAdapter.getItem(position - 1);
showDeleteDialog(user);
return true;
}
public void showDeleteDialog(final User user) {
DialogTips dialog = new DialogTips(getActivity(), user.getUsername(), "删除联系人", "确定", true, true);
// 设置成功事件
dialog.SetOnSuccessListener(new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int userId) {
deleteContact(user);
}
});
// 显示确认对话框
dialog.show();
dialog = null;
}
/**
* 删除联系人
* deleteContact
*/
private void deleteContact(final User user) {
final ProgressDialog progress = new ProgressDialog(getActivity());
progress.setMessage("正在删除...");
progress.setCanceledOnTouchOutside(false);
progress.show();
userManager.deleteContact(user.getObjectId(), new UpdateListener() {
@Override
public void onSuccess() {
// TODO Auto-generated method stub
ShowToast("删除成功");
//删除内存
CustomApplication.getInstance().getContactList().remove(user.getUsername());
//更新界面
getActivity().runOnUiThread(new Runnable() {
public void run() {
progress.dismiss();
mUserAdapter.remove(user);
}
});
}
@Override
public void onFailure(int arg0, String arg1) {
// TODO Auto-generated method stub
ShowToast("删除失败:" + arg1);
progress.dismiss();
}
});
}
private class LetterListViewListener implements
OnTouchingLetterChangedListener {
@Override
public void onTouchingLetterChanged(String s) {
// 该字母首次出现的位置
int position = mUserAdapter.getPositionForSection(s.charAt(0));
if (position != -1) {
mFriendListView.setSelection(position);
}
}
}
}