diff options
| author | Bananeweizen <bananeweizen@gmx.de> | 2014-01-12 19:05:49 +0100 |
|---|---|---|
| committer | Bananeweizen <bananeweizen@gmx.de> | 2014-01-12 19:05:49 +0100 |
| commit | df177f0e15f4a8fa3dd378648477200596306be9 (patch) | |
| tree | ef194d722a1270875fd8be55e03bbce80aaf8fb6 /main/src | |
| parent | 05ccbe7f00e3ab378cc83fc7aed1a62f7aae6ad6 (diff) | |
| download | cgeo-df177f0e15f4a8fa3dd378648477200596306be9.zip cgeo-df177f0e15f4a8fa3dd378648477200596306be9.tar.gz cgeo-df177f0e15f4a8fa3dd378648477200596306be9.tar.bz2 | |
new: search suggestions for caches and trackables while typing
Diffstat (limited to 'main/src')
| -rw-r--r-- | main/src/cgeo/geocaching/DataStore.java | 72 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/Intents.java | 4 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/SearchActivity.java | 16 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/search/SuggestionProvider.java | 57 |
4 files changed, 147 insertions, 2 deletions
diff --git a/main/src/cgeo/geocaching/DataStore.java b/main/src/cgeo/geocaching/DataStore.java index 9d8a640..60dcd0d 100644 --- a/main/src/cgeo/geocaching/DataStore.java +++ b/main/src/cgeo/geocaching/DataStore.java @@ -25,17 +25,20 @@ import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.eclipse.jdt.annotation.NonNull; +import android.app.SearchManager; import android.content.ContentValues; import android.content.Context; import android.content.ContextWrapper; import android.content.res.Resources; import android.database.Cursor; import android.database.DatabaseUtils; +import android.database.MatrixCursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteDoneException; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteStatement; +import android.provider.BaseColumns; import java.io.File; import java.io.FilenameFilter; @@ -818,7 +821,7 @@ public class DataStore { /** * Remove obsolete cache directories in c:geo private storage. - * + * * @param db * the read-write database to use */ @@ -3129,4 +3132,71 @@ public class DataStore { return missingFromSearch; } + public static Cursor findSuggestions(final String searchTerm) { + // require 3 characters, otherwise there are to many results + if (StringUtils.length(searchTerm) < 3) { + return null; + } + init(); + final MatrixCursor resultCursor = new MatrixCursor(new String[] { + BaseColumns._ID, + SearchManager.SUGGEST_COLUMN_TEXT_1, + SearchManager.SUGGEST_COLUMN_TEXT_2, + SearchManager.SUGGEST_COLUMN_INTENT_ACTION, + SearchManager.SUGGEST_COLUMN_QUERY + }); + try { + final String selectionArg = "%" + searchTerm + "%"; + findCaches(resultCursor, selectionArg); + findTrackables(resultCursor, selectionArg); + } catch (final Exception e) { + Log.e("DataStore.loadBatchOfStoredGeocodes", e); + } + return resultCursor; + } + + private static void findCaches(final MatrixCursor resultCursor, final String selectionArg) { + Cursor cursor = database.query( + dbTableCaches, + new String[] { "geocode", "name" }, + "geocode IS NOT NULL AND geocode != '' AND (geocode LIKE ? OR name LIKE ?)", + new String[] { selectionArg, selectionArg }, + null, + null, + "name"); + while (cursor.moveToNext()) { + final String geocode = cursor.getString(0); + resultCursor.addRow(new String[] { + String.valueOf(resultCursor.getCount()), + cursor.getString(1), + geocode, + Intents.ACTION_GEOCACHE, + geocode + }); + } + cursor.close(); + } + + private static void findTrackables(final MatrixCursor resultCursor, final String selectionArg) { + Cursor cursor = database.query( + dbTableTrackables, + new String[] { "tbcode", "title" }, + "tbcode IS NOT NULL AND tbcode != '' AND (tbcode LIKE ? OR title LIKE ?)", + new String[] { selectionArg, selectionArg }, + null, + null, + "title"); + while (cursor.moveToNext()) { + final String tbcode = cursor.getString(0); + resultCursor.addRow(new String[] { + String.valueOf(resultCursor.getCount()), + cursor.getString(1), + tbcode, + Intents.ACTION_TRACKABLE, + tbcode + }); + } + cursor.close(); + } + } diff --git a/main/src/cgeo/geocaching/Intents.java b/main/src/cgeo/geocaching/Intents.java index d9d9829..5c969a1 100644 --- a/main/src/cgeo/geocaching/Intents.java +++ b/main/src/cgeo/geocaching/Intents.java @@ -29,4 +29,8 @@ public class Intents { public static final String EXTRA_WAYPOINT_ID = PREFIX + "waypoint_id"; public static final String EXTRA_CACHELIST = PREFIX + "cache_list"; public static final String EXTRA_POCKET_GUID = PREFIX + "pocket_guid"; + + private static final String PREFIX_ACTION = "cgeo.geocaching.intent.action."; + public static final String ACTION_GEOCACHE = PREFIX_ACTION + "GEOCACHE"; + public static final String ACTION_TRACKABLE = PREFIX_ACTION + "TRACKABLE"; } diff --git a/main/src/cgeo/geocaching/SearchActivity.java b/main/src/cgeo/geocaching/SearchActivity.java index 0648073..a078fd2 100644 --- a/main/src/cgeo/geocaching/SearchActivity.java +++ b/main/src/cgeo/geocaching/SearchActivity.java @@ -60,9 +60,23 @@ public class SearchActivity extends AbstractActivity { @Override public final void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); + final Intent intent = getIntent(); + + // search suggestion for a cache + if (Intents.ACTION_GEOCACHE.equals(intent.getAction())) { + CacheDetailActivity.startActivity(this, intent.getStringExtra(SearchManager.QUERY)); + finish(); + return; + } + + // search suggestion for a trackable + if (Intents.ACTION_TRACKABLE.equals(intent.getAction())) { + TrackableActivity.startActivity(this, null, intent.getStringExtra(SearchManager.QUERY), null); + finish(); + return; + } // search query - final Intent intent = getIntent(); if (Intent.ACTION_SEARCH.equals(intent.getAction())) { hideKeyboard(); final String query = intent.getStringExtra(SearchManager.QUERY); diff --git a/main/src/cgeo/geocaching/search/SuggestionProvider.java b/main/src/cgeo/geocaching/search/SuggestionProvider.java new file mode 100644 index 0000000..c0a7728 --- /dev/null +++ b/main/src/cgeo/geocaching/search/SuggestionProvider.java @@ -0,0 +1,57 @@ +package cgeo.geocaching.search; + +import cgeo.geocaching.DataStore; + +import org.apache.commons.lang3.StringUtils; + +import android.app.SearchManager; +import android.content.ContentProvider; +import android.content.ContentValues; +import android.database.Cursor; +import android.net.Uri; + +public class SuggestionProvider extends ContentProvider { + + private static Cursor lastCursor; + + @Override + public boolean onCreate() { + return true; + } + + @Override + public String getType(final Uri arg0) { + return SearchManager.SUGGEST_MIME_TYPE; + } + + @Override + public Cursor query(final Uri uri, final String[] projection, final String selection, final String[] selectionArgs, final String sortOrder) { + final String searchTerm = uri.getLastPathSegment(); + // can be empty when deleting the query + if (StringUtils.equals(searchTerm, SearchManager.SUGGEST_URI_PATH_QUERY)) { + return lastCursor; + } + return getSuggestions(searchTerm); + } + + private static Cursor getSuggestions(final String searchTerm) { + lastCursor = DataStore.findSuggestions(searchTerm); + return lastCursor; + } + + @Override + public int delete(final Uri uri, final String selection, final String[] selectionArgs) { + throw new UnsupportedOperationException(); + } + + @Override + public Uri insert(final Uri uri, final ContentValues values) { + throw new UnsupportedOperationException(); + } + + @Override + public int update(final Uri uri, final ContentValues values, final String selection, final String[] selectionArgs) { + throw new UnsupportedOperationException(); + } + +} |
