1e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert/* 2e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert * Copyright (C) 2008 The Android Open Source Project 3e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert * 4e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 5e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert * you may not use this file except in compliance with the License. 6e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert * You may obtain a copy of the License at 7e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert * 8e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 9e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert * 10e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert * Unless required by applicable law or agreed to in writing, software 11e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 12e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert * See the License for the specific language governing permissions and 14e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert * limitations under the License. 15e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert */ 16e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert 1718c681a8ab3c5227fb536501572c96b92c914a07Bjorn Bringertpackage com.android.quicksearchbox.google; 18e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert 19848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasaniimport com.android.quicksearchbox.CursorBackedSourceResult; 2049fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringertimport com.android.quicksearchbox.QsbApplication; 21848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasaniimport com.android.quicksearchbox.Source; 22848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasaniimport com.android.quicksearchbox.SourceResult; 2393bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringertimport com.android.quicksearchbox.SuggestionCursorBackedCursor; 24e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert 25e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringertimport android.app.SearchManager; 26e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringertimport android.content.ContentProvider; 27e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringertimport android.content.ContentValues; 28e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringertimport android.content.Context; 2949fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringertimport android.content.UriMatcher; 30e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringertimport android.database.Cursor; 31e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringertimport android.net.Uri; 3213b4f2dc4b339790c2b9b0220be47c8e77fd61eaMathew Inwoodimport android.util.Log; 33e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert 34e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert/** 3549fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert * A suggestion provider which provides content from Genie, a service that offers 3649fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert * a superset of the content provided by Google Suggest. 37e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert */ 3818c681a8ab3c5227fb536501572c96b92c914a07Bjorn Bringertpublic class GoogleSuggestionProvider extends ContentProvider { 3913b4f2dc4b339790c2b9b0220be47c8e77fd61eaMathew Inwood private static final boolean DBG = false; 4013b4f2dc4b339790c2b9b0220be47c8e77fd61eaMathew Inwood private static final String TAG = "QSB.GoogleSuggestionProvider"; 41e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert 4249fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert // UriMatcher constants 4349fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert private static final int SEARCH_SUGGEST = 0; 4449fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert private static final int SEARCH_SHORTCUT = 1; 45e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert 4649fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert private UriMatcher mUriMatcher; 47e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert 4893bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert private GoogleSource mSource; 49e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert 50e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert @Override 51e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert public boolean onCreate() { 5293bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert mSource = QsbApplication.get(getContext()).getGoogleSource(); 5349fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert mUriMatcher = buildUriMatcher(getContext()); 54e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert return true; 55e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert } 56e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert 57e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert /** 58e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert * This will always return {@link SearchManager#SUGGEST_MIME_TYPE} as this 59e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert * provider is purely to provide suggestions. 60e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert */ 61e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert @Override 62e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert public String getType(Uri uri) { 63e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert return SearchManager.SUGGEST_MIME_TYPE; 64e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert } 65e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert 66848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani private SourceResult emptyIfNull(SourceResult result, Source source, String query) { 67848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani return result == null ? new CursorBackedSourceResult(source, query) : result; 68848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani } 69848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 70e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert @Override 71e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert public Cursor query(Uri uri, String[] projection, String selection, 72e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert String[] selectionArgs, String sortOrder) { 73e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert 7413b4f2dc4b339790c2b9b0220be47c8e77fd61eaMathew Inwood if (DBG) Log.d(TAG, "query uri=" + uri); 7549fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert int match = mUriMatcher.match(uri); 76e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert 7749fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert if (match == SEARCH_SUGGEST) { 7849fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert String query = getQuery(uri); 79848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani return new SuggestionCursorBackedCursor( 80848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani emptyIfNull(mSource.queryExternal(query), mSource, query)); 8149fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert } else if (match == SEARCH_SHORTCUT) { 8293bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert String shortcutId = getQuery(uri); 8349fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert String extraData = 8449fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert uri.getQueryParameter(SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA); 8593bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert return new SuggestionCursorBackedCursor(mSource.refreshShortcut(shortcutId, extraData)); 8649fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert } else { 8749fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert throw new IllegalArgumentException("Unknown URI " + uri); 88e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert } 89e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert } 90e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert 9118c681a8ab3c5227fb536501572c96b92c914a07Bjorn Bringert /** 9218c681a8ab3c5227fb536501572c96b92c914a07Bjorn Bringert * Gets the search text from a uri. 9318c681a8ab3c5227fb536501572c96b92c914a07Bjorn Bringert */ 9418c681a8ab3c5227fb536501572c96b92c914a07Bjorn Bringert private String getQuery(Uri uri) { 9518c681a8ab3c5227fb536501572c96b92c914a07Bjorn Bringert if (uri.getPathSegments().size() > 1) { 9618c681a8ab3c5227fb536501572c96b92c914a07Bjorn Bringert return uri.getLastPathSegment(); 9718c681a8ab3c5227fb536501572c96b92c914a07Bjorn Bringert } else { 9818c681a8ab3c5227fb536501572c96b92c914a07Bjorn Bringert return ""; 9918c681a8ab3c5227fb536501572c96b92c914a07Bjorn Bringert } 10018c681a8ab3c5227fb536501572c96b92c914a07Bjorn Bringert } 10118c681a8ab3c5227fb536501572c96b92c914a07Bjorn Bringert 102e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert @Override 103e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert public Uri insert(Uri uri, ContentValues values) { 104e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert throw new UnsupportedOperationException(); 105e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert } 106e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert 107e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert @Override 108e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert public int update(Uri uri, ContentValues values, String selection, 109e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert String[] selectionArgs) { 110e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert throw new UnsupportedOperationException(); 111e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert } 112e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert 113e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert @Override 114e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert public int delete(Uri uri, String selection, String[] selectionArgs) { 115e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert throw new UnsupportedOperationException(); 116e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert } 11749fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert 11849fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert private UriMatcher buildUriMatcher(Context context) { 11949fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert String authority = getAuthority(context); 12049fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); 12149fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY, 12249fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert SEARCH_SUGGEST); 12349fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", 12449fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert SEARCH_SUGGEST); 12549fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_SHORTCUT, 12649fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert SEARCH_SHORTCUT); 12749fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/*", 12849fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert SEARCH_SHORTCUT); 12949fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert return matcher; 13049fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert } 13149fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert 13249fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert protected String getAuthority(Context context) { 13349fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert return context.getPackageName() + ".google"; 13449fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert } 13549fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert 136e72a6418e84a89d2bfd4e9d22282eca95357e0daBjorn Bringert} 137