Search code examples
androidsearchautocomplete

Use SearchRecentSuggestionsProvider with some predefined terms?


I'm looking for some information on extending SearchRecentSuggestionsProvider such that it will handle two types of suggestions:

  • User search history
  • Predefined terms that I'd like to always have as possible suggestions

For example, when a user starts typing "Goo", maybe they've searched for "Goo Gone" before - and maybe I'd also like to include "Google" since it's in my list of "special terms".

Referring to the documentation at Google I see that I can really do an either or - use Google's code or roll my own SQLite database to store things. Is there a way to override part of SearchRecentSuggestionsProvider to do what I want?


Solution

  • Yes, you can extend SearchRecentSuggestionsProvider with your own class. This is the class I wrote to do this: https://github.com/bostonbusmap/bostonbusmap/blob/master/src/boston/Bus/Map/provider/TransitContentProvider.java

    package boston.Bus.Map.provider;
    
    import boston.Bus.Map.data.RoutePool;
    import boston.Bus.Map.main.Main;
    import boston.Bus.Map.provider.DatabaseContentProvider.DatabaseAgent;
    import boston.Bus.Map.transit.TransitSystem;
    import android.app.SearchManager;
    import android.content.ContentProvider;
    import android.content.ContentResolver;
    import android.content.ContentValues;
    import android.content.SearchRecentSuggestionsProvider;
    import android.content.UriMatcher;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteQueryBuilder;
    import android.net.Uri;
    
    public class TransitContentProvider extends SearchRecentSuggestionsProvider {
    
        private UriMatcher matcher;
    
        public static final String AUTHORITY = "com.bostonbusmap.transitprovider";
        public static final int MODE = SearchRecentSuggestionsProvider.DATABASE_MODE_QUERIES;
    
    
        private static final int SUGGESTIONS_CODE = 5;
    
        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);
    
        public TransitContentProvider()
        {
            matcher = new UriMatcher(UriMatcher.NO_MATCH);
    
            matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, SUGGESTIONS_CODE);
            setupSuggestions(AUTHORITY, MODE);
        }
    
        @Override
        public boolean onCreate() {
            boolean create = super.onCreate();
            return create;
        }
    
        @Override
        public Cursor query(Uri uri, String[] projection, String selection,
                String[] selectionArgs, String sortOrder)
        {
            int code = matcher.match(uri);
            switch (code)
            {
            case SUGGESTIONS_CODE:
                if (selectionArgs == null || selectionArgs.length == 0 || selectionArgs[0].trim().length() == 0)
                {
                    return super.query(uri, projection, selection, selectionArgs, sortOrder);
                }
                else
                {
                    ContentResolver resolver = getContext().getContentResolver();
                    return DatabaseAgent.getCursorForSearch(resolver, selectionArgs[0]);
                }
            default:
                return super.query(uri, projection, selection, selectionArgs, sortOrder);
            }
        }
    }