Search in sources :

Example 36 with SearchableInfo

use of android.app.SearchableInfo in project android_frameworks_base by DirtyUnicorns.

the class Searchables method getSearchableInfo.

/**
     * Look up, or construct, based on the activity.
     *
     * The activities fall into three cases, based on meta-data found in
     * the manifest entry:
     * <ol>
     * <li>The activity itself implements search.  This is indicated by the
     * presence of a "android.app.searchable" meta-data attribute.
     * The value is a reference to an XML file containing search information.</li>
     * <li>A related activity implements search.  This is indicated by the
     * presence of a "android.app.default_searchable" meta-data attribute.
     * The value is a string naming the activity implementing search.  In this
     * case the factory will "redirect" and return the searchable data.</li>
     * <li>No searchability data is provided.  We return null here and other
     * code will insert the "default" (e.g. contacts) search.
     *
     * TODO: cache the result in the map, and check the map first.
     * TODO: it might make sense to implement the searchable reference as
     * an application meta-data entry.  This way we don't have to pepper each
     * and every activity.
     * TODO: can we skip the constructor step if it's a non-searchable?
     * TODO: does it make sense to plug the default into a slot here for
     * automatic return?  Probably not, but it's one way to do it.
     *
     * @param activity The name of the current activity, or null if the
     * activity does not define any explicit searchable metadata.
     */
public SearchableInfo getSearchableInfo(ComponentName activity) {
    // Step 1.  Is the result already hashed?  (case 1)
    SearchableInfo result;
    synchronized (this) {
        result = mSearchablesMap.get(activity);
        if (result != null)
            return result;
    }
    // Step 2.  See if the current activity references a searchable.
    // Note:  Conceptually, this could be a while(true) loop, but there's
    // no point in implementing reference chaining here and risking a loop.
    // References must point directly to searchable activities.
    ActivityInfo ai = null;
    try {
        ai = mPm.getActivityInfo(activity, PackageManager.GET_META_DATA, mUserId);
    } catch (RemoteException re) {
        Log.e(LOG_TAG, "Error getting activity info " + re);
        return null;
    }
    String refActivityName = null;
    // First look for activity-specific reference
    Bundle md = ai.metaData;
    if (md != null) {
        refActivityName = md.getString(MD_LABEL_DEFAULT_SEARCHABLE);
    }
    // If not found, try for app-wide reference
    if (refActivityName == null) {
        md = ai.applicationInfo.metaData;
        if (md != null) {
            refActivityName = md.getString(MD_LABEL_DEFAULT_SEARCHABLE);
        }
    }
    // Irrespective of source, if a reference was found, follow it.
    if (refActivityName != null) {
        // This value is deprecated, return null
        if (refActivityName.equals(MD_SEARCHABLE_SYSTEM_SEARCH)) {
            return null;
        }
        String pkg = activity.getPackageName();
        ComponentName referredActivity;
        if (refActivityName.charAt(0) == '.') {
            referredActivity = new ComponentName(pkg, pkg + refActivityName);
        } else {
            referredActivity = new ComponentName(pkg, refActivityName);
        }
        // it against the original name so we can skip the check
        synchronized (this) {
            result = mSearchablesMap.get(referredActivity);
            if (result != null) {
                mSearchablesMap.put(activity, result);
                return result;
            }
        }
    }
    // Step 3.  None found. Return null.
    return null;
}
Also used : ActivityInfo(android.content.pm.ActivityInfo) Bundle(android.os.Bundle) SearchableInfo(android.app.SearchableInfo) ComponentName(android.content.ComponentName) RemoteException(android.os.RemoteException)

Example 37 with SearchableInfo

use of android.app.SearchableInfo in project android_frameworks_base by DirtyUnicorns.

the class Searchables method dump.

void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
    pw.println("Searchable authorities:");
    synchronized (this) {
        if (mSearchablesList != null) {
            for (SearchableInfo info : mSearchablesList) {
                pw.print("  ");
                pw.println(info.getSuggestAuthority());
            }
        }
    }
}
Also used : SearchableInfo(android.app.SearchableInfo)

Example 38 with SearchableInfo

use of android.app.SearchableInfo in project android_frameworks_base by DirtyUnicorns.

the class SearchablesTest method testNonSearchable.

/*
     * SearchableInfo tests
     *  Mock the context so I can provide very specific input data
     *  Confirm OK with "zero" searchables
     *  Confirm "good" metadata read properly
     *  Confirm "bad" metadata skipped properly
     *  Confirm ordering of searchables
     *  Confirm "good" actionkeys
     *  confirm "bad" actionkeys are rejected
     *  confirm XML ordering enforced (will fail today - bug in SearchableInfo)
     *  findActionKey works
     *  getIcon works
     */
/**
     * Test that non-searchable activities return no searchable info (this would typically
     * trigger the use of the default searchable e.g. contacts)
     */
public void testNonSearchable() {
    // test basic array & hashmap
    Searchables searchables = new Searchables(mContext, 0);
    searchables.updateSearchableList();
    // confirm that we return null for non-searchy activities
    ComponentName nonActivity = new ComponentName("com.android.frameworks.coretests", "com.android.frameworks.coretests.activity.NO_SEARCH_ACTIVITY");
    SearchableInfo si = searchables.getSearchableInfo(nonActivity);
    assertNull(si);
}
Also used : SearchableInfo(android.app.SearchableInfo) Searchables(com.android.server.search.Searchables) ComponentName(android.content.ComponentName)

Example 39 with SearchableInfo

use of android.app.SearchableInfo in project android_frameworks_base by DirtyUnicorns.

the class SearchablesTest method testSearchablesListEmpty.

/**
     * This round of tests confirms good operations with "zero" searchables found
     */
public void testSearchablesListEmpty() {
    MyMockPackageManager mockPM = new MyMockPackageManager(mContext.getPackageManager());
    MyMockContext mockContext = new MyMockContext(mContext, mockPM);
    mockPM.setSearchablesMode(MyMockPackageManager.SEARCHABLES_MOCK_ZERO);
    Searchables searchables = new Searchables(mockContext, 0);
    searchables.updateSearchableList();
    ArrayList<SearchableInfo> searchablesList = searchables.getSearchablesList();
    assertNotNull(searchablesList);
    MoreAsserts.assertEmpty(searchablesList);
    ArrayList<SearchableInfo> global = searchables.getSearchablesInGlobalSearchList();
    MoreAsserts.assertEmpty(global);
}
Also used : SearchableInfo(android.app.SearchableInfo) Searchables(com.android.server.search.Searchables)

Example 40 with SearchableInfo

use of android.app.SearchableInfo in project android_frameworks_base by DirtyUnicorns.

the class SearchablesTest method checkSearchables.

/**
     * Generic health checker for an array of searchables.
     * 
     * This is designed to pass for any semi-legal searchable, without knowing much about
     * the format of the underlying data.  It's fairly easy for a non-compliant application
     * to provide meta-data that will pass here (e.g. a non-existent suggestions authority).
     * 
     * @param searchables The list of searchables to examine.
     */
private void checkSearchables(ArrayList<SearchableInfo> searchablesList) {
    assertNotNull(searchablesList);
    int count = searchablesList.size();
    for (int ii = 0; ii < count; ii++) {
        SearchableInfo si = searchablesList.get(ii);
        checkSearchable(si);
    }
}
Also used : SearchableInfo(android.app.SearchableInfo)

Aggregations

SearchableInfo (android.app.SearchableInfo)54 Intent (android.content.Intent)22 ComponentName (android.content.ComponentName)17 PendingIntent (android.app.PendingIntent)15 ActivityNotFoundException (android.content.ActivityNotFoundException)15 RecognizerIntent (android.speech.RecognizerIntent)15 Searchables (com.android.server.search.Searchables)15 ActivityInfo (android.content.pm.ActivityInfo)12 ResolveInfo (android.content.pm.ResolveInfo)6 Bundle (android.os.Bundle)6 ArrayList (java.util.ArrayList)6 HashMap (java.util.HashMap)6 RemoteException (android.os.RemoteException)5 SearchManager (android.app.SearchManager)2 PackageManager (android.content.pm.PackageManager)2 MenuItem (android.view.MenuItem)1 CompositeSubscription (rx.subscriptions.CompositeSubscription)1