19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.provider; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentValues; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SearchRecentSuggestionsProvider; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is a utility class providing access to 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.SearchRecentSuggestionsProvider}. 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Unlike some utility classes, this one must be instantiated and properly initialized, so that 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it can be configured to operate with the search suggestions provider that you have created. 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Typically, you will do this in your searchable activity, each time you receive an incoming 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} Intent. The code to record each 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * incoming query is as follows: 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SearchSuggestions suggestions = new SearchSuggestions(this, 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * MySuggestionsProvider.AUTHORITY, MySuggestionsProvider.MODE); 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * suggestions.saveRecentQuery(queryString, null); 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre> 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>For a working example, see SearchSuggestionSampleProvider and SearchQueryResults in 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * samples/ApiDemos/app. 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class SearchRecentSuggestions { 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // debugging support 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String LOG_TAG = "SearchSuggestions"; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // DELETE ME (eventually) 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int DBG_SUGGESTION_TIMESTAMPS = 0; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is a superset of all possible column names (need not all be in table) 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static class SuggestionColumns implements BaseColumns { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DISPLAY1 = "display1"; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DISPLAY2 = "display2"; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String QUERY = "query"; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DATE = "date"; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* if you change column order you must also change indices below */ 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is the database projection that can be used to view saved queries, when 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * configured for one-line operation. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String[] QUERIES_PROJECTION_1LINE = new String[] { 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SuggestionColumns._ID, 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SuggestionColumns.DATE, 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SuggestionColumns.QUERY, 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SuggestionColumns.DISPLAY1, 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* if you change column order you must also change indices below */ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is the database projection that can be used to view saved queries, when 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * configured for two-line operation. 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String[] QUERIES_PROJECTION_2LINE = new String[] { 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SuggestionColumns._ID, 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SuggestionColumns.DATE, 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SuggestionColumns.QUERY, 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SuggestionColumns.DISPLAY1, 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SuggestionColumns.DISPLAY2, 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* these indices depend on QUERIES_PROJECTION_xxx */ 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Index into the provided query projections. For use with Cursor.update methods. */ 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int QUERIES_PROJECTION_DATE_INDEX = 1; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Index into the provided query projections. For use with Cursor.update methods. */ 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int QUERIES_PROJECTION_QUERY_INDEX = 2; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Index into the provided query projections. For use with Cursor.update methods. */ 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int QUERIES_PROJECTION_DISPLAY1_INDEX = 3; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Index into the provided query projections. For use with Cursor.update methods. */ 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int QUERIES_PROJECTION_DISPLAY2_INDEX = 4; // only when 2line active 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* columns needed to determine whether to truncate history */ 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String[] TRUNCATE_HISTORY_PROJECTION = new String[] { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SuggestionColumns._ID, SuggestionColumns.DATE 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set a cap on the count of items in the suggestions table, to 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * prevent db and layout operations from dragging to a crawl. Revisit this 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cap when/if db/layout performance improvements are made. 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MAX_HISTORY_COUNT = 250; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // client-provided configuration values 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mContext; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mAuthority; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mTwoLineDisplay; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Uri mSuggestionsUri; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mQueriesProjection; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Although provider utility classes are typically static, this one must be constructed 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * because it needs to be initialized using the same values that you provided in your 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.SearchRecentSuggestionsProvider}. 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param authority This must match the authority that you've declared in your manifest. 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mode You can use mode flags here to determine certain functional aspects of your 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * database. Note, this value should not change from run to run, because when it does change, 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your suggestions database may be wiped. 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.content.SearchRecentSuggestionsProvider 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.content.SearchRecentSuggestionsProvider#setupSuggestions 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SearchRecentSuggestions(Context context, String authority, int mode) { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (TextUtils.isEmpty(authority) || 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((mode & SearchRecentSuggestionsProvider.DATABASE_MODE_QUERIES) == 0)) { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // unpack mode flags 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTwoLineDisplay = (0 != (mode & SearchRecentSuggestionsProvider.DATABASE_MODE_2LINES)); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // saved values 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAuthority = new String(authority); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // derived values 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSuggestionsUri = Uri.parse("content://" + mAuthority + "/suggestions"); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTwoLineDisplay) { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mQueriesProjection = QUERIES_PROJECTION_2LINE; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mQueriesProjection = QUERIES_PROJECTION_1LINE; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a query to the recent queries list. 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param queryString The string as typed by the user. This string will be displayed as 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the suggestion, and if the user clicks on the suggestion, this string will be sent to your 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searchable activity (as a new search query). 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param line2 If you have configured your recent suggestions provider with 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.SearchRecentSuggestionsProvider#DATABASE_MODE_2LINES}, you can 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pass a second line of text here. It will be shown in a smaller font, below the primary 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * suggestion. When typing, matches in either line of text will be displayed in the list. 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If you did not configure two-line mode, or if a given suggestion does not have any 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * additional text to display, you can pass null here. 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void saveRecentQuery(String queryString, String line2) { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (TextUtils.isEmpty(queryString)) { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mTwoLineDisplay && !TextUtils.isEmpty(line2)) { 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentResolver cr = mContext.getContentResolver(); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = System.currentTimeMillis(); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Use content resolver (not cursor) to insert/update this query 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues values = new ContentValues(); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(SuggestionColumns.DISPLAY1, queryString); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTwoLineDisplay) { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(SuggestionColumns.DISPLAY2, line2); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(SuggestionColumns.QUERY, queryString); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(SuggestionColumns.DATE, now); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.insert(mSuggestionsUri, values); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOG_TAG, "saveRecentQuery", e); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Shorten the list (if it has become too long) 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project truncateHistory(cr, MAX_HISTORY_COUNT); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Completely delete the history. Use this call to implement a "clear history" UI. 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Any application that implements search suggestions based on previous actions (such as 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recent queries, page/items viewed, etc.) should provide a way for the user to clear the 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * history. This gives the user a measure of privacy, if they do not wish for their recent 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searches to be replayed by other users of the device (via suggestions). 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearHistory() { 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentResolver cr = mContext.getContentResolver(); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project truncateHistory(cr, 0); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reduces the length of the history table, to prevent it from growing too large. 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr Convenience copy of the content resolver. 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param maxEntries Max entries to leave in the table. 0 means remove all entries. 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void truncateHistory(ContentResolver cr, int maxEntries) { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (maxEntries < 0) { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // null means "delete all". otherwise "delete but leave n newest" 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String selection = null; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (maxEntries > 0) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project selection = "_id IN " + 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "(SELECT _id FROM suggestions" + 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ORDER BY " + SuggestionColumns.DATE + " DESC" + 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " LIMIT -1 OFFSET " + String.valueOf(maxEntries) + ")"; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.delete(mSuggestionsUri, selection, null); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOG_TAG, "truncateHistory", e); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 230