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
private View mAutocompleteAnchorView;
private LocationBarMediator mLocationBarMediator;
private View mUrlBar;
private View mDeleteButton;
private View mMicButton;
private final OneshotSupplierImpl<TemplateUrlService> mTemplateUrlServiceSupplier =
new OneshotSupplierImpl<>();
private CallbackController mCallbackController = new CallbackController();
......@@ -124,7 +126,8 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse
mLocationBarMediator = new LocationBarMediator(mLocationBarLayout.getContext(),
mLocationBarLayout, locationBarDataProvider, profileObservableSupplier,
PrivacyPreferencesManagerImpl.getInstance(), overrideUrlLoadingDelegate,
LocaleManager.getInstance(), mTemplateUrlServiceSupplier, backKeyBehavior);
LocaleManager.getInstance(), mTemplateUrlServiceSupplier, backKeyBehavior,
windowAndroid);
mUrlCoordinator =
new UrlBarCoordinator((UrlBar) mUrlBar, windowDelegate, actionModeCallback,
mCallbackController.makeCancelable(mLocationBarMediator::onUrlFocusChange),
......@@ -139,6 +142,11 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse
mUrlCoordinator, mAutocompleteCoordinator, mStatusCoordinator);
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);
// 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
mLocationBarLayout.addUrlFocusChangeListener(mAutocompleteCoordinator);
mLocationBarLayout.addUrlFocusChangeListener(mUrlCoordinator);
mLocationBarLayout.initialize(mAutocompleteCoordinator, mUrlCoordinator, mStatusCoordinator,
locationBarDataProvider, windowDelegate, windowAndroid,
mLocationBarMediator.getVoiceRecognitionHandler());
locationBarDataProvider);
if (locationBarLayout instanceof LocationBarPhone) {
mSubCoordinator = new LocationBarCoordinatorPhone(
......@@ -175,6 +182,10 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse
}
mUrlBar.setOnKeyListener(null);
mUrlBar = null;
mDeleteButton.setOnClickListener(null);
mDeleteButton = null;
mMicButton.setOnClickListener(null);
mMicButton = null;
mUrlCoordinator.destroy();
mUrlCoordinator = null;
mLocationBarLayout.getContext().unregisterComponentCallbacks(mLocationBarMediator);
......
......@@ -13,7 +13,6 @@ import android.util.AttributeSet;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.FrameLayout;
......@@ -29,18 +28,15 @@ import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.ObserverList;
import org.chromium.base.metrics.RecordUserAction;
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.UrlBarCoordinator.SelectionState;
import org.chromium.chrome.browser.omnibox.geo.GeolocationHeader;
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.voice.VoiceRecognitionHandler;
import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
import org.chromium.chrome.browser.util.ChromeAccessibilityUtil;
import org.chromium.components.browser_ui.widget.CompositeTouchDelegate;
import org.chromium.ui.base.WindowAndroid;
import java.util.ArrayList;
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
* search terms.
*/
public class LocationBarLayout extends FrameLayout implements OnClickListener {
public class LocationBarLayout extends FrameLayout {
protected ImageButton mDeleteButton;
protected ImageButton mMicButton;
private boolean mShouldShowMicButtonWhenUnfocused;
......@@ -67,8 +62,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
protected StatusCoordinator mStatusCoordinator;
private WindowAndroid mWindowAndroid;
private boolean mUrlFocusChangeInProgress;
protected boolean mNativeInitialized;
private boolean mUrlHasFocus;
......@@ -80,8 +73,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
protected float mUrlFocusChangeFraction;
protected LinearLayout mUrlActionContainer;
private VoiceRecognitionHandler mVoiceRecognitionHandler;
protected CompositeTouchDelegate mCompositeTouchDelegate;
public LocationBarLayout(Context context, AttributeSet attrs) {
......@@ -141,21 +132,15 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
* @param urlCoordinator The coordinator for interacting with the url bar.
* @param statusCoordinator The coordinator for interacting with the status icon.
* @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
public void initialize(@NonNull AutocompleteCoordinator autocompleteCoordinator,
@NonNull UrlBarCoordinator urlCoordinator, @NonNull StatusCoordinator statusCoordinator,
@NonNull LocationBarDataProvider locationBarDataProvider,
@NonNull WindowDelegate windowDelegate, @NonNull WindowAndroid windowAndroid,
@NonNull VoiceRecognitionHandler voiceRecognitionHandler) {
@NonNull LocationBarDataProvider locationBarDataProvider) {
mAutocompleteCoordinator = autocompleteCoordinator;
mUrlCoordinator = urlCoordinator;
mStatusCoordinator = statusCoordinator;
mWindowAndroid = windowAndroid;
mLocationBarDataProvider = locationBarDataProvider;
mVoiceRecognitionHandler = voiceRecognitionHandler;
updateButtonVisibility();
updateShouldAnimateIconChanges();
......@@ -172,10 +157,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
public void onFinishNativeInitialization() {
mNativeInitialized = true;
updateMicButtonState();
mDeleteButton.setOnClickListener(this);
mMicButton.setOnClickListener(this);
for (Runnable deferredRunnable : mDeferredNativeRunnables) {
post(deferredRunnable);
}
......@@ -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.
}
@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() {
return mUrlHasFocus;
}
......@@ -259,10 +225,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
return mUrlFocusedWithoutAnimations;
}
protected VoiceRecognitionHandler getVoiceRecognitionHandler() {
return mVoiceRecognitionHandler;
}
/* package */ void addUrlFocusChangeListener(UrlFocusChangeListener listener) {
mUrlFocusChangeListeners.addObserver(listener);
}
......@@ -271,12 +233,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
mUrlFocusChangeListeners.removeObserver(listener);
}
@Override
protected void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
if (visibility == View.VISIBLE) updateMicButtonState();
}
protected void onNtpStartedLoading() {}
public View getContainerView() {
......@@ -287,20 +243,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
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
protected void setUrlFocusChangeFraction(float fraction) {
mUrlFocusChangeFraction = fraction;
......@@ -645,11 +587,10 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
updateShouldAnimateIconChanges();
}
/* package */ void setVoiceSearchEnabled(boolean isEnabled) {
mVoiceSearchEnabled = isEnabled;
}
/** Update the status visibility according to the current state held in LocationBar. */
/* package */ void updateStatusVisibility() {}
public void setVoiceRecognitionHandlerForTesting(
VoiceRecognitionHandler voiceRecognitionHandler) {
mVoiceRecognitionHandler = voiceRecognitionHandler;
}
}
......@@ -85,6 +85,7 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
private TemplateUrl mSearchEngine;
private final Context mContext;
private final BackKeyBehaviorDelegate mBackKeyBehavior;
private final WindowAndroid mWindowAndroid;
private String mOriginalUrl = "";
private boolean mNativeInitialized;
......@@ -97,7 +98,8 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
@NonNull OverrideUrlLoadingDelegate overrideUrlLoadingDelegate,
@NonNull LocaleManager localeManager,
@NonNull OneshotSupplier<TemplateUrlService> templateUrlServiceSupplier,
@NonNull BackKeyBehaviorDelegate backKeyBehavior) {
@NonNull BackKeyBehaviorDelegate backKeyBehavior,
@NonNull WindowAndroid windowAndroid) {
mContext = context;
mLocationBarLayout = locationBarLayout;
mLocationBarDataProvider = locationBarDataProvider;
......@@ -111,6 +113,7 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
mPrivacyPreferencesManager = privacyPreferencesManager;
mTemplateUrlServiceSupplier = templateUrlServiceSupplier;
mBackKeyBehavior = backKeyBehavior;
mWindowAndroid = windowAndroid;
}
/**
......@@ -174,6 +177,7 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
mLocationBarLayout.post(deferredRunnable);
}
mDeferredNativeRunnables.clear();
updateMicButtonState();
}
/*package */ void setUrlFocusChangeFraction(float fraction) {
......@@ -187,7 +191,6 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
/* package */ void setVoiceRecognitionHandlerForTesting(
VoiceRecognitionHandler voiceRecognitionHandler) {
mVoiceRecognitionHandler = voiceRecognitionHandler;
mLocationBarLayout.setVoiceRecognitionHandlerForTesting(voiceRecognitionHandler);
}
/* package */ void setAssistantVoiceSearchServiceForTesting(
......@@ -382,6 +385,20 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
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 void setProfile(Profile profile) {
......@@ -460,7 +477,7 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
@Override
public void onIncognitoStateChanged() {
mLocationBarLayout.updateMicButtonState();
updateMicButtonState();
}
@Override
......@@ -591,7 +608,9 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
@Override
public void updateMicButtonState() {
mLocationBarLayout.updateMicButtonState();
mLocationBarLayout.setVoiceSearchEnabled(mVoiceRecognitionHandler != null
&& mVoiceRecognitionHandler.isVoiceSearchEnabled());
updateButtonVisibility();
}
@Override
......@@ -620,12 +639,12 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
@Override
public AutocompleteCoordinator getAutocompleteCoordinator() {
return mLocationBarLayout.getAutocompleteCoordinator();
return mAutocompleteCoordinator;
}
@Override
public WindowAndroid getWindowAndroid() {
return mLocationBarLayout.getWindowAndroid();
return mWindowAndroid;
}
// UrlBarDelegate implementation.
......
......@@ -17,16 +17,13 @@ import android.view.View;
import androidx.annotation.NonNull;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.WindowDelegate;
import org.chromium.chrome.browser.download.DownloadUtils;
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.tab.Tab;
import org.chromium.chrome.browser.toolbar.top.ToolbarTablet;
import org.chromium.components.browser_ui.widget.animation.CancelAwareAnimatorListener;
import org.chromium.ui.base.LocalizationUtils;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.interpolators.BakedBezierInterpolator;
import java.util.ArrayList;
......@@ -115,11 +112,9 @@ class LocationBarTablet extends LocationBarLayout {
@Override
public void initialize(@NonNull AutocompleteCoordinator autocompleteCoordinator,
@NonNull UrlBarCoordinator urlCoordinator, @NonNull StatusCoordinator statusCoordinator,
@NonNull LocationBarDataProvider locationBarDataProvider,
@NonNull WindowDelegate windowDelegate, @NonNull WindowAndroid windowAndroid,
@NonNull VoiceRecognitionHandler voiceRecognitionHandler) {
@NonNull LocationBarDataProvider locationBarDataProvider) {
super.initialize(autocompleteCoordinator, urlCoordinator, statusCoordinator,
locationBarDataProvider, windowDelegate, windowAndroid, voiceRecognitionHandler);
locationBarDataProvider);
mStatusCoordinator.setShowIconsWhenUrlFocused(true);
if (SearchEngineLogoUtils.shouldShowSearchEngineLogo(
mLocationBarDataProvider.isIncognito())) {
......
......@@ -188,7 +188,7 @@ public class UrlBarCoordinator implements UrlBarEditingTextStateProvider, UrlFoc
* @param shouldDelayHiding When true, keyboard hide operation will be delayed slightly to
* 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.
mUrlBar.removeCallbacks(mKeyboardHideTask);
......
......@@ -35,6 +35,7 @@ import org.chromium.chrome.browser.init.SingleWindowKeyboardVisibilityDelegate;
import org.chromium.chrome.browser.locale.LocaleManager;
import org.chromium.chrome.browser.omnibox.BackKeyBehaviorDelegate;
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.tab.Tab;
import org.chromium.chrome.browser.tab.TabBuilder;
......@@ -309,7 +310,9 @@ public class SearchActivity
// will navigate to Tabbed mode. Investigate whether this can inflate
// the tabbed mode layout in the background instead of CCTs.
CustomTabsConnection.getInstance().warmup(0);
mSearchBox.onDeferredStartup(isVoiceSearchIntent());
VoiceRecognitionHandler voiceRecognitionHandler =
mLocationBarCoordinator.getVoiceRecognitionHandler();
mSearchBox.onDeferredStartup(isVoiceSearchIntent(), voiceRecognitionHandler);
RecordUserAction.record("SearchWidget.WidgetSelected");
getActivityDelegate().onFinishDeferredInitialization();
......@@ -342,7 +345,8 @@ public class SearchActivity
}
private void beginQuery() {
mSearchBox.beginQuery(isVoiceSearchIntent(), getOptionalIntentQuery());
mSearchBox.beginQuery(isVoiceSearchIntent(), getOptionalIntentQuery(),
mLocationBarCoordinator.getVoiceRecognitionHandler());
}
@Override
......
......@@ -5,15 +5,15 @@
package org.chromium.chrome.browser.searchwidget;
import android.content.Context;
import android.os.Handler;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.WindowDelegate;
import org.chromium.chrome.browser.locale.LocaleManager;
import org.chromium.chrome.browser.omnibox.LocationBarDataProvider;
import org.chromium.chrome.browser.omnibox.LocationBarLayout;
......@@ -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.voice.VoiceRecognitionHandler;
import org.chromium.chrome.browser.toolbar.top.ToolbarPhone;
import org.chromium.ui.base.WindowAndroid;
/** Implementation of the {@link LocationBarLayout} that is displayed for widget searches. */
public class SearchActivityLocationBarLayout extends LocationBarLayout {
......@@ -44,11 +43,9 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout {
@Override
public void initialize(@NonNull AutocompleteCoordinator autocompleteCoordinator,
@NonNull UrlBarCoordinator urlCoordinator, @NonNull StatusCoordinator statusCoordinator,
@NonNull LocationBarDataProvider locationBarDataProvider,
@NonNull WindowDelegate windowDelegate, @NonNull WindowAndroid windowAndroid,
@NonNull VoiceRecognitionHandler voiceRecognitionHandler) {
@NonNull LocationBarDataProvider locationBarDataProvider) {
super.initialize(autocompleteCoordinator, urlCoordinator, statusCoordinator,
locationBarDataProvider, windowDelegate, windowAndroid, voiceRecognitionHandler);
locationBarDataProvider);
mPendingSearchPromoDecision = LocaleManager.getInstance().needToCheckForSearchEnginePromo();
getAutocompleteCoordinator().setShouldPreventOmniboxAutocomplete(
mPendingSearchPromoDecision);
......@@ -64,11 +61,12 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout {
}
/** Called when the SearchActivity has finished initialization. */
void onDeferredStartup(boolean isVoiceSearchIntent) {
void onDeferredStartup(
boolean isVoiceSearchIntent, @NonNull VoiceRecognitionHandler voiceRecognitionHandler) {
getAutocompleteCoordinator().prefetchZeroSuggestResults();
SearchWidgetProvider.updateCachedVoiceSearchAvailability(
getVoiceRecognitionHandler().isVoiceSearchEnabled());
voiceRecognitionHandler.isVoiceSearchEnabled());
if (isVoiceSearchIntent && mUrlBar.isFocused()) onUrlFocusChange(true);
assert !LocaleManager.getInstance().needToCheckForSearchEnginePromo();
......@@ -82,7 +80,7 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout {
}
if (mPendingBeginQuery) {
beginQueryInternal(isVoiceSearchIntent);
beginQueryInternal(isVoiceSearchIntent, voiceRecognitionHandler);
mPendingBeginQuery = false;
}
}
......@@ -93,7 +91,8 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout {
* @param optionalText Prepopulate with a query, this may be null.
*/
@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
// before native has been initialized and have it not be cleared one the delayed beginQuery
// logic is performed.
......@@ -106,15 +105,16 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout {
return;
}
beginQueryInternal(isVoiceSearchIntent);
beginQueryInternal(isVoiceSearchIntent, voiceRecognitionHandler);
}
private void beginQueryInternal(boolean isVoiceSearchIntent) {
private void beginQueryInternal(
boolean isVoiceSearchIntent, @NonNull VoiceRecognitionHandler voiceRecognitionHandler) {
assert !mPendingSearchPromoDecision;
assert !isVoiceSearchIntent || mNativeInitialized;
if (getVoiceRecognitionHandler().isVoiceSearchEnabled() && isVoiceSearchIntent) {
getVoiceRecognitionHandler().startVoiceRecognition(
if (voiceRecognitionHandler.isVoiceSearchEnabled() && isVoiceSearchIntent) {
voiceRecognitionHandler.startVoiceRecognition(
VoiceRecognitionHandler.VoiceInteractionSource.SEARCH_WIDGET);
} else {
focusTextBox();
......@@ -141,12 +141,7 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout {
mUrlBarFocusRequested |= !mUrlBar.hasFocus();
ensureUrlBarFocusedAndTriggerZeroSuggest();
new Handler().post(new Runnable() {
@Override
public void run() {
getWindowAndroid().getKeyboardDelegate().showKeyboard(mUrlBar);
}
});
mUrlCoordinator.setKeyboardVisibility(true, false);
}
@Override
......
......@@ -257,8 +257,11 @@ public class SearchActivityTest {
final SearchActivityLocationBarLayout locationBar =
(SearchActivityLocationBarLayout) searchActivity.findViewById(
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))
.startVoiceRecognition(
VoiceRecognitionHandler.VoiceInteractionSource.SEARCH_WIDGET);
......
......@@ -70,6 +70,7 @@ import org.chromium.components.search_engines.TemplateUrl;
import org.chromium.components.search_engines.TemplateUrlService;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.ui.base.PageTransition;
import org.chromium.ui.base.WindowAndroid;
import java.util.Arrays;
import java.util.Collections;
......@@ -139,6 +140,8 @@ public class LocationBarMediatorTest {
private TemplateUrl mNonGoogleSearchEngine;
@Mock
private BackKeyBehaviorDelegate mOverrideBackKeyBehaviorDelegate;
@Mock
private WindowAndroid mWindowAndroid;
@Captor
private ArgumentCaptor<Runnable> mRunnableCaptor;
......@@ -154,11 +157,10 @@ public class LocationBarMediatorTest {
mJniMocker.mock(ProfileJni.TEST_HOOKS, mProfileNativesJniMock);
mJniMocker.mock(OmniboxPrerenderJni.TEST_HOOKS, mPrerenderJni);
SearchEngineLogoUtils.setDelegateForTesting(mSearchEngineDelegate);
mMediator = new LocationBarMediator(/* context= */ RuntimeEnvironment.application,
mLocationBarLayout, mLocationBarDataProvider, mProfileSupplier,
mPrivacyPreferencesManager, mOverrideUrlLoadingDelegate, mLocaleManager,
mTemplateUrlServiceSupplier, mOverrideBackKeyBehaviorDelegate);
mTemplateUrlServiceSupplier, mOverrideBackKeyBehaviorDelegate, mWindowAndroid);
mMediator.setCoordinators(mUrlCoordinator, mAutocompleteCoordinator, mStatusCoordinator);
SearchEngineLogoUtils.setDelegateForTesting(mSearchEngineDelegate);
}
......
......@@ -371,7 +371,7 @@ public class WindowAndroid implements AndroidPermissionDelegate, DisplayAndroidO
*/
@CalledByNative
@Override
public final boolean hasPermission(String permission) {
public boolean hasPermission(String permission) {
if (mPermissionDelegate != null) return mPermissionDelegate.hasPermission(permission);
return ApiCompatibilityUtils.checkPermission(ContextUtils.getApplicationContext(),
......@@ -393,7 +393,7 @@ public class WindowAndroid implements AndroidPermissionDelegate, DisplayAndroidO
*/
@CalledByNative
@Override
public final boolean canRequestPermission(String permission) {
public boolean canRequestPermission(String permission) {
if (mPermissionDelegate != null) {
return mPermissionDelegate.canRequestPermission(permission);
}
......@@ -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.
*/
@Override
public final boolean isPermissionRevokedByPolicy(String permission) {
public boolean isPermissionRevokedByPolicy(String permission) {
if (mPermissionDelegate != null) {
return mPermissionDelegate.isPermissionRevokedByPolicy(permission);
}
......@@ -430,7 +430,7 @@ public class WindowAndroid implements AndroidPermissionDelegate, DisplayAndroidO
* @param callback The callback to be notified whether the permissions were granted.
*/
@Override
public final void requestPermissions(String[] permissions, PermissionCallback callback) {
public void requestPermissions(String[] permissions, PermissionCallback callback) {
if (mPermissionDelegate != null) {
mPermissionDelegate.requestPermissions(permissions, callback);
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