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