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