| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.android.quicksearchbox; |
| |
| import android.app.SearchManager; |
| import android.database.AbstractCursor; |
| import android.database.CursorIndexOutOfBoundsException; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.Collection; |
| |
| public class SuggestionCursorBackedCursor extends AbstractCursor { |
| |
| // This array also used in CursorBackedSuggestionExtras to avoid duplication. |
| public static final String[] COLUMNS = { |
| "_id", // 0, This will contain the row number. CursorAdapter, used by SuggestionsAdapter, |
| // used by SearchDialog, expects an _id column. |
| SearchManager.SUGGEST_COLUMN_TEXT_1, // 1 |
| SearchManager.SUGGEST_COLUMN_TEXT_2, // 2 |
| SearchManager.SUGGEST_COLUMN_TEXT_2_URL, // 3 |
| SearchManager.SUGGEST_COLUMN_ICON_1, // 4 |
| SearchManager.SUGGEST_COLUMN_ICON_2, // 5 |
| SearchManager.SUGGEST_COLUMN_INTENT_ACTION, // 6 |
| SearchManager.SUGGEST_COLUMN_INTENT_DATA, // 7 |
| SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA, // 8 |
| SearchManager.SUGGEST_COLUMN_QUERY, // 9 |
| SearchManager.SUGGEST_COLUMN_FORMAT, // 10 |
| SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, // 11 |
| SearchManager.SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING, // 12 |
| }; |
| |
| private static final int COLUMN_INDEX_ID = 0; |
| private static final int COLUMN_INDEX_TEXT1 = 1; |
| private static final int COLUMN_INDEX_TEXT2 = 2; |
| private static final int COLUMN_INDEX_TEXT2_URL = 3; |
| private static final int COLUMN_INDEX_ICON1 = 4; |
| private static final int COLUMN_INDEX_ICON2 = 5; |
| private static final int COLUMN_INDEX_INTENT_ACTION = 6; |
| private static final int COLUMN_INDEX_INTENT_DATA = 7; |
| private static final int COLUMN_INDEX_INTENT_EXTRA_DATA = 8; |
| private static final int COLUMN_INDEX_QUERY = 9; |
| private static final int COLUMN_INDEX_FORMAT = 10; |
| private static final int COLUMN_INDEX_SHORTCUT_ID = 11; |
| private static final int COLUMN_INDEX_SPINNER_WHILE_REFRESHING = 12; |
| |
| private final SuggestionCursor mCursor; |
| private ArrayList<String> mExtraColumns; |
| |
| public SuggestionCursorBackedCursor(SuggestionCursor cursor) { |
| mCursor = cursor; |
| } |
| |
| @Override |
| public void close() { |
| super.close(); |
| mCursor.close(); |
| } |
| |
| @Override |
| public String[] getColumnNames() { |
| Collection<String> extraColumns = mCursor.getExtraColumns(); |
| if (extraColumns != null) { |
| ArrayList<String> allColumns = new ArrayList<String>(COLUMNS.length + |
| extraColumns.size()); |
| mExtraColumns = new ArrayList<String>(extraColumns); |
| allColumns.addAll(Arrays.asList(COLUMNS)); |
| allColumns.addAll(mExtraColumns); |
| return allColumns.toArray(new String[allColumns.size()]); |
| } else { |
| return COLUMNS; |
| } |
| } |
| |
| @Override |
| public int getCount() { |
| return mCursor.getCount(); |
| } |
| |
| private Suggestion get() { |
| mCursor.moveTo(getPosition()); |
| return mCursor; |
| } |
| |
| private String getExtra(int columnIdx) { |
| int extraColumn = columnIdx - COLUMNS.length; |
| SuggestionExtras extras = get().getExtras(); |
| if (extras != null) { |
| return extras.getExtra(mExtraColumns.get(extraColumn)); |
| } else { |
| return null; |
| } |
| } |
| |
| @Override |
| public int getInt(int column) { |
| if (column == COLUMN_INDEX_ID) { |
| return getPosition(); |
| } else { |
| try { |
| return Integer.valueOf(getString(column)); |
| } catch (NumberFormatException e) { |
| return 0; |
| } |
| } |
| } |
| |
| @Override |
| public String getString(int column) { |
| if (column < COLUMNS.length) { |
| switch (column) { |
| case COLUMN_INDEX_ID: |
| return String.valueOf(getPosition()); |
| case COLUMN_INDEX_TEXT1: |
| return get().getSuggestionText1(); |
| case COLUMN_INDEX_TEXT2: |
| return get().getSuggestionText2(); |
| case COLUMN_INDEX_TEXT2_URL: |
| return get().getSuggestionText2Url(); |
| case COLUMN_INDEX_ICON1: |
| return get().getSuggestionIcon1(); |
| case COLUMN_INDEX_ICON2: |
| return get().getSuggestionIcon2(); |
| case COLUMN_INDEX_INTENT_ACTION: |
| return get().getSuggestionIntentAction(); |
| case COLUMN_INDEX_INTENT_DATA: |
| return get().getSuggestionIntentDataString(); |
| case COLUMN_INDEX_INTENT_EXTRA_DATA: |
| return get().getSuggestionIntentExtraData(); |
| case COLUMN_INDEX_QUERY: |
| return get().getSuggestionQuery(); |
| case COLUMN_INDEX_FORMAT: |
| return get().getSuggestionFormat(); |
| case COLUMN_INDEX_SHORTCUT_ID: |
| return get().getShortcutId(); |
| case COLUMN_INDEX_SPINNER_WHILE_REFRESHING: |
| return String.valueOf(get().isSpinnerWhileRefreshing()); |
| default: |
| throw new CursorIndexOutOfBoundsException("Requested column " + column |
| + " of " + COLUMNS.length); |
| } |
| } else { |
| return getExtra(column); |
| } |
| } |
| |
| @Override |
| public long getLong(int column) { |
| try { |
| return Long.valueOf(getString(column)); |
| } catch (NumberFormatException e) { |
| return 0; |
| } |
| } |
| |
| @Override |
| public boolean isNull(int column) { |
| return getString(column) == null; |
| } |
| |
| @Override |
| public short getShort(int column) { |
| try { |
| return Short.valueOf(getString(column)); |
| } catch (NumberFormatException e) { |
| return 0; |
| } |
| } |
| |
| @Override |
| public double getDouble(int column) { |
| try { |
| return Double.valueOf(getString(column)); |
| } catch (NumberFormatException e) { |
| return 0; |
| } |
| } |
| |
| @Override |
| public float getFloat(int column) { |
| try { |
| return Float.valueOf(getString(column)); |
| } catch (NumberFormatException e) { |
| return 0; |
| } |
| } |
| } |