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:
@@ -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;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user