193bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert/* 293bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert * Copyright (C) 2010 The Android Open Source Project 393bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert * 493bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 593bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert * you may not use this file except in compliance with the License. 693bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert * You may obtain a copy of the License at 793bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert * 893bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 993bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert * 1093bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert * Unless required by applicable law or agreed to in writing, software 1193bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 1293bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1393bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert * See the License for the specific language governing permissions and 1493bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert * limitations under the License. 1593bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert */ 1693bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringertpackage com.android.quicksearchbox; 1793bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert 1893bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringertimport android.app.SearchManager; 1993bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringertimport android.database.AbstractCursor; 2093bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringertimport android.database.CursorIndexOutOfBoundsException; 2193bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert 225229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwoodimport java.util.ArrayList; 235229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwoodimport java.util.Arrays; 245229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwoodimport java.util.Collection; 255229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood 2693bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringertpublic class SuggestionCursorBackedCursor extends AbstractCursor { 2793bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert 285229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood // This array also used in CursorBackedSuggestionExtras to avoid duplication. 295229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood public static final String[] COLUMNS = { 3093bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert "_id", // 0, This will contain the row number. CursorAdapter, used by SuggestionsAdapter, 3193bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert // used by SearchDialog, expects an _id column. 3293bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert SearchManager.SUGGEST_COLUMN_TEXT_1, // 1 3393bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert SearchManager.SUGGEST_COLUMN_TEXT_2, // 2 3493bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert SearchManager.SUGGEST_COLUMN_TEXT_2_URL, // 3 3593bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert SearchManager.SUGGEST_COLUMN_ICON_1, // 4 3693bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert SearchManager.SUGGEST_COLUMN_ICON_2, // 5 3793bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert SearchManager.SUGGEST_COLUMN_INTENT_ACTION, // 6 3893bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert SearchManager.SUGGEST_COLUMN_INTENT_DATA, // 7 3993bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA, // 8 4093bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert SearchManager.SUGGEST_COLUMN_QUERY, // 9 4193bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert SearchManager.SUGGEST_COLUMN_FORMAT, // 10 4293bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, // 11 4393bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert SearchManager.SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING, // 12 4493bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert }; 4593bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert 4693bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert private static final int COLUMN_INDEX_ID = 0; 4793bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert private static final int COLUMN_INDEX_TEXT1 = 1; 4893bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert private static final int COLUMN_INDEX_TEXT2 = 2; 4993bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert private static final int COLUMN_INDEX_TEXT2_URL = 3; 5093bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert private static final int COLUMN_INDEX_ICON1 = 4; 5193bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert private static final int COLUMN_INDEX_ICON2 = 5; 5293bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert private static final int COLUMN_INDEX_INTENT_ACTION = 6; 5393bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert private static final int COLUMN_INDEX_INTENT_DATA = 7; 5493bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert private static final int COLUMN_INDEX_INTENT_EXTRA_DATA = 8; 5593bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert private static final int COLUMN_INDEX_QUERY = 9; 5693bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert private static final int COLUMN_INDEX_FORMAT = 10; 5793bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert private static final int COLUMN_INDEX_SHORTCUT_ID = 11; 5893bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert private static final int COLUMN_INDEX_SPINNER_WHILE_REFRESHING = 12; 5993bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert 6093bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert private final SuggestionCursor mCursor; 615229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood private ArrayList<String> mExtraColumns; 6293bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert 6393bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert public SuggestionCursorBackedCursor(SuggestionCursor cursor) { 6493bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert mCursor = cursor; 6593bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert } 6693bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert 6793bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert @Override 682f6c8b84b24d3adf767e8533627f6f63e73acbdeBjorn Bringert public void close() { 692f6c8b84b24d3adf767e8533627f6f63e73acbdeBjorn Bringert super.close(); 702f6c8b84b24d3adf767e8533627f6f63e73acbdeBjorn Bringert mCursor.close(); 712f6c8b84b24d3adf767e8533627f6f63e73acbdeBjorn Bringert } 722f6c8b84b24d3adf767e8533627f6f63e73acbdeBjorn Bringert 732f6c8b84b24d3adf767e8533627f6f63e73acbdeBjorn Bringert @Override 7493bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert public String[] getColumnNames() { 755229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood Collection<String> extraColumns = mCursor.getExtraColumns(); 765229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood if (extraColumns != null) { 775229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood ArrayList<String> allColumns = new ArrayList<String>(COLUMNS.length + 785229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood extraColumns.size()); 795229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood mExtraColumns = new ArrayList<String>(extraColumns); 805229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood allColumns.addAll(Arrays.asList(COLUMNS)); 815229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood allColumns.addAll(mExtraColumns); 825229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return allColumns.toArray(new String[allColumns.size()]); 835229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood } else { 845229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return COLUMNS; 855229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood } 8693bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert } 8793bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert 8893bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert @Override 8993bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert public int getCount() { 9093bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert return mCursor.getCount(); 9193bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert } 9293bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert 9393bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert private Suggestion get() { 9493bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert mCursor.moveTo(getPosition()); 9593bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert return mCursor; 9693bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert } 9793bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert 985229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood private String getExtra(int columnIdx) { 995229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood int extraColumn = columnIdx - COLUMNS.length; 1005229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood SuggestionExtras extras = get().getExtras(); 1015229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood if (extras != null) { 1025229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return extras.getExtra(mExtraColumns.get(extraColumn)); 1035229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood } else { 1045229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return null; 1055229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood } 1065229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood } 1075229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood 10893bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert @Override 10993bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert public int getInt(int column) { 1105229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood if (column == COLUMN_INDEX_ID) { 1115229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return getPosition(); 1125229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood } else { 1135229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood try { 1145229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return Integer.valueOf(getString(column)); 1155229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood } catch (NumberFormatException e) { 1165229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return 0; 1175229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood } 11893bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert } 11993bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert } 12093bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert 12193bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert @Override 12293bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert public String getString(int column) { 1235229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood if (column < COLUMNS.length) { 1245229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood switch (column) { 1255229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood case COLUMN_INDEX_ID: 1265229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return String.valueOf(getPosition()); 1275229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood case COLUMN_INDEX_TEXT1: 1285229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return get().getSuggestionText1(); 1295229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood case COLUMN_INDEX_TEXT2: 1305229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return get().getSuggestionText2(); 1315229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood case COLUMN_INDEX_TEXT2_URL: 1325229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return get().getSuggestionText2Url(); 1335229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood case COLUMN_INDEX_ICON1: 1345229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return get().getSuggestionIcon1(); 1355229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood case COLUMN_INDEX_ICON2: 1365229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return get().getSuggestionIcon2(); 1375229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood case COLUMN_INDEX_INTENT_ACTION: 1385229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return get().getSuggestionIntentAction(); 1395229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood case COLUMN_INDEX_INTENT_DATA: 1405229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return get().getSuggestionIntentDataString(); 1415229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood case COLUMN_INDEX_INTENT_EXTRA_DATA: 1425229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return get().getSuggestionIntentExtraData(); 1435229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood case COLUMN_INDEX_QUERY: 1445229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return get().getSuggestionQuery(); 1455229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood case COLUMN_INDEX_FORMAT: 1465229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return get().getSuggestionFormat(); 1475229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood case COLUMN_INDEX_SHORTCUT_ID: 1485229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return get().getShortcutId(); 1495229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood case COLUMN_INDEX_SPINNER_WHILE_REFRESHING: 1505229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return String.valueOf(get().isSpinnerWhileRefreshing()); 1515229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood default: 1525229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood throw new CursorIndexOutOfBoundsException("Requested column " + column 1535229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood + " of " + COLUMNS.length); 1545229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood } 1555229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood } else { 1565229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return getExtra(column); 15793bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert } 15893bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert } 15993bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert 16093bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert @Override 16193bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert public long getLong(int column) { 1625229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood try { 1635229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return Long.valueOf(getString(column)); 1645229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood } catch (NumberFormatException e) { 1655229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return 0; 1665229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood } 16793bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert } 16893bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert 16993bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert @Override 17093bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert public boolean isNull(int column) { 17193bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert return getString(column) == null; 17293bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert } 17393bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert 17493bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert @Override 17593bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert public short getShort(int column) { 1765229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood try { 1775229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return Short.valueOf(getString(column)); 1785229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood } catch (NumberFormatException e) { 1795229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return 0; 1805229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood } 18193bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert } 18293bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert 18393bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert @Override 18493bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert public double getDouble(int column) { 1855229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood try { 1865229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return Double.valueOf(getString(column)); 1875229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood } catch (NumberFormatException e) { 1885229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return 0; 1895229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood } 19093bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert } 19193bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert 19293bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert @Override 19393bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert public float getFloat(int column) { 1945229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood try { 1955229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return Float.valueOf(getString(column)); 1965229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood } catch (NumberFormatException e) { 1975229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood return 0; 1985229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood } 19993bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert } 20093bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert} 201