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