SuggestionCursorBackedCursor.java revision 5229b06f00d20aac76cd8519b37f2a579d61c54f
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 */
16package com.android.quicksearchbox;
17
18import android.app.SearchManager;
19import android.database.AbstractCursor;
20import android.database.CursorIndexOutOfBoundsException;
21
22import java.util.ArrayList;
23import java.util.Arrays;
24import java.util.Collection;
25
26public class SuggestionCursorBackedCursor extends AbstractCursor {
27
28    // This array also used in CursorBackedSuggestionExtras to avoid duplication.
29    public static final String[] COLUMNS = {
30        "_id",  // 0, This will contain the row number. CursorAdapter, used by SuggestionsAdapter,
31                // used by SearchDialog, expects an _id column.
32        SearchManager.SUGGEST_COLUMN_TEXT_1,  // 1
33        SearchManager.SUGGEST_COLUMN_TEXT_2,  // 2
34        SearchManager.SUGGEST_COLUMN_TEXT_2_URL,  // 3
35        SearchManager.SUGGEST_COLUMN_ICON_1,  // 4
36        SearchManager.SUGGEST_COLUMN_ICON_2,  // 5
37        SearchManager.SUGGEST_COLUMN_INTENT_ACTION,  // 6
38        SearchManager.SUGGEST_COLUMN_INTENT_DATA,  // 7
39        SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA,  // 8
40        SearchManager.SUGGEST_COLUMN_QUERY,  // 9
41        SearchManager.SUGGEST_COLUMN_FORMAT,  // 10
42        SearchManager.SUGGEST_COLUMN_SHORTCUT_ID,  // 11
43        SearchManager.SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING,  // 12
44    };
45
46    private static final int COLUMN_INDEX_ID = 0;
47    private static final int COLUMN_INDEX_TEXT1 = 1;
48    private static final int COLUMN_INDEX_TEXT2 = 2;
49    private static final int COLUMN_INDEX_TEXT2_URL = 3;
50    private static final int COLUMN_INDEX_ICON1 = 4;
51    private static final int COLUMN_INDEX_ICON2 = 5;
52    private static final int COLUMN_INDEX_INTENT_ACTION = 6;
53    private static final int COLUMN_INDEX_INTENT_DATA = 7;
54    private static final int COLUMN_INDEX_INTENT_EXTRA_DATA = 8;
55    private static final int COLUMN_INDEX_QUERY = 9;
56    private static final int COLUMN_INDEX_FORMAT = 10;
57    private static final int COLUMN_INDEX_SHORTCUT_ID = 11;
58    private static final int COLUMN_INDEX_SPINNER_WHILE_REFRESHING = 12;
59
60    private final SuggestionCursor mCursor;
61    private ArrayList<String> mExtraColumns;
62
63    public SuggestionCursorBackedCursor(SuggestionCursor cursor) {
64        mCursor = cursor;
65    }
66
67    @Override
68    public String[] getColumnNames() {
69        Collection<String> extraColumns = mCursor.getExtraColumns();
70        if (extraColumns != null) {
71            ArrayList<String> allColumns = new ArrayList<String>(COLUMNS.length +
72                    extraColumns.size());
73            mExtraColumns = new ArrayList<String>(extraColumns);
74            allColumns.addAll(Arrays.asList(COLUMNS));
75            allColumns.addAll(mExtraColumns);
76            return allColumns.toArray(new String[allColumns.size()]);
77        } else {
78            return COLUMNS;
79        }
80    }
81
82    @Override
83    public int getCount() {
84        return mCursor.getCount();
85    }
86
87    private Suggestion get() {
88        mCursor.moveTo(getPosition());
89        return mCursor;
90    }
91
92    private String getExtra(int columnIdx) {
93        int extraColumn = columnIdx - COLUMNS.length;
94        SuggestionExtras extras = get().getExtras();
95        if (extras != null) {
96            return extras.getExtra(mExtraColumns.get(extraColumn));
97        } else {
98            return null;
99        }
100    }
101
102    @Override
103    public int getInt(int column) {
104        if (column == COLUMN_INDEX_ID) {
105            return getPosition();
106        } else {
107            try {
108                return Integer.valueOf(getString(column));
109            } catch (NumberFormatException e) {
110                return 0;
111            }
112        }
113    }
114
115    @Override
116    public String getString(int column) {
117        if (column < COLUMNS.length) {
118            switch (column) {
119                case COLUMN_INDEX_ID:
120                    return String.valueOf(getPosition());
121                case COLUMN_INDEX_TEXT1:
122                    return get().getSuggestionText1();
123                case COLUMN_INDEX_TEXT2:
124                    return get().getSuggestionText2();
125                case COLUMN_INDEX_TEXT2_URL:
126                    return get().getSuggestionText2Url();
127                case COLUMN_INDEX_ICON1:
128                    return get().getSuggestionIcon1();
129                case COLUMN_INDEX_ICON2:
130                    return get().getSuggestionIcon2();
131                case COLUMN_INDEX_INTENT_ACTION:
132                    return get().getSuggestionIntentAction();
133                case COLUMN_INDEX_INTENT_DATA:
134                    return get().getSuggestionIntentDataString();
135                case COLUMN_INDEX_INTENT_EXTRA_DATA:
136                    return get().getSuggestionIntentExtraData();
137                case COLUMN_INDEX_QUERY:
138                    return get().getSuggestionQuery();
139                case COLUMN_INDEX_FORMAT:
140                    return get().getSuggestionFormat();
141                case COLUMN_INDEX_SHORTCUT_ID:
142                    return get().getShortcutId();
143                case COLUMN_INDEX_SPINNER_WHILE_REFRESHING:
144                    return String.valueOf(get().isSpinnerWhileRefreshing());
145                default:
146                    throw new CursorIndexOutOfBoundsException("Requested column " + column
147                            + " of " + COLUMNS.length);
148            }
149        } else {
150            return getExtra(column);
151        }
152    }
153
154    @Override
155    public long getLong(int column) {
156        try {
157            return Long.valueOf(getString(column));
158        } catch (NumberFormatException e) {
159            return 0;
160        }
161    }
162
163    @Override
164    public boolean isNull(int column) {
165        return getString(column) == null;
166    }
167
168    @Override
169    public short getShort(int column) {
170        try {
171            return Short.valueOf(getString(column));
172        } catch (NumberFormatException e) {
173            return 0;
174        }
175    }
176
177    @Override
178    public double getDouble(int column) {
179        try {
180            return Double.valueOf(getString(column));
181        } catch (NumberFormatException e) {
182            return 0;
183        }
184    }
185
186    @Override
187    public float getFloat(int column) {
188        try {
189            return Float.valueOf(getString(column));
190        } catch (NumberFormatException e) {
191            return 0;
192        }
193    }
194}
195