content: /*
   * Copyright (C) 2007 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package android.widget;
  
  import android.database.Cursor;
  
  /**
   * <p>The CursorFilter delegates most of the work to the CursorAdapter.
   * Subclasses should override these delegate methods to run the queries
   * and convert the results into String that can be used by auto-completion
   * widgets.</p>
   */
  class CursorFilter extends Filter {
      
      CursorFilterClient mClient;
      
      interface CursorFilterClient {
          CharSequence convertToString(Cursor cursor);
          Cursor runQueryOnBackgroundThread(CharSequence constraint);
          Cursor getCursor();
          void changeCursor(Cursor cursor);
      }
  
      CursorFilter(CursorFilterClient client) {
          mClient = client;
      }
      
      @Override
      public CharSequence convertResultToString(Object resultValue) {
          return mClient.convertToString((Cursor) resultValue);
      }
  
      @Override
      protected FilterResults performFiltering(CharSequence constraint) {
          Cursor cursor = mClient.runQueryOnBackgroundThread(constraint);
  
          FilterResults results = new FilterResults();
          if (cursor != null) {
              results.count = cursor.getCount();
              results.values = cursor;
          } else {
              results.count = 0;
              results.values = null;
          }
          return results;
      }
  
      @Override
      protected void publishResults(CharSequence constraint, FilterResults results) {
          Cursor oldCursor = mClient.getCursor();
          
          if (results.values != null && results.values != oldCursor) {
              mClient.changeCursor((Cursor) results.values);
          }
      }
  }
  