GoogleSuggestionProvider.java revision 13b4f2dc4b339790c2b9b0220be47c8e77fd61ea
1/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.quicksearchbox.google;
18
19import com.android.quicksearchbox.CursorBackedSourceResult;
20import com.android.quicksearchbox.QsbApplication;
21import com.android.quicksearchbox.Source;
22import com.android.quicksearchbox.SourceResult;
23import com.android.quicksearchbox.SuggestionCursorBackedCursor;
24
25import android.app.SearchManager;
26import android.content.ContentProvider;
27import android.content.ContentValues;
28import android.content.Context;
29import android.content.UriMatcher;
30import android.database.Cursor;
31import android.net.Uri;
32import android.util.Log;
33
34/**
35 * A suggestion provider which provides content from Genie, a service that offers
36 * a superset of the content provided by Google Suggest.
37 */
38public class GoogleSuggestionProvider extends ContentProvider {
39    private static final boolean DBG = false;
40    private static final String TAG = "QSB.GoogleSuggestionProvider";
41
42    // UriMatcher constants
43    private static final int SEARCH_SUGGEST = 0;
44    private static final int SEARCH_SHORTCUT = 1;
45
46    private UriMatcher mUriMatcher;
47
48    private GoogleSource mSource;
49
50    @Override
51    public boolean onCreate() {
52        mSource = QsbApplication.get(getContext()).getGoogleSource();
53        mUriMatcher = buildUriMatcher(getContext());
54        return true;
55    }
56
57    /**
58     * This will always return {@link SearchManager#SUGGEST_MIME_TYPE} as this
59     * provider is purely to provide suggestions.
60     */
61    @Override
62    public String getType(Uri uri) {
63        return SearchManager.SUGGEST_MIME_TYPE;
64    }
65
66    private SourceResult emptyIfNull(SourceResult result, Source source, String query) {
67        return result == null ? new CursorBackedSourceResult(source, query) : result;
68    }
69
70    @Override
71    public Cursor query(Uri uri, String[] projection, String selection,
72            String[] selectionArgs, String sortOrder) {
73
74        if (DBG) Log.d(TAG, "query uri=" + uri);
75        int match = mUriMatcher.match(uri);
76
77        if (match == SEARCH_SUGGEST) {
78            String query = getQuery(uri);
79            return new SuggestionCursorBackedCursor(
80                    emptyIfNull(mSource.queryExternal(query), mSource, query));
81        } else if (match == SEARCH_SHORTCUT) {
82            String shortcutId = getQuery(uri);
83            String extraData =
84                uri.getQueryParameter(SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA);
85            return new SuggestionCursorBackedCursor(mSource.refreshShortcut(shortcutId, extraData));
86        } else {
87            throw new IllegalArgumentException("Unknown URI " + uri);
88        }
89    }
90
91    /**
92     * Gets the search text from a uri.
93     */
94    private String getQuery(Uri uri) {
95        if (uri.getPathSegments().size() > 1) {
96            return uri.getLastPathSegment();
97        } else {
98            return "";
99        }
100    }
101
102    @Override
103    public Uri insert(Uri uri, ContentValues values) {
104        throw new UnsupportedOperationException();
105    }
106
107    @Override
108    public int update(Uri uri, ContentValues values, String selection,
109            String[] selectionArgs) {
110        throw new UnsupportedOperationException();
111    }
112
113    @Override
114    public int delete(Uri uri, String selection, String[] selectionArgs) {
115        throw new UnsupportedOperationException();
116    }
117
118    private UriMatcher buildUriMatcher(Context context) {
119        String authority = getAuthority(context);
120        UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
121        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY,
122                SEARCH_SUGGEST);
123        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY + "/*",
124                SEARCH_SUGGEST);
125        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_SHORTCUT,
126                SEARCH_SHORTCUT);
127        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/*",
128                SEARCH_SHORTCUT);
129        return matcher;
130    }
131
132    protected String getAuthority(Context context) {
133        return context.getPackageName() + ".google";
134    }
135
136}
137