From 5f08181f7daebfb83dcbdf541a579aecdbc30a00 Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Thu, 4 Feb 2016 09:32:19 +1100 Subject: [PATCH 1/4] Remove unused `SearchResultsFragment`. This is left over from when the search functionality was updated recently. --- .../fragments/SearchResultsFragment.java | 129 ------------------ 1 file changed, 129 deletions(-) delete mode 100644 F-Droid/src/org/fdroid/fdroid/views/fragments/SearchResultsFragment.java diff --git a/F-Droid/src/org/fdroid/fdroid/views/fragments/SearchResultsFragment.java b/F-Droid/src/org/fdroid/fdroid/views/fragments/SearchResultsFragment.java deleted file mode 100644 index d3d47d88e..000000000 --- a/F-Droid/src/org/fdroid/fdroid/views/fragments/SearchResultsFragment.java +++ /dev/null @@ -1,129 +0,0 @@ -package org.fdroid.fdroid.views.fragments; - -import android.app.SearchManager; -import android.content.Intent; -import android.database.Cursor; -import android.net.Uri; -import android.os.Bundle; -import android.support.v4.app.ListFragment; -import android.support.v4.app.LoaderManager; -import android.support.v4.content.CursorLoader; -import android.support.v4.content.Loader; -import android.text.TextUtils; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ListView; -import android.widget.TextView; - -import org.fdroid.fdroid.AppDetails; -import org.fdroid.fdroid.R; -import org.fdroid.fdroid.Utils; -import org.fdroid.fdroid.data.App; -import org.fdroid.fdroid.data.AppProvider; -import org.fdroid.fdroid.views.AppListAdapter; -import org.fdroid.fdroid.views.AvailableAppListAdapter; - -public class SearchResultsFragment extends ListFragment implements LoaderManager.LoaderCallbacks { - - private static final String TAG = "SearchResultsFragment"; - - private static final int REQUEST_APPDETAILS = 0; - - private AppListAdapter adapter; - - protected String getQuery() { - Intent intent = getActivity().getIntent(); - String query = null; - if (Intent.ACTION_SEARCH.equals(intent.getAction())) { - query = intent.getStringExtra(SearchManager.QUERY); - } - if (query == null) { - return ""; - } - return query; - } - - @Override - public void onResume() { - super.onResume(); - - //Starts a new or restarts an existing Loader in this manager - getLoaderManager().restartLoader(0, null, this); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup root, Bundle data) { - - adapter = new AvailableAppListAdapter(getActivity(), null); - setListAdapter(adapter); - - View view = inflater.inflate(R.layout.searchresults, null); - updateSummary(view); - - return view; - } - - @Override - public Loader onCreateLoader(int id, Bundle args) { - Uri uri = AppProvider.getSearchUri(getQuery()); - return new CursorLoader( - getActivity(), - uri, - AppListFragment.APP_PROJECTION, - null, - null, - AppListFragment.APP_SORT - ); - } - - private void updateSummary() { - updateSummary(getView()); - } - - private void updateSummary(View view) { - - String query = getQuery(); - - if (query != null) - query = query.trim(); - - if (TextUtils.isEmpty(query)) - getActivity().finish(); - - TextView tv = (TextView) view.findViewById(R.id.description); - String headerText; - int count = adapter.getCount(); - if (count == 0) { - headerText = getString(R.string.searchres_noapps, query); - } else if (count == 1) { - headerText = getString(R.string.searchres_oneapp, query); - } else { - headerText = getString(R.string.searchres_napps, count, query); - } - tv.setText(headerText); - Utils.debugLog(TAG, "Search for '" + query + "' returned " + count + " results"); - } - - @Override - public void onListItemClick(ListView l, View v, int position, long id) { - final App app = new App((Cursor) adapter.getItem(position)); - - Intent intent = new Intent(getActivity(), AppDetails.class); - intent.putExtra(AppDetails.EXTRA_APPID, app.packageName); - intent.putExtra(AppDetails.EXTRA_HINT_SEARCHING, true); - startActivityForResult(intent, REQUEST_APPDETAILS); - super.onListItemClick(l, v, position, id); - } - - @Override - public void onLoadFinished(Loader loader, Cursor data) { - adapter.swapCursor(data); - updateSummary(); - } - - @Override - public void onLoaderReset(Loader loader) { - adapter.swapCursor(null); - } -} From 46817b1893122a57c69f3c0a0a384bff1c94c7fc Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Thu, 4 Feb 2016 09:58:42 +1100 Subject: [PATCH 2/4] Add tests for searching null or empty values. Should help prevent abuse of the search API into the future. --- F-Droid/test/src/org/fdroid/fdroid/AppProviderTest.java | 6 ++++-- F-Droid/test/src/org/fdroid/fdroid/FDroidProviderTest.java | 5 +++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/F-Droid/test/src/org/fdroid/fdroid/AppProviderTest.java b/F-Droid/test/src/org/fdroid/fdroid/AppProviderTest.java index 9a90600ad..e37dac891 100644 --- a/F-Droid/test/src/org/fdroid/fdroid/AppProviderTest.java +++ b/F-Droid/test/src/org/fdroid/fdroid/AppProviderTest.java @@ -86,8 +86,10 @@ public class AppProviderTest extends FDroidProviderTest { assertInvalidUri(AppProvider.getAuthority()); assertInvalidUri(ApkProvider.getContentUri()); - assertValidUri(AppProvider.getContentUri()); - assertValidUri(AppProvider.getSearchUri("'searching!'")); + assertValidUri(AppProvider.getContentUri(), "content://org.fdroid.fdroid.data.AppProvider"); + assertValidUri(AppProvider.getSearchUri("'searching!'"), "content://org.fdroid.fdroid.data.AppProvider/search/'searching!'"); + assertValidUri(AppProvider.getSearchUri(""), "content://org.fdroid.fdroid.data.AppProvider"); + assertValidUri(AppProvider.getSearchUri(null), "content://org.fdroid.fdroid.data.AppProvider"); assertValidUri(AppProvider.getNoApksUri()); assertValidUri(AppProvider.getInstalledUri()); assertValidUri(AppProvider.getCanUpdateUri()); diff --git a/F-Droid/test/src/org/fdroid/fdroid/FDroidProviderTest.java b/F-Droid/test/src/org/fdroid/fdroid/FDroidProviderTest.java index 3bf2ea8bb..76a803fdb 100644 --- a/F-Droid/test/src/org/fdroid/fdroid/FDroidProviderTest.java +++ b/F-Droid/test/src/org/fdroid/fdroid/FDroidProviderTest.java @@ -131,6 +131,11 @@ public abstract class FDroidProviderTest extends Provi cursor.close(); } + protected void assertValidUri(Uri actualUri, String expectedUri) { + assertValidUri(actualUri); + assertEquals(expectedUri, actualUri.toString()); + } + /** * Many queries need at least some sort of projection in order to produce * valid SQL. As such, we also need to know about that, so we can provide From 81b772c3fdce9772843b87b6c95cb4cd0dbb73d8 Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Fri, 5 Feb 2016 09:51:04 +1100 Subject: [PATCH 3/4] Use `appendPath(...)` instead of `appendEncodedPath(...)`. I misread the documentation when first using the `appendEncodedPath` method, because it expects the path to already be encoded. This causes a bug because if you search for a '/'. The result is a malformed URI that has the path '/search//' instead of '/search/%2F'. Using `appendPath` will always encode the string given to it, which is desirable. Also check for empty strings, and return a URI that gives all apps. This was not strictly neccesary, because the code which invokes it checks for empty strings, but if somewhere else in the future starts to use this code, they would've had to know to check for empty strings first. Fixes #555. --- F-Droid/src/org/fdroid/fdroid/Utils.java | 4 ++-- .../org/fdroid/fdroid/data/AppProvider.java | 20 ++++++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/F-Droid/src/org/fdroid/fdroid/Utils.java b/F-Droid/src/org/fdroid/fdroid/Utils.java index 9f02616e4..8aa75072c 100644 --- a/F-Droid/src/org/fdroid/fdroid/Utils.java +++ b/F-Droid/src/org/fdroid/fdroid/Utils.java @@ -304,9 +304,9 @@ public final class Utils { b.scheme(localRepoUri.getScheme().replaceFirst("http", "fdroidrepo")); b.appendQueryParameter("swap", "1"); if (!TextUtils.isEmpty(FDroidApp.bssid)) { - b.appendQueryParameter("bssid", Uri.encode(FDroidApp.bssid)); + b.appendQueryParameter("bssid", FDroidApp.bssid); if (!TextUtils.isEmpty(FDroidApp.ssid)) - b.appendQueryParameter("ssid", Uri.encode(FDroidApp.ssid)); + b.appendQueryParameter("ssid", FDroidApp.ssid); } return b.build(); } diff --git a/F-Droid/src/org/fdroid/fdroid/data/AppProvider.java b/F-Droid/src/org/fdroid/fdroid/data/AppProvider.java index bb5e57bf6..ef2a4463b 100644 --- a/F-Droid/src/org/fdroid/fdroid/data/AppProvider.java +++ b/F-Droid/src/org/fdroid/fdroid/data/AppProvider.java @@ -7,6 +7,7 @@ import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; +import android.text.TextUtils; import android.util.Log; import org.fdroid.fdroid.Preferences; @@ -542,17 +543,22 @@ public class AppProvider extends FDroidProvider { } public static Uri getSearchUri(String query) { - return getContentUri().buildUpon() - .appendPath(PATH_SEARCH) - .appendEncodedPath(query) - .build(); + if (TextUtils.isEmpty(query)) { + // Return all the things for an empty search. + return getContentUri(); + } else { + return getContentUri().buildUpon() + .appendPath(PATH_SEARCH) + .appendPath(query) + .build(); + } } public static Uri getSearchInstalledUri(String query) { return getContentUri() .buildUpon() .appendPath(PATH_SEARCH_INSTALLED) - .appendEncodedPath(query) + .appendPath(query) .build(); } @@ -560,7 +566,7 @@ public class AppProvider extends FDroidProvider { return getContentUri() .buildUpon() .appendPath(PATH_SEARCH_CAN_UPDATE) - .appendEncodedPath(query) + .appendPath(query) .build(); } @@ -568,7 +574,7 @@ public class AppProvider extends FDroidProvider { return getContentUri().buildUpon() .appendPath(PATH_SEARCH_REPO) .appendPath(repo.id + "") - .appendEncodedPath(query) + .appendPath(query) .build(); } From e57b034a62d079d48708a8b32ad1894d5d7b179d Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Fri, 5 Feb 2016 09:55:15 +1100 Subject: [PATCH 4/4] Add test for searching for forward slashes. --- F-Droid/test/src/org/fdroid/fdroid/AppProviderTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/F-Droid/test/src/org/fdroid/fdroid/AppProviderTest.java b/F-Droid/test/src/org/fdroid/fdroid/AppProviderTest.java index e37dac891..fa3d55957 100644 --- a/F-Droid/test/src/org/fdroid/fdroid/AppProviderTest.java +++ b/F-Droid/test/src/org/fdroid/fdroid/AppProviderTest.java @@ -88,6 +88,7 @@ public class AppProviderTest extends FDroidProviderTest { assertValidUri(AppProvider.getContentUri(), "content://org.fdroid.fdroid.data.AppProvider"); assertValidUri(AppProvider.getSearchUri("'searching!'"), "content://org.fdroid.fdroid.data.AppProvider/search/'searching!'"); + assertValidUri(AppProvider.getSearchUri("/"), "content://org.fdroid.fdroid.data.AppProvider/search/%2F"); assertValidUri(AppProvider.getSearchUri(""), "content://org.fdroid.fdroid.data.AppProvider"); assertValidUri(AppProvider.getSearchUri(null), "content://org.fdroid.fdroid.data.AppProvider"); assertValidUri(AppProvider.getNoApksUri());