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