SearchableSource.java revision 782dd228e78e9294692d639597f96c26283968bb
13e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert/*
23e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * Copyright (C) 2009 The Android Open Source Project
33e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert *
43e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
53e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * you may not use this file except in compliance with the License.
63e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * You may obtain a copy of the License at
73e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert *
83e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert *      http://www.apache.org/licenses/LICENSE-2.0
93e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert *
103e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
113e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
123e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * See the License for the specific language governing permissions and
143e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * limitations under the License.
153e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert */
163e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
173e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertpackage com.android.quicksearchbox;
183e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
193e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.app.SearchManager;
20227180196cf8d92172cbb62f8ddaacf864be28e7Bjorn Bringertimport android.app.SearchableInfo;
213e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.content.ComponentName;
223e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.content.ContentResolver;
233e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.content.Context;
243e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.content.pm.ActivityInfo;
253e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.content.pm.PackageManager;
263e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.content.pm.PackageManager.NameNotFoundException;
273e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.database.Cursor;
283e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.graphics.drawable.Drawable;
293e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.net.Uri;
303e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.util.Log;
31782dd228e78e9294692d639597f96c26283968bbBjorn Bringertimport android.widget.ListView;
323e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
33227180196cf8d92172cbb62f8ddaacf864be28e7Bjorn Bringertimport java.util.Arrays;
34227180196cf8d92172cbb62f8ddaacf864be28e7Bjorn Bringert
353e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert/**
363e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * Represents a single suggestion source, e.g. Contacts.
373e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert *
383e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert */
393e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertpublic class SearchableSource implements Source {
403e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
413e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private static final boolean DBG = true;
423e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private static final String TAG = "SearchableSource";
433e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
443e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private final Context mContext;
453e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
463e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private final SearchableInfo mSearchable;
473e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
483e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private final ActivityInfo mActivityInfo;
493e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
503e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    // Cached label for the activity
513e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private CharSequence mLabel = null;
523e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
533e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    // Cached icon for the activity
543e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private Drawable.ConstantState mSourceIcon = null;
553e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
563e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private final boolean mIsWebSuggestionSource;
573e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
583e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private final IconLoader mIconLoader;
593e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
603e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public SearchableSource(Context context, SearchableInfo searchable)
613e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            throws NameNotFoundException {
623e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        this(context, searchable, false);
633e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
643e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
653e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public SearchableSource(Context context, SearchableInfo searchable,
663e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            boolean isWebSuggestionSource) throws NameNotFoundException {
673e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        ComponentName componentName = searchable.getSearchActivity();
683e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        mContext = context;
693e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        mSearchable = searchable;
703e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        mActivityInfo = context.getPackageManager().getActivityInfo(componentName, 0);
713e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        mIsWebSuggestionSource = isWebSuggestionSource;
723e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
733e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        Context activityContext = searchable.getActivityContext(context);
743e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        Context providerContext = searchable.getProviderContext(context, activityContext);
753e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        mIconLoader = new CachingIconLoader(new PackageIconLoader(providerContext));
763e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
773e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
783e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public ComponentName getComponentName() {
793e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mSearchable.getSearchActivity();
803e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
813e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
823e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public Drawable getIcon(String drawableId) {
833e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mIconLoader.getIcon(drawableId);
843e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
853e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
863e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public Uri getIconUri(String drawableId) {
873e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mIconLoader.getIconUri(drawableId);
883e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
893e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
903e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public CharSequence getLabel() {
913e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (mLabel == null) {
923e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            // Load label lazily
933e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mLabel = mActivityInfo.loadLabel(mContext.getPackageManager());
943e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
953e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mLabel;
963e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
973e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
983e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public int getQueryThreshold() {
993e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mSearchable.getSuggestThreshold();
1003e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1013e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1023e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public String getSettingsDescription() {
1033e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mSearchable.getSettingsDescription();
1043e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1053e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1063e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public Drawable getSourceIcon() {
1073e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (mSourceIcon == null) {
1083e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            // Load icon lazily
1093e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            int iconRes = getSourceIconResource();
1103e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            PackageManager pm = mContext.getPackageManager();
1113e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            Drawable icon = pm.getDrawable(mActivityInfo.packageName, iconRes,
1123e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                    mActivityInfo.applicationInfo);
1133e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            // Can't share Drawable instances, save constant state instead.
1143e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            mSourceIcon = (icon != null) ? icon.getConstantState() : null;
1153e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            // Optimization, return the Drawable the first time
1163e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return icon;
1173e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
1183e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return (mSourceIcon != null) ? mSourceIcon.newDrawable() : null;
1193e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1203e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1213e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public Uri getSourceIconUri() {
1223e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mIconLoader.getIconUri(String.valueOf(getSourceIconResource()));
1233e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1243e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1253e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private int getSourceIconResource() {
1263e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        int icon = mActivityInfo.getIconResource();
1273e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return (icon != 0) ? icon : android.R.drawable.sym_def_app_icon;
1283e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1293e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1303e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public SuggestionCursor getSuggestions(String query, int queryLimit) {
1313e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        try {
1323e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            Cursor cursor = getSuggestions(mContext, mSearchable, query, queryLimit);
1333e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            if (DBG) Log.d(TAG, toString() + "[" + query + "] returned.");
1343e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return new SourceResult(this, query, cursor);
1353e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        } catch (RuntimeException ex) {
1363e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            Log.e(TAG, toString() + "[" + query + "] failed", ex);
1373e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return new SourceResult(this, query);
1383e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
1393e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1403e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1413e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    /**
1423e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     * This is a copy of {@link SearchManager#getSuggestions(SearchableInfo, String)}.
1433e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert     */
1443e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    private static Cursor getSuggestions(Context context, SearchableInfo searchable, String query,
1453e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            int queryLimit) {
1463e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (searchable == null) {
1473e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return null;
1483e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
1493e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1503e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        String authority = searchable.getSuggestAuthority();
1513e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (authority == null) {
1523e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            return null;
1533e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
1543e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1553e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        Uri.Builder uriBuilder = new Uri.Builder()
1563e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                .scheme(ContentResolver.SCHEME_CONTENT)
1573e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                .authority(authority);
1583e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1593e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        // if content path provided, insert it now
1603e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        final String contentPath = searchable.getSuggestPath();
1613e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (contentPath != null) {
1623e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            uriBuilder.appendEncodedPath(contentPath);
1633e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
1643e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1653e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        // append standard suggestion query path
1663e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        uriBuilder.appendPath(SearchManager.SUGGEST_URI_PATH_QUERY);
1673e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1683e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        // get the query selection, may be null
1693e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        String selection = searchable.getSuggestSelection();
1703e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        // inject query, either as selection args or inline
1713e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        String[] selArgs = null;
1723e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (selection != null) {    // use selection if provided
1733e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            selArgs = new String[] { query };
1743e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        } else {                    // no selection, use REST pattern
1753e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            uriBuilder.appendPath(query);
1763e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
1773e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1783e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        uriBuilder.appendQueryParameter("limit", String.valueOf(queryLimit));
1793e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1803e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        Uri uri = uriBuilder.build();
1813e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1823e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        // finally, make the query
1833e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        if (DBG) {
1843e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert            Log.d(TAG, "query(" + uri + ",null," + selection + ","
1853e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert                    + Arrays.toString(selArgs) + ",null)");
1863e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        }
1873e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return context.getContentResolver().query(uri, null, selection, selArgs, null);
1883e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1893e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1903e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public boolean isWebSuggestionSource() {
1913e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mIsWebSuggestionSource;
1923e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1933e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1943e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public boolean queryAfterZeroResults() {
1953e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mSearchable.queryAfterZeroResults();
1963e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
1973e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
1983e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public boolean shouldRewriteQueryFromData() {
1993e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mSearchable.shouldRewriteQueryFromData();
2003e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
2013e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
2023e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public boolean shouldRewriteQueryFromText() {
2033e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mSearchable.shouldRewriteQueryFromText();
2043e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
2053e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
2063e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    @Override
2073e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public String toString() {
2083e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return "SearchableSource{component=" + getComponentName().flattenToShortString() + "}";
2093e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
2103e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
2113e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public String getDefaultIntentAction() {
2123e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mSearchable.getSuggestIntentAction();
2133e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
2143e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
2153e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public String getDefaultIntentData() {
2163e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mSearchable.getSuggestIntentData();
2173e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
2183e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
2193e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    public ComponentName getSearchActivity() {
2203e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert        return mSearchable.getSearchActivity();
2213e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert    }
2223e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert
223782dd228e78e9294692d639597f96c26283968bbBjorn Bringert    public String getSuggestActionMsg(int keyCode) {
224782dd228e78e9294692d639597f96c26283968bbBjorn Bringert        SearchableInfo.ActionKeyInfo actionKey = mSearchable.findActionKey(keyCode);
225782dd228e78e9294692d639597f96c26283968bbBjorn Bringert        if (actionKey == null) return null;
226782dd228e78e9294692d639597f96c26283968bbBjorn Bringert        return actionKey.getSuggestActionMsg();
227782dd228e78e9294692d639597f96c26283968bbBjorn Bringert    }
228782dd228e78e9294692d639597f96c26283968bbBjorn Bringert
229782dd228e78e9294692d639597f96c26283968bbBjorn Bringert    public String getSuggestActionMsgColumn(int keyCode) {
230782dd228e78e9294692d639597f96c26283968bbBjorn Bringert        SearchableInfo.ActionKeyInfo actionKey = mSearchable.findActionKey(keyCode);
231782dd228e78e9294692d639597f96c26283968bbBjorn Bringert        if (actionKey == null) return null;
232782dd228e78e9294692d639597f96c26283968bbBjorn Bringert        return actionKey.getSuggestActionMsgColumn();
233782dd228e78e9294692d639597f96c26283968bbBjorn Bringert    }
234782dd228e78e9294692d639597f96c26283968bbBjorn Bringert
2353e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert}
236