1a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang/* 2a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang * Copyright (C) 2017 The Android Open Source Project 3a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang * 4a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang * Licensed under the Apache License, Version 2.0 (the "License"); 5a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang * you may not use this file except in compliance with the License. 6a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang * You may obtain a copy of the License at 7a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang * 8a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang * http://www.apache.org/licenses/LICENSE-2.0 9a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang * 10a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang * Unless required by applicable law or agreed to in writing, software 11a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang * distributed under the License is distributed on an "AS IS" BASIS, 12a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang * See the License for the specific language governing permissions and 14a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang * limitations under the License. 152078bc2358031ef3a191900d9036daf4251911c1Matthew Fritze * 16a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang */ 17a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang 182078bc2358031ef3a191900d9036daf4251911c1Matthew Fritzepackage com.android.settings.search; 19a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang 20a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhangimport android.content.Context; 21a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhangimport android.database.Cursor; 22a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhangimport android.database.sqlite.SQLiteDatabase; 23a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhangimport android.support.annotation.VisibleForTesting; 24a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang 25a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhangimport com.android.settings.search.IndexDatabaseHelper.SavedQueriesColumns; 26a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhangimport com.android.settings.utils.AsyncLoader; 27a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang 28a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhangimport java.util.ArrayList; 29a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhangimport java.util.List; 30a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang 31a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang/** 32a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang * Loader for recently searched queries. 33a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang */ 3440ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritzepublic class SavedQueryLoader extends AsyncLoader<List<? extends SearchResult>> { 35a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang 36a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang // Max number of proposed suggestions 37623faaa00e7bd04463e1393bbb8f210d005ef47fFan Zhang @VisibleForTesting 38a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang static final int MAX_PROPOSED_SUGGESTIONS = 5; 39a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang 40a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang private final SQLiteDatabase mDatabase; 41a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang 42a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang public SavedQueryLoader(Context context) { 43a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang super(context); 44a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang mDatabase = IndexDatabaseHelper.getInstance(context).getReadableDatabase(); 45a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang } 46a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang 47a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang @Override 4840ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze protected void onDiscardResult(List<? extends SearchResult> result) { 49a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang 50a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang } 51a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang 52a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang @Override 5340ce0fab758714c973945ec8f053c52076d5fc50Matthew Fritze public List<? extends SearchResult> loadInBackground() { 54623faaa00e7bd04463e1393bbb8f210d005ef47fFan Zhang try (final Cursor cursor = mDatabase.query( 55623faaa00e7bd04463e1393bbb8f210d005ef47fFan Zhang IndexDatabaseHelper.Tables.TABLE_SAVED_QUERIES /* table */, 56a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang new String[]{SavedQueriesColumns.QUERY} /* columns */, 57a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang null /* selection */, 58a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang null /* selectionArgs */, 59a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang null /* groupBy */, 60a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang null /* having */, 61a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang "rowId DESC" /* orderBy */, 62623faaa00e7bd04463e1393bbb8f210d005ef47fFan Zhang String.valueOf(MAX_PROPOSED_SUGGESTIONS) /* limit */)) { 63623faaa00e7bd04463e1393bbb8f210d005ef47fFan Zhang return convertCursorToResult(cursor); 64623faaa00e7bd04463e1393bbb8f210d005ef47fFan Zhang } 65a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang } 66a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang 67a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang private List<SearchResult> convertCursorToResult(Cursor cursor) { 68a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang final List<SearchResult> results = new ArrayList<>(); 69a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang while (cursor.moveToNext()) { 70a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang final SavedQueryPayload payload = new SavedQueryPayload( 71a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang cursor.getString(cursor.getColumnIndex(SavedQueriesColumns.QUERY))); 72a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang results.add(new SearchResult.Builder() 736efea1e624bb4b48290000cfdb82df224a31b81dMatthew Fritze .setStableId(payload.hashCode()) 746efea1e624bb4b48290000cfdb82df224a31b81dMatthew Fritze .setTitle(payload.query) 756efea1e624bb4b48290000cfdb82df224a31b81dMatthew Fritze .setPayload(payload) 76a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang .build()); 77a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang } 78a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang return results; 79a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang } 80a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhang} 81