Commit 3a1155f3 authored by Patrick Noland's avatar Patrick Noland Committed by Chromium LUCI CQ

[ToolbarMVC] Extract VoiceRecognitionHandler from LBLayout

To enable this, onClick for the delete and mic buttons is now implemented
by LBMediator

This extraction lets us:
* Implement updateMicButtonState in LBMediator
* Remove LBLayout methods: getVoiceRecognitionHandler,
onWindowVisibilityChanged, getWindowAndroid, and
setVoiceRecognitionHandlerForTesting

Since SearchActivityLocationBarLayout used LBL's VoiceRecognitionHandler,
we need to refactor the methods that do this to take one as an argument.
Doing so is straightforward.
Finally, some WindowAndroid methods are made non-final to allow them
to be mocked in unit tests.


Bug: 1147581
Change-Id: I54a6ba9b36b7a9991793b0f9d52a163e0b362bcc
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2596424
Commit-Queue: Patrick Noland <pnoland@chromium.org>
Reviewed-by: default avatarFilip Gorski <fgorski@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#844925}
parent eb4d6e7b
...@@ -69,6 +69,8 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse ...@@ -69,6 +69,8 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse
private View mAutocompleteAnchorView; private View mAutocompleteAnchorView;
private LocationBarMediator mLocationBarMediator; private LocationBarMediator mLocationBarMediator;
private View mUrlBar; private View mUrlBar;
private View mDeleteButton;
private View mMicButton;
private final OneshotSupplierImpl<TemplateUrlService> mTemplateUrlServiceSupplier = private final OneshotSupplierImpl<TemplateUrlService> mTemplateUrlServiceSupplier =
new OneshotSupplierImpl<>(); new OneshotSupplierImpl<>();
private CallbackController mCallbackController = new CallbackController(); private CallbackController mCallbackController = new CallbackController();
...@@ -124,7 +126,8 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse ...@@ -124,7 +126,8 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse
mLocationBarMediator = new LocationBarMediator(mLocationBarLayout.getContext(), mLocationBarMediator = new LocationBarMediator(mLocationBarLayout.getContext(),
mLocationBarLayout, locationBarDataProvider, profileObservableSupplier, mLocationBarLayout, locationBarDataProvider, profileObservableSupplier,
PrivacyPreferencesManagerImpl.getInstance(), overrideUrlLoadingDelegate, PrivacyPreferencesManagerImpl.getInstance(), overrideUrlLoadingDelegate,
LocaleManager.getInstance(), mTemplateUrlServiceSupplier, backKeyBehavior); LocaleManager.getInstance(), mTemplateUrlServiceSupplier, backKeyBehavior,
windowAndroid);
mUrlCoordinator = mUrlCoordinator =
new UrlBarCoordinator((UrlBar) mUrlBar, windowDelegate, actionModeCallback, new UrlBarCoordinator((UrlBar) mUrlBar, windowDelegate, actionModeCallback,
mCallbackController.makeCancelable(mLocationBarMediator::onUrlFocusChange), mCallbackController.makeCancelable(mLocationBarMediator::onUrlFocusChange),
...@@ -139,6 +142,11 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse ...@@ -139,6 +142,11 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse
mUrlCoordinator, mAutocompleteCoordinator, mStatusCoordinator); mUrlCoordinator, mAutocompleteCoordinator, mStatusCoordinator);
mUrlBar.setOnKeyListener(mLocationBarMediator); mUrlBar.setOnKeyListener(mLocationBarMediator);
mDeleteButton = mLocationBarLayout.findViewById(R.id.delete_button);
mMicButton = mLocationBarLayout.findViewById(R.id.mic_button);
mDeleteButton.setOnClickListener(mLocationBarMediator::deleteButtonClicked);
mMicButton.setOnClickListener(mLocationBarMediator::micButtonClicked);
mUrlCoordinator.addUrlTextChangeListener(mAutocompleteCoordinator); mUrlCoordinator.addUrlTextChangeListener(mAutocompleteCoordinator);
// The LocationBar's direction is tied to the UrlBar's text direction. Icons inside the // The LocationBar's direction is tied to the UrlBar's text direction. Icons inside the
...@@ -153,8 +161,7 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse ...@@ -153,8 +161,7 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse
mLocationBarLayout.addUrlFocusChangeListener(mAutocompleteCoordinator); mLocationBarLayout.addUrlFocusChangeListener(mAutocompleteCoordinator);
mLocationBarLayout.addUrlFocusChangeListener(mUrlCoordinator); mLocationBarLayout.addUrlFocusChangeListener(mUrlCoordinator);
mLocationBarLayout.initialize(mAutocompleteCoordinator, mUrlCoordinator, mStatusCoordinator, mLocationBarLayout.initialize(mAutocompleteCoordinator, mUrlCoordinator, mStatusCoordinator,
locationBarDataProvider, windowDelegate, windowAndroid, locationBarDataProvider);
mLocationBarMediator.getVoiceRecognitionHandler());
if (locationBarLayout instanceof LocationBarPhone) { if (locationBarLayout instanceof LocationBarPhone) {
mSubCoordinator = new LocationBarCoordinatorPhone( mSubCoordinator = new LocationBarCoordinatorPhone(
...@@ -175,6 +182,10 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse ...@@ -175,6 +182,10 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse
} }
mUrlBar.setOnKeyListener(null); mUrlBar.setOnKeyListener(null);
mUrlBar = null; mUrlBar = null;
mDeleteButton.setOnClickListener(null);
mDeleteButton = null;
mMicButton.setOnClickListener(null);
mMicButton = null;
mUrlCoordinator.destroy(); mUrlCoordinator.destroy();
mUrlCoordinator = null; mUrlCoordinator = null;
mLocationBarLayout.getContext().unregisterComponentCallbacks(mLocationBarMediator); mLocationBarLayout.getContext().unregisterComponentCallbacks(mLocationBarMediator);
......
...@@ -13,7 +13,6 @@ import android.util.AttributeSet; ...@@ -13,7 +13,6 @@ import android.util.AttributeSet;
import android.util.SparseArray; import android.util.SparseArray;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.FrameLayout; import android.widget.FrameLayout;
...@@ -29,18 +28,15 @@ import org.chromium.base.ApiCompatibilityUtils; ...@@ -29,18 +28,15 @@ import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.ObserverList; import org.chromium.base.ObserverList;
import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.R; import org.chromium.chrome.R;
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.UrlBarCoordinator.SelectionState; import org.chromium.chrome.browser.omnibox.UrlBarCoordinator.SelectionState;
import org.chromium.chrome.browser.omnibox.geo.GeolocationHeader; import org.chromium.chrome.browser.omnibox.geo.GeolocationHeader;
import org.chromium.chrome.browser.omnibox.status.StatusCoordinator; import org.chromium.chrome.browser.omnibox.status.StatusCoordinator;
import org.chromium.chrome.browser.omnibox.status.StatusView; import org.chromium.chrome.browser.omnibox.status.StatusView;
import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator; import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator;
import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler;
import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; import org.chromium.chrome.browser.util.ChromeAccessibilityUtil;
import org.chromium.components.browser_ui.widget.CompositeTouchDelegate; import org.chromium.components.browser_ui.widget.CompositeTouchDelegate;
import org.chromium.ui.base.WindowAndroid;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -49,8 +45,7 @@ import java.util.List; ...@@ -49,8 +45,7 @@ import java.util.List;
* This class represents the location bar where the user types in URLs and * This class represents the location bar where the user types in URLs and
* search terms. * search terms.
*/ */
public class LocationBarLayout extends FrameLayout implements OnClickListener { public class LocationBarLayout extends FrameLayout {
protected ImageButton mDeleteButton; protected ImageButton mDeleteButton;
protected ImageButton mMicButton; protected ImageButton mMicButton;
private boolean mShouldShowMicButtonWhenUnfocused; private boolean mShouldShowMicButtonWhenUnfocused;
...@@ -67,8 +62,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -67,8 +62,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
protected StatusCoordinator mStatusCoordinator; protected StatusCoordinator mStatusCoordinator;
private WindowAndroid mWindowAndroid;
private boolean mUrlFocusChangeInProgress; private boolean mUrlFocusChangeInProgress;
protected boolean mNativeInitialized; protected boolean mNativeInitialized;
private boolean mUrlHasFocus; private boolean mUrlHasFocus;
...@@ -80,8 +73,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -80,8 +73,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
protected float mUrlFocusChangeFraction; protected float mUrlFocusChangeFraction;
protected LinearLayout mUrlActionContainer; protected LinearLayout mUrlActionContainer;
private VoiceRecognitionHandler mVoiceRecognitionHandler;
protected CompositeTouchDelegate mCompositeTouchDelegate; protected CompositeTouchDelegate mCompositeTouchDelegate;
public LocationBarLayout(Context context, AttributeSet attrs) { public LocationBarLayout(Context context, AttributeSet attrs) {
...@@ -141,21 +132,15 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -141,21 +132,15 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
* @param urlCoordinator The coordinator for interacting with the url bar. * @param urlCoordinator The coordinator for interacting with the url bar.
* @param statusCoordinator The coordinator for interacting with the status icon. * @param statusCoordinator The coordinator for interacting with the status icon.
* @param locationBarDataProvider Provider of LocationBar data, e.g. url and title. * @param locationBarDataProvider Provider of LocationBar data, e.g. url and title.
* @param windowDelegate {@link WindowDelegate} that will provide {@link Window} related info.
* @param windowAndroid {@link WindowAndroid} that is used by the owning {@link Activity}.
*/ */
@CallSuper @CallSuper
public void initialize(@NonNull AutocompleteCoordinator autocompleteCoordinator, public void initialize(@NonNull AutocompleteCoordinator autocompleteCoordinator,
@NonNull UrlBarCoordinator urlCoordinator, @NonNull StatusCoordinator statusCoordinator, @NonNull UrlBarCoordinator urlCoordinator, @NonNull StatusCoordinator statusCoordinator,
@NonNull LocationBarDataProvider locationBarDataProvider, @NonNull LocationBarDataProvider locationBarDataProvider) {
@NonNull WindowDelegate windowDelegate, @NonNull WindowAndroid windowAndroid,
@NonNull VoiceRecognitionHandler voiceRecognitionHandler) {
mAutocompleteCoordinator = autocompleteCoordinator; mAutocompleteCoordinator = autocompleteCoordinator;
mUrlCoordinator = urlCoordinator; mUrlCoordinator = urlCoordinator;
mStatusCoordinator = statusCoordinator; mStatusCoordinator = statusCoordinator;
mWindowAndroid = windowAndroid;
mLocationBarDataProvider = locationBarDataProvider; mLocationBarDataProvider = locationBarDataProvider;
mVoiceRecognitionHandler = voiceRecognitionHandler;
updateButtonVisibility(); updateButtonVisibility();
updateShouldAnimateIconChanges(); updateShouldAnimateIconChanges();
...@@ -172,10 +157,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -172,10 +157,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
public void onFinishNativeInitialization() { public void onFinishNativeInitialization() {
mNativeInitialized = true; mNativeInitialized = true;
updateMicButtonState();
mDeleteButton.setOnClickListener(this);
mMicButton.setOnClickListener(this);
for (Runnable deferredRunnable : mDeferredNativeRunnables) { for (Runnable deferredRunnable : mDeferredNativeRunnables) {
post(deferredRunnable); post(deferredRunnable);
} }
...@@ -236,21 +217,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -236,21 +217,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
// When we restore tabs, we focus the selected tab so the URL of the page shows. // When we restore tabs, we focus the selected tab so the URL of the page shows.
} }
@Override
public void onClick(View v) {
if (v == mDeleteButton) {
setUrlBarTextEmpty();
updateButtonVisibility();
RecordUserAction.record("MobileOmniboxDeleteUrl");
return;
} else if (v == mMicButton) {
RecordUserAction.record("MobileOmniboxVoiceSearch");
mVoiceRecognitionHandler.startVoiceRecognition(
VoiceRecognitionHandler.VoiceInteractionSource.OMNIBOX);
}
}
/* package */ boolean isUrlBarFocused() { /* package */ boolean isUrlBarFocused() {
return mUrlHasFocus; return mUrlHasFocus;
} }
...@@ -259,10 +225,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -259,10 +225,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
return mUrlFocusedWithoutAnimations; return mUrlFocusedWithoutAnimations;
} }
protected VoiceRecognitionHandler getVoiceRecognitionHandler() {
return mVoiceRecognitionHandler;
}
/* package */ void addUrlFocusChangeListener(UrlFocusChangeListener listener) { /* package */ void addUrlFocusChangeListener(UrlFocusChangeListener listener) {
mUrlFocusChangeListeners.addObserver(listener); mUrlFocusChangeListeners.addObserver(listener);
} }
...@@ -271,12 +233,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -271,12 +233,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
mUrlFocusChangeListeners.removeObserver(listener); mUrlFocusChangeListeners.removeObserver(listener);
} }
@Override
protected void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
if (visibility == View.VISIBLE) updateMicButtonState();
}
protected void onNtpStartedLoading() {} protected void onNtpStartedLoading() {}
public View getContainerView() { public View getContainerView() {
...@@ -287,20 +243,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -287,20 +243,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
return mStatusCoordinator.getSecurityIconView(); return mStatusCoordinator.getSecurityIconView();
} }
protected WindowAndroid getWindowAndroid() {
return mWindowAndroid;
}
/**
* Call to notify the location bar that the state of the voice search microphone button may
* need to be updated.
*/
/* package */ void updateMicButtonState() {
mVoiceSearchEnabled =
mVoiceRecognitionHandler != null && mVoiceRecognitionHandler.isVoiceSearchEnabled();
updateButtonVisibility();
}
@CallSuper @CallSuper
protected void setUrlFocusChangeFraction(float fraction) { protected void setUrlFocusChangeFraction(float fraction) {
mUrlFocusChangeFraction = fraction; mUrlFocusChangeFraction = fraction;
...@@ -645,11 +587,10 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -645,11 +587,10 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
updateShouldAnimateIconChanges(); updateShouldAnimateIconChanges();
} }
/* package */ void setVoiceSearchEnabled(boolean isEnabled) {
mVoiceSearchEnabled = isEnabled;
}
/** Update the status visibility according to the current state held in LocationBar. */ /** Update the status visibility according to the current state held in LocationBar. */
/* package */ void updateStatusVisibility() {} /* package */ void updateStatusVisibility() {}
public void setVoiceRecognitionHandlerForTesting(
VoiceRecognitionHandler voiceRecognitionHandler) {
mVoiceRecognitionHandler = voiceRecognitionHandler;
}
} }
...@@ -85,6 +85,7 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -85,6 +85,7 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
private TemplateUrl mSearchEngine; private TemplateUrl mSearchEngine;
private final Context mContext; private final Context mContext;
private final BackKeyBehaviorDelegate mBackKeyBehavior; private final BackKeyBehaviorDelegate mBackKeyBehavior;
private final WindowAndroid mWindowAndroid;
private String mOriginalUrl = ""; private String mOriginalUrl = "";
private boolean mNativeInitialized; private boolean mNativeInitialized;
...@@ -97,7 +98,8 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -97,7 +98,8 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
@NonNull OverrideUrlLoadingDelegate overrideUrlLoadingDelegate, @NonNull OverrideUrlLoadingDelegate overrideUrlLoadingDelegate,
@NonNull LocaleManager localeManager, @NonNull LocaleManager localeManager,
@NonNull OneshotSupplier<TemplateUrlService> templateUrlServiceSupplier, @NonNull OneshotSupplier<TemplateUrlService> templateUrlServiceSupplier,
@NonNull BackKeyBehaviorDelegate backKeyBehavior) { @NonNull BackKeyBehaviorDelegate backKeyBehavior,
@NonNull WindowAndroid windowAndroid) {
mContext = context; mContext = context;
mLocationBarLayout = locationBarLayout; mLocationBarLayout = locationBarLayout;
mLocationBarDataProvider = locationBarDataProvider; mLocationBarDataProvider = locationBarDataProvider;
...@@ -111,6 +113,7 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -111,6 +113,7 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
mPrivacyPreferencesManager = privacyPreferencesManager; mPrivacyPreferencesManager = privacyPreferencesManager;
mTemplateUrlServiceSupplier = templateUrlServiceSupplier; mTemplateUrlServiceSupplier = templateUrlServiceSupplier;
mBackKeyBehavior = backKeyBehavior; mBackKeyBehavior = backKeyBehavior;
mWindowAndroid = windowAndroid;
} }
/** /**
...@@ -174,6 +177,7 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -174,6 +177,7 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
mLocationBarLayout.post(deferredRunnable); mLocationBarLayout.post(deferredRunnable);
} }
mDeferredNativeRunnables.clear(); mDeferredNativeRunnables.clear();
updateMicButtonState();
} }
/*package */ void setUrlFocusChangeFraction(float fraction) { /*package */ void setUrlFocusChangeFraction(float fraction) {
...@@ -187,7 +191,6 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -187,7 +191,6 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
/* package */ void setVoiceRecognitionHandlerForTesting( /* package */ void setVoiceRecognitionHandlerForTesting(
VoiceRecognitionHandler voiceRecognitionHandler) { VoiceRecognitionHandler voiceRecognitionHandler) {
mVoiceRecognitionHandler = voiceRecognitionHandler; mVoiceRecognitionHandler = voiceRecognitionHandler;
mLocationBarLayout.setVoiceRecognitionHandlerForTesting(voiceRecognitionHandler);
} }
/* package */ void setAssistantVoiceSearchServiceForTesting( /* package */ void setAssistantVoiceSearchServiceForTesting(
...@@ -382,6 +385,20 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -382,6 +385,20 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
urlBarData, UrlBar.ScrollType.SCROLL_TO_TLD, SelectionState.SELECT_ALL); urlBarData, UrlBar.ScrollType.SCROLL_TO_TLD, SelectionState.SELECT_ALL);
} }
/* package */ void deleteButtonClicked(View view) {
if (!mNativeInitialized) return;
RecordUserAction.record("MobileOmniboxDeleteUrl");
mLocationBarLayout.setUrlBarTextEmpty();
updateButtonVisibility();
}
/* package */ void micButtonClicked(View view) {
if (!mNativeInitialized) return;
RecordUserAction.record("MobileOmniboxVoiceSearch");
mVoiceRecognitionHandler.startVoiceRecognition(
VoiceRecognitionHandler.VoiceInteractionSource.OMNIBOX);
}
// Private methods // Private methods
private void setProfile(Profile profile) { private void setProfile(Profile profile) {
...@@ -460,7 +477,7 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -460,7 +477,7 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
@Override @Override
public void onIncognitoStateChanged() { public void onIncognitoStateChanged() {
mLocationBarLayout.updateMicButtonState(); updateMicButtonState();
} }
@Override @Override
...@@ -591,7 +608,9 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -591,7 +608,9 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
@Override @Override
public void updateMicButtonState() { public void updateMicButtonState() {
mLocationBarLayout.updateMicButtonState(); mLocationBarLayout.setVoiceSearchEnabled(mVoiceRecognitionHandler != null
&& mVoiceRecognitionHandler.isVoiceSearchEnabled());
updateButtonVisibility();
} }
@Override @Override
...@@ -620,12 +639,12 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -620,12 +639,12 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
@Override @Override
public AutocompleteCoordinator getAutocompleteCoordinator() { public AutocompleteCoordinator getAutocompleteCoordinator() {
return mLocationBarLayout.getAutocompleteCoordinator(); return mAutocompleteCoordinator;
} }
@Override @Override
public WindowAndroid getWindowAndroid() { public WindowAndroid getWindowAndroid() {
return mLocationBarLayout.getWindowAndroid(); return mWindowAndroid;
} }
// UrlBarDelegate implementation. // UrlBarDelegate implementation.
......
...@@ -17,16 +17,13 @@ import android.view.View; ...@@ -17,16 +17,13 @@ import android.view.View;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.WindowDelegate;
import org.chromium.chrome.browser.download.DownloadUtils; import org.chromium.chrome.browser.download.DownloadUtils;
import org.chromium.chrome.browser.omnibox.status.StatusCoordinator; import org.chromium.chrome.browser.omnibox.status.StatusCoordinator;
import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator; import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator;
import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.toolbar.top.ToolbarTablet; import org.chromium.chrome.browser.toolbar.top.ToolbarTablet;
import org.chromium.components.browser_ui.widget.animation.CancelAwareAnimatorListener; import org.chromium.components.browser_ui.widget.animation.CancelAwareAnimatorListener;
import org.chromium.ui.base.LocalizationUtils; import org.chromium.ui.base.LocalizationUtils;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.interpolators.BakedBezierInterpolator; import org.chromium.ui.interpolators.BakedBezierInterpolator;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -115,11 +112,9 @@ class LocationBarTablet extends LocationBarLayout { ...@@ -115,11 +112,9 @@ class LocationBarTablet extends LocationBarLayout {
@Override @Override
public void initialize(@NonNull AutocompleteCoordinator autocompleteCoordinator, public void initialize(@NonNull AutocompleteCoordinator autocompleteCoordinator,
@NonNull UrlBarCoordinator urlCoordinator, @NonNull StatusCoordinator statusCoordinator, @NonNull UrlBarCoordinator urlCoordinator, @NonNull StatusCoordinator statusCoordinator,
@NonNull LocationBarDataProvider locationBarDataProvider, @NonNull LocationBarDataProvider locationBarDataProvider) {
@NonNull WindowDelegate windowDelegate, @NonNull WindowAndroid windowAndroid,
@NonNull VoiceRecognitionHandler voiceRecognitionHandler) {
super.initialize(autocompleteCoordinator, urlCoordinator, statusCoordinator, super.initialize(autocompleteCoordinator, urlCoordinator, statusCoordinator,
locationBarDataProvider, windowDelegate, windowAndroid, voiceRecognitionHandler); locationBarDataProvider);
mStatusCoordinator.setShowIconsWhenUrlFocused(true); mStatusCoordinator.setShowIconsWhenUrlFocused(true);
if (SearchEngineLogoUtils.shouldShowSearchEngineLogo( if (SearchEngineLogoUtils.shouldShowSearchEngineLogo(
mLocationBarDataProvider.isIncognito())) { mLocationBarDataProvider.isIncognito())) {
......
...@@ -188,7 +188,7 @@ public class UrlBarCoordinator implements UrlBarEditingTextStateProvider, UrlFoc ...@@ -188,7 +188,7 @@ public class UrlBarCoordinator implements UrlBarEditingTextStateProvider, UrlFoc
* @param shouldDelayHiding When true, keyboard hide operation will be delayed slightly to * @param shouldDelayHiding When true, keyboard hide operation will be delayed slightly to
* improve the animation smoothness. * improve the animation smoothness.
*/ */
/* package */ void setKeyboardVisibility(boolean showKeyboard, boolean shouldDelayHiding) { public void setKeyboardVisibility(boolean showKeyboard, boolean shouldDelayHiding) {
// Cancel pending jobs to prevent any possibility of keyboard flicker. // Cancel pending jobs to prevent any possibility of keyboard flicker.
mUrlBar.removeCallbacks(mKeyboardHideTask); mUrlBar.removeCallbacks(mKeyboardHideTask);
......
...@@ -35,6 +35,7 @@ import org.chromium.chrome.browser.init.SingleWindowKeyboardVisibilityDelegate; ...@@ -35,6 +35,7 @@ import org.chromium.chrome.browser.init.SingleWindowKeyboardVisibilityDelegate;
import org.chromium.chrome.browser.locale.LocaleManager; import org.chromium.chrome.browser.locale.LocaleManager;
import org.chromium.chrome.browser.omnibox.BackKeyBehaviorDelegate; import org.chromium.chrome.browser.omnibox.BackKeyBehaviorDelegate;
import org.chromium.chrome.browser.omnibox.LocationBarCoordinator; import org.chromium.chrome.browser.omnibox.LocationBarCoordinator;
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.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabBuilder; import org.chromium.chrome.browser.tab.TabBuilder;
...@@ -309,7 +310,9 @@ public class SearchActivity ...@@ -309,7 +310,9 @@ public class SearchActivity
// will navigate to Tabbed mode. Investigate whether this can inflate // will navigate to Tabbed mode. Investigate whether this can inflate
// the tabbed mode layout in the background instead of CCTs. // the tabbed mode layout in the background instead of CCTs.
CustomTabsConnection.getInstance().warmup(0); CustomTabsConnection.getInstance().warmup(0);
mSearchBox.onDeferredStartup(isVoiceSearchIntent()); VoiceRecognitionHandler voiceRecognitionHandler =
mLocationBarCoordinator.getVoiceRecognitionHandler();
mSearchBox.onDeferredStartup(isVoiceSearchIntent(), voiceRecognitionHandler);
RecordUserAction.record("SearchWidget.WidgetSelected"); RecordUserAction.record("SearchWidget.WidgetSelected");
getActivityDelegate().onFinishDeferredInitialization(); getActivityDelegate().onFinishDeferredInitialization();
...@@ -342,7 +345,8 @@ public class SearchActivity ...@@ -342,7 +345,8 @@ public class SearchActivity
} }
private void beginQuery() { private void beginQuery() {
mSearchBox.beginQuery(isVoiceSearchIntent(), getOptionalIntentQuery()); mSearchBox.beginQuery(isVoiceSearchIntent(), getOptionalIntentQuery(),
mLocationBarCoordinator.getVoiceRecognitionHandler());
} }
@Override @Override
......
...@@ -5,15 +5,15 @@ ...@@ -5,15 +5,15 @@
package org.chromium.chrome.browser.searchwidget; package org.chromium.chrome.browser.searchwidget;
import android.content.Context; import android.content.Context;
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.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
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.LocationBarDataProvider;
import org.chromium.chrome.browser.omnibox.LocationBarLayout; import org.chromium.chrome.browser.omnibox.LocationBarLayout;
...@@ -25,7 +25,6 @@ import org.chromium.chrome.browser.omnibox.status.StatusCoordinator; ...@@ -25,7 +25,6 @@ import org.chromium.chrome.browser.omnibox.status.StatusCoordinator;
import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator; 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.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 {
...@@ -44,11 +43,9 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout { ...@@ -44,11 +43,9 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout {
@Override @Override
public void initialize(@NonNull AutocompleteCoordinator autocompleteCoordinator, public void initialize(@NonNull AutocompleteCoordinator autocompleteCoordinator,
@NonNull UrlBarCoordinator urlCoordinator, @NonNull StatusCoordinator statusCoordinator, @NonNull UrlBarCoordinator urlCoordinator, @NonNull StatusCoordinator statusCoordinator,
@NonNull LocationBarDataProvider locationBarDataProvider, @NonNull LocationBarDataProvider locationBarDataProvider) {
@NonNull WindowDelegate windowDelegate, @NonNull WindowAndroid windowAndroid,
@NonNull VoiceRecognitionHandler voiceRecognitionHandler) {
super.initialize(autocompleteCoordinator, urlCoordinator, statusCoordinator, super.initialize(autocompleteCoordinator, urlCoordinator, statusCoordinator,
locationBarDataProvider, windowDelegate, windowAndroid, voiceRecognitionHandler); locationBarDataProvider);
mPendingSearchPromoDecision = LocaleManager.getInstance().needToCheckForSearchEnginePromo(); mPendingSearchPromoDecision = LocaleManager.getInstance().needToCheckForSearchEnginePromo();
getAutocompleteCoordinator().setShouldPreventOmniboxAutocomplete( getAutocompleteCoordinator().setShouldPreventOmniboxAutocomplete(
mPendingSearchPromoDecision); mPendingSearchPromoDecision);
...@@ -64,11 +61,12 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout { ...@@ -64,11 +61,12 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout {
} }
/** Called when the SearchActivity has finished initialization. */ /** Called when the SearchActivity has finished initialization. */
void onDeferredStartup(boolean isVoiceSearchIntent) { void onDeferredStartup(
boolean isVoiceSearchIntent, @NonNull VoiceRecognitionHandler voiceRecognitionHandler) {
getAutocompleteCoordinator().prefetchZeroSuggestResults(); getAutocompleteCoordinator().prefetchZeroSuggestResults();
SearchWidgetProvider.updateCachedVoiceSearchAvailability( SearchWidgetProvider.updateCachedVoiceSearchAvailability(
getVoiceRecognitionHandler().isVoiceSearchEnabled()); voiceRecognitionHandler.isVoiceSearchEnabled());
if (isVoiceSearchIntent && mUrlBar.isFocused()) onUrlFocusChange(true); if (isVoiceSearchIntent && mUrlBar.isFocused()) onUrlFocusChange(true);
assert !LocaleManager.getInstance().needToCheckForSearchEnginePromo(); assert !LocaleManager.getInstance().needToCheckForSearchEnginePromo();
...@@ -82,7 +80,7 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout { ...@@ -82,7 +80,7 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout {
} }
if (mPendingBeginQuery) { if (mPendingBeginQuery) {
beginQueryInternal(isVoiceSearchIntent); beginQueryInternal(isVoiceSearchIntent, voiceRecognitionHandler);
mPendingBeginQuery = false; mPendingBeginQuery = false;
} }
} }
...@@ -93,7 +91,8 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout { ...@@ -93,7 +91,8 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout {
* @param optionalText Prepopulate with a query, this may be null. * @param optionalText Prepopulate with a query, this may be null.
*/ */
@VisibleForTesting @VisibleForTesting
public void beginQuery(boolean isVoiceSearchIntent, @Nullable String optionalText) { public void beginQuery(boolean isVoiceSearchIntent, @Nullable String optionalText,
@NonNull VoiceRecognitionHandler voiceRecognitionHandler) {
// Clear the text regardless of the promo decision. This allows the user to enter text // Clear the text regardless of the promo decision. This allows the user to enter text
// before native has been initialized and have it not be cleared one the delayed beginQuery // before native has been initialized and have it not be cleared one the delayed beginQuery
// logic is performed. // logic is performed.
...@@ -106,15 +105,16 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout { ...@@ -106,15 +105,16 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout {
return; return;
} }
beginQueryInternal(isVoiceSearchIntent); beginQueryInternal(isVoiceSearchIntent, voiceRecognitionHandler);
} }
private void beginQueryInternal(boolean isVoiceSearchIntent) { private void beginQueryInternal(
boolean isVoiceSearchIntent, @NonNull VoiceRecognitionHandler voiceRecognitionHandler) {
assert !mPendingSearchPromoDecision; assert !mPendingSearchPromoDecision;
assert !isVoiceSearchIntent || mNativeInitialized; assert !isVoiceSearchIntent || mNativeInitialized;
if (getVoiceRecognitionHandler().isVoiceSearchEnabled() && isVoiceSearchIntent) { if (voiceRecognitionHandler.isVoiceSearchEnabled() && isVoiceSearchIntent) {
getVoiceRecognitionHandler().startVoiceRecognition( voiceRecognitionHandler.startVoiceRecognition(
VoiceRecognitionHandler.VoiceInteractionSource.SEARCH_WIDGET); VoiceRecognitionHandler.VoiceInteractionSource.SEARCH_WIDGET);
} else { } else {
focusTextBox(); focusTextBox();
...@@ -141,12 +141,7 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout { ...@@ -141,12 +141,7 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout {
mUrlBarFocusRequested |= !mUrlBar.hasFocus(); mUrlBarFocusRequested |= !mUrlBar.hasFocus();
ensureUrlBarFocusedAndTriggerZeroSuggest(); ensureUrlBarFocusedAndTriggerZeroSuggest();
new Handler().post(new Runnable() { mUrlCoordinator.setKeyboardVisibility(true, false);
@Override
public void run() {
getWindowAndroid().getKeyboardDelegate().showKeyboard(mUrlBar);
}
});
} }
@Override @Override
......
...@@ -257,8 +257,11 @@ public class SearchActivityTest { ...@@ -257,8 +257,11 @@ public class SearchActivityTest {
final SearchActivityLocationBarLayout locationBar = final SearchActivityLocationBarLayout locationBar =
(SearchActivityLocationBarLayout) searchActivity.findViewById( (SearchActivityLocationBarLayout) searchActivity.findViewById(
R.id.search_location_bar); R.id.search_location_bar);
locationBar.setVoiceRecognitionHandlerForTesting(mHandler);
locationBar.beginQuery(/* isVoiceSearchIntent= */ true, /* optionalText= */ null); LocationBarCoordinator locationBarCoordinator =
searchActivity.getLocationBarCoordinatorForTesting();
locationBarCoordinator.setVoiceRecognitionHandlerForTesting(mHandler);
locationBar.beginQuery(/* isVoiceSearchIntent= */ true, /* optionalText= */ null, mHandler);
verify(mHandler, times(0)) verify(mHandler, times(0))
.startVoiceRecognition( .startVoiceRecognition(
VoiceRecognitionHandler.VoiceInteractionSource.SEARCH_WIDGET); VoiceRecognitionHandler.VoiceInteractionSource.SEARCH_WIDGET);
......
...@@ -70,6 +70,7 @@ import org.chromium.components.search_engines.TemplateUrl; ...@@ -70,6 +70,7 @@ import org.chromium.components.search_engines.TemplateUrl;
import org.chromium.components.search_engines.TemplateUrlService; import org.chromium.components.search_engines.TemplateUrlService;
import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.ui.base.PageTransition; import org.chromium.ui.base.PageTransition;
import org.chromium.ui.base.WindowAndroid;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
...@@ -139,6 +140,8 @@ public class LocationBarMediatorTest { ...@@ -139,6 +140,8 @@ public class LocationBarMediatorTest {
private TemplateUrl mNonGoogleSearchEngine; private TemplateUrl mNonGoogleSearchEngine;
@Mock @Mock
private BackKeyBehaviorDelegate mOverrideBackKeyBehaviorDelegate; private BackKeyBehaviorDelegate mOverrideBackKeyBehaviorDelegate;
@Mock
private WindowAndroid mWindowAndroid;
@Captor @Captor
private ArgumentCaptor<Runnable> mRunnableCaptor; private ArgumentCaptor<Runnable> mRunnableCaptor;
...@@ -154,11 +157,10 @@ public class LocationBarMediatorTest { ...@@ -154,11 +157,10 @@ public class LocationBarMediatorTest {
mJniMocker.mock(ProfileJni.TEST_HOOKS, mProfileNativesJniMock); mJniMocker.mock(ProfileJni.TEST_HOOKS, mProfileNativesJniMock);
mJniMocker.mock(OmniboxPrerenderJni.TEST_HOOKS, mPrerenderJni); mJniMocker.mock(OmniboxPrerenderJni.TEST_HOOKS, mPrerenderJni);
SearchEngineLogoUtils.setDelegateForTesting(mSearchEngineDelegate); SearchEngineLogoUtils.setDelegateForTesting(mSearchEngineDelegate);
mMediator = new LocationBarMediator(/* context= */ RuntimeEnvironment.application, mMediator = new LocationBarMediator(/* context= */ RuntimeEnvironment.application,
mLocationBarLayout, mLocationBarDataProvider, mProfileSupplier, mLocationBarLayout, mLocationBarDataProvider, mProfileSupplier,
mPrivacyPreferencesManager, mOverrideUrlLoadingDelegate, mLocaleManager, mPrivacyPreferencesManager, mOverrideUrlLoadingDelegate, mLocaleManager,
mTemplateUrlServiceSupplier, mOverrideBackKeyBehaviorDelegate); mTemplateUrlServiceSupplier, mOverrideBackKeyBehaviorDelegate, mWindowAndroid);
mMediator.setCoordinators(mUrlCoordinator, mAutocompleteCoordinator, mStatusCoordinator); mMediator.setCoordinators(mUrlCoordinator, mAutocompleteCoordinator, mStatusCoordinator);
SearchEngineLogoUtils.setDelegateForTesting(mSearchEngineDelegate); SearchEngineLogoUtils.setDelegateForTesting(mSearchEngineDelegate);
} }
......
...@@ -371,7 +371,7 @@ public class WindowAndroid implements AndroidPermissionDelegate, DisplayAndroidO ...@@ -371,7 +371,7 @@ public class WindowAndroid implements AndroidPermissionDelegate, DisplayAndroidO
*/ */
@CalledByNative @CalledByNative
@Override @Override
public final boolean hasPermission(String permission) { public boolean hasPermission(String permission) {
if (mPermissionDelegate != null) return mPermissionDelegate.hasPermission(permission); if (mPermissionDelegate != null) return mPermissionDelegate.hasPermission(permission);
return ApiCompatibilityUtils.checkPermission(ContextUtils.getApplicationContext(), return ApiCompatibilityUtils.checkPermission(ContextUtils.getApplicationContext(),
...@@ -393,7 +393,7 @@ public class WindowAndroid implements AndroidPermissionDelegate, DisplayAndroidO ...@@ -393,7 +393,7 @@ public class WindowAndroid implements AndroidPermissionDelegate, DisplayAndroidO
*/ */
@CalledByNative @CalledByNative
@Override @Override
public final boolean canRequestPermission(String permission) { public boolean canRequestPermission(String permission) {
if (mPermissionDelegate != null) { if (mPermissionDelegate != null) {
return mPermissionDelegate.canRequestPermission(permission); return mPermissionDelegate.canRequestPermission(permission);
} }
...@@ -412,7 +412,7 @@ public class WindowAndroid implements AndroidPermissionDelegate, DisplayAndroidO ...@@ -412,7 +412,7 @@ public class WindowAndroid implements AndroidPermissionDelegate, DisplayAndroidO
* @return Whether the permission is revoked by policy and the user has no ability to change it. * @return Whether the permission is revoked by policy and the user has no ability to change it.
*/ */
@Override @Override
public final boolean isPermissionRevokedByPolicy(String permission) { public boolean isPermissionRevokedByPolicy(String permission) {
if (mPermissionDelegate != null) { if (mPermissionDelegate != null) {
return mPermissionDelegate.isPermissionRevokedByPolicy(permission); return mPermissionDelegate.isPermissionRevokedByPolicy(permission);
} }
...@@ -430,7 +430,7 @@ public class WindowAndroid implements AndroidPermissionDelegate, DisplayAndroidO ...@@ -430,7 +430,7 @@ public class WindowAndroid implements AndroidPermissionDelegate, DisplayAndroidO
* @param callback The callback to be notified whether the permissions were granted. * @param callback The callback to be notified whether the permissions were granted.
*/ */
@Override @Override
public final void requestPermissions(String[] permissions, PermissionCallback callback) { public void requestPermissions(String[] permissions, PermissionCallback callback) {
if (mPermissionDelegate != null) { if (mPermissionDelegate != null) {
mPermissionDelegate.requestPermissions(permissions, callback); mPermissionDelegate.requestPermissions(permissions, callback);
return; return;
......
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