Home | History | Annotate | Download | only in quicksearchbox
      1 /*
      2  * Copyright (C) 2009 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 
     17 package com.android.quicksearchbox;
     18 
     19 import com.android.quicksearchbox.util.Consumer;
     20 import com.android.quicksearchbox.util.Consumers;
     21 import com.android.quicksearchbox.util.NamedTask;
     22 import com.android.quicksearchbox.util.NamedTaskExecutor;
     23 
     24 import android.os.Handler;
     25 import android.util.Log;
     26 
     27 /**
     28  * A task that gets suggestions from a corpus.
     29  */
     30 public class QueryTask<C extends SuggestionCursor> implements NamedTask {
     31     private static final String TAG = "QSB.QueryTask";
     32     private static final boolean DBG = false;
     33 
     34     private final String mQuery;
     35     private final int mQueryLimit;
     36     private final SuggestionCursorProvider<C> mProvider;
     37     private final Handler mHandler;
     38     private final Consumer<C> mConsumer;
     39 
     40     /**
     41      * Creates a new query task.
     42      *
     43      * @param query Query to run.
     44      * @param queryLimit The number of suggestions to ask each provider for.
     45      * @param provider The provider to ask for suggestions.
     46      * @param handler Handler that {@link Consumer#consume} will
     47      *        get called on. If null, the method is called on the query thread.
     48      * @param consumer Consumer to notify when the suggestions have been returned.
     49      */
     50     public QueryTask(String query, int queryLimit, SuggestionCursorProvider<C> provider,
     51             Handler handler, Consumer<C> consumer) {
     52         mQuery = query;
     53         mQueryLimit = queryLimit;
     54         mProvider = provider;
     55         mHandler = handler;
     56         mConsumer = consumer;
     57     }
     58 
     59     @Override
     60     public String getName() {
     61         return mProvider.getName();
     62     }
     63 
     64     @Override
     65     public void run() {
     66         final C cursor = mProvider.getSuggestions(mQuery, mQueryLimit);
     67         if (DBG) Log.d(TAG, "Suggestions from " + mProvider + " = " + cursor);
     68         Consumers.consumeCloseableAsync(mHandler, mConsumer, cursor);
     69     }
     70 
     71     @Override
     72     public String toString() {
     73         return mProvider + "[" + mQuery + "]";
     74     }
     75 
     76     public static <C extends SuggestionCursor> void startQuery(String query,
     77             int maxResults,
     78             SuggestionCursorProvider<C> provider,
     79             NamedTaskExecutor executor, Handler handler,
     80             Consumer<C> consumer) {
     81 
     82         QueryTask<C> task = new QueryTask<C>(query, maxResults, provider, handler,
     83                 consumer);
     84         executor.execute(task);
     85     }
     86 }
     87