Commit 9a2fbb23 authored by Matthew Jones's avatar Matthew Jones Committed by Commit Bot

Unify visibility logic for omnibox results container and suggestion list

This patch reduces the number of functions independently responsible
for changing the visibility of the omnibox suggestions. Since the only
visible part of the results container is the list, the visibility of
the container should depend on whether the suggestions list
visibility.

To support this change, a new method has been added to the
UrlFocusChangeListener interface: onUrlAnimationFinished. This method
triggers after the animation for focusing or unfocusing the omnibox
has completed.

Change-Id: I110379fd59dd2d54182d03cc91ed75dd3cba765b
Reviewed-on: https://chromium-review.googlesource.com/c/1294423
Commit-Queue: Matthew Jones <mdjones@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#604674}
parent 889406de
...@@ -398,6 +398,12 @@ public class LocationBarLayout extends FrameLayout ...@@ -398,6 +398,12 @@ public class LocationBarLayout extends FrameLayout
if (!inProgress) { if (!inProgress) {
updateButtonVisibility(); updateButtonVisibility();
} }
if (!inProgress) {
for (UrlFocusChangeListener listener : mUrlFocusChangeListeners) {
listener.onUrlAnimationFinished(mUrlHasFocus);
}
}
} }
/** /**
......
...@@ -13,4 +13,10 @@ public interface UrlFocusChangeListener { ...@@ -13,4 +13,10 @@ public interface UrlFocusChangeListener {
* @param hasFocus Whether the URL field has gained focus. * @param hasFocus Whether the URL field has gained focus.
*/ */
void onUrlFocusChange(boolean hasFocus); void onUrlFocusChange(boolean hasFocus);
/**
* A notification that animations for focusing or unfocusing the input field has finished.
* @param hasFocus Whether the URL field has gained focus.
*/
default void onUrlAnimationFinished(boolean hasFocus) {};
} }
...@@ -34,7 +34,6 @@ import org.chromium.chrome.browser.omnibox.suggestions.OmniboxResultsAdapter.Omn ...@@ -34,7 +34,6 @@ import org.chromium.chrome.browser.omnibox.suggestions.OmniboxResultsAdapter.Omn
import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionsList.OmniboxSuggestionListEmbedder; import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionsList.OmniboxSuggestionListEmbedder;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.toolbar.ToolbarDataProvider; import org.chromium.chrome.browser.toolbar.ToolbarDataProvider;
import org.chromium.chrome.browser.toolbar.ToolbarPhone;
import org.chromium.chrome.browser.util.KeyNavigationUtil; import org.chromium.chrome.browser.util.KeyNavigationUtil;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.UiUtils; import org.chromium.ui.UiUtils;
...@@ -74,6 +73,7 @@ public class AutocompleteCoordinator ...@@ -74,6 +73,7 @@ public class AutocompleteCoordinator
private ViewGroup mOmniboxResultsContainer; private ViewGroup mOmniboxResultsContainer;
private float mMaxRequiredWidth; private float mMaxRequiredWidth;
private float mMaxMatchContentsWidth; private float mMaxMatchContentsWidth;
private boolean mCanShowSuggestions;
// The timestamp (using SystemClock.elapsedRealtime()) at the point when the user started // The timestamp (using SystemClock.elapsedRealtime()) at the point when the user started
// modifying the omnibox with new input. // modifying the omnibox with new input.
...@@ -91,7 +91,6 @@ public class AutocompleteCoordinator ...@@ -91,7 +91,6 @@ public class AutocompleteCoordinator
private boolean mIgnoreOmniboxItemSelection = true; private boolean mIgnoreOmniboxItemSelection = true;
private Runnable mShowSuggestions;
private Runnable mRequestSuggestions; private Runnable mRequestSuggestions;
private DeferredOnSelectionRunnable mDeferredOnSelection; private DeferredOnSelectionRunnable mDeferredOnSelection;
...@@ -182,6 +181,8 @@ public class AutocompleteCoordinator ...@@ -182,6 +181,8 @@ public class AutocompleteCoordinator
@Override @Override
public void onUrlFocusChange(boolean hasFocus) { public void onUrlFocusChange(boolean hasFocus) {
if (hasFocus) { if (hasFocus) {
// TODO(mdjones): Move init into visibility update method as it's only caller.
initOmniboxResultsContainer();
if (mNativeInitialized) { if (mNativeInitialized) {
startZeroSuggest(); startZeroSuggest();
} else { } else {
...@@ -191,14 +192,12 @@ public class AutocompleteCoordinator ...@@ -191,14 +192,12 @@ public class AutocompleteCoordinator
} }
}); });
} }
maybeShowOmniboxResultsContainer();
} else { } else {
// Prevent any upcoming omnibox suggestions from showing once a URL is loaded (and as // Prevent any upcoming omnibox suggestions from showing once a URL is loaded (and as
// a consequence the omnibox is unfocused). // a consequence the omnibox is unfocused).
stopAutocomplete(true); stopAutocomplete(true);
updateOmniboxResultsContainerVisibility(false); mCanShowSuggestions = false;
mHasStartedNewOmniboxEditSession = false; mHasStartedNewOmniboxEditSession = false;
mNewOmniboxEditSessionTimestamp = -1; mNewOmniboxEditSessionTimestamp = -1;
hideSuggestions(); hideSuggestions();
...@@ -206,6 +205,12 @@ public class AutocompleteCoordinator ...@@ -206,6 +205,12 @@ public class AutocompleteCoordinator
} }
} }
@Override
public void onUrlAnimationFinished(boolean hasFocus) {
mCanShowSuggestions = hasFocus;
updateOmniboxSuggestionsVisibility();
}
/** /**
* Provides data and state for the toolbar component. * Provides data and state for the toolbar component.
* @param toolbarDataProvider The data provider. * @param toolbarDataProvider The data provider.
...@@ -324,9 +329,6 @@ public class AutocompleteCoordinator ...@@ -324,9 +329,6 @@ public class AutocompleteCoordinator
mSuggestionList = new OmniboxSuggestionsList(mContext, mSuggestionListEmbedder); mSuggestionList = new OmniboxSuggestionsList(mContext, mSuggestionListEmbedder);
} }
// Ensure the results container is initialized and add the suggestion list to it.
initOmniboxResultsContainer();
// Start with visibility GONE to ensure that show() is called. http://crbug.com/517438 // Start with visibility GONE to ensure that show() is called. http://crbug.com/517438
mSuggestionList.setVisibility(View.GONE); mSuggestionList.setVisibility(View.GONE);
mSuggestionList.setAdapter(mSuggestionListAdapter); mSuggestionList.setAdapter(mSuggestionListAdapter);
...@@ -455,33 +457,6 @@ public class AutocompleteCoordinator ...@@ -455,33 +457,6 @@ public class AutocompleteCoordinator
mMaxMatchContentsWidth = 0; mMaxMatchContentsWidth = 0;
} }
/**
* Handles showing/hiding the suggestions list.
* @param visible Whether the suggestions list should be visible.
*/
private void setSuggestionsListVisibility(final boolean visible) {
if (mSuggestionsShown == visible) return;
mSuggestionsShown = visible;
if (mSuggestionList != null) {
final boolean isShowing = mSuggestionList.getVisibility() == View.VISIBLE;
if (visible && !isShowing) {
mIgnoreOmniboxItemSelection = true; // Reset to default value.
if (mSuggestionList.getParent() == null) {
mOmniboxResultsContainer.addView(mSuggestionList);
}
mSuggestionList.show();
updateSuggestionListLayoutDirection();
} else if (!visible && isShowing) {
mSuggestionList.setVisibility(View.GONE);
UiUtils.removeViewFromParent(mSuggestionList);
}
}
maybeShowOmniboxResultsContainer();
}
private void initOmniboxResultsContainer() { private void initOmniboxResultsContainer() {
if (mOmniboxResultsContainer != null) return; if (mOmniboxResultsContainer != null) return;
ViewStub overlayStub = ViewStub overlayStub =
...@@ -490,25 +465,34 @@ public class AutocompleteCoordinator ...@@ -490,25 +465,34 @@ public class AutocompleteCoordinator
} }
/** /**
* Conditionally show the omnibox suggestions container. * Update whether the omnibox suggestions are visible.
*/ */
private void maybeShowOmniboxResultsContainer() { private void updateOmniboxSuggestionsVisibility() {
if (isSuggestionsListShown() || mDelegate.isUrlBarFocused()) { if (mOmniboxResultsContainer == null || mSuggestionList == null) return;
initOmniboxResultsContainer();
updateOmniboxResultsContainerVisibility(true);
}
}
/** boolean isContainerVisible = mOmniboxResultsContainer.getVisibility() == View.VISIBLE;
* Update whether the omnibox suggestions container is visible. boolean shouldBeVisible = mCanShowSuggestions && getSuggestionCount() > 0;
*/ if (isContainerVisible == shouldBeVisible) return;
private void updateOmniboxResultsContainerVisibility(boolean visible) {
if (mOmniboxResultsContainer == null) return; mSuggestionsShown = shouldBeVisible;
final boolean isListVisible = mSuggestionList.getVisibility() == View.VISIBLE;
if (shouldBeVisible && !isListVisible) {
mIgnoreOmniboxItemSelection = true; // Reset to default value.
boolean currentlyVisible = mOmniboxResultsContainer.getVisibility() == View.VISIBLE; if (mSuggestionList.getParent() == null) {
if (currentlyVisible == visible) return; mOmniboxResultsContainer.addView(mSuggestionList);
}
mSuggestionList.show();
updateSuggestionListLayoutDirection();
} else if (!shouldBeVisible && isListVisible) {
mSuggestionList.setVisibility(View.GONE);
UiUtils.removeViewFromParent(mSuggestionList);
}
if (visible) { if (shouldBeVisible) {
mOmniboxResultsContainer.setVisibility(View.VISIBLE); mOmniboxResultsContainer.setVisibility(View.VISIBLE);
} else { } else {
mOmniboxResultsContainer.setVisibility(View.INVISIBLE); mOmniboxResultsContainer.setVisibility(View.INVISIBLE);
...@@ -809,19 +793,7 @@ public class AutocompleteCoordinator ...@@ -809,19 +793,7 @@ public class AutocompleteCoordinator
if (itemsChanged) mSuggestionListAdapter.notifySuggestionsChanged(); if (itemsChanged) mSuggestionListAdapter.notifySuggestionsChanged();
if (mDelegate.isUrlBarFocused()) { updateOmniboxSuggestionsVisibility();
if (mShowSuggestions != null) mParent.removeCallbacks(mShowSuggestions);
mShowSuggestions = () -> {
setSuggestionsListVisibility(true);
mShowSuggestions = null;
};
if (!mDelegate.isUrlFocusChangeInProgress()) {
mShowSuggestions.run();
} else {
mParent.postDelayed(
mShowSuggestions, ToolbarPhone.URL_FOCUS_CHANGE_ANIMATION_DURATION_MS);
}
}
} }
private void loadUrlFromOmniboxMatch( private void loadUrlFromOmniboxMatch(
...@@ -898,8 +870,7 @@ public class AutocompleteCoordinator ...@@ -898,8 +870,7 @@ public class AutocompleteCoordinator
/** /**
* Sets to show cached zero suggest results. This will start both caching zero suggest results * Sets to show cached zero suggest results. This will start both caching zero suggest results
* in shared preferences and also attempt to show them when appropriate without needing native * in shared preferences and also attempt to show them when appropriate without needing native
* initialization. See {@link #showCachedZeroSuggestResultsIfAvailable()} for * initialization.
* showing the loaded results before native initialization.
* @param showCachedZeroSuggestResults Whether cached zero suggest should be shown. * @param showCachedZeroSuggestResults Whether cached zero suggest should be shown.
*/ */
public void setShowCachedZeroSuggestResults(boolean showCachedZeroSuggestResults) { public void setShowCachedZeroSuggestResults(boolean showCachedZeroSuggestResults) {
...@@ -907,15 +878,6 @@ public class AutocompleteCoordinator ...@@ -907,15 +878,6 @@ public class AutocompleteCoordinator
if (mShowCachedZeroSuggestResults) mAutocomplete.startCachedZeroSuggest(); if (mShowCachedZeroSuggestResults) mAutocomplete.startCachedZeroSuggest();
} }
/**
* Signals the omnibox to shows the cached zero suggest results if they have been loaded from
* cache successfully.
*/
public void showCachedZeroSuggestResultsIfAvailable() {
if (!mShowCachedZeroSuggestResults || mSuggestionList == null) return;
setSuggestionsListVisibility(true);
}
/** /**
* Update the visuals of the autocomplete UI. * Update the visuals of the autocomplete UI.
* @param useDarkColors Whether dark colors should be applied to the UI. * @param useDarkColors Whether dark colors should be applied to the UI.
...@@ -946,12 +908,10 @@ public class AutocompleteCoordinator ...@@ -946,12 +908,10 @@ public class AutocompleteCoordinator
private void hideSuggestions() { private void hideSuggestions() {
if (mAutocomplete == null || !mNativeInitialized) return; if (mAutocomplete == null || !mNativeInitialized) return;
if (mShowSuggestions != null) mParent.removeCallbacks(mShowSuggestions);
stopAutocomplete(true); stopAutocomplete(true);
setSuggestionsListVisibility(false);
clearSuggestions(true); clearSuggestions(true);
updateOmniboxSuggestionsVisibility();
} }
/** /**
......
...@@ -142,7 +142,6 @@ public class SearchActivity extends AsyncInitializationActivity ...@@ -142,7 +142,6 @@ public class SearchActivity extends AsyncInitializationActivity
// Kick off everything needed for the user to type into the box. // Kick off everything needed for the user to type into the box.
beginQuery(); beginQuery();
mSearchBox.getAutocompleteCoordinator().showCachedZeroSuggestResultsIfAvailable();
// Kick off loading of the native library. // Kick off loading of the native library.
if (!getActivityDelegate().shouldDelayNativeInitialization()) { if (!getActivityDelegate().shouldDelayNativeInitialization()) {
......
...@@ -144,6 +144,7 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout { ...@@ -144,6 +144,7 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout {
// is finalized after native has been initialized. // is finalized after native has been initialized.
private void focusTextBox() { private void focusTextBox() {
if (!mUrlBar.hasFocus()) mUrlBar.requestFocus(); if (!mUrlBar.hasFocus()) mUrlBar.requestFocus();
setUrlFocusChangeInProgress(false);
getAutocompleteCoordinator().setShowCachedZeroSuggestResults(true); getAutocompleteCoordinator().setShowCachedZeroSuggestResults(true);
new Handler().post(new Runnable() { new Handler().post(new Runnable() {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment