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