Loading core/java/android/app/SuggestionsAdapter.java +19 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ResourceCursorAdapter; import android.widget.TextView; import android.widget.Filter; import java.io.FileNotFoundException; import java.io.IOException; Loading Loading @@ -90,6 +91,12 @@ class SuggestionsAdapter extends ResourceCursorAdapter { private final Runnable mStartSpinnerRunnable; 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, WeakHashMap<String, Drawable> outsideDrawablesCache, boolean globalSearchMode) { super(context, Loading Loading @@ -119,6 +126,18 @@ class SuggestionsAdapter extends ResourceCursorAdapter { 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; } }); } /** Loading core/java/android/widget/Filter.java +32 −1 Original line number Diff line number Diff line Loading @@ -46,6 +46,8 @@ public abstract class Filter { private Handler mThreadHandler; private Handler mResultHandler; private Delayer mDelayer; private final Object mLock = new Object(); /** Loading @@ -55,6 +57,20 @@ public abstract class Filter { 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 * cancels all previous non-executed filtering requests and posts a new Loading Loading @@ -91,6 +107,8 @@ public abstract class Filter { mThreadHandler = new RequestHandler(thread.getLooper()); } final long delay = (mDelayer == null) ? 0 : mDelayer.getPostingDelay(constraint); Message message = mThreadHandler.obtainMessage(FILTER_TOKEN); RequestArguments args = new RequestArguments(); Loading @@ -102,7 +120,7 @@ public abstract class Filter { mThreadHandler.removeMessages(FILTER_TOKEN); mThreadHandler.removeMessages(FINISH_TOKEN); mThreadHandler.sendMessage(message); mThreadHandler.sendMessageDelayed(message, delay); } } Loading Loading @@ -289,4 +307,17 @@ public abstract class Filter { */ 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); } } Loading
core/java/android/app/SuggestionsAdapter.java +19 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ResourceCursorAdapter; import android.widget.TextView; import android.widget.Filter; import java.io.FileNotFoundException; import java.io.IOException; Loading Loading @@ -90,6 +91,12 @@ class SuggestionsAdapter extends ResourceCursorAdapter { private final Runnable mStartSpinnerRunnable; 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, WeakHashMap<String, Drawable> outsideDrawablesCache, boolean globalSearchMode) { super(context, Loading Loading @@ -119,6 +126,18 @@ class SuggestionsAdapter extends ResourceCursorAdapter { 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; } }); } /** Loading
core/java/android/widget/Filter.java +32 −1 Original line number Diff line number Diff line Loading @@ -46,6 +46,8 @@ public abstract class Filter { private Handler mThreadHandler; private Handler mResultHandler; private Delayer mDelayer; private final Object mLock = new Object(); /** Loading @@ -55,6 +57,20 @@ public abstract class Filter { 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 * cancels all previous non-executed filtering requests and posts a new Loading Loading @@ -91,6 +107,8 @@ public abstract class Filter { mThreadHandler = new RequestHandler(thread.getLooper()); } final long delay = (mDelayer == null) ? 0 : mDelayer.getPostingDelay(constraint); Message message = mThreadHandler.obtainMessage(FILTER_TOKEN); RequestArguments args = new RequestArguments(); Loading @@ -102,7 +120,7 @@ public abstract class Filter { mThreadHandler.removeMessages(FILTER_TOKEN); mThreadHandler.removeMessages(FINISH_TOKEN); mThreadHandler.sendMessage(message); mThreadHandler.sendMessageDelayed(message, delay); } } Loading Loading @@ -289,4 +307,17 @@ public abstract class Filter { */ 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); } }