Improve query filtering for Search
- there was a crash when inputing "w" then "-" then "-". This crash was due to the InputFilter which got some strange indices from the BaseInputConnection. - so now we are doing our own filtering before sending the query to Sqlite. We only keep Letters / Digits / Spaces. Change-Id: I66dcbebeec9217cf8fd65a16b10fe2304d98cf58
This commit is contained in:
@@ -22,9 +22,6 @@ import android.database.Cursor;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Bundle;
|
||||
import android.text.Editable;
|
||||
import android.text.InputFilter;
|
||||
import android.text.SpannableStringBuilder;
|
||||
import android.text.Spanned;
|
||||
import android.text.TextUtils;
|
||||
import android.text.TextWatcher;
|
||||
import android.view.LayoutInflater;
|
||||
@@ -69,32 +66,6 @@ public class DashboardSummary extends Fragment {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A basic InputFilter for filtering query input (mainly because we are issuing SQL queries
|
||||
* that need to be valid ones. So just accept Letters, Digits and Spaces.
|
||||
*/
|
||||
private class QueryInputFilter implements InputFilter {
|
||||
|
||||
public QueryInputFilter() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence filter(CharSequence source, int start, int end, Spanned dest,
|
||||
int dstart, int dend) {
|
||||
SpannableStringBuilder sb = null;
|
||||
for (int i = start; i < end; i++) {
|
||||
char c = source.charAt(i);
|
||||
if (!Character.isLetterOrDigit(c) && !Character.isSpaceChar(c)) {
|
||||
if (sb == null) {
|
||||
sb = new SpannableStringBuilder(source, start, end);
|
||||
}
|
||||
sb.delete(i, i + 1);
|
||||
}
|
||||
}
|
||||
return sb;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
@@ -147,9 +118,6 @@ public class DashboardSummary extends Fragment {
|
||||
}
|
||||
});
|
||||
|
||||
final InputFilter queryFilter = new QueryInputFilter();
|
||||
mEditText.setFilters(new InputFilter[] { queryFilter });
|
||||
|
||||
mListView = (ListView) view.findViewById(R.id.list_results);
|
||||
mListView.setAdapter(mAdapter);
|
||||
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
||||
@@ -191,12 +159,25 @@ public class DashboardSummary extends Fragment {
|
||||
}
|
||||
}
|
||||
|
||||
private String getFilteredQueryString() {
|
||||
final CharSequence query = mEditText.getText().toString();
|
||||
final StringBuilder filtered = new StringBuilder();
|
||||
for (int n = 0; n < query.length(); n++) {
|
||||
char c = query.charAt(n);
|
||||
if (!Character.isLetterOrDigit(c) && !Character.isSpaceChar(c)) {
|
||||
continue;
|
||||
}
|
||||
filtered.append(c);
|
||||
}
|
||||
return filtered.toString();
|
||||
}
|
||||
|
||||
private void updateSearchResults() {
|
||||
if (mUpdateSearchResultsTask != null) {
|
||||
mUpdateSearchResultsTask.cancel(false);
|
||||
mUpdateSearchResultsTask = null;
|
||||
}
|
||||
final String query = mEditText.getText().toString();
|
||||
final String query = getFilteredQueryString();
|
||||
if (TextUtils.isEmpty(query)) {
|
||||
setCursor(null);
|
||||
} else {
|
||||
|
Reference in New Issue
Block a user