Search in sources :

Example 11 with SearchableInfo

use of android.app.SearchableInfo in project XobotOS by xamarin.

the class Searchables method buildSearchableList.

/**
     * Builds an entire list (suitable for display) of
     * activities that are searchable, by iterating the entire set of
     * ACTION_SEARCH & ACTION_WEB_SEARCH intents.
     *
     * Also clears the hash of all activities -> searches which will
     * refill as the user clicks "search".
     *
     * This should only be done at startup and again if we know that the
     * list has changed.
     *
     * TODO: every activity that provides a ACTION_SEARCH intent should
     * also provide searchability meta-data.  There are a bunch of checks here
     * that, if data is not found, silently skip to the next activity.  This
     * won't help a developer trying to figure out why their activity isn't
     * showing up in the list, but an exception here is too rough.  I would
     * like to find a better notification mechanism.
     *
     * TODO: sort the list somehow?  UI choice.
     */
public void buildSearchableList() {
    // These will become the new values at the end of the method
    HashMap<ComponentName, SearchableInfo> newSearchablesMap = new HashMap<ComponentName, SearchableInfo>();
    ArrayList<SearchableInfo> newSearchablesList = new ArrayList<SearchableInfo>();
    ArrayList<SearchableInfo> newSearchablesInGlobalSearchList = new ArrayList<SearchableInfo>();
    final PackageManager pm = mContext.getPackageManager();
    // Use intent resolver to generate list of ACTION_SEARCH & ACTION_WEB_SEARCH receivers.
    List<ResolveInfo> searchList;
    final Intent intent = new Intent(Intent.ACTION_SEARCH);
    searchList = pm.queryIntentActivities(intent, PackageManager.GET_META_DATA);
    List<ResolveInfo> webSearchInfoList;
    final Intent webSearchIntent = new Intent(Intent.ACTION_WEB_SEARCH);
    webSearchInfoList = pm.queryIntentActivities(webSearchIntent, PackageManager.GET_META_DATA);
    // analyze each one, generate a Searchables record, and record
    if (searchList != null || webSearchInfoList != null) {
        int search_count = (searchList == null ? 0 : searchList.size());
        int web_search_count = (webSearchInfoList == null ? 0 : webSearchInfoList.size());
        int count = search_count + web_search_count;
        for (int ii = 0; ii < count; ii++) {
            // for each component, try to find metadata
            ResolveInfo info = (ii < search_count) ? searchList.get(ii) : webSearchInfoList.get(ii - search_count);
            ActivityInfo ai = info.activityInfo;
            // Check first to avoid duplicate entries.
            if (newSearchablesMap.get(new ComponentName(ai.packageName, ai.name)) == null) {
                SearchableInfo searchable = SearchableInfo.getActivityMetaData(mContext, ai);
                if (searchable != null) {
                    newSearchablesList.add(searchable);
                    newSearchablesMap.put(searchable.getSearchActivity(), searchable);
                    if (searchable.shouldIncludeInGlobalSearch()) {
                        newSearchablesInGlobalSearchList.add(searchable);
                    }
                }
            }
        }
    }
    List<ResolveInfo> newGlobalSearchActivities = findGlobalSearchActivities();
    // Find the global search activity
    ComponentName newGlobalSearchActivity = findGlobalSearchActivity(newGlobalSearchActivities);
    // Find the web search activity
    ComponentName newWebSearchActivity = findWebSearchActivity(newGlobalSearchActivity);
    // Store a consistent set of new values
    synchronized (this) {
        mSearchablesMap = newSearchablesMap;
        mSearchablesList = newSearchablesList;
        mSearchablesInGlobalSearchList = newSearchablesInGlobalSearchList;
        mGlobalSearchActivities = newGlobalSearchActivities;
        mCurrentGlobalSearchActivity = newGlobalSearchActivity;
        mWebSearchActivity = newWebSearchActivity;
    }
}
Also used : ResolveInfo(android.content.pm.ResolveInfo) ActivityInfo(android.content.pm.ActivityInfo) PackageManager(android.content.pm.PackageManager) HashMap(java.util.HashMap) SearchableInfo(android.app.SearchableInfo) ArrayList(java.util.ArrayList) ComponentName(android.content.ComponentName) Intent(android.content.Intent)

Example 12 with SearchableInfo

use of android.app.SearchableInfo in project Etar-Calendar by Etar-Group.

the class CalendarController method launchSearch.

//    private void launchAlerts() {
//        Intent intent = new Intent();
//        intent.setClass(mContext, AlertActivity.class);
//        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//        mContext.startActivity(intent);
//    }
private void launchSearch(long eventId, String query, ComponentName componentName) {
    final SearchManager searchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE);
    final SearchableInfo searchableInfo = searchManager.getSearchableInfo(componentName);
    final Intent intent = new Intent(Intent.ACTION_SEARCH);
    intent.putExtra(SearchManager.QUERY, query);
    intent.setComponent(searchableInfo.getSearchActivity());
    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    mContext.startActivity(intent);
}
Also used : SearchManager(android.app.SearchManager) SearchableInfo(android.app.SearchableInfo) Intent(android.content.Intent)

Example 13 with SearchableInfo

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

the class SearchablesTest method testSearchablesListReal.

/**
     * This is an attempt to run the searchable info list with a mocked context.  Here are some
     * things I'd like to test.
     *
     *  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

     */
public void testSearchablesListReal() {
    MyMockPackageManager mockPM = new MyMockPackageManager(mContext.getPackageManager());
    MyMockContext mockContext = new MyMockContext(mContext, mockPM);
    // build item list with real-world source data
    mockPM.setSearchablesMode(MyMockPackageManager.SEARCHABLES_PASSTHROUGH);
    Searchables searchables = new Searchables(mockContext, 0);
    searchables.updateSearchableList();
    // tests with "real" searchables (deprecate, this should be a unit test)
    ArrayList<SearchableInfo> searchablesList = searchables.getSearchablesList();
    int count = searchablesList.size();
    // this isn't really a unit test
    assertTrue(count >= 1);
    checkSearchables(searchablesList);
    ArrayList<SearchableInfo> global = searchables.getSearchablesInGlobalSearchList();
    checkSearchables(global);
}
Also used : SearchableInfo(android.app.SearchableInfo) Searchables(com.android.server.search.Searchables)

Example 14 with SearchableInfo

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

the class SearchView method onVoiceClicked.

private void onVoiceClicked() {
    // guard against possible race conditions
    if (mSearchable == null) {
        return;
    }
    SearchableInfo searchable = mSearchable;
    try {
        if (searchable.getVoiceSearchLaunchWebSearch()) {
            Intent webSearchIntent = createVoiceWebSearchIntent(mVoiceWebSearchIntent, searchable);
            getContext().startActivity(webSearchIntent);
        } else if (searchable.getVoiceSearchLaunchRecognizer()) {
            Intent appSearchIntent = createVoiceAppSearchIntent(mVoiceAppSearchIntent, searchable);
            getContext().startActivity(appSearchIntent);
        }
    } catch (ActivityNotFoundException e) {
        // Should not happen, since we check the availability of
        // voice search before showing the button. But just in case...
        Log.w(LOG_TAG, "Could not find voice search activity");
    }
}
Also used : ActivityNotFoundException(android.content.ActivityNotFoundException) SearchableInfo(android.app.SearchableInfo) Intent(android.content.Intent) PendingIntent(android.app.PendingIntent) RecognizerIntent(android.speech.RecognizerIntent)

Example 15 with SearchableInfo

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

the class Searchables method updateSearchableList.

/**
     * Builds an entire list (suitable for display) of
     * activities that are searchable, by iterating the entire set of
     * ACTION_SEARCH & ACTION_WEB_SEARCH intents.
     *
     * Also clears the hash of all activities -> searches which will
     * refill as the user clicks "search".
     *
     * This should only be done at startup and again if we know that the
     * list has changed.
     *
     * TODO: every activity that provides a ACTION_SEARCH intent should
     * also provide searchability meta-data.  There are a bunch of checks here
     * that, if data is not found, silently skip to the next activity.  This
     * won't help a developer trying to figure out why their activity isn't
     * showing up in the list, but an exception here is too rough.  I would
     * like to find a better notification mechanism.
     *
     * TODO: sort the list somehow?  UI choice.
     */
public void updateSearchableList() {
    // These will become the new values at the end of the method
    HashMap<ComponentName, SearchableInfo> newSearchablesMap = new HashMap<ComponentName, SearchableInfo>();
    ArrayList<SearchableInfo> newSearchablesList = new ArrayList<SearchableInfo>();
    ArrayList<SearchableInfo> newSearchablesInGlobalSearchList = new ArrayList<SearchableInfo>();
    // Use intent resolver to generate list of ACTION_SEARCH & ACTION_WEB_SEARCH receivers.
    List<ResolveInfo> searchList;
    final Intent intent = new Intent(Intent.ACTION_SEARCH);
    long ident = Binder.clearCallingIdentity();
    try {
        searchList = queryIntentActivities(intent, PackageManager.GET_META_DATA | PackageManager.MATCH_DEBUG_TRIAGED_MISSING);
        List<ResolveInfo> webSearchInfoList;
        final Intent webSearchIntent = new Intent(Intent.ACTION_WEB_SEARCH);
        webSearchInfoList = queryIntentActivities(webSearchIntent, PackageManager.GET_META_DATA | PackageManager.MATCH_DEBUG_TRIAGED_MISSING);
        // analyze each one, generate a Searchables record, and record
        if (searchList != null || webSearchInfoList != null) {
            int search_count = (searchList == null ? 0 : searchList.size());
            int web_search_count = (webSearchInfoList == null ? 0 : webSearchInfoList.size());
            int count = search_count + web_search_count;
            for (int ii = 0; ii < count; ii++) {
                // for each component, try to find metadata
                ResolveInfo info = (ii < search_count) ? searchList.get(ii) : webSearchInfoList.get(ii - search_count);
                ActivityInfo ai = info.activityInfo;
                // Check first to avoid duplicate entries.
                if (newSearchablesMap.get(new ComponentName(ai.packageName, ai.name)) == null) {
                    SearchableInfo searchable = SearchableInfo.getActivityMetaData(mContext, ai, mUserId);
                    if (searchable != null) {
                        newSearchablesList.add(searchable);
                        newSearchablesMap.put(searchable.getSearchActivity(), searchable);
                        if (searchable.shouldIncludeInGlobalSearch()) {
                            newSearchablesInGlobalSearchList.add(searchable);
                        }
                    }
                }
            }
        }
        List<ResolveInfo> newGlobalSearchActivities = findGlobalSearchActivities();
        // Find the global search activity
        ComponentName newGlobalSearchActivity = findGlobalSearchActivity(newGlobalSearchActivities);
        // Find the web search activity
        ComponentName newWebSearchActivity = findWebSearchActivity(newGlobalSearchActivity);
        // Store a consistent set of new values
        synchronized (this) {
            mSearchablesMap = newSearchablesMap;
            mSearchablesList = newSearchablesList;
            mSearchablesInGlobalSearchList = newSearchablesInGlobalSearchList;
            mGlobalSearchActivities = newGlobalSearchActivities;
            mCurrentGlobalSearchActivity = newGlobalSearchActivity;
            mWebSearchActivity = newWebSearchActivity;
        }
    } finally {
        Binder.restoreCallingIdentity(ident);
    }
}
Also used : ResolveInfo(android.content.pm.ResolveInfo) ActivityInfo(android.content.pm.ActivityInfo) HashMap(java.util.HashMap) SearchableInfo(android.app.SearchableInfo) ArrayList(java.util.ArrayList) ComponentName(android.content.ComponentName) Intent(android.content.Intent)

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