Merge change 7551 into donut

* changes:
  Add ability to delay messages in Filter based on constraint.  Use this to delay 500ms for delete keys in the search dialog.
This commit is contained in:
Android (Google) Code Review
2009-07-16 14:41:10 -07:00
2 changed files with 51 additions and 1 deletions

View File

@@ -40,6 +40,7 @@ import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ResourceCursorAdapter; import android.widget.ResourceCursorAdapter;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Filter;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
@@ -90,6 +91,12 @@ class SuggestionsAdapter extends ResourceCursorAdapter {
private final Runnable mStartSpinnerRunnable; private final Runnable mStartSpinnerRunnable;
private final Runnable mStopSpinnerRunnable; private final Runnable mStopSpinnerRunnable;
/**
* The amount of time we delay in the filter when the user presses the delete key.
* @see Filter#setDelayer(android.widget.Filter.Delayer).
*/
private static final long DELETE_KEY_POST_DELAY = 500L;
public SuggestionsAdapter(Context context, SearchDialog searchDialog, SearchableInfo searchable, public SuggestionsAdapter(Context context, SearchDialog searchDialog, SearchableInfo searchable,
WeakHashMap<String, Drawable> outsideDrawablesCache, boolean globalSearchMode) { WeakHashMap<String, Drawable> outsideDrawablesCache, boolean globalSearchMode) {
super(context, super(context,
@@ -119,6 +126,18 @@ class SuggestionsAdapter extends ResourceCursorAdapter {
mSearchDialog.setWorking(false); mSearchDialog.setWorking(false);
} }
}; };
// delay 500ms when deleting
getFilter().setDelayer(new Filter.Delayer() {
private int mPreviousLength = 0;
public long getPostingDelay(CharSequence constraint) {
long delay = constraint.length() < mPreviousLength ? DELETE_KEY_POST_DELAY : 0;
mPreviousLength = constraint.length();
return delay;
}
});
} }
/** /**

View File

@@ -46,6 +46,8 @@ public abstract class Filter {
private Handler mThreadHandler; private Handler mThreadHandler;
private Handler mResultHandler; private Handler mResultHandler;
private Delayer mDelayer;
private final Object mLock = new Object(); private final Object mLock = new Object();
/** /**
@@ -55,6 +57,20 @@ public abstract class Filter {
mResultHandler = new ResultsHandler(); mResultHandler = new ResultsHandler();
} }
/**
* Provide an interface that decides how long to delay the message for a given query. Useful
* for heuristics such as posting a delay for the delete key to avoid doing any work while the
* user holds down the delete key.
*
* @param delayer The delayer.
* @hide
*/
public void setDelayer(Delayer delayer) {
synchronized (mLock) {
mDelayer = delayer;
}
}
/** /**
* <p>Starts an asynchronous filtering operation. Calling this method * <p>Starts an asynchronous filtering operation. Calling this method
* cancels all previous non-executed filtering requests and posts a new * cancels all previous non-executed filtering requests and posts a new
@@ -90,6 +106,8 @@ public abstract class Filter {
thread.start(); thread.start();
mThreadHandler = new RequestHandler(thread.getLooper()); mThreadHandler = new RequestHandler(thread.getLooper());
} }
final long delay = (mDelayer == null) ? 0 : mDelayer.getPostingDelay(constraint);
Message message = mThreadHandler.obtainMessage(FILTER_TOKEN); Message message = mThreadHandler.obtainMessage(FILTER_TOKEN);
@@ -102,7 +120,7 @@ public abstract class Filter {
mThreadHandler.removeMessages(FILTER_TOKEN); mThreadHandler.removeMessages(FILTER_TOKEN);
mThreadHandler.removeMessages(FINISH_TOKEN); mThreadHandler.removeMessages(FINISH_TOKEN);
mThreadHandler.sendMessage(message); mThreadHandler.sendMessageDelayed(message, delay);
} }
} }
@@ -289,4 +307,17 @@ public abstract class Filter {
*/ */
FilterResults results; FilterResults results;
} }
/**
* @hide
*/
public interface Delayer {
/**
* @param constraint The constraint passed to {@link Filter#filter(CharSequence)}
* @return The delay that should be used for
* {@link Handler#sendMessageDelayed(android.os.Message, long)}
*/
long getPostingDelay(CharSequence constraint);
}
} }