Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9ce081aa authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

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.
parents eb09c6a0 8bf92e00
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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,
@@ -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;
            }
        });
    }

    /**
+32 −1
Original line number Diff line number Diff line
@@ -46,6 +46,8 @@ public abstract class Filter {
    private Handler mThreadHandler;
    private Handler mResultHandler;

    private Delayer mDelayer;

    private final Object mLock = new Object();

    /**
@@ -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
@@ -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();
@@ -102,7 +120,7 @@ public abstract class Filter {
    
            mThreadHandler.removeMessages(FILTER_TOKEN);
            mThreadHandler.removeMessages(FINISH_TOKEN);
            mThreadHandler.sendMessage(message);
            mThreadHandler.sendMessageDelayed(message, delay);
        }
    }

@@ -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);
    }
}