package cn.rongcloud.im.ui.activity;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Editable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.style.ForegroundColorSpan;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import cn.rongcloud.im.App;
import cn.rongcloud.im.R;
import cn.rongcloud.im.SealUserInfoManager;
import cn.rongcloud.im.db.DBManager;
import cn.rongcloud.im.db.Friend;
import cn.rongcloud.im.db.FriendDao;
import cn.rongcloud.im.model.SearchResult;
import cn.rongcloud.im.server.pinyin.CharacterParser;
import cn.rongcloud.im.server.utils.RongGenerate;
import cn.rongcloud.im.server.widget.SelectableRoundedImageView;
import de.greenrobot.dao.query.QueryBuilder;
import io.rong.imageloader.core.ImageLoader;
import io.rong.imkit.RongIM;
/**
* Created by tiankui on 16/9/2.
*/
public class SealSearchMoreFriendsActivity extends Activity implements AdapterView.OnItemClickListener {
private EditText mSearchEditText;
private ListView mFriendListView;
private TextView mSearchNoResultsTextView;
private ImageView mPressBackImageView;
private LinearLayout mFriendListResultLinearLayout;
private String mFilterString;
private ArrayList<Friend> mFilterFriendList;
private AsyncTask mAsyncTask;
private ThreadPoolExecutor mExecutor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_more_friends_detail_info);
Intent intent = getIntent();
mFilterString = intent.getStringExtra("filterString");
mFilterFriendList = intent.getParcelableArrayListExtra("filterFriendList");
initView();
initData();
}
public void initView() {
mSearchEditText = (EditText) findViewById(R.id.ac_et_search);
mFriendListView = (ListView) findViewById(R.id.ac_lv_friend_list_detail_info);
mSearchNoResultsTextView = (TextView) findViewById(R.id.ac_tv_search_no_results);
mPressBackImageView = (ImageView) findViewById(R.id.ac_iv_press_back);
mFriendListResultLinearLayout = (LinearLayout)findViewById(R.id.ac_ll_friend_list_result);
}
public void initData() {
mExecutor = new ThreadPoolExecutor(3, 5, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
mSearchEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mFilterString = s.toString();
mAsyncTask = new AsyncTask<String, Void, SearchResult>() {
@Override
protected SearchResult doInBackground(String... params) {
return filterInfo(mFilterString);
}
@Override
protected void onPostExecute(SearchResult searchResult) {
if (searchResult.getFilterStr().equals(mFilterString)) {
List<Friend> filterFriendList = searchResult.getFilterFriendList();
if (filterFriendList.size() > 0) {
mFriendListResultLinearLayout.setVisibility(View.VISIBLE);
mFriendListView.setVisibility(View.VISIBLE);
FriendListAdapter friendListAdapter = new FriendListAdapter(filterFriendList);
mFriendListView.setAdapter(friendListAdapter);
} else {
mFriendListResultLinearLayout.setVisibility(View.GONE);
mFriendListView.setVisibility(View.GONE);
}
if (mFilterString.equals("")) {
mSearchNoResultsTextView.setVisibility(View.GONE);
}
if (filterFriendList.size() == 0) {
if (mFilterString.equals("")) {
mSearchNoResultsTextView.setVisibility(View.GONE);
} else {
mSearchNoResultsTextView.setVisibility(View.VISIBLE);
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
spannableStringBuilder.append(getResources().getString(R.string.ac_search_no_result_pre));
SpannableStringBuilder colorFilterStr = new SpannableStringBuilder(mFilterString);
colorFilterStr.setSpan(new ForegroundColorSpan(Color.parseColor("#0099ff")), 0, mFilterString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableStringBuilder.append(colorFilterStr);
spannableStringBuilder.append(getResources().getString(R.string.ac_search_no_result_suffix));
mSearchNoResultsTextView.setText(spannableStringBuilder);
}
} else {
mSearchNoResultsTextView.setVisibility(View.GONE);
}
}
}
} .executeOnExecutor(mExecutor, s.toString());
}
@Override
public void afterTextChanged(Editable s) {
}
});
mSearchEditText.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
final int DRAWABLE_RIGHT = 2;
if (event.getAction() == MotionEvent.ACTION_UP) {
if (event.getRawX() >= (mSearchEditText.getRight() - 2 * mSearchEditText.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) {
filterInfo("");
mSearchEditText.setText("");
return true;
}
}
return false;
}
});
mPressBackImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SealSearchMoreFriendsActivity.this.finish();
}
});
mFriendListView.setOnItemClickListener(this);
mSearchEditText.setText(mFilterString);
}
private synchronized SearchResult filterInfo(String filterStr) {
List<Friend> filterFriendList = new ArrayList<>();
SearchResult searchResult = new SearchResult();
if (filterStr.equals("")) {
SearchResult result = new SearchResult();
result.setFilterStr("");
result.setFilterFriendList(filterFriendList);
return result;
}
if (filterStr.contains("'")) {
SearchResult result = new SearchResult();
result.setFilterStr(filterStr);
result.setFilterFriendList(filterFriendList);
return result;
}
QueryBuilder queryBuilder = DBManager.getInstance().getDaoSession().getFriendDao().queryBuilder();
filterFriendList = queryBuilder.where(queryBuilder.or(FriendDao.Properties.Name.like("%" + filterStr + "%"),
FriendDao.Properties.DisplayName.like("%" + filterStr + "%"),
FriendDao.Properties.NameSpelling.like(filterStr + "%"),
FriendDao.Properties.DisplayNameSpelling.like(filterStr + "%"))).orderAsc(FriendDao.Properties.DisplayNameSpelling, FriendDao.Properties.NameSpelling).build().list();
searchResult.setFilterStr(filterStr);
searchResult.setFilterFriendList(filterFriendList);
return searchResult;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Object selectObject = parent.getItemAtPosition(position);
if (selectObject instanceof Friend) {
Friend friend = (Friend) selectObject;
if (!TextUtils.isEmpty(friend.getDisplayName())) {
RongIM.getInstance().startPrivateChat(SealSearchMoreFriendsActivity.this, friend.getUserId(), friend.getDisplayName());
} else {
RongIM.getInstance().startPrivateChat(SealSearchMoreFriendsActivity.this, friend.getUserId(), friend.getName());
}
}
}
private class FriendListAdapter extends BaseAdapter {
private List<Friend> filterFriendList;
public FriendListAdapter(List<Friend> filterFriendList) {
this.filterFriendList = filterFriendList;
}
@Override
public int getCount() {
if (filterFriendList != null) {
return filterFriendList.size();
}
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
Friend friend = (Friend) getItem(position);
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = View.inflate(SealSearchMoreFriendsActivity.this, R.layout.item_filter_friend_list, null);
viewHolder.portraitImageView = (SelectableRoundedImageView) convertView.findViewById(R.id.item_aiv_friend_image);
viewHolder.nameDisplayNameLinearLayout = (LinearLayout) convertView.findViewById(R.id.item_ll_friend_name);
viewHolder.displayNameTextView = (TextView) convertView.findViewById(R.id.item_tv_friend_display_name);
viewHolder.nameTextView = (TextView) convertView.findViewById(R.id.item_tv_friend_name);
viewHolder.nameSingleTextView = (TextView) convertView.findViewById(R.id.item_tv_friend_name_single);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
String portraitUri = SealUserInfoManager.getInstance().getPortraitUri(friend);
ImageLoader.getInstance().displayImage(portraitUri, viewHolder.portraitImageView, App.getOptions());
if (!TextUtils.isEmpty(friend.getDisplayName())) {
viewHolder.nameSingleTextView.setVisibility(View.GONE);
viewHolder.nameDisplayNameLinearLayout.setVisibility(View.VISIBLE);
viewHolder.displayNameTextView.setText(CharacterParser.getInstance().getColoredDisplayName(mFilterString, friend.getDisplayName()));
viewHolder.nameTextView.setText(CharacterParser.getInstance().getColoredName(mFilterString, friend.getName()));
} else {
viewHolder.nameDisplayNameLinearLayout.setVisibility(View.GONE);
viewHolder.nameSingleTextView.setVisibility(View.VISIBLE);
viewHolder.nameSingleTextView.setText(CharacterParser.getInstance().getColoredName(mFilterString, friend.getName()));
}
return convertView;
}
@Override
public Object getItem(int position) {
if (filterFriendList == null)
return null;
if (position >= filterFriendList.size())
return null;
return filterFriendList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
}
class ViewHolder {
SelectableRoundedImageView portraitImageView;
LinearLayout nameDisplayNameLinearLayout;
TextView nameTextView;
TextView displayNameTextView;
TextView nameSingleTextView;
}
@Override
protected void onDestroy() {
if (mAsyncTask != null) {
mAsyncTask.cancel(true);
mAsyncTask = null;
}
super.onDestroy();
}
}