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