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 
17 package com.android.quicksearchbox.google;
18 
19 import com.android.quicksearchbox.CursorBackedSourceResult;
20 import com.android.quicksearchbox.QsbApplication;
21 import com.android.quicksearchbox.Source;
22 import com.android.quicksearchbox.SourceResult;
23 import com.android.quicksearchbox.SuggestionCursorBackedCursor;
24 
25 import android.app.SearchManager;
26 import android.content.ContentProvider;
27 import android.content.ContentValues;
28 import android.content.Context;
29 import android.content.UriMatcher;
30 import android.database.Cursor;
31 import android.net.Uri;
32 import 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  */
38 public 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
onCreate()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
getType(Uri uri)62     public String getType(Uri uri) {
63         return SearchManager.SUGGEST_MIME_TYPE;
64     }
65 
emptyIfNull(SourceResult result, GoogleSource source, String query)66     private SourceResult emptyIfNull(SourceResult result, GoogleSource source, String query) {
67         return result == null ? new CursorBackedSourceResult(source, query) : result;
68     }
69 
70     @Override
query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)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      */
getQuery(Uri uri)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
insert(Uri uri, ContentValues values)103     public Uri insert(Uri uri, ContentValues values) {
104         throw new UnsupportedOperationException();
105     }
106 
107     @Override
update(Uri uri, ContentValues values, String selection, String[] selectionArgs)108     public int update(Uri uri, ContentValues values, String selection,
109             String[] selectionArgs) {
110         throw new UnsupportedOperationException();
111     }
112 
113     @Override
delete(Uri uri, String selection, String[] selectionArgs)114     public int delete(Uri uri, String selection, String[] selectionArgs) {
115         throw new UnsupportedOperationException();
116     }
117 
buildUriMatcher(Context context)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 
getAuthority(Context context)132     protected String getAuthority(Context context) {
133         return context.getPackageName() + ".google";
134     }
135 
136 }
137