Commit dbf8c7e8 authored by Patrick Noland's avatar Patrick Noland Committed by Commit Bot

[ToolbarMVC] Move child coordinator initialization and ownership to LBC

This puts LocationBarCoordinator in charge of constructing and
destroying UrlBarCoordinator, StatusCoordinator, and
AutocompleteCoordinator. This allows us to wire a few more
dependencies into constructors instead of via setters. The
coordinators are still passed to LocationBarLayout for it to use via
a new initialize() method that consolidates a few different setter
methods on LocationBarLayout. initialize() helps avoid bugs that
could arise when calling these setters out of order. There is an
additional change to LocationBarLayoutTest that fixes a DCHECK when
running tests on a debug build.

Bug: 1146057, 1146062

Change-Id: Ie6c7e871d6cb0eb4bbffff0ab3ed275968d84e85
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2495969
Commit-Queue: Patrick Noland <pnoland@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Reviewed-by: default avatarFilip Gorski <fgorski@chromium.org>
Reviewed-by: default avatarTomasz Wiszkowski <ender@google.com>
Reviewed-by: default avatarPeter Conn <peconn@chromium.org>
Cr-Commit-Position: refs/heads/master@{#827494}
parent bb18911e
......@@ -22,6 +22,7 @@ import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.ActionMode;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
......@@ -59,7 +60,6 @@ import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TrustedCdn;
import org.chromium.chrome.browser.toolbar.LocationBarModel;
import org.chromium.chrome.browser.toolbar.ToolbarColors;
import org.chromium.chrome.browser.toolbar.top.ToolbarActionModeCallback;
import org.chromium.chrome.browser.toolbar.top.ToolbarLayout;
import org.chromium.chrome.browser.toolbar.top.ToolbarPhone;
import org.chromium.components.browser_ui.styles.ChromeColors;
......@@ -130,7 +130,6 @@ public class CustomTabToolbar extends ToolbarLayout implements View.OnLongClickL
private TextView mUrlBar;
private View mLiteStatusView;
private View mLiteStatusSeparatorView;
private UrlBarCoordinator mUrlCoordinator;
private TextView mTitleBar;
private ImageButton mIncognitoButton;
private ImageButton mSecurityButton;
......@@ -181,8 +180,6 @@ public class CustomTabToolbar extends ToolbarLayout implements View.OnLongClickL
mUrlBar.setEnabled(false);
mLiteStatusView = findViewById(R.id.url_bar_lite_status);
mLiteStatusSeparatorView = findViewById(R.id.url_bar_lite_status_separator);
mUrlCoordinator = new UrlBarCoordinator((UrlBar) mUrlBar);
mUrlCoordinator.setAllowFocus(false);
mTitleBar = findViewById(R.id.title_bar);
mLocationBarFrameLayout = findViewById(R.id.location_bar_frame_layout);
mTitleUrlContainer = findViewById(R.id.title_url_container);
......@@ -246,22 +243,15 @@ public class CustomTabToolbar extends ToolbarLayout implements View.OnLongClickL
* state.
* @return The LocationBar implementation for this CustomTabToolbar.
*/
public LocationBar createLocationBar(LocationBarModel locationBarModel) {
public LocationBar createLocationBar(
LocationBarModel locationBarModel, ActionMode.Callback actionModeCallback) {
mLocationBarModel = locationBarModel;
mLocationBar = new CustomTabLocationBar(locationBarModel);
mUrlCoordinator.setDelegate(mLocationBar);
mLocationBar =
new CustomTabLocationBar(locationBarModel, actionModeCallback, (UrlBar) mUrlBar);
mLocationBar.updateVisualsForState();
return mLocationBar;
}
/**
*
* @param actionModeCallback The default callback for text editing action bar to use.
*/
public void setDefaultTextEditActionModeCallback(ToolbarActionModeCallback actionModeCallback) {
mUrlCoordinator.setActionModeCallback(actionModeCallback);
}
private void updateCustomActionButtonVisuals(
ImageButton button, Drawable drawable, String description) {
Resources resources = getResources();
......@@ -616,10 +606,15 @@ public class CustomTabToolbar extends ToolbarLayout implements View.OnLongClickL
private class CustomTabLocationBar
implements LocationBar, UrlBar.UrlBarDelegate, LocationBarDataProvider.Observer {
private LocationBarDataProvider mLocationBarDataProvider;
private UrlBarCoordinator mUrlCoordinator;
public CustomTabLocationBar(LocationBarDataProvider locationBarDataProvider) {
public CustomTabLocationBar(LocationBarDataProvider locationBarDataProvider,
ActionMode.Callback actionModeCallback, UrlBar urlBar) {
mLocationBarDataProvider = locationBarDataProvider;
mLocationBarDataProvider.addObserver(this);
mUrlCoordinator = new UrlBarCoordinator(urlBar, null, actionModeCallback);
mUrlCoordinator.setAllowFocus(false);
mUrlCoordinator.setDelegate(this);
}
public void onNativeLibraryReady() {
......
......@@ -4,13 +4,17 @@
package org.chromium.chrome.browser.omnibox;
import android.view.ActionMode;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat;
import org.chromium.base.CallbackController;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.WindowDelegate;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
......@@ -18,11 +22,17 @@ import org.chromium.chrome.browser.lifecycle.Destroyable;
import org.chromium.chrome.browser.lifecycle.NativeInitObserver;
import org.chromium.chrome.browser.ntp.FakeboxDelegate;
import org.chromium.chrome.browser.ntp.NewTabPage;
import org.chromium.chrome.browser.omnibox.LocationBarDataProvider.Observer;
import org.chromium.chrome.browser.omnibox.UrlBar.UrlBarDelegate;
import org.chromium.chrome.browser.omnibox.status.StatusCoordinator;
import org.chromium.chrome.browser.omnibox.status.StatusView;
import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator;
import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionsDropdownEmbedder;
import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.share.ShareDelegate;
import org.chromium.chrome.browser.tabmodel.IncognitoStateProvider;
import org.chromium.chrome.browser.toolbar.top.ToolbarActionModeCallback;
import org.chromium.ui.base.DeviceFormFactor;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.modaldialog.ModalDialogManager;
......@@ -38,9 +48,9 @@ import java.util.List;
*
* <p>The coordinator creates and owns elements within this component.
*/
public final class LocationBarCoordinator implements LocationBar, FakeboxDelegate,
UrlBar.UrlBarDelegate, NativeInitObserver,
LocationBarDataProvider.Observer {
public final class LocationBarCoordinator implements LocationBar, FakeboxDelegate, UrlBarDelegate,
NativeInitObserver, Observer,
OmniboxSuggestionsDropdownEmbedder {
/** Identifies coordinators with methods specific to a device type. */
public interface SubCoordinator extends Destroyable {}
......@@ -49,6 +59,12 @@ public final class LocationBarCoordinator implements LocationBar, FakeboxDelegat
private SubCoordinator mSubCoordinator;
private ActivityLifecycleDispatcher mActivityLifecycleDispatcher;
private LocationBarDataProvider mLocationbarDataProvider;
private UrlBarCoordinator mUrlCoordinator;
private AutocompleteCoordinator mAutocompleteCoordinator;
private StatusCoordinator mStatusCoordinator;
private WindowDelegate mWindowDelegate;
private View mAutocompleteAnchorView;
private CallbackController mCallbackController = new CallbackController();
/**
* Creates {@link LocationBarCoordinator} and its subcoordinator: {@link
......@@ -74,17 +90,23 @@ public final class LocationBarCoordinator implements LocationBar, FakeboxDelegat
* incognito state.
* @param activityLifecycleDispatcher Allows observation of the activity state.
*/
public LocationBarCoordinator(View locationBarLayout,
public LocationBarCoordinator(View locationBarLayout, View autocompleteAnchorView,
ObservableSupplier<Profile> profileObservableSupplier,
LocationBarDataProvider locationBarDataProvider,
ToolbarActionModeCallback actionModeCallback, WindowDelegate windowDelegate,
WindowAndroid windowAndroid, ActivityTabProvider activityTabProvider,
LocationBarDataProvider locationBarDataProvider, ActionMode.Callback actionModeCallback,
WindowDelegate windowDelegate, WindowAndroid windowAndroid,
ActivityTabProvider activityTabProvider,
Supplier<ModalDialogManager> modalDialogManagerSupplier,
Supplier<ShareDelegate> shareDelegateSupplier,
IncognitoStateProvider incognitoStateProvider,
ActivityLifecycleDispatcher activityLifecycleDispatcher,
OverrideUrlLoadingDelegate overrideUrlLoadingDelegate) {
mLocationBarLayout = (LocationBarLayout) locationBarLayout;
mWindowDelegate = windowDelegate;
mActivityLifecycleDispatcher = activityLifecycleDispatcher;
mActivityLifecycleDispatcher.register(this);
mLocationbarDataProvider = locationBarDataProvider;
mLocationbarDataProvider.addObserver(this);
mAutocompleteAnchorView = autocompleteAnchorView;
if (locationBarLayout instanceof LocationBarPhone) {
mSubCoordinator = new LocationBarCoordinatorPhone((LocationBarPhone) locationBarLayout);
......@@ -93,17 +115,34 @@ public final class LocationBarCoordinator implements LocationBar, FakeboxDelegat
new LocationBarCoordinatorTablet((LocationBarTablet) locationBarLayout);
}
mLocationbarDataProvider = locationBarDataProvider;
mLocationBarLayout.setLocationBarDataProvider(locationBarDataProvider);
locationBarDataProvider.addObserver(this);
mLocationBarLayout.setProfileSupplier(profileObservableSupplier);
mLocationBarLayout.setDefaultTextEditActionModeCallback(actionModeCallback);
mLocationBarLayout.initializeControls(windowDelegate, windowAndroid, activityTabProvider,
modalDialogManagerSupplier, shareDelegateSupplier, incognitoStateProvider,
View urlBar = mLocationBarLayout.findViewById(R.id.url_bar);
mUrlCoordinator =
new UrlBarCoordinator((UrlBar) urlBar, windowDelegate, actionModeCallback);
mAutocompleteCoordinator =
new AutocompleteCoordinator(mLocationBarLayout, mLocationBarLayout, this,
mUrlCoordinator, activityLifecycleDispatcher, modalDialogManagerSupplier,
activityTabProvider, shareDelegateSupplier, locationBarDataProvider);
StatusView statusView = mLocationBarLayout.findViewById(R.id.location_bar_status);
mStatusCoordinator = new StatusCoordinator(isTablet(), statusView, mUrlCoordinator,
incognitoStateProvider, modalDialogManagerSupplier, locationBarDataProvider);
mUrlCoordinator.setDelegate(this);
mUrlCoordinator.addUrlTextChangeListener(mAutocompleteCoordinator);
mUrlCoordinator.addUrlTextChangeListener(mStatusCoordinator);
mUrlCoordinator.setOnFocusChangedCallback(mLocationBarLayout::onUrlFocusChange);
// The LocationBar's direction is tied to the UrlBar's text direction. Icons inside the
// location bar, e.g. lock, refresh, X, should be reversed if UrlBar's text is RTL.
mUrlCoordinator.setUrlDirectionListener(
mCallbackController.makeCancelable(layoutDirection -> {
ViewCompat.setLayoutDirection(mLocationBarLayout, (Integer) layoutDirection);
mAutocompleteCoordinator.updateSuggestionListLayoutDirection();
}));
mLocationBarLayout.addUrlFocusChangeListener(mAutocompleteCoordinator);
mLocationBarLayout.initialize(mAutocompleteCoordinator, mUrlCoordinator, mStatusCoordinator,
locationBarDataProvider, profileObservableSupplier, windowDelegate, windowAndroid,
overrideUrlLoadingDelegate);
mActivityLifecycleDispatcher = activityLifecycleDispatcher;
mActivityLifecycleDispatcher.register(this);
}
@Override
......@@ -117,6 +156,19 @@ public final class LocationBarCoordinator implements LocationBar, FakeboxDelegat
mSubCoordinator.destroy();
mSubCoordinator = null;
}
if (mUrlCoordinator != null) {
mUrlCoordinator = null;
}
if (mAutocompleteCoordinator != null) {
if (mLocationBarLayout != null) {
mLocationBarLayout.removeUrlFocusChangeListener(mAutocompleteCoordinator);
}
mAutocompleteCoordinator.destroy();
mAutocompleteCoordinator = null;
}
if (mStatusCoordinator != null) {
mStatusCoordinator = null;
}
if (mLocationBarLayout != null) {
mLocationBarLayout.destroy();
mLocationBarLayout = null;
......@@ -125,6 +177,10 @@ public final class LocationBarCoordinator implements LocationBar, FakeboxDelegat
mLocationbarDataProvider.removeObserver(this);
mLocationbarDataProvider = null;
}
if (mCallbackController != null) {
mCallbackController.destroy();
mCallbackController = null;
}
}
@Override
......@@ -262,6 +318,27 @@ public final class LocationBarCoordinator implements LocationBar, FakeboxDelegat
mLocationBarLayout.setUrl(mLocationbarDataProvider.getCurrentUrl());
}
// OmniboxSuggestionsDropdownEmbedder implementation
@Override
public boolean isTablet() {
return DeviceFormFactor.isNonMultiDisplayContextOnTablet(mLocationBarLayout.getContext());
}
@Override
public WindowDelegate getWindowDelegate() {
return mWindowDelegate;
}
@Override
public View getAnchorView() {
return mAutocompleteAnchorView;
}
@Override
public View getAlignmentView() {
return isTablet() ? mLocationBarLayout : null;
}
/**
* Returns the {@link LocationBarCoordinatorPhone} for this coordinator.
*
......
......@@ -35,10 +35,11 @@ import androidx.core.util.ObjectsCompat;
import androidx.core.view.inputmethod.EditorInfoCompat;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.compat.ApiHelperForO;
import org.chromium.base.Callback;
import org.chromium.base.Log;
import org.chromium.base.SysUtils;
import org.chromium.base.ThreadUtils;
import org.chromium.base.compat.ApiHelperForO;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.browser.WindowDelegate;
import org.chromium.ui.KeyboardVisibilityDelegate;
......@@ -71,7 +72,7 @@ public abstract class UrlBar extends AutocompleteEditText {
private UrlTextChangeListener mUrlTextChangeListener;
private TextWatcher mTextChangedListener;
private UrlBarTextContextMenuDelegate mTextContextMenuDelegate;
private UrlDirectionListener mUrlDirectionListener;
private Callback<Integer> mUrlDirectionListener;
/**
* The gesture detector is used to detect long presses. Long presses require special treatment
......@@ -135,20 +136,6 @@ public abstract class UrlBar extends AutocompleteEditText {
private CharSequence mTextForAutofillServices;
protected boolean mRequestingAutofillStructure;
/**
* Implement this to get updates when the direction of the text in the URL bar changes.
* E.g. If the user is typing a URL, then erases it and starts typing a query in Arabic,
* the direction will change from left-to-right to right-to-left.
*/
interface UrlDirectionListener {
/**
* Called whenever the layout direction of the UrlBar changes.
* @param layoutDirection the new direction: android.view.View.LAYOUT_DIRECTION_LTR or
* android.view.View.LAYOUT_DIRECTION_RTL
*/
public void onUrlDirectionChanged(int layoutDirection);
}
/**
* Delegate used to communicate with the content side and the parent layout.
*/
......@@ -494,7 +481,7 @@ public abstract class UrlBar extends AutocompleteEditText {
if (urlDirection != mUrlDirection) {
mUrlDirection = urlDirection;
if (mUrlDirectionListener != null) {
mUrlDirectionListener.onUrlDirectionChanged(urlDirection);
mUrlDirectionListener.onResult(urlDirection);
}
// Ensure the display text is visible after updating the URL direction.
......@@ -516,10 +503,10 @@ public abstract class UrlBar extends AutocompleteEditText {
* @param listener The UrlDirectionListener to receive callbacks when the url direction changes,
* or null to unregister any previously registered listener.
*/
public void setUrlDirectionListener(UrlDirectionListener listener) {
public void setUrlDirectionListener(Callback<Integer> listener) {
mUrlDirectionListener = listener;
if (mUrlDirectionListener != null) {
mUrlDirectionListener.onUrlDirectionChanged(mUrlDirection);
mUrlDirectionListener.onResult(mUrlDirection);
}
}
......
......@@ -8,12 +8,13 @@ import android.text.TextWatcher;
import android.view.ActionMode;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.chromium.base.Callback;
import org.chromium.chrome.browser.WindowDelegate;
import org.chromium.chrome.browser.omnibox.UrlBar.ScrollType;
import org.chromium.chrome.browser.omnibox.UrlBar.UrlBarDelegate;
import org.chromium.chrome.browser.omnibox.UrlBar.UrlDirectionListener;
import org.chromium.chrome.browser.omnibox.UrlBar.UrlTextChangeListener;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
......@@ -41,11 +42,21 @@ public class UrlBarCoordinator implements UrlBarEditingTextStateProvider {
/**
* Constructs a coordinator for the given UrlBar view.
*
* @param urlBar The {@link UrlBar} view this coordinator encapsulates.
* @param windowDelegate Delegate for accessing and mutating window properties, e.g. soft input
* mode.
* @param actionModeCallback Callback to handle changes in contextual action Modes.
*/
public UrlBarCoordinator(UrlBar urlBar) {
public UrlBarCoordinator(@NonNull UrlBar urlBar, @Nullable WindowDelegate windowDelegate,
@NonNull ActionMode.Callback actionModeCallback) {
mUrlBar = urlBar;
PropertyModel model = new PropertyModel(UrlBarProperties.ALL_KEYS);
PropertyModel model =
new PropertyModel.Builder(UrlBarProperties.ALL_KEYS)
.with(UrlBarProperties.ACTION_MODE_CALLBACK, actionModeCallback)
.with(UrlBarProperties.WINDOW_DELEGATE, windowDelegate)
.build();
PropertyModelChangeProcessor.create(model, urlBar, UrlBarViewBinder::bind);
mMediator = new UrlBarMediator(model);
......@@ -87,8 +98,8 @@ public class UrlBarCoordinator implements UrlBarEditingTextStateProvider {
mMediator.setAllowFocus(allowFocus);
}
/** @see UrlBarMediator#setUrlDirectionListener(UrlDirectionListener) */
public void setUrlDirectionListener(UrlDirectionListener listener) {
/** @see UrlBarMediator#setUrlDirectionListener(Callback<Integer>) */
public void setUrlDirectionListener(Callback<Integer> listener) {
mMediator.setUrlDirectionListener(listener);
}
......@@ -97,16 +108,6 @@ public class UrlBarCoordinator implements UrlBarEditingTextStateProvider {
mMediator.setOnFocusChangedCallback(callback);
}
/** @see UrlBarMediator#setWindowDelegate(WindowDelegate) */
public void setWindowDelegate(WindowDelegate windowDelegate) {
mMediator.setWindowDelegate(windowDelegate);
}
/** @see UrlBarMediator#setActionModeCallback(android.view.ActionMode.Callback) */
public void setActionModeCallback(ActionMode.Callback callback) {
mMediator.setActionModeCallback(callback);
}
/** Selects all of the text of the UrlBar. */
public void selectAll() {
mUrlBar.selectAll();
......
......@@ -13,17 +13,14 @@ import android.text.Spanned;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.format.DateUtils;
import android.view.ActionMode;
import androidx.annotation.VisibleForTesting;
import org.chromium.base.Callback;
import org.chromium.base.ContextUtils;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.chrome.browser.WindowDelegate;
import org.chromium.chrome.browser.omnibox.UrlBar.ScrollType;
import org.chromium.chrome.browser.omnibox.UrlBar.UrlBarDelegate;
import org.chromium.chrome.browser.omnibox.UrlBar.UrlDirectionListener;
import org.chromium.chrome.browser.omnibox.UrlBar.UrlTextChangeListener;
import org.chromium.chrome.browser.omnibox.UrlBarCoordinator.SelectionState;
import org.chromium.chrome.browser.omnibox.UrlBarProperties.AutocompleteText;
......@@ -255,24 +252,10 @@ class UrlBarMediator
/**
* Set the listener to be notified for URL direction changes.
*/
public void setUrlDirectionListener(UrlDirectionListener listener) {
public void setUrlDirectionListener(Callback<Integer> listener) {
mModel.set(UrlBarProperties.URL_DIRECTION_LISTENER, listener);
}
/**
* Set the delegate that provides Window capabilities.
*/
public void setWindowDelegate(WindowDelegate windowDelegate) {
mModel.set(UrlBarProperties.WINDOW_DELEGATE, windowDelegate);
}
/**
* Set the callback to handle contextual Action Modes.
*/
public void setActionModeCallback(ActionMode.Callback callback) {
mModel.set(UrlBarProperties.ACTION_MODE_CALLBACK, callback);
}
@Override
public String getReplacementCutCopyText(
String currentText, int selectionStart, int selectionEnd) {
......
......@@ -12,7 +12,6 @@ import org.chromium.chrome.browser.WindowDelegate;
import org.chromium.chrome.browser.omnibox.UrlBar.ScrollType;
import org.chromium.chrome.browser.omnibox.UrlBar.UrlBarDelegate;
import org.chromium.chrome.browser.omnibox.UrlBar.UrlBarTextContextMenuDelegate;
import org.chromium.chrome.browser.omnibox.UrlBar.UrlDirectionListener;
import org.chromium.chrome.browser.omnibox.UrlBar.UrlTextChangeListener;
import org.chromium.chrome.browser.omnibox.UrlBarCoordinator.SelectionState;
import org.chromium.ui.modelutil.PropertyKey;
......@@ -113,7 +112,7 @@ class UrlBarProperties {
new WritableObjectPropertyKey<>();
/** The listener to be notified of URL direction changes. */
public static final WritableObjectPropertyKey<UrlDirectionListener> URL_DIRECTION_LISTENER =
public static final WritableObjectPropertyKey<Callback<Integer>> URL_DIRECTION_LISTENER =
new WritableObjectPropertyKey<>();
/** The callback to be notified on url text changes. @see UrlTextChangeListener. */
......
......@@ -48,11 +48,19 @@ public class StatusCoordinator implements View.OnClickListener, UrlTextChangeLis
* @param isTablet Whether the UI is shown on a tablet.
* @param statusView The status view, used to supply and manipulate child views.
* @param urlBarEditingTextStateProvider The url coordinator.
* @param incognitoStateProvider Provider of incocognito-ness for the active TabModel.
* @param modalDialogManagerSupplier A supplier for {@link ModalDialogManager} used to display a
* dialog.
*/
public StatusCoordinator(boolean isTablet, StatusView statusView,
UrlBarEditingTextStateProvider urlBarEditingTextStateProvider) {
UrlBarEditingTextStateProvider urlBarEditingTextStateProvider,
IncognitoStateProvider incognitoStateProvider,
Supplier<ModalDialogManager> modalDialogManagerSupplier,
LocationBarDataProvider locationBarDataProvider) {
mIsTablet = isTablet;
mStatusView = statusView;
mModalDialogManagerSupplier = modalDialogManagerSupplier;
mLocationBarDataProvider = locationBarDataProvider;
mModel = new PropertyModel(StatusProperties.ALL_KEYS);
......@@ -66,7 +74,8 @@ public class StatusCoordinator implements View.OnClickListener, UrlTextChangeLis
mModel.get(StatusProperties.SHOW_STATUS_ICON) ? View.VISIBLE : View.GONE);
};
mMediator = new StatusMediator(mModel, mStatusView.getResources(), mStatusView.getContext(),
urlBarEditingTextStateProvider, isTablet, forceModelViewReconciliationRunnable);
urlBarEditingTextStateProvider, isTablet, forceModelViewReconciliationRunnable,
incognitoStateProvider, locationBarDataProvider);
Resources res = mStatusView.getResources();
mMediator.setUrlMinWidth(res.getDimensionPixelSize(R.dimen.location_bar_min_url_width)
......@@ -79,6 +88,12 @@ public class StatusCoordinator implements View.OnClickListener, UrlTextChangeLis
mMediator.setVerboseStatusTextMinWidth(
res.getDimensionPixelSize(R.dimen.location_bar_min_verbose_status_text_width));
mStatusView.setLocationBarDataProvider(mLocationBarDataProvider);
// Update status immediately after receiving the data provider to avoid initial presence
// glitch on tablet devices. This glitch would be typically seen upon launch of app, right
// before the landing page is presented to the user.
updateStatusIcon();
}
/**
......@@ -86,9 +101,10 @@ public class StatusCoordinator implements View.OnClickListener, UrlTextChangeLis
*
* @param locationBarDataProvider The data provider.
*/
public void setLocationBarDataProvider(LocationBarDataProvider locationBarDataProvider) {
public void setLocationBarDataProviderForTesting(
LocationBarDataProvider locationBarDataProvider) {
mLocationBarDataProvider = locationBarDataProvider;
mMediator.setLocationBarDataProvider(mLocationBarDataProvider);
mMediator.setLocationBarDataProviderForTesting(mLocationBarDataProvider);
mStatusView.setLocationBarDataProvider(mLocationBarDataProvider);
// Update status immediately after receiving the data provider to avoid initial presence
// glitch on tablet devices. This glitch would be typically seen upon launch of app, right
......@@ -137,20 +153,6 @@ public class StatusCoordinator implements View.OnClickListener, UrlTextChangeLis
updateStatusIcon();
}
/** @param incognitoBadgeVisible Whether or not the incognito badge is visible. */
public void setIncognitoBadgeVisibility(boolean incognitoBadgeVisible) {
mMediator.setIncognitoBadgeVisibility(incognitoBadgeVisible);
}
/**
* @param modalDialogManagerSupplier A supplier for {@link ModalDialogManager} used
* to display a dialog.
*/
public void setModalDialogManagerSupplier(
Supplier<ModalDialogManager> modalDialogManagerSupplier) {
mModalDialogManagerSupplier = modalDialogManagerSupplier;
}
/** Updates the security icon displayed in the LocationBar. */
public void updateStatusIcon() {
mMediator.setSecurityIconResource(
......@@ -254,10 +256,6 @@ public class StatusCoordinator implements View.OnClickListener, UrlTextChangeLis
mMediator.setFirstSuggestionIsSearchType(firstSuggestionIsSearchQuery);
}
public void setIncognitoStateProvider(IncognitoStateProvider incognitoStateProvider) {
mMediator.setIncognitoStateProvider(incognitoStateProvider);
}
/** Update information required to display the search engine icon. */
public void updateSearchEngineStatusIcon(boolean shouldShowSearchEngineLogo,
boolean isSearchEngineGoogle, String searchEngineUrl) {
......
......@@ -117,8 +117,11 @@ class StatusMediator implements IncognitoStateProvider.IncognitoStateObserver {
StatusMediator(PropertyModel model, Resources resources, Context context,
UrlBarEditingTextStateProvider urlBarEditingTextStateProvider, boolean isTablet,
Runnable forceModelViewReconciliationRunnable) {
Runnable forceModelViewReconciliationRunnable,
IncognitoStateProvider incognitoStateProvider,
LocationBarDataProvider locationBarDataProvider) {
mModel = model;
mLocationBarDataProvider = locationBarDataProvider;
mDelegate = new StatusMediatorDelegate();
updateColorTheme();
......@@ -136,13 +139,16 @@ class StatusMediator implements IncognitoStateProvider.IncognitoStateObserver {
mIsTablet = isTablet;
mForceModelViewReconciliationRunnable = forceModelViewReconciliationRunnable;
if (incognitoStateProvider != null) {
incognitoStateProvider.addIncognitoStateObserverAndTrigger(this);
}
}
/**
* Set the ToolbarDataProvider for this class.
* Override the LocationBarDataProvider for this class for testing purposes.
*/
void setLocationBarDataProvider(LocationBarDataProvider toolbarCommonPropertiesModel) {
mLocationBarDataProvider = toolbarCommonPropertiesModel;
void setLocationBarDataProviderForTesting(LocationBarDataProvider locationBarDataProvider) {
mLocationBarDataProvider = locationBarDataProvider;
}
/**
......@@ -369,13 +375,6 @@ class StatusMediator implements IncognitoStateProvider.IncognitoStateObserver {
}
}
/**
* @param incognitoBadgeVisible Whether or not the incognito badge is visible.
*/
void setIncognitoBadgeVisibility(boolean incognitoBadgeVisible) {
mModel.set(StatusProperties.INCOGNITO_BADGE_VISIBLE, incognitoBadgeVisible);
}
/**
* Specify minimum width of the verbose status text field.
*/
......@@ -662,15 +661,12 @@ class StatusMediator implements IncognitoStateProvider.IncognitoStateObserver {
return urlTextWithAutocomplete;
}
public void setIncognitoStateProvider(IncognitoStateProvider incognitoStateProvider) {
if (incognitoStateProvider == null) return;
incognitoStateProvider.addIncognitoStateObserverAndTrigger(this);
}
@Override
public void onIncognitoStateChanged(boolean isIncognito) {
boolean previousIsIncognito = mIsIncognito;
mIsIncognito = isIncognito;
boolean incognitoBadgeVisible = isIncognito && !mIsTablet;
mModel.set(StatusProperties.INCOGNITO_BADGE_VISIBLE, incognitoBadgeVisible);
if (previousIsIncognito != isIncognito) reconcileVisualState();
}
......
......@@ -11,6 +11,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.ViewStub;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.core.view.ViewCompat;
......@@ -20,6 +21,7 @@ import org.chromium.base.StrictModeContext;
import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.omnibox.LocationBarDataProvider;
import org.chromium.chrome.browser.omnibox.UrlBar.UrlTextChangeListener;
import org.chromium.chrome.browser.omnibox.UrlBarEditingTextStateProvider;
......@@ -45,7 +47,7 @@ import org.chromium.chrome.browser.share.ShareDelegate;
import org.chromium.chrome.browser.util.KeyNavigationUtil;
import org.chromium.components.query_tiles.QueryTile;
import org.chromium.ui.ViewProvider;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.modaldialog.ModalDialogManager;
import org.chromium.ui.modelutil.LazyConstructionPropertyMcp;
import org.chromium.ui.modelutil.MVCListAdapter;
import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
......@@ -63,9 +65,15 @@ public class AutocompleteCoordinator implements UrlFocusChangeListener, UrlTextC
private AutocompleteMediator mMediator;
private OmniboxSuggestionsDropdown mDropdown;
public AutocompleteCoordinator(ViewGroup parent, AutocompleteDelegate delegate,
OmniboxSuggestionsDropdownEmbedder dropdownEmbedder,
UrlBarEditingTextStateProvider urlBarEditingTextProvider) {
public AutocompleteCoordinator(@NonNull ViewGroup parent,
@NonNull AutocompleteDelegate delegate,
@NonNull OmniboxSuggestionsDropdownEmbedder dropdownEmbedder,
@NonNull UrlBarEditingTextStateProvider urlBarEditingTextProvider,
@NonNull ActivityLifecycleDispatcher lifecycleDispatcher,
@NonNull Supplier<ModalDialogManager> modalDialogManagerSupplier,
@Nullable ActivityTabProvider activityTabProvider,
@Nullable Supplier<ShareDelegate> shareDelegateSupplier,
@NonNull LocationBarDataProvider locationBarDataProvider) {
mParent = parent;
Context context = parent.getContext();
......@@ -78,7 +86,9 @@ public class AutocompleteCoordinator implements UrlFocusChangeListener, UrlTextC
mQueryTileCoordinator = new OmniboxQueryTileCoordinator(context, this::onTileSelected);
mMediator = new AutocompleteMediator(context, delegate, urlBarEditingTextProvider,
new AutocompleteController(), listModel, new Handler());
new AutocompleteController(), listModel, new Handler(), lifecycleDispatcher,
modalDialogManagerSupplier, activityTabProvider, shareDelegateSupplier,
locationBarDataProvider);
mMediator.initDefaultProcessors(mQueryTileCoordinator::setTiles);
listModel.set(SuggestionListProperties.OBSERVER, mMediator);
......@@ -212,14 +222,6 @@ public class AutocompleteCoordinator implements UrlFocusChangeListener, UrlTextC
mMediator.onUrlAnimationFinished(hasFocus);
}
/**
* Provides data and state for the toolbar component.
* @param locationBarDataProvider The data provider.
*/
public void setLocationBarDataProvider(LocationBarDataProvider locationBarDataProvider) {
mMediator.setLocationBarDataProvider(locationBarDataProvider);
}
/**
* Updates the profile used for generating autocomplete suggestions.
* @param profile The profile to be used.
......@@ -229,27 +231,6 @@ public class AutocompleteCoordinator implements UrlFocusChangeListener, UrlTextC
mQueryTileCoordinator.setProfile(profile);
}
/**
* Set the WindowAndroid instance associated with the containing Activity.
*/
public void setWindowAndroid(WindowAndroid windowAndroid) {
mMediator.setWindowAndroid(windowAndroid);
}
/**
* @param provider A means of accessing the activity's tab.
*/
public void setActivityTabProvider(ActivityTabProvider provider) {
mMediator.setActivityTabProvider(provider);
}
/**
* @param shareDelegateSupplier A means of accessing the sharing feature.
*/
public void setShareDelegateSupplier(Supplier<ShareDelegate> shareDelegateSupplier) {
mMediator.setShareDelegateSupplier(shareDelegateSupplier);
}
/**
* Whether omnibox autocomplete should currently be prevented from generating suggestions.
*/
......@@ -384,6 +365,16 @@ public class AutocompleteCoordinator implements UrlFocusChangeListener, UrlTextC
AutocompleteControllerJni.get().prefetchZeroSuggestResults();
}
/**
* Provides data and state for the toolbar component.
* @param locationBarDataProvider The data provider.
*/
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
public void setLocationBarDataProviderForTesting(
LocationBarDataProvider locationBarDataProvider) {
mMediator.setLocationBarDataProviderForTesting(locationBarDataProvider);
}
/** @return Suggestions Dropdown view, showing the list of suggestions. */
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
public OmniboxSuggestionsDropdown getSuggestionsDropdownForTest() {
......
......@@ -4,7 +4,6 @@
package org.chromium.chrome.browser.omnibox.suggestions;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
......@@ -33,7 +32,6 @@ import org.chromium.chrome.browser.ActivityTabProvider.ActivityTabTabObserver;
import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton;
import org.chromium.chrome.browser.document.ChromeIntentUtil;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.init.AsyncInitializationActivity;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.lifecycle.StartStopWithNativeObserver;
import org.chromium.chrome.browser.omnibox.LocationBarDataProvider;
......@@ -55,7 +53,6 @@ import org.chromium.components.embedder_support.util.UrlConstants;
import org.chromium.components.query_tiles.QueryTile;
import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.base.PageTransition;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.modaldialog.DialogDismissalCause;
import org.chromium.ui.modaldialog.ModalDialogManager;
import org.chromium.ui.modaldialog.ModalDialogProperties;
......@@ -145,27 +142,66 @@ class AutocompleteMediator implements OnSuggestionsReceivedListener, StartStopWi
private long mLastActionUpTimestamp;
private boolean mIgnoreOmniboxItemSelection = true;
private WindowAndroid mWindowAndroid;
@NonNull
private ActivityLifecycleDispatcher mLifecycleDispatcher;
@NonNull
private Supplier<ModalDialogManager> mModalDialogManagerSupplier;
private ActivityTabTabObserver mTabObserver;
private final DropdownItemViewInfoListBuilder mDropdownViewInfoListBuilder;
private final DropdownItemViewInfoListManager mDropdownViewInfoListManager;
public AutocompleteMediator(Context context, AutocompleteDelegate delegate,
UrlBarEditingTextStateProvider textProvider,
AutocompleteController autocompleteController, PropertyModel listPropertyModel,
Handler handler) {
public AutocompleteMediator(@NonNull Context context, @NonNull AutocompleteDelegate delegate,
@NonNull UrlBarEditingTextStateProvider textProvider,
@NonNull AutocompleteController autocompleteController,
@NonNull PropertyModel listPropertyModel, @NonNull Handler handler,
@NonNull ActivityLifecycleDispatcher lifecycleDispatcher,
@NonNull Supplier<ModalDialogManager> modalDialogManagerSupplier,
@Nullable ActivityTabProvider activityTabProvider,
@Nullable Supplier<ShareDelegate> shareDelegateSupplier,
@NonNull LocationBarDataProvider locationBarDataProvider) {
mContext = context;
mDelegate = delegate;
mUrlBarEditingTextProvider = textProvider;
mListPropertyModel = listPropertyModel;
mLifecycleDispatcher = lifecycleDispatcher;
mLifecycleDispatcher.register(this);
mModalDialogManagerSupplier = modalDialogManagerSupplier;
mAutocomplete = autocompleteController;
mAutocomplete.setOnSuggestionsReceivedListener(this);
mHandler = handler;
mDataProvider = locationBarDataProvider;
mSuggestionModels = mListPropertyModel.get(SuggestionListProperties.SUGGESTION_MODELS);
mAutocompleteResult = new AutocompleteResult(null, null);
mDropdownViewInfoListBuilder = new DropdownItemViewInfoListBuilder(mAutocomplete);
mDropdownViewInfoListBuilder.setShareDelegateSupplier(shareDelegateSupplier);
mDropdownViewInfoListManager = new DropdownItemViewInfoListManager(mSuggestionModels);
if (activityTabProvider != null) {
mDropdownViewInfoListBuilder.setActivityTabProvider(activityTabProvider);
mTabObserver = new ActivityTabTabObserver(activityTabProvider) {
@Override
public void onPageLoadFinished(Tab tab, String url) {
maybeTriggerCacheRefresh(url);
}
@Override
protected void onObservingDifferentTab(Tab tab, boolean hint) {
if (tab == null) return;
maybeTriggerCacheRefresh(tab.getUrlString());
}
/**
* Trigger ZeroSuggest cache refresh in case user is accessing a new tab page.
* Avoid issuing multiple concurrent server requests for the same event to
* reduce server pressure.
*/
private void maybeTriggerCacheRefresh(String url) {
if (url == null) return;
if (!UrlConstants.NTP_URL.equals(url)) return;
AutocompleteControllerJni.get().prefetchZeroSuggestResults();
}
};
}
}
/**
......@@ -190,6 +226,9 @@ class AutocompleteMediator implements OnSuggestionsReceivedListener, StartStopWi
if (mTabObserver != null) {
mTabObserver.destroy();
}
if (mLifecycleDispatcher != null) {
mLifecycleDispatcher.unregister(this);
}
}
@Override
......@@ -252,29 +291,10 @@ class AutocompleteMediator implements OnSuggestionsReceivedListener, StartStopWi
/**
* Sets the data provider for the toolbar.
*/
void setLocationBarDataProvider(LocationBarDataProvider provider) {
void setLocationBarDataProviderForTesting(LocationBarDataProvider provider) {
mDataProvider = provider;
}
/** Set the WindowAndroid instance associated with the containing Activity. */
void setWindowAndroid(WindowAndroid window) {
if (mLifecycleDispatcher != null) {
mLifecycleDispatcher.unregister(this);
}
mWindowAndroid = window;
if (window != null && window.getActivity().get() != null
&& window.getActivity().get() instanceof AsyncInitializationActivity) {
mLifecycleDispatcher =
((AsyncInitializationActivity) mWindowAndroid.getActivity().get())
.getLifecycleDispatcher();
}
if (mLifecycleDispatcher != null) {
mLifecycleDispatcher.register(this);
}
}
/**
* Sets the layout direction to be used for any new suggestion views.
* @see View#setLayoutDirection(int)
......@@ -328,48 +348,6 @@ class AutocompleteMediator implements OnSuggestionsReceivedListener, StartStopWi
mDropdownViewInfoListBuilder.onNativeInitialized();
}
/**
* @param provider A means of accessing the activity tab.
*/
void setActivityTabProvider(ActivityTabProvider provider) {
mDropdownViewInfoListBuilder.setActivityTabProvider(provider);
if (mTabObserver != null) {
mTabObserver.destroy();
mTabObserver = null;
}
if (provider != null) {
mTabObserver = new ActivityTabTabObserver(provider) {
@Override
public void onPageLoadFinished(Tab tab, String url) {
maybeTriggerCacheRefresh(url);
}
@Override
protected void onObservingDifferentTab(Tab tab, boolean hint) {
if (tab == null) return;
maybeTriggerCacheRefresh(tab.getUrlString());
}
/**
* Trigger ZeroSuggest cache refresh in case user is accessing a new tab page.
* Avoid issuing multiple concurrent server requests for the same event to reduce
* server pressure.
*/
private void maybeTriggerCacheRefresh(String url) {
if (url == null) return;
if (!UrlConstants.NTP_URL.equals(url)) return;
AutocompleteControllerJni.get().prefetchZeroSuggestResults();
}
};
}
}
void setShareDelegateSupplier(Supplier<ShareDelegate> shareDelegateSupplier) {
mDropdownViewInfoListBuilder.setShareDelegateSupplier(shareDelegateSupplier);
}
/** @see org.chromium.chrome.browser.omnibox.UrlFocusChangeListener#onUrlFocusChange(boolean) */
void onUrlFocusChange(boolean hasFocus) {
if (hasFocus) {
......@@ -561,11 +539,7 @@ class AutocompleteMediator implements OnSuggestionsReceivedListener, StartStopWi
RecordUserAction.record("MobileOmniboxDeleteGesture");
if (!suggestion.isDeletable()) return;
if (mWindowAndroid == null) return;
Activity activity = mWindowAndroid.getActivity().get();
if (activity == null || !(activity instanceof AsyncInitializationActivity)) return;
ModalDialogManager manager =
((AsyncInitializationActivity) activity).getModalDialogManager();
ModalDialogManager manager = mModalDialogManagerSupplier.get();
if (manager == null) {
assert false : "No modal dialog manager registered for this activity.";
return;
......
......@@ -167,9 +167,12 @@ public class SearchActivity extends AsyncInitializationActivity
mSearchBox = (SearchActivityLocationBarLayout) mContentView.findViewById(
R.id.search_location_bar);
mSearchBox.setDelegate(this);
mLocationBarCoordinator = new LocationBarCoordinator(mSearchBox, mProfileSupplier,
mSearchBoxDataProvider, null, new WindowDelegate(getWindow()), getWindowAndroid(),
/*activityTabProvider=*/null, /*modalDialogManagerSupplier=*/null,
View anchorView = mContentView.findViewById(R.id.toolbar);
mLocationBarCoordinator = new LocationBarCoordinator(mSearchBox, anchorView,
mProfileSupplier, mSearchBoxDataProvider, null, new WindowDelegate(getWindow()),
getWindowAndroid(),
/*activityTabProvider=*/null, /*modalDialogManagerSupplier=*/
getModalDialogManagerSupplier(),
/*shareDelegateSupplier=*/null, /*incognitoStateProvider=*/null,
getLifecycleDispatcher(), /*overrideUrlLoadingDelegate=*/
(String url, @PageTransition int transition, String postDataType, byte[] postData,
......
......@@ -9,16 +9,28 @@ import android.os.Handler;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.WindowDelegate;
import org.chromium.chrome.browser.locale.LocaleManager;
import org.chromium.chrome.browser.omnibox.LocationBarDataProvider;
import org.chromium.chrome.browser.omnibox.LocationBarLayout;
import org.chromium.chrome.browser.omnibox.OverrideUrlLoadingDelegate;
import org.chromium.chrome.browser.omnibox.UrlBar;
import org.chromium.chrome.browser.omnibox.UrlBarCoordinator;
import org.chromium.chrome.browser.omnibox.UrlBarCoordinator.SelectionState;
import org.chromium.chrome.browser.omnibox.UrlBarData;
import org.chromium.chrome.browser.omnibox.status.StatusCoordinator;
import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator;
import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.toolbar.top.ToolbarPhone;
import org.chromium.ui.base.WindowAndroid;
/** Implementation of the {@link LocationBarLayout} that is displayed for widget searches. */
public class SearchActivityLocationBarLayout extends LocationBarLayout {
......@@ -40,13 +52,9 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout {
public SearchActivityLocationBarLayout(Context context, AttributeSet attrs) {
super(context, attrs, R.layout.location_bar_base);
setUrlBarFocusable(true);
setBackground(ToolbarPhone.createModernLocationBarBackground(getResources()));
setShouldShowMicButtonWhenUnfocused(true);
mPendingSearchPromoDecision = LocaleManager.getInstance().needToCheckForSearchEnginePromo();
getAutocompleteCoordinator().setShouldPreventOmniboxAutocomplete(
mPendingSearchPromoDecision);
}
/** Set the {@link Delegate}. */
......@@ -54,6 +62,22 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout {
mDelegate = delegate;
}
@Override
public void initialize(@NonNull AutocompleteCoordinator autocompleteCoordinator,
@NonNull UrlBarCoordinator urlCoordinator, @NonNull StatusCoordinator statusCoordinator,
@NonNull LocationBarDataProvider locationBarDataProvider,
@NonNull ObservableSupplier<Profile> profileSupplier,
@NonNull WindowDelegate windowDelegate, @NonNull WindowAndroid windowAndroid,
@NonNull OverrideUrlLoadingDelegate overrideUrlLoadingDelegate) {
super.initialize(autocompleteCoordinator, urlCoordinator, statusCoordinator,
locationBarDataProvider, profileSupplier, windowDelegate, windowAndroid,
overrideUrlLoadingDelegate);
setUrlBarFocusable(true);
mPendingSearchPromoDecision = LocaleManager.getInstance().needToCheckForSearchEnginePromo();
getAutocompleteCoordinator().setShouldPreventOmniboxAutocomplete(
mPendingSearchPromoDecision);
}
@Override
public void loadUrlWithPostData(String url, int transition, long inputStart,
@Nullable String postDataType, @Nullable byte[] postData) {
......
......@@ -413,9 +413,8 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve
if (toolbarLayout instanceof CustomTabToolbar) {
CustomTabToolbar customTabToolbar = ((CustomTabToolbar) toolbarLayout);
mLocationBar = customTabToolbar.createLocationBar(mLocationBarModel);
customTabToolbar.setDefaultTextEditActionModeCallback(
mActionModeController.getActionModeCallback());
mLocationBar = customTabToolbar.createLocationBar(
mLocationBarModel, mActionModeController.getActionModeCallback());
} else {
OverrideUrlLoadingDelegate overrideUrlLoadingDelegate =
(url, transition, postDataType, postData, incognito)
......@@ -423,8 +422,8 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve
url, transition, postDataType, postData, incognito,
startSurfaceParentTabSupplier.get());
LocationBarCoordinator locationBarCoordinator = new LocationBarCoordinator(
mActivity.findViewById(R.id.location_bar), profileSupplier, mLocationBarModel,
mActionModeController.getActionModeCallback(),
mActivity.findViewById(R.id.location_bar), toolbarLayout, profileSupplier,
mLocationBarModel, mActionModeController.getActionModeCallback(),
new WindowDelegate(mActivity.getWindow()), windowAndroid, mActivityTabProvider,
modalDialogManagerSupplier, shareDelegateSupplier, mIncognitoStateProvider,
activityLifecycleDispatcher, overrideUrlLoadingDelegate);
......
......@@ -134,7 +134,7 @@ public class LocationBarLayoutTest {
mTestLocationBarModel.setTab(tab, tab.isIncognito());
TestThreadUtils.runOnUiThreadBlocking(
() -> getLocationBar().setLocationBarDataProvider(mTestLocationBarModel));
() -> getLocationBar().setLocationBarDataProviderForTesting(mTestLocationBarModel));
}
private void setUrlToPageUrl(LocationBarLayout locationBar) {
......@@ -273,6 +273,8 @@ public class LocationBarLayoutTest {
updateSearchEngineLogoWithGoogle(locationBar);
mTestLocationBarModel.setCurrentUrl(GOOGLE_SRP_URL);
mTestLocationBarModel.setSecurityLevel(ConnectionSecurityLevel.SECURE);
mTestLocationBarModel.mDisplayText = GOOGLE_SRP_URL;
mTestLocationBarModel.mEditingText = GOOGLE_SRP_URL;
setUrlToPageUrl(locationBar);
onView(withId(R.id.location_bar_status)).check((view, e) -> {
......
......@@ -94,8 +94,8 @@ public final class StatusMediatorUnitTest {
TestThreadUtils.runOnUiThreadBlocking(() -> {
mMediator = new StatusMediator(mModel, mResources, mContext,
mUrlBarEditingTextStateProvider,
/* isTablet */ false, mMockForceModelViewReconciliationRunnable);
mMediator.setLocationBarDataProvider(mLocationBarDataProvider);
/* isTablet */ false, mMockForceModelViewReconciliationRunnable, null,
mLocationBarDataProvider);
mMediator.setDelegateForTesting(mDelegate);
});
mBitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888);
......
......@@ -42,6 +42,7 @@ import org.chromium.base.test.BaseJUnit4ClassRunner;
import org.chromium.base.test.UiThreadTest;
import org.chromium.base.test.util.Batch;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.omnibox.LocationBarDataProvider;
import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType;
import org.chromium.chrome.browser.omnibox.UrlBarEditingTextStateProvider;
......@@ -55,6 +56,7 @@ import org.chromium.components.metrics.OmniboxEventProtos.OmniboxEventProto.Page
import org.chromium.components.query_tiles.QueryTile;
import org.chromium.content_public.browser.test.NativeLibraryTestUtils;
import org.chromium.ui.base.PageTransition;
import org.chromium.ui.modaldialog.ModalDialogManager;
import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
import org.chromium.ui.modelutil.PropertyModel;
......@@ -142,6 +144,12 @@ public class AutocompleteMediatorUnitTest {
@Mock
LocationBarDataProvider mLocationBarDataProvider;
@Mock
ActivityLifecycleDispatcher mLifecycleDispatcher;
@Mock
ModalDialogManager mModalDialogManager;
@Mock
Handler mHandler;
......@@ -161,8 +169,8 @@ public class AutocompleteMediatorUnitTest {
mMediator = new AutocompleteMediator(ContextUtils.getApplicationContext(),
mAutocompleteDelegate, mTextStateProvider, mAutocompleteController, mListModel,
mHandler);
mMediator.setLocationBarDataProvider(mLocationBarDataProvider);
mHandler, mLifecycleDispatcher,
() -> mModalDialogManager, null, null, mLocationBarDataProvider);
mMediator.getDropdownItemViewInfoListBuilderForTest().registerSuggestionProcessor(
mMockProcessor);
mMediator.getDropdownItemViewInfoListBuilderForTest().setHeaderProcessorForTest(
......
......@@ -33,6 +33,7 @@ import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.Feature;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.omnibox.LocationBarDataProvider;
import org.chromium.chrome.browser.omnibox.UrlBarData;
import org.chromium.chrome.browser.omnibox.UrlBarEditingTextStateProvider;
......@@ -58,6 +59,7 @@ import org.chromium.ui.base.AndroidPermissionDelegate;
import org.chromium.ui.base.PermissionCallback;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.base.WindowAndroid.IntentCallback;
import org.chromium.ui.modaldialog.ModalDialogManager;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
......@@ -78,12 +80,15 @@ public class VoiceRecognitionHandlerTest {
Intent mIntent;
@Mock
AssistantVoiceSearchService mAssistantVoiceSearchService;
@Mock
ModalDialogManager mModalDialogManager;
private TestDataProvider mDataProvider;
private TestDelegate mDelegate;
private TestVoiceRecognitionHandler mHandler;
private TestAndroidPermissionDelegate mPermissionDelegate;
private TestWindowAndroid mWindowAndroid;
private ActivityLifecycleDispatcher mLifecycleDispatcher;
private Tab mTab;
private List<VoiceResult> mAutocompleteVoiceResults;
......@@ -304,7 +309,8 @@ public class VoiceRecognitionHandlerTest {
public TestAutocompleteCoordinator(ViewGroup parent, AutocompleteDelegate delegate,
OmniboxSuggestionsDropdownEmbedder dropdownEmbedder,
UrlBarEditingTextStateProvider urlBarEditingTextProvider) {
super(parent, delegate, dropdownEmbedder, urlBarEditingTextProvider);
super(parent, delegate, dropdownEmbedder, urlBarEditingTextProvider,
mLifecycleDispatcher, () -> mModalDialogManager, null, null, mDataProvider);
}
@Override
......@@ -499,6 +505,10 @@ public class VoiceRecognitionHandlerTest {
public void setUp() throws InterruptedException, ExecutionException {
MockitoAnnotations.initMocks(this);
mActivityTestRule.startMainActivityOnBlankPage();
mLifecycleDispatcher = mActivityTestRule.getActivity().getLifecycleDispatcher();
TestThreadUtils.runOnUiThreadBlocking(
() -> { mWindowAndroid = new TestWindowAndroid(mActivityTestRule.getActivity()); });
mDataProvider = new TestDataProvider();
mDelegate = TestThreadUtils.runOnUiThreadBlocking(() -> new TestDelegate());
......@@ -506,7 +516,6 @@ public class VoiceRecognitionHandlerTest {
mPermissionDelegate = new TestAndroidPermissionDelegate();
TestThreadUtils.runOnUiThreadBlocking(() -> {
mWindowAndroid = new TestWindowAndroid(mActivityTestRule.getActivity());
mWindowAndroid.setAndroidPermissionDelegate(mPermissionDelegate);
mTab = new MockTab(0, false);
});
......
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