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

[ToolbarMVC] Move some focus logic into LocationBarMediator

This changes moves dispatchKeyEvent, onConfigurationChanged,
showUrlBarCursorWithoutFocusAnimations, and updateStatusIcon to
LocationBarMediator. To enable this, it adds a getter and setter for
mUrlFocusedWithoutAnimations. Some unused methods are removed. Since
onKey logic has changed structure, unit tests are added for this.

Bug: 1147581, 746660
Change-Id: I4715a156d02b8e9c3a4c63109c0cc521251f5cbd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2585444
Commit-Queue: Patrick Noland <pnoland@chromium.org>
Reviewed-by: default avatarFilip Gorski <fgorski@chromium.org>
Cr-Commit-Position: refs/heads/master@{#836293}
parent e08c48ea
......@@ -157,6 +157,7 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse
mAutocompleteCoordinator.updateSuggestionListLayoutDirection();
}));
mLocationBarLayout.getContext().registerComponentCallbacks(mLocationBarMediator);
mLocationBarLayout.addUrlFocusChangeListener(mAutocompleteCoordinator);
mLocationBarLayout.addUrlFocusChangeListener(mUrlCoordinator);
mLocationBarLayout.initialize(mAutocompleteCoordinator, mUrlCoordinator, mStatusCoordinator,
......@@ -176,6 +177,7 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse
mUrlBar = null;
mUrlCoordinator.destroy();
mUrlCoordinator = null;
mLocationBarLayout.getContext().unregisterComponentCallbacks(mLocationBarMediator);
mLocationBarLayout.removeUrlFocusChangeListener(mAutocompleteCoordinator);
mAutocompleteCoordinator.destroy();
mAutocompleteCoordinator = null;
......
......@@ -6,13 +6,11 @@ package org.chromium.chrome.browser.omnibox;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.graphics.drawable.Drawable;
import android.os.Parcelable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.SparseArray;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
......@@ -44,7 +42,6 @@ import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator;
import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService;
import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler;
import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.util.ChromeAccessibilityUtil;
import org.chromium.components.browser_ui.styles.ChromeColors;
import org.chromium.components.browser_ui.widget.CompositeTouchDelegate;
......@@ -156,29 +153,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
boolean retVal = super.dispatchKeyEvent(event);
if (retVal && mUrlHasFocus && mUrlFocusedWithoutAnimations
&& event.getAction() == KeyEvent.ACTION_DOWN && event.isPrintingKey()
&& event.hasNoModifiers()) {
handleUrlFocusAnimation(mUrlHasFocus);
}
return retVal;
}
@Override
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (mUrlHasFocus && mUrlFocusedWithoutAnimations
&& newConfig.keyboard != Configuration.KEYBOARD_QWERTY) {
// If we lose the hardware keyboard and the focus animations were not run, then the
// user has not typed any text, so we will just clear the focus instead.
setUrlBarFocus(false, null, OmniboxFocusReason.UNFOCUS);
}
}
/**
* Initializes LocationBarLayout with dependencies that aren't immediately available at
* construction time.
......@@ -236,21 +210,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
updateMicButtonVisibility();
}
/** Initiates a prefetch of autocomplete suggestions. */
public void startPrefetch() {
if (!mNativeInitialized) return;
mAutocompleteCoordinator.prefetchZeroSuggestResults();
}
/* package */ void clearOmniboxFocus() {
setUrlBarFocus(false, null, OmniboxFocusReason.UNFOCUS);
}
/* package */ void onUrlTextChanged() {
updateButtonVisibility();
}
/* package */ boolean didFocusUrlFromFakebox() {
return mUrlFocusedFromFakebox;
}
......@@ -259,14 +218,8 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
return mUrlFocusedFromQueryTiles;
}
public void showUrlBarCursorWithoutFocusAnimations() {
if (mUrlHasFocus || mUrlFocusedFromFakebox) return;
mUrlFocusedWithoutAnimations = true;
// This interface should only be called to devices with a hardware keyboard attached as
// described in the LocationBar.
setUrlBarFocus(true, null, OmniboxFocusReason.DEFAULT_WITH_HARDWARE_KEYBOARD);
/* package */ void setIsUrlFocusedWithoutAnimations(boolean isUrlFocusedWithoutAnimations) {
mUrlFocusedWithoutAnimations = isUrlFocusedWithoutAnimations;
}
/**
......@@ -282,15 +235,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
mStatusCoordinator.setLocationBarDataProviderForTesting(locationBarDataProvider);
}
/**
* Updates the security icon displayed in the LocationBar.
*/
public void updateStatusIcon() {
mStatusCoordinator.updateStatusIcon();
// Update the URL in case the scheme change triggers a URL emphasis change.
setUrl(mLocationBarDataProvider.getCurrentUrl());
}
/* package */ void onSuggestionsHidden() {}
/* package */ void onSuggestionsChanged() {
......@@ -329,20 +273,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
setUrl(mLocationBarDataProvider.getCurrentUrl());
}
public void gestureDetected(boolean isLongPress) {
recordOmniboxFocusReason(isLongPress ? OmniboxFocusReason.OMNIBOX_LONG_PRESS
: OmniboxFocusReason.OMNIBOX_TAP);
}
/**
* Update the location bar visuals based on a loading state change.
* @param updateUrl Whether to update the URL as a result of this call.
*/
public void updateLoadingState(boolean updateUrl) {
if (updateUrl) setUrl(mLocationBarDataProvider.getCurrentUrl());
mStatusCoordinator.updateStatusIcon();
}
/* package */ void setUrlBarFocus(
boolean shouldBeFocused, @Nullable String pastedText, @OmniboxFocusReason int reason) {
if (shouldBeFocused) {
......@@ -381,6 +311,10 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
return mUrlHasFocus;
}
/* package */ boolean isUrlBarFocusedWithoutAnimations() {
return mUrlFocusedWithoutAnimations;
}
protected VoiceRecognitionHandler getVoiceRecognitionHandler() {
return mVoiceRecognitionHandler;
}
......@@ -584,14 +518,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
mStatusCoordinator.setShouldAnimateIconChanges(shouldAnimate);
}
/** Focuses the current page. */
private void focusCurrentTab() {
if (mLocationBarDataProvider.hasTab()) {
View view = getCurrentTab().getView();
if (view != null) view.requestFocus();
}
}
/**
* @return Whether the URL focus change is taking place, e.g. a focus animation is running on
* a phone device.
......@@ -862,13 +788,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
return textChanged;
}
/** @return The current active {@link Tab}. */
@Nullable
private Tab getCurrentTab() {
if (mLocationBarDataProvider == null) return null;
return mLocationBarDataProvider.getTab();
}
protected void setUnfocusedWidth(int unfocusedWidth) {
mStatusCoordinator.setUnfocusedLocationBarWidth(unfocusedWidth);
}
......@@ -916,7 +835,7 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
mAutocompleteCoordinator.onTextChanged(textWithoutAutocomplete, textWithAutocomplete);
}
private void recordOmniboxFocusReason(@OmniboxFocusReason int reason) {
/* package */ void recordOmniboxFocusReason(@OmniboxFocusReason int reason) {
RecordHistogram.recordEnumeratedHistogram(
"Android.OmniboxFocusReason", reason, OmniboxFocusReason.NUM_ENTRIES);
}
......
......@@ -4,7 +4,9 @@
package org.chromium.chrome.browser.omnibox;
import android.content.ComponentCallbacks;
import android.content.Context;
import android.content.res.Configuration;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.View;
......@@ -57,7 +59,7 @@ import java.util.List;
class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDelegate,
VoiceRecognitionHandler.Delegate,
AssistantVoiceSearchService.Observer, UrlBarDelegate,
OnKeyListener {
OnKeyListener, ComponentCallbacks {
private final LocationBarLayout mLocationBarLayout;
private VoiceRecognitionHandler mVoiceRecognitionHandler;
private final LocationBarDataProvider mLocationBarDataProvider;
......@@ -170,12 +172,25 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
// This method is only used in CustomTabToolbar.
}
/**
* Update the location bar visuals based on a loading state change.
* @param updateUrl Whether to update the URL as a result of this call.
*/
/*package */ void updateLoadingState(boolean updateUrl) {
mLocationBarLayout.updateLoadingState(updateUrl);
if (updateUrl) mLocationBarLayout.setUrl(mLocationBarDataProvider.getCurrentUrl());
mStatusCoordinator.updateStatusIcon();
}
/*package */ void showUrlBarCursorWithoutFocusAnimations() {
mLocationBarLayout.showUrlBarCursorWithoutFocusAnimations();
if (mLocationBarLayout.isUrlBarFocused() || mLocationBarLayout.didFocusUrlFromFakebox()) {
return;
}
mLocationBarLayout.setIsUrlFocusedWithoutAnimations(true);
// This method should only be called on devices with a hardware keyboard attached, as
// described in the documentation for LocationBar#showUrlBarCursorWithoutFocusAnimations.
setUrlBarFocus(/*shouldBeFocused=*/true, /*pastedText=*/null,
OmniboxFocusReason.DEFAULT_WITH_HARDWARE_KEYBOARD);
}
/*package */ void revertChanges() {
......@@ -194,12 +209,15 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
}
}
/** Updates the security icon displayed in the LocationBar. */
/*package */ void updateStatusIcon() {
mLocationBarLayout.updateStatusIcon();
mStatusCoordinator.updateStatusIcon();
// Update the URL in case the scheme change triggers a URL emphasis change.
mLocationBarLayout.setUrl(mLocationBarDataProvider.getCurrentUrl());
}
/* package */ void onUrlTextChanged() {
mLocationBarLayout.onUrlTextChanged();
updateButtonVisibility();
}
/* package */ void onSuggestionsChanged(String autocompleteText, boolean defaultMatchIsSearch) {
......@@ -399,7 +417,7 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
@Override
public void clearOmniboxFocus() {
mLocationBarLayout.clearOmniboxFocus();
setUrlBarFocus(/*shouldBeFocused=*/false, /*pastedText=*/null, OmniboxFocusReason.UNFOCUS);
}
// AssistantVoiceSearchService.Observer implementation.
......@@ -432,7 +450,8 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
// Ensure the UrlBar has focus before entering text. If the UrlBar is not focused,
// autocomplete text will be updated but the visible text will not.
mLocationBarLayout.setUrlBarFocus(true, null, OmniboxFocusReason.SEARCH_QUERY);
mLocationBarLayout.setUrlBarFocus(
/*shouldBeFocused=*/true, /*pastedText=*/null, OmniboxFocusReason.SEARCH_QUERY);
mLocationBarLayout.setUrlBarText(UrlBarData.forNonUrlText(query),
UrlBar.ScrollType.NO_SCROLL, SelectionState.SELECT_ALL);
mAutocompleteCoordinator.startAutocompleteForQuery(query);
......@@ -477,12 +496,27 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
@Override
public void gestureDetected(boolean isLongPress) {
mLocationBarLayout.gestureDetected(isLongPress);
mLocationBarLayout.recordOmniboxFocusReason(isLongPress
? OmniboxFocusReason.OMNIBOX_LONG_PRESS
: OmniboxFocusReason.OMNIBOX_TAP);
}
// OnKeyListener implementation.
@Override
public boolean onKey(View view, int keyCode, KeyEvent event) {
boolean result = handleKeyEvent(view, keyCode, event);
if (result && mLocationBarLayout.isUrlBarFocused()
&& mLocationBarLayout.isUrlBarFocusedWithoutAnimations()
&& event.getAction() == KeyEvent.ACTION_DOWN && event.isPrintingKey()
&& event.hasNoModifiers()) {
mLocationBarLayout.handleUrlFocusAnimation(/*hasFocus=*/true);
}
return result;
}
private boolean handleKeyEvent(View view, int keyCode, KeyEvent event) {
boolean isRtl = view.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
if (mAutocompleteCoordinator.handleKeyEvent(keyCode, event)) {
return true;
......@@ -513,4 +547,21 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
}
return false;
}
// ComponentCallbacks implementation.
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (mLocationBarLayout.isUrlBarFocused()
&& mLocationBarLayout.isUrlBarFocusedWithoutAnimations()
&& newConfig.keyboard != Configuration.KEYBOARD_QWERTY) {
// If we lose the hardware keyboard and the focus animations were not run, then the
// user has not typed any text, so we will just clear the focus instead.
setUrlBarFocus(
/*shouldBeFocused=*/false, /*pastedText=*/null, OmniboxFocusReason.UNFOCUS);
}
}
@Override
public void onLowMemory() {}
}
......@@ -167,8 +167,14 @@ public class LocationBarLayoutTest {
() -> getLocationBar().setLocationBarDataProviderForTesting(mTestLocationBarModel));
}
private void setUrlToPageUrl(LocationBarLayout locationBar) {
TestThreadUtils.runOnUiThreadBlocking(() -> { getLocationBar().updateLoadingState(true); });
private void setUrlToPageUrl() {
TestThreadUtils.runOnUiThreadBlocking(() -> {
mActivityTestRule.getActivity()
.getToolbarManager()
.getToolbarLayoutForTesting()
.getLocationBar()
.updateLoadingState(true);
});
}
private String getUrlText(UrlBar urlBar) {
......@@ -262,7 +268,7 @@ public class LocationBarLayoutTest {
mTestLocationBarModel.setSecurityLevel(ConnectionSecurityLevel.SECURE);
mTestLocationBarModel.mDisplayText = TRIMMED_URL;
mTestLocationBarModel.mEditingText = VERBOSE_URL;
setUrlToPageUrl(locationBar);
setUrlToPageUrl();
Assert.assertEquals(TRIMMED_URL, getUrlText(urlBar));
......@@ -292,7 +298,7 @@ public class LocationBarLayoutTest {
mTestLocationBarModel.setSecurityLevel(ConnectionSecurityLevel.SECURE);
mTestLocationBarModel.mDisplayText = GOOGLE_SRP_URL;
mTestLocationBarModel.mEditingText = GOOGLE_SRP_URL;
setUrlToPageUrl(locationBar);
setUrlToPageUrl();
onView(withId(R.id.location_bar_status)).check((view, e) -> {
Assert.assertEquals(iconView.getVisibility(), VISIBLE);
......@@ -314,7 +320,7 @@ public class LocationBarLayoutTest {
mTestLocationBarModel.setSecurityLevel(ConnectionSecurityLevel.SECURE);
mTestLocationBarModel.mDisplayText = GOOGLE_SRP_URL;
mTestLocationBarModel.mEditingText = GOOGLE_SRP_URL;
setUrlToPageUrl(locationBar);
setUrlToPageUrl();
setUrlBarTextAndFocus("");
onView(withId(R.id.location_bar_status)).check((view, e) -> {
......@@ -693,7 +699,7 @@ public class LocationBarLayoutTest {
String url, boolean incognito, LocationBarLayout locationBar) {
Tab tab = mActivityTestRule.loadUrlInNewTab(url, incognito);
setupModelsForCurrentTab();
setUrlToPageUrl(locationBar);
setUrlToPageUrl();
TestThreadUtils.runOnUiThreadBlocking(() -> { locationBar.onPrimaryColorChanged(); });
return tab;
}
......
......@@ -7,6 +7,7 @@ package org.chromium.chrome.browser.omnibox;
import static org.mockito.Mockito.doReturn;
import android.content.Intent;
import android.content.res.Configuration;
import androidx.test.filters.MediumTest;
......@@ -183,4 +184,22 @@ public class LocationBarTest {
Assert.assertEquals(TEST_QUERY, mUrlBar.getTextWithoutAutocomplete());
});
}
@Test
@MediumTest
public void testOnConfigurationChanged() {
startActivityNormally();
TestThreadUtils.runOnUiThreadBlocking(() -> {
mLocationBarMediator.showUrlBarCursorWithoutFocusAnimations();
Assert.assertTrue(mLocationBarMediator.isUrlBarFocused());
});
Configuration configuration = mActivity.getSavedConfigurationForTesting();
configuration.keyboard = Configuration.KEYBOARD_12KEY;
TestThreadUtils.runOnUiThreadBlocking(() -> {
mLocationBarMediator.onConfigurationChanged(configuration);
Assert.assertFalse(mLocationBarMediator.isUrlBarFocused());
});
}
}
......@@ -24,8 +24,11 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import android.content.Context;
import android.content.res.Configuration;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.View;
import android.widget.TextView;
import org.junit.Before;
import org.junit.Rule;
......@@ -111,9 +114,13 @@ public class LocationBarMediatorTest {
@Mock
private SearchEngineLogoUtils.Delegate mSearchEngineDelegate;
@Mock
private View mView;
private TextView mView;
@Mock
private OneshotSupplier<TemplateUrlService> mTemplateUrlServiceSupplier;
@Mock
private KeyEvent mKeyEvent;
@Mock
private KeyEvent.DispatcherState mKeyDispatcherState;
@Captor
private ArgumentCaptor<Runnable> mRunnableCaptor;
......@@ -374,6 +381,116 @@ public class LocationBarMediatorTest {
verify(mUrlCoordinator).setKeyboardVisibility(true, false);
}
@Test
public void testOnConfigurationChanged_qwertyKeyboard() {
doReturn(true).when(mLocationBarLayout).isUrlBarFocused();
doReturn(true).when(mLocationBarLayout).isUrlBarFocusedWithoutAnimations();
Configuration newConfig = new Configuration();
newConfig.keyboard = Configuration.KEYBOARD_QWERTY;
mMediator.onConfigurationChanged(newConfig);
verify(mLocationBarLayout, never()).setUrlBarFocus(anyBoolean(), anyString(), anyInt());
}
@Test
public void testOnConfigurationChanged_nonQwertyKeyboard() {
doReturn(false).when(mLocationBarLayout).isUrlBarFocused();
doReturn(false).when(mLocationBarLayout).isUrlBarFocusedWithoutAnimations();
Configuration newConfig = new Configuration();
newConfig.keyboard = Configuration.KEYBOARD_NOKEYS;
mMediator.onConfigurationChanged(newConfig);
verify(mLocationBarLayout, never()).setUrlBarFocus(anyBoolean(), anyString(), anyInt());
doReturn(true).when(mLocationBarLayout).isUrlBarFocused();
mMediator.onConfigurationChanged(newConfig);
verify(mLocationBarLayout, never()).setUrlBarFocus(anyBoolean(), anyString(), anyInt());
doReturn(true).when(mLocationBarLayout).isUrlBarFocusedWithoutAnimations();
mMediator.onConfigurationChanged(newConfig);
verify(mLocationBarLayout).setUrlBarFocus(false, null, OmniboxFocusReason.UNFOCUS);
}
@Test
public void testOnKey_autocompleteHandles() {
doReturn(true)
.when(mAutocompleteCoordinator)
.handleKeyEvent(KeyEvent.KEYCODE_BACK, mKeyEvent);
mMediator.onKey(mView, KeyEvent.KEYCODE_BACK, mKeyEvent);
verify(mAutocompleteCoordinator).handleKeyEvent(KeyEvent.KEYCODE_BACK, mKeyEvent);
}
@Test
public void testOnKey_back() {
doReturn(mKeyDispatcherState).when(mLocationBarLayout).getKeyDispatcherState();
doReturn(KeyEvent.ACTION_DOWN).when(mKeyEvent).getAction();
assertTrue(mMediator.onKey(mView, KeyEvent.KEYCODE_BACK, mKeyEvent));
verify(mKeyDispatcherState).startTracking(mKeyEvent, mMediator);
doReturn(true).when(mKeyEvent).isTracking();
doReturn(KeyEvent.ACTION_UP).when(mKeyEvent).getAction();
assertTrue(mMediator.onKey(mView, KeyEvent.KEYCODE_BACK, mKeyEvent));
verify(mKeyDispatcherState).handleUpEvent(mKeyEvent);
verify(mLocationBarLayout).backKeyPressed();
}
@Test
public void testOnKey_escape() {
doReturn(KeyEvent.ACTION_DOWN).when(mKeyEvent).getAction();
assertTrue(mMediator.onKey(mView, KeyEvent.KEYCODE_ESCAPE, mKeyEvent));
verify(mLocationBarLayout).setUrl(mLocationBarDataProvider.getCurrentUrl());
}
@Test
public void testOnKey_right() {
doReturn(KeyEvent.ACTION_DOWN).when(mKeyEvent).getAction();
doReturn(KeyEvent.KEYCODE_DPAD_RIGHT).when(mKeyEvent).getKeyCode();
doReturn("a").when(mView).getText();
doReturn(0).when(mView).getSelectionStart();
doReturn(1).when(mView).getSelectionEnd();
assertFalse(mMediator.onKey(mView, KeyEvent.KEYCODE_DPAD_RIGHT, mKeyEvent));
doReturn(1).when(mView).getSelectionStart();
assertTrue(mMediator.onKey(mView, KeyEvent.KEYCODE_DPAD_RIGHT, mKeyEvent));
}
@Test
public void testOnKey_leftRtl() {
doReturn(KeyEvent.ACTION_DOWN).when(mKeyEvent).getAction();
doReturn(KeyEvent.KEYCODE_DPAD_LEFT).when(mKeyEvent).getKeyCode();
doReturn("a").when(mView).getText();
doReturn(0).when(mView).getSelectionStart();
doReturn(1).when(mView).getSelectionEnd();
doReturn(View.LAYOUT_DIRECTION_RTL).when(mView).getLayoutDirection();
assertFalse(mMediator.onKey(mView, KeyEvent.KEYCODE_DPAD_LEFT, mKeyEvent));
doReturn(1).when(mView).getSelectionStart();
assertTrue(mMediator.onKey(mView, KeyEvent.KEYCODE_DPAD_LEFT, mKeyEvent));
}
@Test
public void testOnKey_unhandled() {
doReturn(KeyEvent.KEYCODE_BUTTON_14).when(mKeyEvent).getAction();
assertFalse(mMediator.onKey(mView, KeyEvent.KEYCODE_BACK, mKeyEvent));
}
@Test
public void testOnKey_triggersFocusAnimation() {
doReturn(KeyEvent.ACTION_DOWN).when(mKeyEvent).getAction();
doReturn(true).when(mAutocompleteCoordinator).handleKeyEvent(KeyEvent.KEYCODE_9, mKeyEvent);
doReturn(true).when(mKeyEvent).isPrintingKey();
doReturn(true).when(mKeyEvent).hasNoModifiers();
doReturn(true).when(mLocationBarLayout).isUrlBarFocused();
doReturn(true).when(mLocationBarLayout).isUrlBarFocusedWithoutAnimations();
assertTrue(mMediator.onKey(mView, KeyEvent.KEYCODE_9, mKeyEvent));
verify(mLocationBarLayout).handleUrlFocusAnimation(true);
}
private ArgumentMatcher<UrlBarData> matchesUrlBarDataForQuery(String query) {
return actual -> {
UrlBarData expected = UrlBarData.forNonUrlText(query);
......
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