1/*
2 * Copyright (C) 2010 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.tests.partial;
18
19import android.app.SearchManager;
20import android.content.ContentProvider;
21import android.content.ContentValues;
22import android.content.Intent;
23import android.database.Cursor;
24import android.database.MatrixCursor;
25import android.net.Uri;
26import android.os.Bundle;
27import android.os.Handler;
28import android.os.Message;
29import android.util.Log;
30
31public class PartialSuggestionProvider extends ContentProvider {
32
33    private static final String TAG = PartialSuggestionProvider.class.getSimpleName();
34
35    private static final int MSG_COMPLETE = 1;
36
37    private MutableMatrixCursor mCursor;
38    private int mType = -1;
39
40    private static final String[] COLUMNS = {
41        "_id",
42        SearchManager.SUGGEST_COLUMN_TEXT_1,
43        SearchManager.SUGGEST_COLUMN_TEXT_2,
44        SearchManager.SUGGEST_COLUMN_INTENT_ACTION,
45        SearchManager.SUGGEST_COLUMN_INTENT_DATA,
46    };
47
48    Handler mHandler = new Handler() {
49        @Override
50        public void handleMessage(Message msg) {
51            switch (msg.what) {
52            case MSG_COMPLETE:
53                mCursor.getExtras().putBoolean(SearchManager.CURSOR_EXTRA_KEY_IN_PROGRESS, false);
54                addRows(mCursor, false);
55                mCursor.notifyChange();
56            }
57
58        }
59    };
60
61    private static class MutableMatrixCursor extends MatrixCursor {
62
63        Bundle mBundle;
64
65        MutableMatrixCursor(String[] columns) {
66            super(columns);
67        }
68
69        @Override
70        public Bundle getExtras() {
71            if (mBundle == null) mBundle = new Bundle();
72            return mBundle;
73        }
74
75        public void notifyChange() {
76            onChange(false);
77        }
78    }
79
80    @Override
81    public boolean onCreate() {
82        return true;
83    }
84
85    private void addRows(MatrixCursor cursor, boolean partial) {
86        for (int i = 0; i < 3; i++) {
87            cursor.addRow(new Object[]{
88                i,
89                (partial? "Partial" : "Final ") + " suggestion " + i,
90                "This is a suggestion",
91                Intent.ACTION_VIEW,
92                "content://com.android.quicksearchbox.partial/partial/" + i
93            });
94        }
95    }
96
97    @Override
98    public Cursor query(Uri uri, String[] projectionIn, String selection,
99            String[] selectionArgs, String sortOrder) {
100        Log.d(TAG, "query(" + uri + ")");
101        mType = (mType + 1) % 3;
102
103        if (mType == 0) {
104            Log.d(TAG, "returning null cursor");
105            return null;
106        }
107
108        MutableMatrixCursor cursor = new MutableMatrixCursor(COLUMNS);
109        if (mType == 1) {
110            addRows(cursor, true);
111        } else {
112            Log.d(TAG, "returning empty cursor");
113        }
114        cursor.getExtras().putBoolean(SearchManager.CURSOR_EXTRA_KEY_IN_PROGRESS, true);
115        mCursor = cursor;
116        // Update the cursor in 2 seconds
117        mHandler.removeMessages(MSG_COMPLETE);
118        mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_COMPLETE), 2000);
119        return cursor;
120    }
121
122    @Override
123    public String getType(Uri uri) {
124        return SearchManager.SUGGEST_MIME_TYPE;
125    }
126
127    @Override
128    public Uri insert(Uri uri, ContentValues values) {
129        throw new UnsupportedOperationException();
130    }
131
132    @Override
133    public int update(Uri uri, ContentValues values, String selection,
134            String[] selectionArgs) {
135        throw new UnsupportedOperationException();
136    }
137
138    @Override
139    public int delete(Uri uri, String selection, String[] selectionArgs) {
140        throw new UnsupportedOperationException();
141    }
142
143}
144