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