Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0b63458c authored by Fabrice Di Meglio's avatar Fabrice Di Meglio
Browse files

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
parent 0d4005a1
Loading
Loading
Loading
Loading
+14 −33
Original line number Diff line number Diff line
@@ -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 {