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

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java

Issue 2885973002: Refactor autocomplete-specific logic into a separate class (Closed)
Patch Set: address tedchoc's comments Created 3 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
Index: chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
index ed2cbb94d9215389895403d1062d4c2fc03703b9..50f73c44dda4c89951c8ba5241171241b6483984 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
@@ -18,7 +18,6 @@ import android.os.SystemClock;
import android.text.Editable;
import android.text.Layout;
import android.text.Selection;
-import android.text.Spanned;
import android.text.TextUtils;
import android.text.style.ReplacementSpan;
import android.util.AttributeSet;
@@ -27,13 +26,7 @@ import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
-import android.view.inputmethod.BaseInputConnection;
-import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputConnection;
-import android.view.inputmethod.InputConnectionWrapper;
import android.widget.TextView;
import org.chromium.base.ApiCompatibilityUtils;
@@ -46,7 +39,6 @@ import org.chromium.chrome.browser.metrics.StartupMetrics;
import org.chromium.chrome.browser.omnibox.LocationBarLayout.OmniboxLivenessListener;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.util.UrlUtilities;
-import org.chromium.chrome.browser.widget.VerticallyFixedEditText;
import org.chromium.content.browser.ContentViewCore;
import org.chromium.ui.UiUtils;
@@ -58,7 +50,7 @@ import java.net.URL;
/**
* The URL text entry view for the Omnibox.
*/
-public class UrlBar extends VerticallyFixedEditText {
+public class UrlBar extends AutocompleteEditText {
private static final String TAG = "cr_UrlBar";
private static final boolean DEBUG = false;
@@ -89,8 +81,6 @@ public class UrlBar extends VerticallyFixedEditText {
private UrlDirectionListener mUrlDirectionListener;
- private final AutocompleteSpan mAutocompleteSpan;
-
/**
* The gesture detector is used to detect long presses. Long presses require special treatment
* because the URL bar has custom touch event handling. See: {@link #onTouchEvent}.
@@ -112,36 +102,18 @@ public class UrlBar extends VerticallyFixedEditText {
private Boolean mUseDarkColors;
- private AccessibilityManager mAccessibilityManager;
-
- /**
- * Whether default TextView scrolling should be disabled because autocomplete has been added.
- * This allows the user entered text to be shown instead of the end of the autocomplete.
- */
- private boolean mDisableTextScrollingFromAutocomplete;
-
private OmniboxLivenessListener mOmniboxLivenessListener;
private long mFirstFocusTimeMs;
- private boolean mInBatchEditMode;
- private int mBeforeBatchEditAutocompleteIndex = -1;
- private String mBeforeBatchEditFullText;
- private boolean mSelectionChangedInBatchMode;
- private boolean mTextDeletedInBatchMode;
-
private boolean mIsPastedText;
+
// Used as a hint to indicate the text may contain an ellipsize span. This will be true if an
// ellispize span was applied the last time the text changed. A true value here does not
// guarantee that the text does contain the span currently as newly set text may have cleared
// this (and it the value will only be recalculated after the text has been changed).
private boolean mDidEllipsizeTextHint;
- // Set to true when the URL bar text is modified programmatically. Initially set
- // to true until the old state has been loaded.
- private boolean mIgnoreTextChangeFromAutocomplete = true;
- private boolean mLastUrlEditWasDelete;
-
/** This tracks whether or not the last ACTION_DOWN event was when the url bar had focus. */
boolean mDownEventHadFocus;
@@ -208,7 +180,6 @@ public class UrlBar extends VerticallyFixedEditText {
setUseDarkTextColors(true);
mUrlDirection = LAYOUT_DIRECTION_LOCALE;
- mAutocompleteSpan = new AutocompleteSpan();
// The URL Bar is derived from an text edit class, and as such is focusable by
// default. This means that if it is created before the first draw of the UI it
@@ -239,9 +210,6 @@ public class UrlBar extends VerticallyFixedEditText {
if (mUrlBarDelegate != null) mUrlBarDelegate.backKeyPressed();
}
});
-
- mAccessibilityManager =
- (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
}
/**
@@ -303,196 +271,27 @@ public class UrlBar extends VerticallyFixedEditText {
return super.onKeyPreIme(keyCode, event);
}
+ @Override
+ public boolean shouldAutocomplete() {
+ if (isPastedText()) return false;
+ return super.shouldAutocomplete();
+ }
+
/**
- * Sets whether text changes should trigger autocomplete.
+ * See {@link AutocompleteEditText#setIgnoreTextChangesForAutocomplete(boolean)}.
* <p>
* {@link #setDelegate(UrlBarDelegate)} must be called with a non-null instance prior to
* enabling autocomplete.
- *
- * @param ignoreAutocomplete Whether text changes should be ignored and no auto complete
- * triggered.
*/
+ @Override
public void setIgnoreTextChangesForAutocomplete(boolean ignoreAutocomplete) {
assert mUrlBarDelegate != null;
-
- mIgnoreTextChangeFromAutocomplete = ignoreAutocomplete;
- }
-
- /**
- * @return The search query text (non-null).
- */
- public String getQueryText() {
- return getEditableText() != null ? getEditableText().toString() : "";
- }
-
- /**
- * @return Whether the current cursor position is at the end of the user typed text (i.e.
- * at the beginning of the inline autocomplete text if present otherwise the very
- * end of the current text).
- */
- private boolean isCursorAtEndOfTypedText() {
- final int selectionStart = getSelectionStart();
- final int selectionEnd = getSelectionEnd();
-
- int expectedSelectionStart = getText().getSpanStart(mAutocompleteSpan);
- int expectedSelectionEnd = getText().length();
- if (expectedSelectionStart < 0) {
- expectedSelectionStart = expectedSelectionEnd;
- }
-
- return selectionStart == expectedSelectionStart && selectionEnd == expectedSelectionEnd;
- }
-
- /**
- * @return Whether the URL is currently in batch edit mode triggered by an IME. No external
- * text changes should be triggered while this is true.
- */
- // isInBatchEditMode is a package protected method on TextView, so we intentionally chose
- // a different name.
- private boolean isHandlingBatchInput() {
- return mInBatchEditMode;
- }
-
- /**
- * @return The user text without the autocomplete text.
- */
- public String getTextWithoutAutocomplete() {
- int autoCompleteIndex = getText().getSpanStart(mAutocompleteSpan);
- if (autoCompleteIndex < 0) {
- return getQueryText();
- } else {
- return getQueryText().substring(0, autoCompleteIndex);
- }
- }
-
- /** @return Whether any autocomplete information is specified on the current text. */
- @VisibleForTesting
- protected boolean hasAutocomplete() {
- return getText().getSpanStart(mAutocompleteSpan) >= 0
- || mAutocompleteSpan.mAutocompleteText != null
- || mAutocompleteSpan.mUserText != null;
- }
-
- /**
- * Whether we want to be showing inline autocomplete results. We don't want to show them as the
- * user deletes input. Also if there is a composition (e.g. while using the Japanese IME),
- * we must not autocomplete or we'll destroy the composition.
- * @return Whether we want to be showing inline autocomplete results.
- */
- public boolean shouldAutocomplete() {
- if (mLastUrlEditWasDelete) return false;
- Editable text = getText();
-
- return isCursorAtEndOfTypedText()
- && !isPastedText()
- && !isHandlingBatchInput()
- && BaseInputConnection.getComposingSpanEnd(text)
- == BaseInputConnection.getComposingSpanStart(text);
- }
-
- @Override
- public void onBeginBatchEdit() {
- if (DEBUG) Log.i(TAG, "onBeginBatchEdit");
- mBeforeBatchEditAutocompleteIndex = getText().getSpanStart(mAutocompleteSpan);
- mBeforeBatchEditFullText = getText().toString();
-
- super.onBeginBatchEdit();
- mInBatchEditMode = true;
- mTextDeletedInBatchMode = false;
- }
-
- @Override
- public void onEndBatchEdit() {
- if (DEBUG) Log.i(TAG, "onEndBatchEdit");
- super.onEndBatchEdit();
- mInBatchEditMode = false;
- limitDisplayableLength();
- if (mSelectionChangedInBatchMode) {
- validateSelection(getSelectionStart(), getSelectionEnd());
- mSelectionChangedInBatchMode = false;
- }
-
- String newText = getText().toString();
- if (!TextUtils.equals(mBeforeBatchEditFullText, newText)
- || getText().getSpanStart(mAutocompleteSpan) != mBeforeBatchEditAutocompleteIndex) {
- // If the text being typed is a single character that matches the next character in the
- // previously visible autocomplete text, we reapply the autocomplete text to prevent
- // a visual flickering when the autocomplete text is cleared and then quickly reapplied
- // when the next round of suggestions is received.
- if (shouldAutocomplete() && mBeforeBatchEditAutocompleteIndex != -1
- && mBeforeBatchEditFullText != null
- && mBeforeBatchEditFullText.startsWith(newText)
- && !mTextDeletedInBatchMode
- && newText.length() - mBeforeBatchEditAutocompleteIndex == 1) {
- setAutocompleteText(newText, mBeforeBatchEditFullText.substring(newText.length()));
- }
- notifyAutocompleteTextStateChanged(mTextDeletedInBatchMode);
- }
-
- mTextDeletedInBatchMode = false;
- mBeforeBatchEditAutocompleteIndex = -1;
- mBeforeBatchEditFullText = null;
- }
-
- @Override
- protected void onSelectionChanged(int selStart, int selEnd) {
- if (DEBUG) Log.i(TAG, "onSelectionChanged -- selStart: %d, selEnd: %d", selStart, selEnd);
- if (!mInBatchEditMode) {
- int beforeTextLength = getText().length();
- if (validateSelection(selStart, selEnd)) {
- boolean textDeleted = getText().length() < beforeTextLength;
- notifyAutocompleteTextStateChanged(textDeleted);
- }
- } else {
- mSelectionChangedInBatchMode = true;
- }
- super.onSelectionChanged(selStart, selEnd);
- }
-
- /**
- * Validates the selection and clears the autocomplete span if needed. The autocomplete text
- * will be deleted if the selection occurs entirely before the autocomplete region.
- *
- * @param selStart The start of the selection.
- * @param selEnd The end of the selection.
- * @return Whether the autocomplete span was removed as a result of this validation.
- */
- private boolean validateSelection(int selStart, int selEnd) {
- int spanStart = getText().getSpanStart(mAutocompleteSpan);
- int spanEnd = getText().getSpanEnd(mAutocompleteSpan);
-
- if (DEBUG) {
- Log.i(TAG, "validateSelection -- selStart: %d, selEnd: %d, spanStart: %d, spanEnd: %d",
- selStart, selEnd, spanStart, spanEnd);
- }
-
- if (spanStart >= 0 && (spanStart != selStart || spanEnd != selEnd)) {
- CharSequence previousAutocompleteText = mAutocompleteSpan.mAutocompleteText;
-
- // On selection changes, the autocomplete text has been accepted by the user or needs
- // to be deleted below.
- mAutocompleteSpan.clearSpan();
-
- // The autocomplete text will be deleted any time the selection occurs entirely before
- // the start of the autocomplete text. This is required because certain keyboards will
- // insert characters temporarily when starting a key entry gesture (whether it be
- // swyping a word or long pressing to get a special character). When this temporary
- // character appears, Chrome may decide to append some autocomplete, but the keyboard
- // will then remove this temporary character only while leaving the autocomplete text
- // alone. See crbug/273763 for more details.
- if (selEnd <= spanStart && TextUtils.equals(previousAutocompleteText,
- getText().subSequence(spanStart, getText().length()))) {
- getText().delete(spanStart, getText().length());
- }
- return true;
- }
- return false;
+ super.setIgnoreTextChangesForAutocomplete(ignoreAutocomplete);
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
mFocused = focused;
- if (!focused) mAutocompleteSpan.clearSpan();
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (focused && mFirstFocusTimeMs == 0) {
@@ -603,26 +402,6 @@ public class UrlBar extends VerticallyFixedEditText {
}
@Override
- public boolean bringPointIntoView(int offset) {
- if (mDisableTextScrollingFromAutocomplete) return false;
- return super.bringPointIntoView(offset);
- }
-
- @Override
- public boolean onPreDraw() {
- boolean retVal = super.onPreDraw();
- if (mDisableTextScrollingFromAutocomplete) {
- // super.onPreDraw will put the selection at the end of the text selection, but
- // in the case of autocomplete we want the last typed character to be shown, which
- // is the start of selection.
- mDisableTextScrollingFromAutocomplete = false;
- bringPointIntoView(getSelectionStart());
- retVal = true;
- }
- return retVal;
- }
-
- @Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
@@ -825,70 +604,6 @@ public class UrlBar extends VerticallyFixedEditText {
}
/**
- * Autocompletes the text on the url bar and selects the text that was not entered by the
- * user. Using append() instead of setText() to preserve the soft-keyboard layout.
- * @param userText user The text entered by the user.
- * @param inlineAutocompleteText The suggested autocompletion for the user's text.
- */
- public void setAutocompleteText(CharSequence userText, CharSequence inlineAutocompleteText) {
- if (DEBUG) {
- Log.i(TAG, "setAutocompleteText -- userText: %s, inlineAutocompleteText: %s",
- userText, inlineAutocompleteText);
- }
- boolean emptyAutocomplete = TextUtils.isEmpty(inlineAutocompleteText);
-
- if (!emptyAutocomplete) mDisableTextScrollingFromAutocomplete = true;
-
- int autocompleteIndex = userText.length();
-
- String previousText = getQueryText();
- CharSequence newText = TextUtils.concat(userText, inlineAutocompleteText);
-
- setIgnoreTextChangesForAutocomplete(true);
-
- if (!TextUtils.equals(previousText, newText)) {
- // The previous text may also have included autocomplete text, so we only
- // append the new autocomplete text that has changed.
- if (TextUtils.indexOf(newText, previousText) == 0) {
- append(newText.subSequence(previousText.length(), newText.length()));
- } else {
- setUrl(newText.toString(), null);
- }
- }
-
- if (getSelectionStart() != autocompleteIndex
- || getSelectionEnd() != getText().length()) {
- setSelection(autocompleteIndex, getText().length());
-
- if (inlineAutocompleteText.length() != 0) {
- // Sending a TYPE_VIEW_TEXT_SELECTION_CHANGED accessibility event causes the
- // previous TYPE_VIEW_TEXT_CHANGED event to be swallowed. As a result the user
- // hears the autocomplete text but *not* the text they typed. Instead we send a
- // TYPE_ANNOUNCEMENT event, which doesn't swallow the text-changed event.
- announceForAccessibility(inlineAutocompleteText);
- }
- }
-
- if (emptyAutocomplete) {
- mAutocompleteSpan.clearSpan();
- } else {
- mAutocompleteSpan.setSpan(userText, inlineAutocompleteText);
- }
-
- setIgnoreTextChangesForAutocomplete(false);
- }
-
- /**
- * Returns the length of the autocomplete text currently displayed, zero if none is
- * currently displayed.
- */
- public int getAutocompleteLength() {
- int autoCompleteIndex = getText().getSpanStart(mAutocompleteSpan);
- if (autoCompleteIndex < 0) return 0;
- return getText().length() - autoCompleteIndex;
- }
-
- /**
* Scroll to ensure the TLD is visible.
* @return Whether the TLD was discovered and successfully scrolled to.
*/
@@ -917,72 +632,17 @@ public class UrlBar extends VerticallyFixedEditText {
@Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
- if (DEBUG) {
- Log.i(TAG, "onTextChanged -- text: %s, start: %d, lengthBefore: %d, lengthAfter: %d",
- text, start, lengthBefore, lengthAfter);
- }
-
super.onTextChanged(text, start, lengthBefore, lengthAfter);
- if (!mInBatchEditMode) {
- limitDisplayableLength();
- notifyAutocompleteTextStateChanged(lengthAfter == 0);
- } else {
- mTextDeletedInBatchMode = lengthAfter == 0;
- }
mIsPastedText = false;
}
@Override
public void setText(CharSequence text, BufferType type) {
if (DEBUG) Log.i(TAG, "setText -- text: %s", text);
-
- mDisableTextScrollingFromAutocomplete = false;
-
- // Avoid setting the same text to the URL bar as it will mess up the scroll/cursor
- // position.
- // Setting the text is also quite expensive, so only do it when the text has changed
- // (since we apply spans when the URL is not focused, we only optimize this when the
- // URL is being edited).
- if (!TextUtils.equals(getEditableText(), text)) {
- // Certain OEM implementations of setText trigger disk reads. crbug.com/633298
- StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
- try {
- super.setText(text, type);
- } finally {
- StrictMode.setThreadPolicy(oldPolicy);
- }
- }
-
- // Verify the autocomplete is still valid after the text change.
- // Note: mAutocompleteSpan may be still null here if setText() is called in View
- // constructor.
- if (mAutocompleteSpan != null
- && mAutocompleteSpan.mUserText != null
- && mAutocompleteSpan.mAutocompleteText != null) {
- if (getText().getSpanStart(mAutocompleteSpan) < 0) {
- mAutocompleteSpan.clearSpan();
- } else {
- clearAutocompleteSpanIfInvalid();
- }
- }
-
+ super.setText(text, type);
fixupTextDirection();
}
- private void clearAutocompleteSpanIfInvalid() {
- Editable editableText = getEditableText();
- CharSequence previousUserText = mAutocompleteSpan.mUserText;
- CharSequence previousAutocompleteText = mAutocompleteSpan.mAutocompleteText;
- if (editableText.length()
- != (previousUserText.length() + previousAutocompleteText.length())) {
- mAutocompleteSpan.clearSpan();
- } else if (TextUtils.indexOf(getText(), previousUserText) != 0
- || TextUtils.indexOf(getText(),
- previousAutocompleteText, previousUserText.length()) != 0) {
- mAutocompleteSpan.clearSpan();
- }
- }
-
private void limitDisplayableLength() {
// To limit displayable length we replace middle portion of the string with ellipsis.
// That affects only presentation of the text, and doesn't affect other aspects like
@@ -1039,17 +699,6 @@ public class UrlBar extends VerticallyFixedEditText {
}
@Override
- public void sendAccessibilityEventUnchecked(AccessibilityEvent event) {
- if (mIgnoreTextChangeFromAutocomplete) {
- if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED
- || event.getEventType() == AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED) {
- return;
- }
- }
- super.sendAccessibilityEventUnchecked(event);
- }
-
- @Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
// Certain OEM implementations of onInitializeAccessibilityNodeInfo trigger disk reads
// to access the clipboard. crbug.com/640993
@@ -1061,117 +710,6 @@ public class UrlBar extends VerticallyFixedEditText {
}
}
- @VisibleForTesting
- InputConnectionWrapper mInputConnection = new InputConnectionWrapper(null, true) {
- private final char[] mTempSelectionChar = new char[1];
-
- @Override
- public boolean commitText(CharSequence text, int newCursorPosition) {
- Editable currentText = getText();
- if (currentText == null) return super.commitText(text, newCursorPosition);
-
- int selectionStart = Selection.getSelectionStart(currentText);
- int selectionEnd = Selection.getSelectionEnd(currentText);
- int autocompleteIndex = currentText.getSpanStart(mAutocompleteSpan);
- // If the text being committed is a single character that matches the next character
- // in the selection (assumed to be the autocomplete text), we only move the text
- // selection instead clearing the autocomplete text causing flickering as the
- // autocomplete text will appear once the next suggestions are received.
- //
- // To be confident that the selection is an autocomplete, we ensure the selection
- // is at least one character and the end of the selection is the end of the
- // currently entered text.
- if (newCursorPosition == 1 && selectionStart > 0 && selectionStart != selectionEnd
- && selectionEnd >= currentText.length()
- && autocompleteIndex == selectionStart
- && text.length() == 1) {
- currentText.getChars(selectionStart, selectionStart + 1, mTempSelectionChar, 0);
- if (mTempSelectionChar[0] == text.charAt(0)) {
-
- // Since the text isn't changing, TalkBack won't read out the typed characters.
- // To work around this, explicitly send an accessibility event. crbug.com/416595
- if (mAccessibilityManager != null && mAccessibilityManager.isEnabled()) {
- AccessibilityEvent event = AccessibilityEvent.obtain(
- AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);
- event.setFromIndex(selectionStart);
- event.setRemovedCount(0);
- event.setAddedCount(1);
- event.setBeforeText(currentText.toString().substring(0, selectionStart));
- sendAccessibilityEventUnchecked(event);
- }
-
- setAutocompleteText(
- currentText.subSequence(0, selectionStart + 1),
- currentText.subSequence(selectionStart + 1, selectionEnd));
- if (!mInBatchEditMode) {
- notifyAutocompleteTextStateChanged(false);
- }
- return true;
- }
- }
-
- boolean retVal = super.commitText(text, newCursorPosition);
-
- // Ensure the autocomplete span is removed if it is no longer valid after committing the
- // text.
- if (getText().getSpanStart(mAutocompleteSpan) >= 0) clearAutocompleteSpanIfInvalid();
-
- return retVal;
- }
-
- @Override
- public boolean setComposingText(CharSequence text, int newCursorPosition) {
- Editable currentText = getText();
- int autoCompleteSpanStart = currentText.getSpanStart(mAutocompleteSpan);
- if (autoCompleteSpanStart >= 0) {
- int composingEnd = BaseInputConnection.getComposingSpanEnd(currentText);
-
- // On certain device/keyboard combinations, the composing regions are specified
- // with a noticeable delay after the initial character is typed, and in certain
- // circumstances it does not check that the current state of the text matches the
- // expectations of it's composing region.
- // For example, you can be typing:
- // chrome://f
- // Chrome will autocomplete to:
- // chrome://f[lags]
- // And after the autocomplete has been set, the keyboard will set the composing
- // region to the last character and it assumes it is 'f' as it was the last
- // character the keyboard sent. If we commit this composition, the text will
- // look like:
- // chrome://flag[f]
- // And if we use the autocomplete clearing logic below, it will look like:
- // chrome://f[f]
- // To work around this, we see if the composition matches all the characters prior
- // to the autocomplete and just readjust the composing region to be that subset.
- //
- // See crbug.com/366732
- if (composingEnd == currentText.length()
- && autoCompleteSpanStart >= text.length()
- && TextUtils.equals(
- currentText.subSequence(
- autoCompleteSpanStart - text.length(),
- autoCompleteSpanStart),
- text)) {
- setComposingRegion(
- autoCompleteSpanStart - text.length(), autoCompleteSpanStart);
- }
-
- // Once composing text is being modified, the autocomplete text has been accepted
- // or has to be deleted.
- mAutocompleteSpan.clearSpan();
- Selection.setSelection(currentText, autoCompleteSpanStart);
- currentText.delete(autoCompleteSpanStart, currentText.length());
- }
- return super.setComposingText(text, newCursorPosition);
- }
- };
-
- @Override
- public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
- mInputConnection.setTarget(super.onCreateInputConnection(outAttrs));
- return mInputConnection;
- }
-
/**
* Emphasize components of the URL for readability.
*/
@@ -1226,45 +764,17 @@ public class UrlBar extends VerticallyFixedEditText {
}
}
- private void notifyAutocompleteTextStateChanged(boolean textDeleted) {
- if (mUrlBarDelegate == null) return;
- if (!hasFocus()) return;
- if (mIgnoreTextChangeFromAutocomplete) return;
-
- mLastUrlEditWasDelete = textDeleted;
- mUrlBarDelegate.onTextChangedForAutocomplete(textDeleted);
+ @Override
+ protected void replaceAllTextFromAutocomplete(String text) {
+ setUrl(text, null);
}
- /**
- * Simple span used for tracking the current autocomplete state.
- */
- private class AutocompleteSpan {
- private CharSequence mUserText;
- private CharSequence mAutocompleteText;
-
- /**
- * Adds the span to the current text.
- * @param userText The user entered text.
- * @param autocompleteText The autocomplete text being appended.
- */
- public void setSpan(CharSequence userText, CharSequence autocompleteText) {
- Editable text = getText();
- text.removeSpan(this);
- mAutocompleteText = autocompleteText;
- mUserText = userText;
- text.setSpan(
- this,
- userText.length(),
- text.length(),
- Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
+ @Override
+ public void onAutocompleteTextStateChanged(boolean textDeleted, boolean updateDisplay) {
+ if (mUrlBarDelegate == null) return;
+ if (updateDisplay) limitDisplayableLength();
- /** Removes this span from the current text and clears the internal state. */
- public void clearSpan() {
- getText().removeSpan(this);
- mAutocompleteText = null;
- mUserText = null;
- }
+ mUrlBarDelegate.onTextChangedForAutocomplete(textDeleted);
}
/**
« no previous file with comments | « chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java ('k') | chrome/android/java_sources.gni » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698