From bd0e9e0a3ce79bfafe5b5c91ec2b345b689b4110 Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Thu, 4 Feb 2016 07:29:00 +1100 Subject: [PATCH 1/2] When no keywords to search, use an empty query selection that evaluates to "1". This means that instead of building invalid SQL such as `WHERE (() OR ())` it will build `WHERE((1) OR (1))` which, while non-optimal, is at least valid. Fixes issue #560. --- CHANGELOG.md | 4 ++++ .../org/fdroid/fdroid/data/AppProvider.java | 22 ++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 726246a26..c8898fb7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +### Upcoming Release + +* Fix bug when entering only a space into the search dialog. + ### 0.98 (2015-02-02) * Add opt-in crash reporting via ACRA diff --git a/F-Droid/src/org/fdroid/fdroid/data/AppProvider.java b/F-Droid/src/org/fdroid/fdroid/data/AppProvider.java index 90935ee8e..bb5e57bf6 100644 --- a/F-Droid/src/org/fdroid/fdroid/data/AppProvider.java +++ b/F-Droid/src/org/fdroid/fdroid/data/AppProvider.java @@ -614,15 +614,14 @@ public class AppProvider extends FDroidProvider { } private AppQuerySelection querySearch(String query) { - final String[] columns = { - getTableName() + ".id", - getTableName() + ".name", - getTableName() + ".summary", - getTableName() + ".description", - }; - - // Remove duplicates, surround in % for wildcard searching + // Put in a Set to remove duplicates final Set keywordSet = new HashSet<>(Arrays.asList(query.split("\\s"))); + + if (keywordSet.size() == 0) { + return new AppQuerySelection(); + } + + // Surround each keyword in % for wildcard searching final String[] keywords = new String[keywordSet.size()]; int iKeyword = 0; for (final String keyword : keywordSet) { @@ -630,6 +629,13 @@ public class AppProvider extends FDroidProvider { iKeyword++; } + final String[] columns = { + getTableName() + ".id", + getTableName() + ".name", + getTableName() + ".summary", + getTableName() + ".description", + }; + // Build selection string and fill out keyword arguments final StringBuilder selection = new StringBuilder(); final String[] selectionKeywords = new String[columns.length * keywords.length]; From 8060ac88c31d2df9a9699e9db8e33507aa039716 Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Thu, 4 Feb 2016 07:46:14 +1100 Subject: [PATCH 2/2] Don't update search query unless it has changed meaningfully. Changing the search query is quite an expensive operation, so this does some rudimentary checking to see if the two queries are meaningfully different. At present, it trims the strings and does a case insensitive comparison. The query is eventually exploded based on whitespace, so leading and trailing white space is not important. Also, sqlite `LIKE` clauses are case insensitive, so case is unimportant. Having said that, I'm not sure how someone will be able to change the queries case without first deleting and then adding characters (thus inducing meaningfull changse). --- .../fdroid/views/AppListFragmentPagerAdapter.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/F-Droid/src/org/fdroid/fdroid/views/AppListFragmentPagerAdapter.java b/F-Droid/src/org/fdroid/fdroid/views/AppListFragmentPagerAdapter.java index 9e9e47ea3..59d1d4ec4 100644 --- a/F-Droid/src/org/fdroid/fdroid/views/AppListFragmentPagerAdapter.java +++ b/F-Droid/src/org/fdroid/fdroid/views/AppListFragmentPagerAdapter.java @@ -58,7 +58,22 @@ public class AppListFragmentPagerAdapter extends FragmentPagerAdapter { return parent.getString(R.string.tab_updates_count, updateCount); } + /** + * Changing the search query is quite an expensive operation, so this does some rudimentary + * checking to see if the two queries are meaningfully different. At present, it trims the + * strings and does a case insensitive comparison. + */ + private boolean isSearchQuerySame(String newQuery) { + String oldValueTrimmed = searchQuery == null ? "" : searchQuery.trim(); + String newValueTrimmed = newQuery == null ? "" : newQuery.trim(); + return oldValueTrimmed.equalsIgnoreCase(newValueTrimmed); + } + public void updateSearchQuery(@Nullable String query) { + if (isSearchQuerySame(query)) { + return; + } + searchQuery = query; for (AppListFragment fragment : registeredFragments) { if (fragment != null) {