107627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani/* 207627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani * Copyright (C) 2010 The Android Open Source Project 307627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani * 407627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani * Licensed under the Apache License, Version 2.0 (the "License"); 507627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani * you may not use this file except in compliance with the License. 607627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani * You may obtain a copy of the License at 707627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani * 807627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani * http://www.apache.org/licenses/LICENSE-2.0 907627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani * 1007627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani * Unless required by applicable law or agreed to in writing, software 1107627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani * distributed under the License is distributed on an "AS IS" BASIS, 1207627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1307627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani * See the License for the specific language governing permissions and 1407627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani * limitations under the License. 1507627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani */ 1607627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 1707627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasanipackage com.android.quicksearchbox.tests.partial; 1807627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 1907627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasaniimport android.app.SearchManager; 2007627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasaniimport android.content.ContentProvider; 2107627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasaniimport android.content.ContentValues; 2207627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasaniimport android.content.Intent; 2307627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasaniimport android.database.Cursor; 2407627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasaniimport android.database.MatrixCursor; 2507627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasaniimport android.net.Uri; 2607627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasaniimport android.os.Bundle; 2707627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasaniimport android.os.Handler; 2807627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasaniimport android.os.Message; 2907627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasaniimport android.util.Log; 3007627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 3107627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasanipublic class PartialSuggestionProvider extends ContentProvider { 3207627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 3307627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani private static final String TAG = PartialSuggestionProvider.class.getSimpleName(); 3407627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 3507627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani private static final int MSG_COMPLETE = 1; 3607627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 3707627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani private MutableMatrixCursor mCursor; 3807627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani private int mType = -1; 3907627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 4007627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani private static final String[] COLUMNS = { 4107627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani "_id", 4207627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani SearchManager.SUGGEST_COLUMN_TEXT_1, 4307627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani SearchManager.SUGGEST_COLUMN_TEXT_2, 4407627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani SearchManager.SUGGEST_COLUMN_INTENT_ACTION, 4507627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani SearchManager.SUGGEST_COLUMN_INTENT_DATA, 4607627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani }; 4707627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 4807627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani Handler mHandler = new Handler() { 4907627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani @Override 5007627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani public void handleMessage(Message msg) { 5107627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani switch (msg.what) { 5207627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani case MSG_COMPLETE: 5307627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani mCursor.getExtras().putBoolean(SearchManager.CURSOR_EXTRA_KEY_IN_PROGRESS, false); 5407627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani addRows(mCursor, false); 5507627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani mCursor.notifyChange(); 5607627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani } 5707627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 5807627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani } 5907627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani }; 6007627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 6107627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani private static class MutableMatrixCursor extends MatrixCursor { 6207627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 6307627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani Bundle mBundle; 6407627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 6507627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani MutableMatrixCursor(String[] columns) { 6607627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani super(columns); 6707627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani } 6807627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 6907627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani @Override 7007627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani public Bundle getExtras() { 7107627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani if (mBundle == null) mBundle = new Bundle(); 7207627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani return mBundle; 7307627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani } 7407627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 7507627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani public void notifyChange() { 7607627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani onChange(false); 7707627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani } 7807627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani } 7907627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 8007627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani @Override 8107627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani public boolean onCreate() { 8207627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani return true; 8307627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani } 8407627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 8507627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani private void addRows(MatrixCursor cursor, boolean partial) { 8607627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani for (int i = 0; i < 3; i++) { 8707627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani cursor.addRow(new Object[]{ 8807627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani i, 8907627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani (partial? "Partial" : "Final ") + " suggestion " + i, 9007627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani "This is a suggestion", 9107627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani Intent.ACTION_VIEW, 9207627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani "content://com.android.quicksearchbox.partial/partial/" + i 9307627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani }); 9407627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani } 9507627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani } 9607627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 9707627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani @Override 9807627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani public Cursor query(Uri uri, String[] projectionIn, String selection, 9907627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani String[] selectionArgs, String sortOrder) { 10007627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani Log.d(TAG, "query(" + uri + ")"); 10107627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani mType = (mType + 1) % 3; 10207627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 10307627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani if (mType == 0) { 10407627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani Log.d(TAG, "returning null cursor"); 10507627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani return null; 10607627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani } 10707627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 10807627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani MutableMatrixCursor cursor = new MutableMatrixCursor(COLUMNS); 10907627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani if (mType == 1) { 11007627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani addRows(cursor, true); 11107627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani } else { 11207627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani Log.d(TAG, "returning empty cursor"); 11307627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani } 11407627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani cursor.getExtras().putBoolean(SearchManager.CURSOR_EXTRA_KEY_IN_PROGRESS, true); 11507627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani mCursor = cursor; 11607627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani // Update the cursor in 2 seconds 11707627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani mHandler.removeMessages(MSG_COMPLETE); 11807627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_COMPLETE), 2000); 11907627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani return cursor; 12007627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani } 12107627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 12207627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani @Override 12307627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani public String getType(Uri uri) { 12407627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani return SearchManager.SUGGEST_MIME_TYPE; 12507627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani } 12607627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 12707627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani @Override 12807627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani public Uri insert(Uri uri, ContentValues values) { 12907627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani throw new UnsupportedOperationException(); 13007627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani } 13107627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 13207627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani @Override 13307627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani public int update(Uri uri, ContentValues values, String selection, 13407627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani String[] selectionArgs) { 13507627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani throw new UnsupportedOperationException(); 13607627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani } 13707627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 13807627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani @Override 13907627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani public int delete(Uri uri, String selection, String[] selectionArgs) { 14007627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani throw new UnsupportedOperationException(); 14107627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani } 14207627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani 14307627cc514504a71f3b128673552d6c601a5e8ceAmith Yamasani} 144