Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Unified Diff: chrome/android/shell/java/src/org/chromium/chrome/shell/omnibox/SuggestionPopup.java

Issue 287293004: [ChromeShell] Add suggestions for ChromeShell toolbar box. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed TemplateUrlServiceTest Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/android/shell/java/src/org/chromium/chrome/shell/omnibox/SuggestionArrayAdapter.java ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/android/shell/java/src/org/chromium/chrome/shell/omnibox/SuggestionPopup.java
diff --git a/chrome/android/shell/java/src/org/chromium/chrome/shell/omnibox/SuggestionPopup.java b/chrome/android/shell/java/src/org/chromium/chrome/shell/omnibox/SuggestionPopup.java
new file mode 100644
index 0000000000000000000000000000000000000000..184af651eb1e236b9bcfb2c0ca39027edec87abb
--- /dev/null
+++ b/chrome/android/shell/java/src/org/chromium/chrome/shell/omnibox/SuggestionPopup.java
@@ -0,0 +1,150 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.shell.omnibox;
+
+import android.content.Context;
+import android.os.Handler;
+import android.text.Editable;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.ListPopupWindow;
+import android.widget.PopupWindow.OnDismissListener;
+import android.widget.TextView;
+
+import org.chromium.chrome.browser.omnibox.AutocompleteController;
+import org.chromium.chrome.browser.omnibox.AutocompleteController.OnSuggestionsReceivedListener;
+import org.chromium.chrome.browser.omnibox.OmniboxSuggestion;
+import org.chromium.chrome.shell.ChromeShellToolbar;
+import org.chromium.chrome.shell.R;
+
+import java.util.List;
+
+/**
+ * Displays suggestions for the text that is entered to the ChromeShell URL field.
+ */
+public class SuggestionPopup implements OnSuggestionsReceivedListener, TextWatcher {
+ private static final long SUGGESTION_START_DELAY_MS = 30;
+
+ private final Context mContext;
+ private final TextView mUrlField;
+ private final ChromeShellToolbar mToolbar;
+ private final AutocompleteController mAutocomplete;
+
+ private boolean mHasStartedNewOmniboxEditSession;
+ private Runnable mRequestSuggestions;
+ private ListPopupWindow mSuggestionsPopup;
+ private SuggestionArrayAdapter mSuggestionArrayAdapter;
+
+ /**
+ * Initializes a suggestion popup that will track urlField value and display suggestions based
+ * on that value.
+ */
+ public SuggestionPopup(Context context, TextView urlField,
+ ChromeShellToolbar toolbar) {
+ mContext = context;
+ mUrlField = urlField;
+ mToolbar = toolbar;
+ mAutocomplete = new AutocompleteController(this);
+ }
+
+ private void navigateToSuggestion(int position) {
+ mToolbar.getCurrentTab().loadUrlWithSanitization(
+ mSuggestionArrayAdapter.getItem(position).getUrl());
+ mUrlField.clearFocus();
+ mToolbar.setKeyboardVisibilityForUrl(false);
+ mToolbar.getCurrentTab().getView().requestFocus();
+ dismissPopup();
+ }
+
+ private void dismissPopup() {
+ if (mSuggestionsPopup != null) {
+ mSuggestionsPopup.dismiss();
+ mSuggestionsPopup = null;
+ }
+ }
+
+ /**
+ * Signals the autocomplete controller to stop generating suggestions and
+ * cancels the queued task to start the autocomplete controller, if any.
+ *
+ * @param clear Whether to clear the most recent autocomplete results.
+ */
+ private void stopAutocomplete(boolean clear) {
+ if (mAutocomplete != null) mAutocomplete.stop(clear);
+ if (mRequestSuggestions != null) mRequestSuggestions = null;
+ }
+
+ // OnSuggestionsReceivedListener implementation
+
+ @Override
+ public void onSuggestionsReceived(List<OmniboxSuggestion> suggestions,
+ String inlineAutocompleteText) {
+ if (!mUrlField.isFocused() || suggestions.isEmpty())
+ return;
+ if (mSuggestionsPopup == null) {
+ mSuggestionsPopup = new ListPopupWindow(
+ mContext, null, android.R.attr.autoCompleteTextViewStyle);
+ mSuggestionsPopup.setOnDismissListener(new OnDismissListener() {
+ @Override
+ public void onDismiss() {
+ mHasStartedNewOmniboxEditSession = false;
+ mSuggestionArrayAdapter = null;
+ }
+ });
+ }
+ mSuggestionsPopup.setWidth(mUrlField.getWidth());
+ mSuggestionArrayAdapter =
+ new SuggestionArrayAdapter(mContext, R.layout.dropdown_item, suggestions);
+ mSuggestionsPopup.setAdapter(mSuggestionArrayAdapter);
+ mSuggestionsPopup.setAnchorView(mUrlField);
+ mSuggestionsPopup.setOnItemClickListener(new OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ navigateToSuggestion(position);
+ }
+ });
+ mSuggestionsPopup.show();
+ }
+
+ // TextWatcher implementation
+
+ @Override
+ public void afterTextChanged(final Editable editableText) {
+ if (!mHasStartedNewOmniboxEditSession) {
+ mAutocomplete.resetSession();
+ mHasStartedNewOmniboxEditSession = true;
+ }
+
+ stopAutocomplete(false);
+ if (TextUtils.isEmpty(editableText)) {
+ dismissPopup();
+ } else {
+ assert mRequestSuggestions == null : "Multiple omnibox requests in flight.";
+ mRequestSuggestions = new Runnable() {
+ @Override
+ public void run() {
+ mRequestSuggestions = null;
+ mAutocomplete.start(
+ mToolbar.getCurrentTab().getProfile(),
+ mToolbar.getCurrentTab().getUrl(),
+ editableText.toString(), false);
+ }
+ };
+ new Handler().postDelayed(mRequestSuggestions, SUGGESTION_START_DELAY_MS);
+ }
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ mRequestSuggestions = null;
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ }
+}
« no previous file with comments | « chrome/android/shell/java/src/org/chromium/chrome/shell/omnibox/SuggestionArrayAdapter.java ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698