package app.hanks.com.conquer.activity;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
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.AdapterView.OnItemLongClickListener;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import cn.bmob.im.bean.BmobChatUser;
import cn.bmob.im.db.BmobDB;
import cn.bmob.v3.listener.UpdateListener;
import app.hanks.com.conquer.CustomApplication;
import app.hanks.com.conquer.R;
import app.hanks.com.conquer.adapter.UserFriendAdapter;
import app.hanks.com.conquer.bean.User;
import app.hanks.com.conquer.util.A;
import app.hanks.com.conquer.util.CharacterParser;
import app.hanks.com.conquer.util.CollectionUtils;
import app.hanks.com.conquer.util.L;
import app.hanks.com.conquer.util.PinyinComparator;
import app.hanks.com.conquer.util.T;
import app.hanks.com.conquer.view.MyLetterView;
import app.hanks.com.conquer.view.MyLetterView.OnTouchingLetterChangedListener;
/**
* 用来显示好友列表类
* @author zyh
*/
public class FriendActivity extends BaseActivity implements OnItemClickListener, OnItemLongClickListener, OnClickListener {
TextView dialog;
ListView list_friends;
MyLetterView right_letter;
List<User> friends = new ArrayList<User>();
/**
* 汉字转换成拼音的类
*/
private CharacterParser characterParser;
/**
* 根据拼音来排列ListView里面的数据类
*/
private PinyinComparator pinyinComparator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
init();
}
private void init() {
characterParser = CharacterParser.getInstance();
pinyinComparator = new PinyinComparator();
initListView();
initRightLetterView();
}
ImageView iv_msg_tips;
TextView tv_new_name;
private UserFriendAdapter userAdapter;
private void initListView() {
list_friends = (ListView) findViewById(R.id.list_friends);
RelativeLayout headView = (RelativeLayout) View.inflate(context, R.layout.layout_new_friend, null);
iv_msg_tips = (ImageView) headView.findViewById(R.id.iv_msg_tips);
headView.findViewById(R.id.layout_new).setOnClickListener(this);
headView.findViewById(R.id.layout_near).setOnClickListener(this);
headView.findViewById(R.id.layout_add).setOnClickListener(this);
list_friends.addHeaderView(headView);
userAdapter = new UserFriendAdapter(context, friends);
list_friends.setAdapter(userAdapter);
list_friends.setOnItemClickListener(this);
list_friends.setOnItemLongClickListener(this);
}
private void initRightLetterView() {
right_letter = (MyLetterView) findViewById(R.id.right_letter);
dialog = (TextView) findViewById(R.id.dialog);
right_letter.setTextView(dialog);
right_letter.setOnTouchingLetterChangedListener(new LetterListViewListener());
}
private class LetterListViewListener implements OnTouchingLetterChangedListener {
@Override
public void onTouchingLetterChanged(String s) {
// 该字母首次出现的位置
int position = userAdapter.getPositionForSection(s.charAt(0));
if (position != -1) {
list_friends.setSelection(position);
}
}
}
/**
* 获取好友列表 queryMyfriends
* @return void
* @throws
*/
private void queryMyfriends() {
// 是否有新的好友请求
if (BmobDB.create(context).hasNewInvite()) {
iv_msg_tips.setVisibility(View.VISIBLE);
} else {
iv_msg_tips.setVisibility(View.GONE);
}
// 在这里再做一次本地的好友数据库的检查,是为了本地好友数据库中已经添加了对方,但是界面却没有显示出来的问题
// 重新设置下内存中保存的好友列表
CustomApplication.getInstance().setContactList(CollectionUtils.list2map(BmobDB.create(context).getContactList()));
Map<String, BmobChatUser> users = CustomApplication.getInstance().getContactList();
// 组装新的User
filledData(CollectionUtils.map2list(users));
if (userAdapter == null) {
userAdapter = new UserFriendAdapter(context, friends);
list_friends.setAdapter(userAdapter);
} else {
userAdapter.notifyDataSetChanged();
}
}
/**
* 为ListView填充数据
* @param date
* @return
*/
private void filledData(List<BmobChatUser> datas) {
friends.clear();
int total = datas.size();
L.i(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.getNick();
// 若没有username
if (username != null) {
String pinyin = characterParser.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("#");
}
friends.add(sortModel);
}
// 根据a-z进行排序
Collections.sort(friends, pinyinComparator);
}
private boolean hidden;
@Override
public void onResume() {
super.onResume();
if (!hidden) {
refresh();
}
}
public void refresh() {
try {
runOnUiThread(new Runnable() {
public void run() {
queryMyfriends();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
User user = (User) userAdapter.getItem(position - 1);
// 开始聊天
Intent intent = new Intent(context, ChatActivity.class);
intent.putExtra("user", user);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
A.goOtherActivity(context, intent);
}
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
User user = (User) userAdapter.getItem(position - 1);
showDeleteDialog(user);
return true;
}
public void showDeleteDialog(final User user) {
Builder builder = new Builder(context);
builder.setTitle("是否删除好友").setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
deleteContact(user);
}
}).setNegativeButton("取消", null).show();
}
/**
* 删除联系人 deleteContact
* @return void
* @throws
*/
private void deleteContact(final User user) {
final ProgressDialog progress = new ProgressDialog(context);
progress.setMessage("正在删除...");
progress.setCanceledOnTouchOutside(false);
progress.show();
userManager.deleteContact(user.getObjectId(), new UpdateListener() {
@Override
public void onSuccess() {
T.show(context, "删除成功");
// 删除内存
CustomApplication.getInstance().getContactList().remove(user.getUsername());
// 更新界面
((Activity) context).runOnUiThread(new Runnable() {
public void run() {
progress.dismiss();
userAdapter.remove(user);
}
});
}
@Override
public void onFailure(int arg0, String arg1) {
T.show(context, "删除失败:" + arg1);
progress.dismiss();
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.layout_add:
A.goOtherActivity(context, AddFriendActivity.class);
break;
case R.id.layout_near:
A.goOtherActivity(context, NearPeopleActivity.class);
break;
case R.id.layout_new:
Intent intent = new Intent(context, NewFriendActivity.class);
intent.putExtra("from", "contact");
A.goOtherActivity(context, intent);
break;
}
}
@Override
public void initTitleBar(ViewGroup rl_title, TextView tv_title, ImageButton ib_back, ImageButton ib_right, View shadow) {
tv_title.setText("好友列表");
}
@Override
public View getContentView() {
return View.inflate(context, R.layout.activity_friend, null);
}
}