CursorBackedSuggestionCursor.java revision 93bd2e70b8b08da1ec37fd0e990dac05551d2e90
13e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert/* 23e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * Copyright (C) 2009 The Android Open Source Project 33e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * 43e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 53e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * you may not use this file except in compliance with the License. 63e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * You may obtain a copy of the License at 73e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * 83e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 93e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * 103e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * Unless required by applicable law or agreed to in writing, software 113e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 123e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * See the License for the specific language governing permissions and 143e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * limitations under the License. 153e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert */ 163e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 173e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertpackage com.android.quicksearchbox; 183e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 193e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.app.SearchManager; 2093bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringertimport android.content.Intent; 213e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.database.Cursor; 22fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringertimport android.database.DataSetObserver; 233e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.net.Uri; 243e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringertimport android.util.Log; 253e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 2693bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringertpublic abstract class CursorBackedSuggestionCursor implements SuggestionCursor { 273e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 28cef2c4c9d54f513babd74801dbed5cbf709b9b79Bjorn Bringert private static final boolean DBG = false; 293e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert protected static final String TAG = "QSB.CursorBackedSuggestionCursor"; 303e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 31883c1bf364e38c5b133afb55f8493a14b65f4dd4Bjorn Bringert public static final String SUGGEST_COLUMN_LOG_TYPE = "suggest_log_type"; 32883c1bf364e38c5b133afb55f8493a14b65f4dd4Bjorn Bringert 3393bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert private final String mUserQuery; 3493bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert 353e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert /** The suggestions, or {@code null} if the suggestions query failed. */ 363e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert protected final Cursor mCursor; 373e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 38fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert /** Column index of {@link SearchManager#SUGGEST_COLUMN_FORMAT} in @{link mCursor}. */ 393e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert private final int mFormatCol; 403e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 41fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert /** Column index of {@link SearchManager#SUGGEST_COLUMN_TEXT_1} in @{link mCursor}. */ 423e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert private final int mText1Col; 433e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 44fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert /** Column index of {@link SearchManager#SUGGEST_COLUMN_TEXT_2} in @{link mCursor}. */ 453e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert private final int mText2Col; 463e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 47965d98377ddfdc52b772c2444d840000b665e000Bjorn Bringert /** Column index of {@link SearchManager#SUGGEST_COLUMN_TEXT_2_URL} in @{link mCursor}. */ 48965d98377ddfdc52b772c2444d840000b665e000Bjorn Bringert private final int mText2UrlCol; 49965d98377ddfdc52b772c2444d840000b665e000Bjorn Bringert 50fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert /** Column index of {@link SearchManager#SUGGEST_COLUMN_ICON_1} in @{link mCursor}. */ 513e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert private final int mIcon1Col; 523e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 53fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert /** Column index of {@link SearchManager#SUGGEST_COLUMN_ICON_1} in @{link mCursor}. */ 543e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert private final int mIcon2Col; 553e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 56fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert /** Column index of {@link SearchManager#SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING} 5794e8a2be78530170f50e7895a558bf8011bbf8e8Bryan Mawhinney * in @{link mCursor}. 5894e8a2be78530170f50e7895a558bf8011bbf8e8Bryan Mawhinney **/ 5994e8a2be78530170f50e7895a558bf8011bbf8e8Bryan Mawhinney private final int mRefreshSpinnerCol; 6094e8a2be78530170f50e7895a558bf8011bbf8e8Bryan Mawhinney 613e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert /** True if this result has been closed. */ 623e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert private boolean mClosed = false; 633e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 643e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert public CursorBackedSuggestionCursor(String userQuery, Cursor cursor) { 6593bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert mUserQuery = userQuery; 663e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert mCursor = cursor; 673e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert mFormatCol = getColumnIndex(SearchManager.SUGGEST_COLUMN_FORMAT); 683e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert mText1Col = getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1); 693e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert mText2Col = getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_2); 70965d98377ddfdc52b772c2444d840000b665e000Bjorn Bringert mText2UrlCol = getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_2_URL); 713e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert mIcon1Col = getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1); 723e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert mIcon2Col = getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_2); 7394e8a2be78530170f50e7895a558bf8011bbf8e8Bryan Mawhinney mRefreshSpinnerCol = getColumnIndex(SearchManager.SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING); 743e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 753e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 7693bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert public String getUserQuery() { 7793bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert return mUserQuery; 7893bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert } 7993bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert 80fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert public abstract Source getSuggestionSource(); 813e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 82fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert public String getSuggestionLogType() { 83883c1bf364e38c5b133afb55f8493a14b65f4dd4Bjorn Bringert return getStringOrNull(SUGGEST_COLUMN_LOG_TYPE); 843e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 853e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 863e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert public void close() { 87185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert if (DBG) Log.d(TAG, "close()"); 883e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert if (mClosed) { 89185bb2e3881452c084fde44d9bee657f65881b0eBjorn Bringert throw new IllegalStateException("Double close()"); 903e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 913e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert mClosed = true; 923e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert if (mCursor != null) { 937a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert try { 947a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert mCursor.close(); 957a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert } catch (RuntimeException ex) { 967a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert // all operations on cross-process cursors can throw random exceptions 977a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert Log.e(TAG, "close() failed, ", ex); 987a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert } 993e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 1003e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 1013e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 1023e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert @Override 1033e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert protected void finalize() { 1043e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert if (!mClosed) { 1053e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert Log.e(TAG, "LEAK! Finalized without being closed: " + toString()); 1063e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 1073e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 1083e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 1093e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert public int getCount() { 1103e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert if (mClosed) { 1113e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert throw new IllegalStateException("getCount() after close()"); 1123e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 1133e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert if (mCursor == null) return 0; 1147a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert try { 1157a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert return mCursor.getCount(); 1167a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert } catch (RuntimeException ex) { 1177a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert // all operations on cross-process cursors can throw random exceptions 1187a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert Log.e(TAG, "getCount() failed, ", ex); 1197a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert return 0; 1207a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert } 1213e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 1223e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 1233e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert public void moveTo(int pos) { 1243e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert if (mClosed) { 1253e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert throw new IllegalStateException("moveTo(" + pos + ") after close()"); 1263e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 1277a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert try { 1287a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert if (!mCursor.moveToPosition(pos)) { 1297a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert Log.e(TAG, "moveToPosition(" + pos + ") failed, count=" + getCount()); 1307a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert } 1317a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert } catch (RuntimeException ex) { 1327a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert // all operations on cross-process cursors can throw random exceptions 1337a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert Log.e(TAG, "moveToPosition() failed, ", ex); 1343e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 1353e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 1363e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 13787e947cbd9f279a83337900ff8bbd5ab0a8dc455Bjorn Bringert public boolean moveToNext() { 13887e947cbd9f279a83337900ff8bbd5ab0a8dc455Bjorn Bringert if (mClosed) { 13987e947cbd9f279a83337900ff8bbd5ab0a8dc455Bjorn Bringert throw new IllegalStateException("moveToNext() after close()"); 14087e947cbd9f279a83337900ff8bbd5ab0a8dc455Bjorn Bringert } 14187e947cbd9f279a83337900ff8bbd5ab0a8dc455Bjorn Bringert try { 14287e947cbd9f279a83337900ff8bbd5ab0a8dc455Bjorn Bringert return mCursor.moveToNext(); 14387e947cbd9f279a83337900ff8bbd5ab0a8dc455Bjorn Bringert } catch (RuntimeException ex) { 14487e947cbd9f279a83337900ff8bbd5ab0a8dc455Bjorn Bringert // all operations on cross-process cursors can throw random exceptions 14587e947cbd9f279a83337900ff8bbd5ab0a8dc455Bjorn Bringert Log.e(TAG, "moveToNext() failed, ", ex); 14687e947cbd9f279a83337900ff8bbd5ab0a8dc455Bjorn Bringert return false; 14787e947cbd9f279a83337900ff8bbd5ab0a8dc455Bjorn Bringert } 14887e947cbd9f279a83337900ff8bbd5ab0a8dc455Bjorn Bringert } 14987e947cbd9f279a83337900ff8bbd5ab0a8dc455Bjorn Bringert 1503e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert public int getPosition() { 1513e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert if (mClosed) { 1523e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert throw new IllegalStateException("getPosition after close()"); 1533e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 1547a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert try { 1557a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert return mCursor.getPosition(); 1567a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert } catch (RuntimeException ex) { 1577a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert // all operations on cross-process cursors can throw random exceptions 1587a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert Log.e(TAG, "getPosition() failed, ", ex); 1597a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert return -1; 1607a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert } 1613e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 1623e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 1633e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert public String getShortcutId() { 1643e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert return getStringOrNull(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID); 1653e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 1663e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 1673e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert public String getSuggestionFormat() { 1683e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert return getStringOrNull(mFormatCol); 1693e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 1703e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 1713e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert public String getSuggestionText1() { 1723e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert return getStringOrNull(mText1Col); 1733e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 1743e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 1753e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert public String getSuggestionText2() { 1763e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert return getStringOrNull(mText2Col); 1773e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 1783e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 179965d98377ddfdc52b772c2444d840000b665e000Bjorn Bringert public String getSuggestionText2Url() { 180965d98377ddfdc52b772c2444d840000b665e000Bjorn Bringert return getStringOrNull(mText2UrlCol); 181965d98377ddfdc52b772c2444d840000b665e000Bjorn Bringert } 182965d98377ddfdc52b772c2444d840000b665e000Bjorn Bringert 1833e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert public String getSuggestionIcon1() { 1843e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert return getStringOrNull(mIcon1Col); 1853e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 1863e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 1873e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert public String getSuggestionIcon2() { 1883e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert return getStringOrNull(mIcon2Col); 1893e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 1903e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 19194e8a2be78530170f50e7895a558bf8011bbf8e8Bryan Mawhinney public boolean isSpinnerWhileRefreshing() { 19294e8a2be78530170f50e7895a558bf8011bbf8e8Bryan Mawhinney return "true".equals(getStringOrNull(mRefreshSpinnerCol)); 19394e8a2be78530170f50e7895a558bf8011bbf8e8Bryan Mawhinney } 19494e8a2be78530170f50e7895a558bf8011bbf8e8Bryan Mawhinney 1953e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert /** 1963e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * Gets the intent action for the current suggestion. 1973e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert */ 198fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert public String getSuggestionIntentAction() { 19993bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert String action = getStringOrNull(SearchManager.SUGGEST_COLUMN_INTENT_ACTION); 20093bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert if (action != null) return action; 20193bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert return getSuggestionSource().getDefaultIntentAction(); 2023e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 2033e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 2043e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert /** 2053e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * Gets the query for the current suggestion. 2063e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert */ 207fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert public String getSuggestionQuery() { 2083e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert return getStringOrNull(SearchManager.SUGGEST_COLUMN_QUERY); 2093e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 2103e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 2111e938ea2f5edefab446b9562b316bc5dc72adebbBryan Mawhinney public String getSuggestionIntentDataString() { 2123e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert // use specific data if supplied, or default data if supplied 2133e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert String data = getStringOrNull(SearchManager.SUGGEST_COLUMN_INTENT_DATA); 2143e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert if (data == null) { 215fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert data = getSuggestionSource().getDefaultIntentData(); 2163e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 2173e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert // then, if an ID was provided, append it. 2183e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert if (data != null) { 2193e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert String id = getStringOrNull(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID); 2203e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert if (id != null) { 2213e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert data = data + "/" + Uri.encode(id); 2223e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 2233e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 2243e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert return data; 2253e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 2263e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 2273e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert /** 2283e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * Gets the intent extra data for the current suggestion. 2293e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert */ 23094e8a2be78530170f50e7895a558bf8011bbf8e8Bryan Mawhinney public String getSuggestionIntentExtraData() { 2313e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert return getStringOrNull(SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA); 2323e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 2333e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 23493bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert public boolean isWebSearchSuggestion() { 23593bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert return Intent.ACTION_WEB_SEARCH.equals(getSuggestionIntentAction()); 23693bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert } 23793bd2e70b8b08da1ec37fd0e990dac05551d2e90Bjorn Bringert 2383e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert /** 239fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert * Gets the index of a column in {@link #mCursor} by name. 2403e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * 2413e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * @return The index, or {@code -1} if the column was not found. 2423e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert */ 2433e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert protected int getColumnIndex(String colName) { 2443e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert if (mCursor == null) return -1; 2457a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert try { 2467a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert return mCursor.getColumnIndex(colName); 2477a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert } catch (RuntimeException ex) { 2487a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert // all operations on cross-process cursors can throw random exceptions 2497a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert Log.e(TAG, "getColumnIndex() failed, ", ex); 2507a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert return -1; 2517a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert } 2523e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 2533e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 2543e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert /** 255fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert * Gets the string value of a column in {@link #mCursor} by column index. 2563e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * 2573e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * @param col Column index. 2583e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * @return The string value, or {@code null}. 2593e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert */ 2603e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert protected String getStringOrNull(int col) { 2613e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert if (mCursor == null) return null; 2623e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert if (col == -1) { 2633e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert return null; 2643e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 2653e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert try { 2663e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert return mCursor.getString(col); 2677a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert } catch (RuntimeException ex) { 2687a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert // all operations on cross-process cursors can throw random exceptions 2697a1f40b4189a7435fe7177e759fde9fd2d032574Bjorn Bringert Log.e(TAG, "getString() failed, ", ex); 2703e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert return null; 2713e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 2723e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 2733e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 2743e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert /** 275fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert * Gets the string value of a column in {@link #mCursor} by column name. 2763e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * 2773e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * @param colName Column name. 2783e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert * @return The string value, or {@code null}. 2793e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert */ 2803e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert protected String getStringOrNull(String colName) { 2813e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert int col = getColumnIndex(colName); 2823e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert return getStringOrNull(col); 2833e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert } 2843e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert 285fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert public void registerDataSetObserver(DataSetObserver observer) { 286fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert // We don't watch Cursor-backed SuggestionCursors for changes 287fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert } 288fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert 289fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert public void unregisterDataSetObserver(DataSetObserver observer) { 290fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert // We don't watch Cursor-backed SuggestionCursors for changes 291fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert } 292bf61e445cbe423cc2554b722b6dd38675015c36dBjorn Bringert 2933e44ff1f2a204db3f479698cf0b3eab3d451dec2Bjorn Bringert} 294