package cn.rongcloud.im.ui.activity;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
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.TextWatcher;
import android.text.style.ForegroundColorSpan;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;
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.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import cn.rongcloud.im.R;
import cn.rongcloud.im.db.DBManager;
import cn.rongcloud.im.db.GroupMember;
import cn.rongcloud.im.db.GroupMemberDao;
import cn.rongcloud.im.db.Groups;
import cn.rongcloud.im.db.GroupsDao;
import cn.rongcloud.im.model.SearchResult;
import cn.rongcloud.im.ui.adapter.GroupListAdapter;
import de.greenrobot.dao.query.QueryBuilder;
import io.rong.imkit.RongIM;
/**
* Created by tiankui on 16/9/20.
*/
public class SealSearchMoreGroupActivity extends Activity {
private EditText mSearchEditText;
private ListView mGroupsListView;
private TextView mSearchNoResultsTextView;
private ImageView mPressBackImageView;
private LinearLayout mGroupListResultsLinearLayout;
private String mFilterString;
private List<String> mFilterGroupId;
private AsyncTask mAsyncTask;
private ThreadPoolExecutor mExecutor;
private static final String SQL_DISTINCT_GROUP_ID = "SELECT DISTINCT " + GroupMemberDao.Properties.GroupId.columnName + " FROM " + GroupMemberDao.TABLENAME;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_more_groups_info);
Intent intent = getIntent();
mFilterString = intent.getStringExtra("filterString");
mFilterGroupId = intent.getStringArrayListExtra("filterGroupId");
initView();
initData();
}
public void initView() {
mSearchEditText = (EditText)findViewById(R.id.ac_et_search);
mGroupsListView = (ListView)findViewById(R.id.ac_lv_group_list_detail_info);
mSearchNoResultsTextView = (TextView)findViewById(R.id.ac_tv_search_no_results);
mPressBackImageView = (ImageView)findViewById(R.id.ac_iv_press_back);
mGroupListResultsLinearLayout = (LinearLayout)findViewById(R.id.ac_ll_group_list_result);
mSearchEditText.setText(mFilterString);
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 void onPreExecute() {
}
@Override
protected SearchResult doInBackground(String... params) {
return filterInfo(mFilterString);
}
@Override
protected void onPostExecute(SearchResult searchResult) {
if (searchResult.getFilterStr().equals(mFilterString)) {
Map<String, List<GroupMember>> filterGroupNameListMap = searchResult.getFilterGroupNameListMap();
Map<String, List<GroupMember>> filterGroupMemberNameListMap = searchResult.getFilterGroupMemberNameListMap();
List<String> filterGroupId = searchResult.getFilterGroupId();
if (filterGroupId.size() > 0) {
mGroupListResultsLinearLayout.setVisibility(View.VISIBLE);
mGroupsListView.setVisibility(View.VISIBLE);
GroupListAdapter groupListAdapter = new GroupListAdapter(SealSearchMoreGroupActivity.this, filterGroupId, filterGroupNameListMap, filterGroupMemberNameListMap, mFilterString);
mGroupsListView.setAdapter(groupListAdapter);
} else {
mGroupListResultsLinearLayout.setVisibility(View.GONE);
mGroupsListView.setVisibility(View.GONE);
}
if (mFilterString.equals("")) {
mSearchNoResultsTextView.setVisibility(View.GONE);
}
if ( filterGroupId.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())) {
mSearchEditText.setText("");
mSearchEditText.clearFocus();
return true;
}
}
return false;
}
});
mPressBackImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SealSearchMoreGroupActivity.this.finish();
}
});
mGroupsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Object selectObject = parent.getItemAtPosition(position);
if (selectObject instanceof String) {
String groupId = (String) selectObject;
Groups groupInfo = DBManager.getInstance().getDaoSession().getGroupsDao().queryBuilder().where(GroupsDao.Properties.GroupsId.eq(groupId)).unique();
if (groupInfo != null) {
RongIM.getInstance().startGroupChat(SealSearchMoreGroupActivity.this, groupInfo.getGroupsId(), groupInfo.getName());
}
}
}
});
}
public void initData() {
filterList(mFilterString);
mExecutor = new ThreadPoolExecutor(3, 5, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
}
private void filterList(String filterStr) {
Map<String, List<GroupMember>> filterGroupNameListMap = new HashMap<>();
Map<String, List<GroupMember>> filterGroupMemberNameListMap = new HashMap<>();
for (String groupId : mFilterGroupId) {
QueryBuilder groupNameQueryBuilder = DBManager.getInstance().getDaoSession().getGroupMemberDao().queryBuilder();
List<GroupMember> filterGroupNameList = groupNameQueryBuilder.where(GroupMemberDao.Properties.GroupId.eq(groupId),
groupNameQueryBuilder.or(GroupMemberDao.Properties.GroupName.like("%" + mFilterString + "%"),
GroupMemberDao.Properties.GroupNameSpelling.like(mFilterString + "%"))).orderAsc(GroupMemberDao.Properties.GroupNameSpelling).build().list();
QueryBuilder groupMemberNameQueryBuilder = DBManager.getInstance().getDaoSession().getGroupMemberDao().queryBuilder();
List<GroupMember> filterGroupMemberNameList = groupMemberNameQueryBuilder.where(GroupMemberDao.Properties.GroupId.eq(groupId),
groupMemberNameQueryBuilder.or(GroupMemberDao.Properties.Name.like("%" + mFilterString + "%"),
GroupMemberDao.Properties.NameSpelling.like(mFilterString + "%"),
GroupMemberDao.Properties.DisplayName.like("%" + mFilterString + "%"),
GroupMemberDao.Properties.DisplayNameSpelling.like(mFilterString + "%"))
).orderAsc(GroupMemberDao.Properties.NameSpelling, GroupMemberDao.Properties.DisplayNameSpelling).build().list();
if (filterGroupNameList.size() != 0) {
filterGroupNameListMap.put(groupId, filterGroupNameList);
} else {
filterGroupNameListMap.put(groupId, null);
}
if (filterGroupMemberNameList.size() != 0) {
filterGroupMemberNameListMap.put(groupId, filterGroupMemberNameList);
} else {
filterGroupMemberNameListMap.put(groupId, null);
}
}
GroupListAdapter groupListAdapter = new GroupListAdapter(this, mFilterGroupId, filterGroupNameListMap, filterGroupMemberNameListMap, filterStr);
mGroupsListView.setAdapter(groupListAdapter);
}
private synchronized SearchResult filterInfo(String filterStr) {
List<String> filterGroupId = new ArrayList<>();
Map<String, List<GroupMember>> filterGroupNameListMap = new HashMap<>();
Map<String, List<GroupMember>> filterGroupMemberNameListMap = new HashMap<>();
SearchResult searchResult = new SearchResult();
if (filterStr.equals("")) {
SearchResult result = new SearchResult();
result.setFilterStr("");
result.setFilterGroupId(filterGroupId);
result.setFilterGroupNameListMap(filterGroupNameListMap);
result.setFilterGroupNameListMap(filterGroupMemberNameListMap);
return result;
}
if (filterStr.contains("'")) {
SearchResult result = new SearchResult();
result.setFilterStr(filterStr);
result.setFilterGroupId(filterGroupId);
result.setFilterGroupNameListMap(filterGroupNameListMap);
result.setFilterGroupNameListMap(filterGroupMemberNameListMap);
return result;
}
/**
* 从数据库里边查询符合条件的数据
*/
Cursor cursor = DBManager.getInstance().getDaoSession().getDatabase().rawQuery(SQL_DISTINCT_GROUP_ID
+ " WHERE " + GroupMemberDao.Properties.GroupName.columnName + " LIKE " + "'" + "%" + filterStr + "%" + "'" + " or "
+ GroupMemberDao.Properties.GroupNameSpelling.columnName + " like " + "'" + filterStr + "%" + "'" + " or "
+ GroupMemberDao.Properties.Name.columnName + " like " + "'" + "%" + filterStr + "%" + "'" + " or "
+ GroupMemberDao.Properties.NameSpelling.columnName + " like " + "'" + filterStr + "%" + "'" + " or "
+ GroupMemberDao.Properties.DisplayName.columnName + " like " + "'" + "%" + filterStr + "%" + "'" + " or "
+ GroupMemberDao.Properties.DisplayNameSpelling.columnName + " like " + "'" + filterStr + "%" + "'", null);
try {
if (cursor.moveToFirst()) {
do {
filterGroupId.add(cursor.getString(0));
} while (cursor.moveToNext());
}
} finally {
cursor.close();
}
for (String groupId : filterGroupId) {
QueryBuilder groupNameQueryBuilder = DBManager.getInstance().getDaoSession().getGroupMemberDao().queryBuilder();
List<GroupMember> filterGroupNameList = groupNameQueryBuilder.where(GroupMemberDao.Properties.GroupId.eq(groupId),
groupNameQueryBuilder.or(GroupMemberDao.Properties.GroupName.like("%" + filterStr + "%"),
GroupMemberDao.Properties.GroupNameSpelling.like(filterStr + "%"))).orderAsc(GroupMemberDao.Properties.GroupNameSpelling).build().list();
QueryBuilder groupMemberNameQueryBuilder = DBManager.getInstance().getDaoSession().getGroupMemberDao().queryBuilder();
List<GroupMember> filterGroupMemberNameList = groupMemberNameQueryBuilder.where(GroupMemberDao.Properties.GroupId.eq(groupId),
groupMemberNameQueryBuilder.or(GroupMemberDao.Properties.Name.like("%" + filterStr + "%"),
GroupMemberDao.Properties.NameSpelling.like(filterStr + "%"),
GroupMemberDao.Properties.DisplayName.like("%" + filterStr + "%"),
GroupMemberDao.Properties.DisplayNameSpelling.like(filterStr + "%"))
).orderAsc(GroupMemberDao.Properties.NameSpelling, GroupMemberDao.Properties.DisplayNameSpelling).build().list();
if (filterGroupNameList.size() != 0) {
filterGroupNameListMap.put(groupId, filterGroupNameList);
} else {
filterGroupNameListMap.put(groupId, null);
}
if (filterGroupMemberNameList.size() != 0) {
filterGroupMemberNameListMap.put(groupId, filterGroupMemberNameList);
} else {
filterGroupMemberNameListMap.put(groupId, null);
}
}
searchResult.setFilterStr(filterStr);
searchResult.setFilterGroupId(filterGroupId);
searchResult.setFilterGroupNameListMap(filterGroupNameListMap);
searchResult.setFilterGroupMemberNameListMap(filterGroupMemberNameListMap);
return searchResult;
}
@Override
protected void onDestroy() {
if (mAsyncTask != null) {
mAsyncTask.cancel(true);
mAsyncTask = null;
}
super.onDestroy();
}
}