package com.kaixin.android.menu;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import android.content.Context;
import android.content.Intent;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.TypedValue;
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.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SectionIndexer;
import android.widget.TextView;
import com.kaixin.android.KXApplication;
import com.kaixin.android.R;
import com.kaixin.android.activity.AddFriendActivity;
import com.kaixin.android.activity.ExportActivity;
import com.kaixin.android.activity.FriendInfoActivity;
import com.kaixin.android.activity.FriendsActivity;
import com.kaixin.android.common.Constants;
import com.kaixin.android.result.FriendsResult;
import com.kaixin.android.result.PublicPageResult;
import com.kaixin.android.ui.base.FlipperLayout.OnOpenListener;
import com.kaixin.android.ui.base.MyLetterListView;
import com.kaixin.android.ui.base.MyLetterListView.OnTouchingLetterChangedListener;
import com.kaixin.android.utils.CallService;
import com.kaixin.android.utils.CommonUtils;
import com.kaixin.android.utils.ImageUtil;
import com.kaixin.android.utils.TextUtil;
import com.nostra13.universalimageloader.core.ImageLoader;
/**
* 菜单好友类
*
* @author gyz
*
*/
public class Friends {
private Context mContext;
private KXApplication mKXApplication;
private View mFriends;
private Button mMenu;
private Button mAdd;
private EditText mSearch;
private TextView mBirthday;
private ListView mDisplay;
private MyLetterListView mLetter;
private Button mAll;
private Button mPage;
private TextUtil mTextUtil;
private Adapter mAdapter;
private OnOpenListener mOnOpenListener;
// 当前显示的好友数据
private List<FriendsResult> mMyFriendsResults = new ArrayList<FriendsResult>();
// 当前显示的好友的姓名的首字母的在列表中的位置
private List<Integer> mMyFriendsPosition = new ArrayList<Integer>();
// 当前显示的好友的姓名的首字母数据
private List<String> mMyFriendsFirstName = new ArrayList<String>();
// 当前显示的公共主页数据
private List<PublicPageResult> mMyPublicPageResults = new ArrayList<PublicPageResult>();
// 是否显示的是好友内容
private boolean mIsAll = true;
public Friends(Context context, KXApplication application) {
mContext = context;
mKXApplication = application;
mFriends = LayoutInflater.from(context).inflate(R.layout.friends, null);
findViewById();
setListener();
init();
}
private void findViewById() {
mMenu = (Button) mFriends.findViewById(R.id.friends_menu);
mAdd = (Button) mFriends.findViewById(R.id.friends_add);
mSearch = (EditText) mFriends.findViewById(R.id.friends_search);
mBirthday = (TextView) mFriends.findViewById(R.id.friends_birthday);
mLetter = (MyLetterListView) mFriends.findViewById(R.id.friends_letter);
mDisplay = (ListView) mFriends.findViewById(R.id.friends_display);
mAll = (Button) mFriends.findViewById(R.id.friends_all);
mPage = (Button) mFriends.findViewById(R.id.friends_page);
if(!CommonUtils.isNetWorkConnected(mKXApplication)){
mFriends.findViewById(R.id.warnning_layout).setVisibility(View.VISIBLE);
}else{
mFriends.findViewById(R.id.warnning_layout).setVisibility(View.GONE);
}
}
private void setListener() {
mMenu.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (mOnOpenListener != null) {
mOnOpenListener.open();
}
}
});
mAdd.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(mContext, AddFriendActivity.class);
mContext.startActivity(intent);
}
});
mAll.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// 如果显示的不是好友内容则显示好友内容数据
if (!mIsAll) {
mIsAll = true;
mAll.setBackgroundResource(R.drawable.bottomtabbutton_leftred);
mPage.setBackgroundResource(R.drawable.bottomtabbutton_rightwhite);
int left = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 20, mContext
.getResources().getDisplayMetrics());
mPage.setPadding(left, 0, 0, 0);
mSearch.setText("");
mBirthday.setVisibility(View.VISIBLE);
mLetter.setVisibility(View.VISIBLE);
mAdapter = new Adapter();
mDisplay.setAdapter(mAdapter);
}
}
});
mPage.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// 如果显示的是好友内容则显示公共主页内容数据
if (mIsAll) {
mIsAll = false;
mAll.setBackgroundResource(R.drawable.bottomtabbutton_leftwhite);
mPage.setBackgroundResource(R.drawable.bottomtabbutton_rightred);
int left = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 20, mContext
.getResources().getDisplayMetrics());
mPage.setPadding(left, 0, 0, 0);
mSearch.setText("");
mBirthday.setVisibility(View.GONE);
mLetter.setVisibility(View.GONE);
mAdapter = new Adapter();
mDisplay.setAdapter(mAdapter);
}
}
});
mLetter.setOnTouchingLetterChangedListener(new OnTouchingLetterChangedListener() {
public void onTouchingLetterChanged(String s) {
// 根据触摸的字母,跳转到响应位置
if (mKXApplication.mMyFriendsFirstNamePosition.get(s) != null) {
mDisplay.setSelection(mKXApplication.mMyFriendsFirstNamePosition
.get(s));
}
}
});
mSearch.addTextChangedListener(new TextWatcher() {
// 当文本改变时调用
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// 获取当前输入的内容并大写
String searchChar = s.toString().toUpperCase();
// 如果显示的是好友内容
if (mIsAll) {
// 清除当前所有的数据
mMyFriendsResults.clear();
mMyFriendsPosition.clear();
mMyFriendsFirstName.clear();
// 判断输入内容的长度
if (searchChar.length() > 0) {
// 判断是否是字母
if (searchChar.matches("^[a-z,A-Z].*$")) {
// 判断当前好友里是有存在这个字母,有的话则取出数据更新界面,否则直接更新界面
if (mKXApplication.mMyFriendsGroupByFirstName
.containsKey(searchChar)) {
List<FriendsResult> results = mKXApplication.mMyFriendsGroupByFirstName
.get(searchChar);
mMyFriendsResults.addAll(results);
mMyFriendsFirstName.add(searchChar);
mMyFriendsPosition.add(0);
mAdapter.notifyDataSetChanged();
} else {
mAdapter.notifyDataSetChanged();
}
} else {
mAdapter.notifyDataSetChanged();
}
} else {
// 输入框没内容时,获取全部好友并更新界面
mMyFriendsResults
.addAll(mKXApplication.mMyFriendsResults);
mMyFriendsPosition
.addAll(mKXApplication.mMyFriendsPosition);
mMyFriendsFirstName
.addAll(mKXApplication.mMyFriendsFirstName);
mAdapter.notifyDataSetChanged();
}
} else {
// 清除当前所有的数据
mMyPublicPageResults.clear();
// 判断输入内容的长度
if (searchChar.length() > 0) {
// 判断是否是字母
if (searchChar.matches("^[a-z,A-Z].*$")) {
// 判断当前公共主页里是有存在这个字母,有的话则取出数据更新界面,否则直接更新界面
if (mKXApplication.mMyPublicPageGroupByFirstName
.containsKey(searchChar)) {
mMyPublicPageResults
.addAll(mKXApplication.mMyPublicPageGroupByFirstName
.get(searchChar));
mAdapter.notifyDataSetChanged();
} else {
mAdapter.notifyDataSetChanged();
}
} else {
mAdapter.notifyDataSetChanged();
}
} else {
// 输入框没内容时,获取全部公共主页并更新界面
mMyPublicPageResults
.addAll(mKXApplication.mMyPublicPageResults);
mAdapter.notifyDataSetChanged();
}
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void afterTextChanged(Editable s) {
}
});
mDisplay.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
int section = getSectionForPosition(position);
FriendsResult friend = mKXApplication.mMyFriendsGroupByFirstName
.get(mMyFriendsFirstName.get(section)).get(
position - getPositionForSection(section));
// FriendsResult friend = mKXApplication.mMyFriendsResults.get(position);
Intent intent = new Intent();
intent.setClass(mContext, FriendInfoActivity.class);
intent.putExtra("email", friend.getEmail());
intent.putExtra("uid", friend.getUid());
intent.putExtra("name", friend.getName());
intent.putExtra("avatar", friend.getAvatar());
mContext.startActivity(intent);
}
private int getPositionForSection(int section) {
if (section < 0 || section >= mMyFriendsFirstName.size()) {
return -1;
}
return mMyFriendsPosition.get(section);
}
private int getSectionForPosition(int position) {
if (position < 0 || position >= mMyFriendsResults.size()) {
return -1;
}
int index = Arrays.binarySearch(mMyFriendsPosition.toArray(),
position);
return index >= 0 ? index : -index - 2;
}
});
}
private void init() {
// 实例化文本工具
mTextUtil = new TextUtil(mKXApplication);
// 获取我的好友
getMyFriends();
// 获取公共主页
getPublicPage();
// 添加适配器
mAdapter = new Adapter();
mDisplay.setAdapter(mAdapter);
}
public void fresh(){
mKXApplication.mMyFriendsResults.clear();
mKXApplication.mMyFriendsPosition.clear();
mKXApplication.mMyFriendsFirstName.clear();
mMyFriendsResults.clear();
mMyFriendsPosition.clear();
mMyFriendsFirstName.clear();
// 获取我的好友
getMyFriends();
mAdapter.notifyDataSetChanged();
}
/**
* 获取我的好友
*/
private void getMyFriends() {
if (mKXApplication.mMyFriendsResults.isEmpty()) {
String json = CallService.getMyFriends("");
try {
JSONObject object = new JSONObject(json);
JSONArray array = object.getJSONArray("data");
FriendsResult result = null;
for (int i = 0; i < array.length(); i++) {
result = new FriendsResult();
result.setUid(array.getJSONObject(i).getString("uid"));
result.setName(array.getJSONObject(i).getString("name"));
result.setAvatar(array.getJSONObject(i).getString("avatar"));
result.setEmail(array.getJSONObject(i).getString("email"));
result.setName_pinyin(mTextUtil.getStringPinYin(result
.getName()));
if (!TextUtils.isEmpty(result.getName_pinyin())) {
result.setName_first(result.getName_pinyin()
.substring(0, 1).toUpperCase());
}
mKXApplication.mMyFriendsResults.add(result);
if (result.getName_first().matches("^[a-z,A-Z].*$")) {
if (mKXApplication.mMyFriendsFirstName.contains(result
.getName_first())) {
mKXApplication.mMyFriendsGroupByFirstName.get(
result.getName_first()).add(result);
} else {
mKXApplication.mMyFriendsFirstName.add(result
.getName_first());
List<FriendsResult> list = new ArrayList<FriendsResult>();
list.add(result);
mKXApplication.mMyFriendsGroupByFirstName.put(
result.getName_first(), list);
}
} else {
if (mKXApplication.mMyFriendsFirstName.contains("#")) {
mKXApplication.mMyFriendsGroupByFirstName.get("#")
.add(result);
} else {
mKXApplication.mMyFriendsFirstName.add("#");
List<FriendsResult> list = new ArrayList<FriendsResult>();
list.add(result);
mKXApplication.mMyFriendsGroupByFirstName.put("#",
list);
}
}
}
Collections.sort(mKXApplication.mMyFriendsFirstName);
int position = 0;
for (int i = 0; i < mKXApplication.mMyFriendsFirstName.size(); i++) {
mKXApplication.mMyFriendsFirstNamePosition
.put(mKXApplication.mMyFriendsFirstName.get(i),
position);
mKXApplication.mMyFriendsPosition.add(position);
position += mKXApplication.mMyFriendsGroupByFirstName.get(
mKXApplication.mMyFriendsFirstName.get(i)).size();
}
} catch (Exception e) {
}
mMyFriendsResults.addAll(mKXApplication.mMyFriendsResults);
mMyFriendsPosition.addAll(mKXApplication.mMyFriendsPosition);
mMyFriendsFirstName.addAll(mKXApplication.mMyFriendsFirstName);
}
}
/**
* 获取公共主页
*/
private void getPublicPage() {
/*if (mKXApplication.mMyPublicPageResults.isEmpty()) {
InputStream inputStream;
try {
inputStream = mContext.getAssets()
.open("data/my_publicpage.KX");
String json = new TextUtil(mKXApplication)
.readTextFile(inputStream);
JSONArray array = new JSONArray(json);
PublicPageResult result = null;
for (int i = 0; i < array.length(); i++) {
result = new PublicPageResult();
result.setUid(array.getJSONObject(i).getString("uid"));
result.setName(array.getJSONObject(i).getString("name"));
result.setAvatar(array.getJSONObject(i).getInt("avatar"));
result.setEmail(array.getJSONObject(i).getString("email"));
result.setName_pinyin(mTextUtil.getStringPinYin(result
.getName()));
if (!TextUtils.isEmpty(result.getName_pinyin())) {
result.setName_first(result.getName_pinyin()
.substring(0, 1).toUpperCase());
}
mKXApplication.mMyPublicPageResults.add(result);
if (result.getName_first().matches("^[a-z,A-Z].*$")) {
if (mKXApplication.mMyPublicPageGroupByFirstName
.containsKey(result.getName_first())) {
mKXApplication.mMyPublicPageGroupByFirstName.get(
result.getName_first()).add(result);
} else {
List<PublicPageResult> list = new ArrayList<PublicPageResult>();
list.add(result);
mKXApplication.mMyPublicPageGroupByFirstName.put(
result.getName_first(), list);
}
} else {
if (mKXApplication.mMyPublicPageGroupByFirstName
.containsKey("#")) {
mKXApplication.mMyPublicPageGroupByFirstName.get(
"#").add(result);
} else {
List<PublicPageResult> list = new ArrayList<PublicPageResult>();
list.add(result);
mKXApplication.mMyPublicPageGroupByFirstName.put(
"#", list);
}
}
}
mMyPublicPageResults
.addAll(mKXApplication.mMyPublicPageResults);
} catch (Exception e) {
e.printStackTrace();
}
}*/
}
private class Adapter extends BaseAdapter implements SectionIndexer {
public int getCount() {
if (mIsAll) {
return mMyFriendsResults.size();
} else {
return mMyPublicPageResults.size();
}
}
public Object getItem(int position) {
if (mIsAll) {
return mMyFriendsResults.get(position);
} else {
return mMyPublicPageResults.get(position);
}
}
public long getItemId(int position) {
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(
R.layout.friends_item, null);
holder = new ViewHolder();
holder.alpha = (TextView) convertView
.findViewById(R.id.friends_item_alpha);
holder.alpha_line = (ImageView) convertView
.findViewById(R.id.friends_item_alpha_line);
holder.avatar = (ImageView) convertView
.findViewById(R.id.friends_item_avatar);
holder.name = (TextView) convertView
.findViewById(R.id.friends_item_name);
holder.arrow = (ImageView) convertView
.findViewById(R.id.friends_item_arrow);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (mIsAll) {
int section = getSectionForPosition(position);
final FriendsResult result = mKXApplication.mMyFriendsGroupByFirstName
.get(mMyFriendsFirstName.get(section)).get(
position - getPositionForSection(section));
if (getPositionForSection(section) == position) {
holder.alpha.setVisibility(View.VISIBLE);
holder.alpha_line.setVisibility(View.VISIBLE);
holder.alpha.setText(mMyFriendsFirstName.get(section));
} else {
holder.alpha.setVisibility(View.GONE);
holder.alpha_line.setVisibility(View.GONE);
}
holder.name.setText(result.getName());
// holder.avatar.setImageBitmap(mKXApplication.getAvatar(result
// .getAvatar()));
ImageLoader.getInstance().displayImage(Constants.getImageUrl() + result.getAvatar(), holder.avatar, ImageUtil.getOption());
holder.arrow.setVisibility(View.GONE);
} else {
PublicPageResult result = mMyPublicPageResults.get(position);
holder.alpha.setVisibility(View.GONE);
holder.alpha_line.setVisibility(View.GONE);
holder.arrow.setVisibility(View.VISIBLE);
// holder.avatar.setImageBitmap(mKXApplication
// .getPublicPageAvatar(result.getAvatar()));
ImageLoader.getInstance().displayImage(Constants.getImageUrl() + result.getAvatar(), holder.avatar, ImageUtil.getOption());
holder.name.setText(result.getName());
}
return convertView;
}
class ViewHolder {
TextView alpha;
ImageView alpha_line;
ImageView avatar;
TextView name;
ImageView arrow;
}
public Object[] getSections() {
return mMyFriendsFirstName.toArray();
}
public int getPositionForSection(int section) {
if (section < 0 || section >= mMyFriendsFirstName.size()) {
return -1;
}
return mMyFriendsPosition.get(section);
}
public int getSectionForPosition(int position) {
if (position < 0 || position >= mMyFriendsResults.size()) {
return -1;
}
int index = Arrays.binarySearch(mMyFriendsPosition.toArray(),
position);
return index >= 0 ? index : -index - 2;
}
}
public View getView() {
return mFriends;
}
public void setOnOpenListener(OnOpenListener onOpenListener) {
mOnOpenListener = onOpenListener;
}
}