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