timothyjc timothyjc - 4 months ago 23
Android Question

Open global search as overlay

I am writing a launcher and want to be able to open up a search as an overlay rather than full-screen in the Google App.

So far I only found a way to open the search in the Google App full-screen as follows (taken from AOSP Launcher3 source code):

public static boolean openSearch(Context context) {

SearchManager searchManager = (SearchManager) context.getSystemService(Context.SEARCH_SERVICE);
ComponentName globalSearchActivity = searchManager.getGlobalSearchActivity();
if (globalSearchActivity == null) {
Timber.w("No global search activity found.");
return false;
}
Intent intent = new Intent(android.app.SearchManager.INTENT_ACTION_GLOBAL_SEARCH);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setComponent(globalSearchActivity);
Bundle appSearchData = new Bundle();
appSearchData.putString("source", "launcher-search");

intent.putExtra(android.app.SearchManager.APP_DATA, appSearchData);

intent.putExtra(android.app.SearchManager.QUERY, "");
intent.putExtra(android.app.SearchManager.EXTRA_SELECT_QUERY, true);
try {
context.startActivity(intent);
return true;
} catch (ActivityNotFoundException ex) {
Timber.w("Global search activity not found: %s", globalSearchActivity);
return false;
}

}


I know it is possible because other launchers like Nova and Action Launcher managed to do it...

Answer

Figured it out...

public static boolean showGlobalSearchOverlay(Context context) {
    ComponentName globalSearchActivity =
            new ComponentName("com.google.android.googlequicksearchbox",
                    "com.google.android.apps.gsa.queryentry.QueryEntryActivity");

    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.setComponent(globalSearchActivity);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    try {
        context.startActivity(intent);
        return true;
    } catch (Throwable e) {
        Timber.w("Unable to show search overlay");
        return false;
    }
}
Comments