1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.quicksearchbox 17 18 import android.os.Handler 19 import android.util.Log 20 import com.android.quicksearchbox.util.Consumer 21 import com.android.quicksearchbox.util.Consumers 22 import com.android.quicksearchbox.util.NamedTask 23 import com.android.quicksearchbox.util.NamedTaskExecutor 24 25 /** A task that gets suggestions from a corpus. */ 26 class QueryTask<C : SuggestionCursor?>( 27 private val mQuery: String?, 28 private val mQueryLimit: Int, 29 private val mProvider: SuggestionCursorProvider<C>?, 30 handler: Handler?, 31 consumer: Consumer<C>? 32 ) : NamedTask { 33 34 private val mHandler: Handler? 35 36 private val mConsumer: Consumer<C>? 37 38 @get:Override 39 override val name: String? 40 get() = mProvider?.name 41 42 @Override runnull43 override fun run() { 44 val cursor = mProvider?.getSuggestions(mQuery, mQueryLimit) 45 if (DBG) Log.d(TAG, "Suggestions from $mProvider = $cursor") 46 Consumers.consumeCloseableAsync(mHandler, mConsumer, cursor) 47 } 48 49 @Override toStringnull50 override fun toString(): String { 51 return "$mProvider[$mQuery]" 52 } 53 54 companion object { 55 private const val TAG = "QSB.QueryTask" 56 private const val DBG = false 57 58 @JvmStatic startQuerynull59 fun <C : SuggestionCursor?> startQuery( 60 query: String?, 61 maxResults: Int, 62 provider: SuggestionCursorProvider<C>?, 63 executor: NamedTaskExecutor, 64 handler: Handler?, 65 consumer: Consumer<C>? 66 ) { 67 val task = QueryTask(query, maxResults, provider, handler, consumer) 68 executor.execute(task) 69 } 70 } 71 72 /** 73 * Creates a new query task. 74 * 75 * @param query Query to run. 76 * @param queryLimit The number of suggestions to ask each provider for. 77 * @param provider The provider to ask for suggestions. 78 * @param handler Handler that [Consumer.consume] will get called on. If null, the method is 79 * called on the query thread. 80 * @param consumer Consumer to notify when the suggestions have been returned. 81 */ 82 init { 83 mHandler = handler 84 mConsumer = consumer 85 } 86 } 87