package org.qii.weiciyuan.ui.send;
import org.qii.weiciyuan.bean.AtUserBean;
import org.qii.weiciyuan.dao.search.AtUserDao;
import org.qii.weiciyuan.support.lib.WeiboPatterns;
import org.qii.weiciyuan.support.utils.GlobalContext;
import org.qii.weiciyuan.support.utils.Utility;
import android.R;
import android.app.Activity;
import android.os.SystemClock;
import android.text.Layout;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
/**
* User: qii
* Date: 13-6-7
*/
public class AutoCompleteAdapter extends ArrayAdapter<AtUserBean> implements Filterable {
private Activity activity;
private AutoCompleteTextView content;
private ProgressBar pb;
private List<AtUserBean> data;
private int res;
private int selectPosition = -1;
private int atSignPosition = -1;
public AutoCompleteAdapter(Activity context, AutoCompleteTextView content, ProgressBar pb) {
super(context, android.R.layout.simple_list_item_1);
data = new ArrayList<AtUserBean>();
this.activity = context;
this.res = R.layout.simple_list_item_1;
this.pb = pb;
this.content = content;
this.content.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String searchFetchedWord = getItem(position).getNickname();
int searchFetchedWordLength = searchFetchedWord.length();
int calcResultSelectionPosition = atSignPosition + searchFetchedWordLength;
AutoCompleteAdapter.this.content.setSelection(calcResultSelectionPosition + 2);
}
});
}
@Override
public int getCount() {
return data.size();
}
@Override
public AtUserBean getItem(int index) {
return data.get(index);
}
@Override
public Filter getFilter() {
return filter;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
View view;
TextView text;
if (convertView == null) {
view = activity.getLayoutInflater().inflate(res, parent, false);
} else {
view = convertView;
}
text = (TextView) view;
text.setText(getItem(position).getNickname());
return view;
}
public View getView(int position, View convertView, ViewGroup parent) {
return getDropDownView(position, convertView, parent);
}
private Filter filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
pb.setVisibility(View.GONE);
}
});
FilterResults filterResults = new FilterResults();
//AutoCompleteTextView is empty, return empty;
if (TextUtils.isEmpty(constraint)) {
return filterResults;
}
selectPosition = content.getSelectionStart();
if (selectPosition == 0) {
return filterResults;
}
String contentStr = constraint.toString();
String search = contentStr.substring(0, selectPosition);
//must contain @ sign
if (!search.contains("@")) {
return filterResults;
}
int start = search.lastIndexOf("@");
if (start == search.length() - 1) {
return filterResults;
}
String q = "";
Matcher localMatcher = WeiboPatterns.MENTION_URL.matcher(search);
boolean canDoSearch = false;
while (localMatcher.find()) {
String str2 = localMatcher.group(0);
int k = localMatcher.start();
int m = localMatcher.end();
if (m == selectPosition) {
q = str2.substring(1);
atSignPosition = k;
canDoSearch = true;
}
}
if (!canDoSearch) {
return filterResults;
}
SystemClock.sleep(500);
if (!contentStr.equals(content.getText().toString())) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
pb.setVisibility(View.GONE);
}
});
return filterResults;
}
AtUserDao dao = new AtUserDao(GlobalContext.getInstance().getSpecialToken(), q);
// SearchDao dao = new SearchDao(GlobalContext.getInstance().getSpecialToken(), q);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
pb.setVisibility(View.VISIBLE);
}
});
try {
// data = dao.getUserList().getUsers();
data = dao.getUserInfo();
} catch (Exception e) {
}
// Now assign the values and count to the FilterResults object
filterResults.values = data;
filterResults.count = data.size();
if (!contentStr.equals(content.getText().toString())) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
pb.setVisibility(View.GONE);
}
});
return filterResults;
}
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
pb.setVisibility(View.GONE);
// int pos = content.getSelectionStart();
int pos = atSignPosition;
Layout layout = content.getLayout();
int line = layout.getLineForOffset(pos);
int baseline = layout.getLineBaseline(line);
int ascent = layout.getLineAscent(line);
float x = layout.getPrimaryHorizontal(pos);
float y = baseline + ascent;
int height = content.getBottom();
content.setDropDownVerticalOffset(-(int) (height - y) + Utility.dip2px(24));
content.setDropDownHorizontalOffset((int) x);
content.setDropDownWidth((Utility.getScreenWidth() * 2) / 3);
}
});
return filterResults;
}
@Override
public CharSequence convertResultToString(Object resultValue) {
String ori = content.getText().toString();
String result = ((AtUserBean) resultValue).getNickname();
String left = ori.substring(0, atSignPosition + 1);
String right = "";
if (selectPosition <= ori.length() - 1) {
right = ori.substring(selectPosition);
}
ori = left + result + " " + right;
return ori;
}
@Override
protected void publishResults(CharSequence contraint, FilterResults results) {
if (results != null && results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
};
}