Commit 2197aac0 authored by Brandon Wylie's avatar Brandon Wylie Committed by Chromium LUCI CQ

Move color/tint methods from LocationBarLayout to LocationBarMediator

Bug: 1147581
Change-Id: I291f529cbb1686c6135791b99268f3cb310d4c98
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2587562Reviewed-by: default avatarFilip Gorski <fgorski@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Reviewed-by: default avatarPatrick Noland <pnoland@chromium.org>
Commit-Queue: Brandon Wylie <wylieb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#844193}
parent 513226bd
...@@ -29,7 +29,6 @@ import org.chromium.chrome.browser.omnibox.status.StatusView; ...@@ -29,7 +29,6 @@ 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.suggestions.AutocompleteDelegate; import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteDelegate;
import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionsDropdownEmbedder; import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionsDropdownEmbedder;
import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService;
import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler; import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler;
import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl; import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
...@@ -117,15 +116,12 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse ...@@ -117,15 +116,12 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse
mAutocompleteAnchorView = autocompleteAnchorView; mAutocompleteAnchorView = autocompleteAnchorView;
mUrlBar = mLocationBarLayout.findViewById(R.id.url_bar); mUrlBar = mLocationBarLayout.findViewById(R.id.url_bar);
OneshotSupplierImpl<AssistantVoiceSearchService> assistantVoiceSearchSupplier =
new OneshotSupplierImpl();
// TODO(crbug.com/1151513): Inject LocaleManager instance to LocationBarCoordinator instead // TODO(crbug.com/1151513): Inject LocaleManager instance to LocationBarCoordinator instead
// of using the singleton. // of using the singleton.
mLocationBarMediator = new LocationBarMediator(mLocationBarLayout, locationBarDataProvider, mLocationBarMediator = new LocationBarMediator(mLocationBarLayout.getContext(),
assistantVoiceSearchSupplier, profileObservableSupplier, mLocationBarLayout, locationBarDataProvider, profileObservableSupplier,
PrivacyPreferencesManagerImpl.getInstance(), overrideUrlLoadingDelegate, PrivacyPreferencesManagerImpl.getInstance(), overrideUrlLoadingDelegate,
LocaleManager.getInstance(), mTemplateUrlServiceSupplier); LocaleManager.getInstance(), mTemplateUrlServiceSupplier);
mUrlCoordinator = mUrlCoordinator =
new UrlBarCoordinator((UrlBar) mUrlBar, windowDelegate, actionModeCallback, new UrlBarCoordinator((UrlBar) mUrlBar, windowDelegate, actionModeCallback,
mCallbackController.makeCancelable(mLocationBarMediator::onUrlFocusChange), mCallbackController.makeCancelable(mLocationBarMediator::onUrlFocusChange),
...@@ -155,7 +151,7 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse ...@@ -155,7 +151,7 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse
mLocationBarLayout.addUrlFocusChangeListener(mUrlCoordinator); mLocationBarLayout.addUrlFocusChangeListener(mUrlCoordinator);
mLocationBarLayout.initialize(mAutocompleteCoordinator, mUrlCoordinator, mStatusCoordinator, mLocationBarLayout.initialize(mAutocompleteCoordinator, mUrlCoordinator, mStatusCoordinator,
locationBarDataProvider, windowDelegate, windowAndroid, locationBarDataProvider, windowDelegate, windowAndroid,
mLocationBarMediator.getVoiceRecognitionHandler(), assistantVoiceSearchSupplier); mLocationBarMediator.getVoiceRecognitionHandler());
if (locationBarLayout instanceof LocationBarPhone) { if (locationBarLayout instanceof LocationBarPhone) {
mSubCoordinator = new LocationBarCoordinatorPhone( mSubCoordinator = new LocationBarCoordinatorPhone(
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
package org.chromium.chrome.browser.omnibox; package org.chromium.chrome.browser.omnibox;
import android.content.Context; import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.os.Parcelable; import android.os.Parcelable;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.AttributeSet; import android.util.AttributeSet;
...@@ -28,7 +30,6 @@ import org.chromium.base.ApiCompatibilityUtils; ...@@ -28,7 +30,6 @@ import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.ObserverList; import org.chromium.base.ObserverList;
import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.metrics.RecordUserAction;
import org.chromium.base.supplier.OneshotSupplier;
import org.chromium.chrome.R; import org.chromium.chrome.R;
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;
...@@ -37,15 +38,12 @@ import org.chromium.chrome.browser.omnibox.geo.GeolocationHeader; ...@@ -37,15 +38,12 @@ 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.AssistantVoiceSearchService;
import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler; 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.styles.ChromeColors;
import org.chromium.components.browser_ui.widget.CompositeTouchDelegate; import org.chromium.components.browser_ui.widget.CompositeTouchDelegate;
import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.components.embedder_support.util.UrlUtilities;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.util.ColorUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -91,8 +89,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -91,8 +89,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
protected CompositeTouchDelegate mCompositeTouchDelegate; protected CompositeTouchDelegate mCompositeTouchDelegate;
private OneshotSupplier<AssistantVoiceSearchService> mAssistantVoiceSearchServiceSupplier;
public LocationBarLayout(Context context, AttributeSet attrs) { public LocationBarLayout(Context context, AttributeSet attrs) {
this(context, attrs, R.layout.location_bar); this(context, attrs, R.layout.location_bar);
...@@ -158,17 +154,13 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -158,17 +154,13 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
@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 WindowDelegate windowDelegate, @NonNull WindowAndroid windowAndroid,
@NonNull VoiceRecognitionHandler voiceRecognitionHandler, @NonNull VoiceRecognitionHandler voiceRecognitionHandler) {
@NonNull OneshotSupplier<AssistantVoiceSearchService> assistantVoiceSearchSupplier) {
mAutocompleteCoordinator = autocompleteCoordinator; mAutocompleteCoordinator = autocompleteCoordinator;
mUrlCoordinator = urlCoordinator; mUrlCoordinator = urlCoordinator;
mStatusCoordinator = statusCoordinator; mStatusCoordinator = statusCoordinator;
mWindowAndroid = windowAndroid; mWindowAndroid = windowAndroid;
mLocationBarDataProvider = locationBarDataProvider; mLocationBarDataProvider = locationBarDataProvider;
mVoiceRecognitionHandler = voiceRecognitionHandler; mVoiceRecognitionHandler = voiceRecognitionHandler;
mAssistantVoiceSearchServiceSupplier = assistantVoiceSearchSupplier;
mAssistantVoiceSearchServiceSupplier.onAvailable(
(assistantVoiceSearchService) -> onAssistantVoiceSearchServiceChanged());
updateButtonVisibility(); updateButtonVisibility();
updateShouldAnimateIconChanges(); updateShouldAnimateIconChanges();
...@@ -194,8 +186,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -194,8 +186,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
} }
mDeferredNativeRunnables.clear(); mDeferredNativeRunnables.clear();
onPrimaryColorChanged();
updateMicButtonVisibility(); updateMicButtonVisibility();
} }
...@@ -211,6 +201,18 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -211,6 +201,18 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
mUrlFocusedWithoutAnimations = isUrlFocusedWithoutAnimations; mUrlFocusedWithoutAnimations = isUrlFocusedWithoutAnimations;
} }
/* package */ void setMicButtonDrawable(Drawable drawable) {
mMicButton.setImageDrawable(drawable);
}
/* package */ void setMicButtonTint(ColorStateList colorStateList) {
ApiCompatibilityUtils.setImageTintList(mMicButton, colorStateList);
}
/* package */ void setDeleteButtonTint(ColorStateList colorStateList) {
ApiCompatibilityUtils.setImageTintList(mDeleteButton, colorStateList);
}
/** /**
* Override the default LocationBarDataProvider in tests. Production code should use the * Override the default LocationBarDataProvider in tests. Production code should use the
* {@link #initialize} method instead. * {@link #initialize} method instead.
...@@ -312,48 +314,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -312,48 +314,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
if (visibility == View.VISIBLE) updateMicButtonState(); if (visibility == View.VISIBLE) updateMicButtonState();
} }
/** Updates visuals after the primary color has changed. */
@CallSuper
public void onPrimaryColorChanged() {
updateAssistantVoiceSearchDrawableAndColors();
updateUseDarkColors();
}
/**
* Update visuals to use a correct light or dark color scheme depending on the primary color.
*/
private void updateUseDarkColors() {
// TODO(crbug.com/1114183): Unify light and dark color logic in chrome and make it clear
// whether the foreground or background color is dark.
final boolean useDarkColors =
!ColorUtils.shouldUseLightForegroundOnBackground(getPrimaryBackgroundColor());
ApiCompatibilityUtils.setImageTintList(
mDeleteButton, ChromeColors.getPrimaryIconTint(getContext(), !useDarkColors));
// If the URL changed colors and is not focused, update the URL to account for the new
// color scheme.
if (mUrlCoordinator.setUseDarkTextColors(useDarkColors) && !mUrlBar.hasFocus()) {
setUrl(mLocationBarDataProvider.getCurrentUrl());
}
mStatusCoordinator.setUseDarkColors(useDarkColors);
if (mAutocompleteCoordinator != null) {
mAutocompleteCoordinator.updateVisualsForState(
useDarkColors, mLocationBarDataProvider.isIncognito());
}
}
/** Returns the primary color based on the url focus, and incognito state. */
private int getPrimaryBackgroundColor() {
// If the url bar is focused, the toolbar background color is the default color regardless
// of whether it is branded or not.
if (mUrlHasFocus) {
return ChromeColors.getDefaultThemeColor(
getResources(), mLocationBarDataProvider.isIncognito());
} else {
return mLocationBarDataProvider.getPrimaryColor();
}
}
protected void onNtpStartedLoading() {} protected void onNtpStartedLoading() {}
public View getContainerView() { public View getContainerView() {
...@@ -368,21 +328,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -368,21 +328,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
return mWindowAndroid; return mWindowAndroid;
} }
/* package */ void onAssistantVoiceSearchServiceChanged() {
updateAssistantVoiceSearchDrawableAndColors();
}
private void updateAssistantVoiceSearchDrawableAndColors() {
AssistantVoiceSearchService assistantVoiceSearchService =
mAssistantVoiceSearchServiceSupplier.get();
if (assistantVoiceSearchService == null) return;
ApiCompatibilityUtils.setImageTintList(mMicButton,
assistantVoiceSearchService.getMicButtonColorStateList(
getPrimaryBackgroundColor(), getContext()));
mMicButton.setImageDrawable(assistantVoiceSearchService.getCurrentMicDrawable());
}
/** /**
* Call to notify the location bar that the state of the voice search microphone button may * Call to notify the location bar that the state of the voice search microphone button may
* need to be updated. * need to be updated.
...@@ -498,7 +443,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -498,7 +443,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
mUrlHasFocus = hasFocus; mUrlHasFocus = hasFocus;
updateButtonVisibility(); updateButtonVisibility();
updateShouldAnimateIconChanges(); updateShouldAnimateIconChanges();
onPrimaryColorChanged();
if (mUrlHasFocus) { if (mUrlHasFocus) {
if (mNativeInitialized) RecordUserAction.record("FocusLocation"); if (mNativeInitialized) RecordUserAction.record("FocusLocation");
...@@ -781,6 +725,9 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -781,6 +725,9 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
updateShouldAnimateIconChanges(); updateShouldAnimateIconChanges();
} }
/** Update the status visibility according to the current state held in LocationBar. */
/* package */ void updateStatusVisibility() {}
public void setVoiceRecognitionHandlerForTesting( public void setVoiceRecognitionHandlerForTesting(
VoiceRecognitionHandler voiceRecognitionHandler) { VoiceRecognitionHandler voiceRecognitionHandler) {
mVoiceRecognitionHandler = voiceRecognitionHandler; mVoiceRecognitionHandler = voiceRecognitionHandler;
......
...@@ -41,6 +41,7 @@ import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImp ...@@ -41,6 +41,7 @@ import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImp
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.util.KeyNavigationUtil; import org.chromium.chrome.browser.util.KeyNavigationUtil;
import org.chromium.components.browser_ui.styles.ChromeColors;
import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.components.embedder_support.util.UrlUtilities;
import org.chromium.components.externalauth.ExternalAuthUtils; import org.chromium.components.externalauth.ExternalAuthUtils;
import org.chromium.components.search_engines.TemplateUrl; import org.chromium.components.search_engines.TemplateUrl;
...@@ -50,6 +51,7 @@ import org.chromium.content_public.browser.LoadUrlParams; ...@@ -50,6 +51,7 @@ import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.common.ResourceRequestBody; import org.chromium.content_public.common.ResourceRequestBody;
import org.chromium.ui.base.PageTransition; import org.chromium.ui.base.PageTransition;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.util.ColorUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
...@@ -66,8 +68,8 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -66,8 +68,8 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
private final LocationBarLayout mLocationBarLayout; private final LocationBarLayout mLocationBarLayout;
private VoiceRecognitionHandler mVoiceRecognitionHandler; private VoiceRecognitionHandler mVoiceRecognitionHandler;
private final LocationBarDataProvider mLocationBarDataProvider; private final LocationBarDataProvider mLocationBarDataProvider;
private AssistantVoiceSearchService mAssistantVoiceSearchService; private final OneshotSupplierImpl<AssistantVoiceSearchService>
private final OneshotSupplierImpl<AssistantVoiceSearchService> mAssistantVoiceSearchSupplier; mAssistantVoiceSearchServiceSupplier = new OneshotSupplierImpl<>();
private StatusCoordinator mStatusCoordinator; private StatusCoordinator mStatusCoordinator;
private AutocompleteCoordinator mAutocompleteCoordinator; private AutocompleteCoordinator mAutocompleteCoordinator;
private OmniboxPrerender mOmniboxPrerender; private OmniboxPrerender mOmniboxPrerender;
...@@ -80,24 +82,26 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -80,24 +82,26 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
private final List<Runnable> mDeferredNativeRunnables = new ArrayList<>(); private final List<Runnable> mDeferredNativeRunnables = new ArrayList<>();
private final OneshotSupplier<TemplateUrlService> mTemplateUrlServiceSupplier; private final OneshotSupplier<TemplateUrlService> mTemplateUrlServiceSupplier;
private TemplateUrl mSearchEngine; private TemplateUrl mSearchEngine;
private final Context mContext;
private boolean mNativeInitialized; private boolean mNativeInitialized;
/*package */ LocationBarMediator(@NonNull LocationBarLayout locationBarLayout, /*package */ LocationBarMediator(@NonNull Context context,
@NonNull LocationBarLayout locationBarLayout,
@NonNull LocationBarDataProvider locationBarDataProvider, @NonNull LocationBarDataProvider locationBarDataProvider,
@NonNull OneshotSupplierImpl<AssistantVoiceSearchService> assistantVoiceSearchSupplier,
@NonNull ObservableSupplier<Profile> profileSupplier, @NonNull ObservableSupplier<Profile> profileSupplier,
@NonNull PrivacyPreferencesManagerImpl privacyPreferencesManager, @NonNull PrivacyPreferencesManagerImpl privacyPreferencesManager,
@NonNull OverrideUrlLoadingDelegate overrideUrlLoadingDelegate, @NonNull OverrideUrlLoadingDelegate overrideUrlLoadingDelegate,
@NonNull LocaleManager localeManager, @NonNull LocaleManager localeManager,
@NonNull OneshotSupplier<TemplateUrlService> templateUrlServiceSupplier) { @NonNull OneshotSupplier<TemplateUrlService> templateUrlServiceSupplier) {
mContext = context;
mLocationBarLayout = locationBarLayout; mLocationBarLayout = locationBarLayout;
mLocationBarDataProvider = locationBarDataProvider; mLocationBarDataProvider = locationBarDataProvider;
mLocationBarDataProvider.addObserver(this); mLocationBarDataProvider.addObserver(this);
mAssistantVoiceSearchSupplier = assistantVoiceSearchSupplier;
mOverrideUrlLoadingDelegate = overrideUrlLoadingDelegate; mOverrideUrlLoadingDelegate = overrideUrlLoadingDelegate;
mLocaleManager = localeManager; mLocaleManager = localeManager;
mVoiceRecognitionHandler = new VoiceRecognitionHandler(this, mAssistantVoiceSearchSupplier); mVoiceRecognitionHandler =
new VoiceRecognitionHandler(this, mAssistantVoiceSearchServiceSupplier);
mProfileSupplier = profileSupplier; mProfileSupplier = profileSupplier;
mProfileSupplier.addObserver(mCallbackController.makeCancelable(this::setProfile)); mProfileSupplier.addObserver(mCallbackController.makeCancelable(this::setProfile));
mPrivacyPreferencesManager = privacyPreferencesManager; mPrivacyPreferencesManager = privacyPreferencesManager;
...@@ -120,9 +124,8 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -120,9 +124,8 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
} }
/*package */ void destroy() { /*package */ void destroy() {
if (mAssistantVoiceSearchService != null) { if (mAssistantVoiceSearchServiceSupplier.get() != null) {
mAssistantVoiceSearchService.destroy(); mAssistantVoiceSearchServiceSupplier.get().destroy();
mAssistantVoiceSearchService = null;
} }
mStatusCoordinator = null; mStatusCoordinator = null;
mAutocompleteCoordinator = null; mAutocompleteCoordinator = null;
...@@ -140,19 +143,22 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -140,19 +143,22 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
/*package */ void onUrlFocusChange(boolean hasFocus) { /*package */ void onUrlFocusChange(boolean hasFocus) {
mLocationBarLayout.onUrlFocusChange(hasFocus); mLocationBarLayout.onUrlFocusChange(hasFocus);
onPrimaryColorChanged();
mLocationBarLayout.updateStatusVisibility();
} }
/*package */ void onFinishNativeInitialization() { /*package */ void onFinishNativeInitialization() {
mNativeInitialized = true; mNativeInitialized = true;
mTemplateUrlServiceSupplier.get().runWhenLoaded(this::registerTemplateUrlObserver); mTemplateUrlServiceSupplier.get().runWhenLoaded(this::registerTemplateUrlObserver);
mOmniboxPrerender = new OmniboxPrerender(); mOmniboxPrerender = new OmniboxPrerender();
Context context = mLocationBarLayout.getContext(); mAssistantVoiceSearchServiceSupplier.set(new AssistantVoiceSearchService(mContext,
mAssistantVoiceSearchService = new AssistantVoiceSearchService(context,
ExternalAuthUtils.getInstance(), mTemplateUrlServiceSupplier.get(), ExternalAuthUtils.getInstance(), mTemplateUrlServiceSupplier.get(),
GSAState.getInstance(context), this, SharedPreferencesManager.getInstance()); GSAState.getInstance(mContext), this, SharedPreferencesManager.getInstance()));
mAssistantVoiceSearchSupplier.set(mAssistantVoiceSearchService); onAssistantVoiceSearchServiceChanged();
mLocationBarLayout.onFinishNativeInitialization(); mLocationBarLayout.onFinishNativeInitialization();
setProfile(mProfileSupplier.get()); setProfile(mProfileSupplier.get());
onPrimaryColorChanged();
mLocationBarLayout.updateStatusVisibility();
for (Runnable deferredRunnable : mDeferredNativeRunnables) { for (Runnable deferredRunnable : mDeferredNativeRunnables) {
mLocationBarLayout.post(deferredRunnable); mLocationBarLayout.post(deferredRunnable);
...@@ -174,8 +180,19 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -174,8 +180,19 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
mLocationBarLayout.setVoiceRecognitionHandlerForTesting(voiceRecognitionHandler); mLocationBarLayout.setVoiceRecognitionHandlerForTesting(voiceRecognitionHandler);
} }
/* package */ void setAssistantVoiceSearchServiceForTesting(
AssistantVoiceSearchService assistantVoiceSearchService) {
mAssistantVoiceSearchServiceSupplier.set(assistantVoiceSearchService);
onAssistantVoiceSearchServiceChanged();
}
/* package */ OneshotSupplier<AssistantVoiceSearchService>
getAssistantVoiceSearchServiceSupplierForTesting() {
return mAssistantVoiceSearchServiceSupplier;
}
/*package */ void updateVisualsForState() { /*package */ void updateVisualsForState() {
mLocationBarLayout.onPrimaryColorChanged(); onPrimaryColorChanged();
} }
/*package */ void setShowTitle(boolean showTitle) { /*package */ void setShowTitle(boolean showTitle) {
...@@ -350,6 +367,54 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -350,6 +367,54 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
} }
} }
@VisibleForTesting
/* package */ void updateAssistantVoiceSearchDrawableAndColors() {
AssistantVoiceSearchService assistantVoiceSearchService =
mAssistantVoiceSearchServiceSupplier.get();
if (assistantVoiceSearchService == null) return;
mLocationBarLayout.setMicButtonTint(assistantVoiceSearchService.getMicButtonColorStateList(
getPrimaryBackgroundColor(), mContext));
mLocationBarLayout.setMicButtonDrawable(
assistantVoiceSearchService.getCurrentMicDrawable());
}
/**
* Update visuals to use a correct light or dark color scheme depending on the primary color.
*/
@VisibleForTesting
/* package */ void updateUseDarkColors() {
// TODO(crbug.com/1114183): Unify light and dark color logic in chrome and make it clear
// whether the foreground or background color is dark.
final boolean useDarkColors =
!ColorUtils.shouldUseLightForegroundOnBackground(getPrimaryBackgroundColor());
mLocationBarLayout.setDeleteButtonTint(
ChromeColors.getPrimaryIconTint(mContext, !useDarkColors));
// If the URL changed colors and is not focused, update the URL to account for the new
// color scheme.
if (mUrlCoordinator.setUseDarkTextColors(useDarkColors) && !isUrlBarFocused()) {
mLocationBarLayout.setUrl(mLocationBarDataProvider.getCurrentUrl());
}
mStatusCoordinator.setUseDarkColors(useDarkColors);
if (mAutocompleteCoordinator != null) {
mAutocompleteCoordinator.updateVisualsForState(
useDarkColors, mLocationBarDataProvider.isIncognito());
}
}
/** Returns the primary color based on the url focus, and incognito state. */
private int getPrimaryBackgroundColor() {
// If the url bar is focused, the toolbar background color is the default color regardless
// of whether it is branded or not.
if (isUrlBarFocused()) {
return ChromeColors.getDefaultThemeColor(
mContext.getResources(), mLocationBarDataProvider.isIncognito());
} else {
return mLocationBarDataProvider.getPrimaryColor();
}
}
// LocationBarData.Observer implementation // LocationBarData.Observer implementation
// Using the default empty onSecurityStateChanged. // Using the default empty onSecurityStateChanged.
// Using the default empty onTitleChanged. // Using the default empty onTitleChanged.
...@@ -366,7 +431,9 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -366,7 +431,9 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
@Override @Override
public void onPrimaryColorChanged() { public void onPrimaryColorChanged() {
mLocationBarLayout.onPrimaryColorChanged(); updateAssistantVoiceSearchDrawableAndColors();
updateUseDarkColors();
mLocationBarLayout.updateStatusVisibility();
} }
@Override @Override
...@@ -443,7 +510,7 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -443,7 +510,7 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
@Override @Override
public void onAssistantVoiceSearchServiceChanged() { public void onAssistantVoiceSearchServiceChanged() {
mLocationBarLayout.onAssistantVoiceSearchServiceChanged(); updateAssistantVoiceSearchDrawableAndColors();
} }
// VoiceRecognitionHandler.Delegate implementation. // VoiceRecognitionHandler.Delegate implementation.
......
...@@ -171,14 +171,6 @@ class LocationBarPhone extends LocationBarLayout { ...@@ -171,14 +171,6 @@ class LocationBarPhone extends LocationBarLayout {
mStatusCoordinator.setShowIconsWhenUrlFocused(showIcon); mStatusCoordinator.setShowIconsWhenUrlFocused(showIcon);
} }
@Override
public void onPrimaryColorChanged() {
super.onPrimaryColorChanged();
boolean isIncognito = mLocationBarDataProvider.isIncognito();
setShowIconsWhenUrlFocused(SearchEngineLogoUtils.shouldShowSearchEngineLogo(isIncognito));
updateStatusVisibility();
}
@Override @Override
protected void onNtpStartedLoading() { protected void onNtpStartedLoading() {
super.onNtpStartedLoading(); super.onNtpStartedLoading();
...@@ -219,8 +211,11 @@ class LocationBarPhone extends LocationBarLayout { ...@@ -219,8 +211,11 @@ class LocationBarPhone extends LocationBarLayout {
} }
/** Update the status visibility according to the current state held in LocationBar. */ /** Update the status visibility according to the current state held in LocationBar. */
private void updateStatusVisibility() { @Override
/* package */ void updateStatusVisibility() {
boolean incognito = mLocationBarDataProvider.isIncognito(); boolean incognito = mLocationBarDataProvider.isIncognito();
setShowIconsWhenUrlFocused(SearchEngineLogoUtils.shouldShowSearchEngineLogo(incognito));
if (!SearchEngineLogoUtils.shouldShowSearchEngineLogo(incognito)) { if (!SearchEngineLogoUtils.shouldShowSearchEngineLogo(incognito)) {
return; return;
} }
......
...@@ -16,13 +16,11 @@ import android.view.View; ...@@ -16,13 +16,11 @@ import android.view.View;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import org.chromium.base.supplier.OneshotSupplier;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.WindowDelegate; 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.AssistantVoiceSearchService;
import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler; 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;
...@@ -119,11 +117,9 @@ class LocationBarTablet extends LocationBarLayout { ...@@ -119,11 +117,9 @@ class LocationBarTablet extends LocationBarLayout {
@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 WindowDelegate windowDelegate, @NonNull WindowAndroid windowAndroid,
@NonNull VoiceRecognitionHandler voiceRecognitionHandler, @NonNull VoiceRecognitionHandler voiceRecognitionHandler) {
@NonNull OneshotSupplier<AssistantVoiceSearchService> assistantVoiceSearchSupplier) {
super.initialize(autocompleteCoordinator, urlCoordinator, statusCoordinator, super.initialize(autocompleteCoordinator, urlCoordinator, statusCoordinator,
locationBarDataProvider, windowDelegate, windowAndroid, voiceRecognitionHandler, locationBarDataProvider, windowDelegate, windowAndroid, voiceRecognitionHandler);
assistantVoiceSearchSupplier);
mStatusCoordinator.setShowIconsWhenUrlFocused(true); mStatusCoordinator.setShowIconsWhenUrlFocused(true);
if (SearchEngineLogoUtils.shouldShowSearchEngineLogo( if (SearchEngineLogoUtils.shouldShowSearchEngineLogo(
mLocationBarDataProvider.isIncognito())) { mLocationBarDataProvider.isIncognito())) {
......
...@@ -12,7 +12,6 @@ import android.view.View; ...@@ -12,7 +12,6 @@ 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.base.supplier.OneshotSupplier;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.WindowDelegate; import org.chromium.chrome.browser.WindowDelegate;
import org.chromium.chrome.browser.locale.LocaleManager; import org.chromium.chrome.browser.locale.LocaleManager;
...@@ -24,7 +23,6 @@ import org.chromium.chrome.browser.omnibox.UrlBarCoordinator.SelectionState; ...@@ -24,7 +23,6 @@ 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.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.AssistantVoiceSearchService;
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; import org.chromium.ui.base.WindowAndroid;
...@@ -60,12 +58,9 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout { ...@@ -60,12 +58,9 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout {
@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 WindowDelegate windowDelegate, @NonNull WindowAndroid windowAndroid,
@NonNull VoiceRecognitionHandler voiceRecognitionHandler, @NonNull VoiceRecognitionHandler voiceRecognitionHandler) {
@NonNull OneshotSupplier<AssistantVoiceSearchService>
assistantVoiceSearchServiceSupplier) {
super.initialize(autocompleteCoordinator, urlCoordinator, statusCoordinator, super.initialize(autocompleteCoordinator, urlCoordinator, statusCoordinator,
locationBarDataProvider, windowDelegate, windowAndroid, voiceRecognitionHandler, locationBarDataProvider, windowDelegate, windowAndroid, voiceRecognitionHandler);
assistantVoiceSearchServiceSupplier);
mPendingSearchPromoDecision = LocaleManager.getInstance().needToCheckForSearchEnginePromo(); mPendingSearchPromoDecision = LocaleManager.getInstance().needToCheckForSearchEnginePromo();
getAutocompleteCoordinator().setShouldPreventOmniboxAutocomplete( getAutocompleteCoordinator().setShouldPreventOmniboxAutocomplete(
mPendingSearchPromoDecision); mPendingSearchPromoDecision);
......
...@@ -341,14 +341,10 @@ public class LocationBarLayoutTest { ...@@ -341,14 +341,10 @@ public class LocationBarLayoutTest {
final View statusIconView = getStatusIconView(); final View statusIconView = getStatusIconView();
updateSearchEngineLogoWithGoogle(locationBar); updateSearchEngineLogoWithGoogle(locationBar);
loadUrlInNewTabAndUpdateModels(UrlConstants.NTP_URL, /* incognito= */ false); loadUrlInNewTabAndUpdateModels(UrlConstants.NTP_URL, /* incognito= */ false);
onView(withId(R.id.location_bar_status)).check(matches(not(isDisplayed())));
onView(withId(R.id.location_bar_status))
.check((view, e) -> Assert.assertEquals(GONE, statusIconView.getVisibility()));
// Focus the UrlBar and check that the status view is VISIBLE.
setUrlBarTextAndFocus(""); setUrlBarTextAndFocus("");
onView(withId(R.id.location_bar_status)) onView(withId(R.id.location_bar_status)).check(matches(isDisplayed()));
.check((view, e) -> Assert.assertEquals(VISIBLE, statusIconView.getVisibility()));
} }
@Test @Test
...@@ -360,18 +356,10 @@ public class LocationBarLayoutTest { ...@@ -360,18 +356,10 @@ public class LocationBarLayoutTest {
final View statusIconView = getStatusIconView(); final View statusIconView = getStatusIconView();
updateSearchEngineLogoWithGoogle(locationBar); updateSearchEngineLogoWithGoogle(locationBar);
loadUrlInNewTabAndUpdateModels(UrlConstants.NTP_URL, /* incognito= */ true); loadUrlInNewTabAndUpdateModels(UrlConstants.NTP_URL, /* incognito= */ true);
onView(withId(R.id.location_bar_status_icon)).check(matches(not(isDisplayed())));
// The status view should be hidden in both focused/unfocused while incognito.
onView(withId(R.id.location_bar_status_icon))
.check((view, e)
-> Assert.assertEquals("Should be gone when unfocused", GONE,
statusIconView.getVisibility()));
setUrlBarTextAndFocus(""); setUrlBarTextAndFocus("");
onView(withId(R.id.location_bar_status_icon)) onView(withId(R.id.location_bar_status_icon)).check(matches(not(isDisplayed())));
.check((view, e)
-> Assert.assertEquals("Should be gone when focused", GONE,
statusIconView.getVisibility()));
} }
@Test @Test
...@@ -385,13 +373,10 @@ public class LocationBarLayoutTest { ...@@ -385,13 +373,10 @@ public class LocationBarLayoutTest {
Tab tab = loadUrlInNewTabAndUpdateModels(UrlConstants.NTP_URL, /* incognito= */ false); Tab tab = loadUrlInNewTabAndUpdateModels(UrlConstants.NTP_URL, /* incognito= */ false);
TestThreadUtils.runOnUiThreadBlocking( TestThreadUtils.runOnUiThreadBlocking(
() -> tab.loadUrl(new LoadUrlParams(UrlConstants.ABOUT_URL))); () -> tab.loadUrl(new LoadUrlParams(UrlConstants.ABOUT_URL)));
onView(withId(R.id.location_bar_status)).check(matches(isDisplayed()));
onView(withId(R.id.location_bar_status_icon))
.check((view, e) -> Assert.assertEquals(VISIBLE, statusIconView.getVisibility()));
setUrlBarTextAndFocus(""); setUrlBarTextAndFocus("");
onView(withId(R.id.location_bar_status_icon)) onView(withId(R.id.location_bar_status)).check(matches(isDisplayed()));
.check((view, e) -> Assert.assertEquals(VISIBLE, statusIconView.getVisibility()));
} }
@Test @Test
...@@ -402,20 +387,10 @@ public class LocationBarLayoutTest { ...@@ -402,20 +387,10 @@ public class LocationBarLayoutTest {
final View statusIconView = getStatusIconView(); final View statusIconView = getStatusIconView();
updateSearchEngineLogoWithGoogle(locationBar); updateSearchEngineLogoWithGoogle(locationBar);
loadUrlInNewTabAndUpdateModels(UrlConstants.ABOUT_URL, /* incognito= */ false); loadUrlInNewTabAndUpdateModels(UrlConstants.ABOUT_URL, /* incognito= */ false);
onView(withId(R.id.location_bar_status)).check(matches(isDisplayed()));
// The status view should be hidden in both focused/unfocused while incognito.
onView(withId(R.id.location_bar_status_icon))
.check((view, e)
-> Assert.assertEquals(
"Status should be visible when unfocused on a site.",
VISIBLE, statusIconView.getVisibility()));
setUrlBarTextAndFocus(""); setUrlBarTextAndFocus("");
onView(withId(R.id.location_bar_status_icon)) onView(withId(R.id.location_bar_status)).check(matches(isDisplayed()));
.check((view, e)
-> Assert.assertEquals(
"Status should be visible when focused on a site.", VISIBLE,
statusIconView.getVisibility()));
} }
@Test @Test
...@@ -427,14 +402,10 @@ public class LocationBarLayoutTest { ...@@ -427,14 +402,10 @@ public class LocationBarLayoutTest {
final View statusIconView = getStatusIconView(); final View statusIconView = getStatusIconView();
updateSearchEngineLogoWithGoogle(locationBar); updateSearchEngineLogoWithGoogle(locationBar);
loadUrlInNewTabAndUpdateModels(UrlConstants.ABOUT_URL, /* incognito= */ true); loadUrlInNewTabAndUpdateModels(UrlConstants.ABOUT_URL, /* incognito= */ true);
onView(withId(R.id.location_bar_status)).check(matches(isDisplayed()));
// The status view should be hidden in both focused/unfocused while incognito.
onView(withId(R.id.location_bar_status_icon))
.check((view, e) -> Assert.assertEquals(GONE, statusIconView.getVisibility()));
setUrlBarTextAndFocus(""); setUrlBarTextAndFocus("");
onView(withId(R.id.location_bar_status_icon)) onView(withId(R.id.location_bar_status)).check(matches(isDisplayed()));
.check((view, e) -> Assert.assertEquals(GONE, statusIconView.getVisibility()));
} }
@Test @Test
...@@ -448,32 +419,25 @@ public class LocationBarLayoutTest { ...@@ -448,32 +419,25 @@ public class LocationBarLayoutTest {
UrlConstants.CHROME_BLANK_URL, /* incognito= */ false); UrlConstants.CHROME_BLANK_URL, /* incognito= */ false);
TestThreadUtils.runOnUiThreadBlocking( TestThreadUtils.runOnUiThreadBlocking(
() -> tab.loadUrl(new LoadUrlParams(UrlConstants.ABOUT_URL))); () -> tab.loadUrl(new LoadUrlParams(UrlConstants.ABOUT_URL)));
onView(withId(R.id.location_bar_status)).check(matches(isDisplayed()));
onView(withId(R.id.location_bar_status_icon))
.check((view, e) -> Assert.assertEquals(VISIBLE, statusIconView.getVisibility()));
setUrlBarTextAndFocus(""); setUrlBarTextAndFocus("");
onView(withId(R.id.location_bar_status_icon)) onView(withId(R.id.location_bar_status)).check(matches(isDisplayed()));
.check((view, e) -> Assert.assertEquals(VISIBLE, statusIconView.getVisibility()));
} }
@Test @Test
@SmallTest @SmallTest
@Restriction(UiRestriction.RESTRICTION_TYPE_PHONE) @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
@EnableFeatures(ChromeFeatureList.OMNIBOX_SEARCH_ENGINE_LOGO) @EnableFeatures(ChromeFeatureList.OMNIBOX_SEARCH_ENGINE_LOGO)
public void testOmniboxSearchEngineLogo_ntp_nonGoogle() { public void testOmniboxSearchEngineLogo_ntp_nonGoogleg() {
final LocationBarLayout locationBar = getLocationBar(); final LocationBarLayout locationBar = getLocationBar();
final View statusIconView = getStatusIconView(); final View statusIconView = getStatusIconView();
updateSearchEngineLogoWithYahoo(locationBar); updateSearchEngineLogoWithYahoo(locationBar);
loadUrlInNewTabAndUpdateModels(UrlConstants.NTP_URL, /* incognito= */ false); loadUrlInNewTabAndUpdateModels(UrlConstants.NTP_URL, /* incognito= */ false);
onView(withId(R.id.location_bar_status)).check(matches(not(isDisplayed())));
onView(withId(R.id.location_bar_status_icon))
.check((view, e) -> Assert.assertEquals(GONE, statusIconView.getVisibility()));
// Focus the UrlBar and check that the status view is VISIBLE.
setUrlBarTextAndFocus(""); setUrlBarTextAndFocus("");
onView(withId(R.id.location_bar_status_icon)) onView(withId(R.id.location_bar_status)).check(matches(isDisplayed()));
.check((view, e) -> Assert.assertEquals(VISIBLE, statusIconView.getVisibility()));
} }
@Test @Test
...@@ -485,18 +449,10 @@ public class LocationBarLayoutTest { ...@@ -485,18 +449,10 @@ public class LocationBarLayoutTest {
final View statusIconView = getStatusIconView(); final View statusIconView = getStatusIconView();
updateSearchEngineLogoWithYahoo(locationBar); updateSearchEngineLogoWithYahoo(locationBar);
loadUrlInNewTabAndUpdateModels(UrlConstants.NTP_URL, /* incognito= */ true); loadUrlInNewTabAndUpdateModels(UrlConstants.NTP_URL, /* incognito= */ true);
onView(withId(R.id.location_bar_status_icon)).check(matches(not(isDisplayed())));
// The status view should be hidden in both focused/unfocused while incognito.
onView(withId(R.id.location_bar_status_icon))
.check((view, e)
-> Assert.assertEquals("Should be gone when unfocused", GONE,
statusIconView.getVisibility()));
setUrlBarTextAndFocus(""); setUrlBarTextAndFocus("");
onView(withId(R.id.location_bar_status_icon)) onView(withId(R.id.location_bar_status_icon)).check(matches(not(isDisplayed())));
.check((view, e)
-> Assert.assertEquals("Should be gone when focused", GONE,
statusIconView.getVisibility()));
} }
@Test @Test
...@@ -510,13 +466,10 @@ public class LocationBarLayoutTest { ...@@ -510,13 +466,10 @@ public class LocationBarLayoutTest {
Tab tab = loadUrlInNewTabAndUpdateModels(UrlConstants.NTP_URL, /* incognito= */ false); Tab tab = loadUrlInNewTabAndUpdateModels(UrlConstants.NTP_URL, /* incognito= */ false);
TestThreadUtils.runOnUiThreadBlocking( TestThreadUtils.runOnUiThreadBlocking(
() -> tab.loadUrl(new LoadUrlParams(UrlConstants.ABOUT_URL))); () -> tab.loadUrl(new LoadUrlParams(UrlConstants.ABOUT_URL)));
onView(withId(R.id.location_bar_status)).check(matches(isDisplayed()));
onView(withId(R.id.location_bar_status_icon))
.check((view, e) -> Assert.assertEquals(VISIBLE, statusIconView.getVisibility()));
setUrlBarTextAndFocus(""); setUrlBarTextAndFocus("");
onView(withId(R.id.location_bar_status_icon)) onView(withId(R.id.location_bar_status)).check(matches(isDisplayed()));
.check((view, e) -> Assert.assertEquals(VISIBLE, statusIconView.getVisibility()));
} }
@Test @Test
...@@ -527,20 +480,10 @@ public class LocationBarLayoutTest { ...@@ -527,20 +480,10 @@ public class LocationBarLayoutTest {
final View statusIconView = getStatusIconView(); final View statusIconView = getStatusIconView();
updateSearchEngineLogoWithYahoo(locationBar); updateSearchEngineLogoWithYahoo(locationBar);
loadUrlInNewTabAndUpdateModels(UrlConstants.ABOUT_URL, /* incognito= */ false); loadUrlInNewTabAndUpdateModels(UrlConstants.ABOUT_URL, /* incognito= */ false);
onView(withId(R.id.location_bar_status)).check(matches(isDisplayed()));
// The status view should be hidden in both focused/unfocused while incognito.
onView(withId(R.id.location_bar_status_icon))
.check((view, e)
-> Assert.assertEquals(
"Status should be visible when unfocused on a site.",
VISIBLE, statusIconView.getVisibility()));
setUrlBarTextAndFocus(""); setUrlBarTextAndFocus("");
onView(withId(R.id.location_bar_status_icon)) onView(withId(R.id.location_bar_status)).check(matches(isDisplayed()));
.check((view, e)
-> Assert.assertEquals(
"Status should be visible when focused on a site.", VISIBLE,
statusIconView.getVisibility()));
} }
@Test @Test
...@@ -552,14 +495,10 @@ public class LocationBarLayoutTest { ...@@ -552,14 +495,10 @@ public class LocationBarLayoutTest {
final View statusIconView = getStatusIconView(); final View statusIconView = getStatusIconView();
updateSearchEngineLogoWithYahoo(locationBar); updateSearchEngineLogoWithYahoo(locationBar);
loadUrlInNewTabAndUpdateModels(UrlConstants.ABOUT_URL, /* incognito= */ true); loadUrlInNewTabAndUpdateModels(UrlConstants.ABOUT_URL, /* incognito= */ true);
onView(withId(R.id.location_bar_status_icon)).check(matches(not(isDisplayed())));
// The status view should be hidden in both focused/unfocused while incognito.
onView(withId(R.id.location_bar_status_icon))
.check((view, e) -> Assert.assertEquals(GONE, statusIconView.getVisibility()));
setUrlBarTextAndFocus(""); setUrlBarTextAndFocus("");
onView(withId(R.id.location_bar_status_icon)) onView(withId(R.id.location_bar_status_icon)).check(matches(not(isDisplayed())));
.check((view, e) -> Assert.assertEquals(GONE, statusIconView.getVisibility()));
} }
@Test @Test
...@@ -573,13 +512,10 @@ public class LocationBarLayoutTest { ...@@ -573,13 +512,10 @@ public class LocationBarLayoutTest {
UrlConstants.CHROME_BLANK_URL, /* incognito= */ false); UrlConstants.CHROME_BLANK_URL, /* incognito= */ false);
TestThreadUtils.runOnUiThreadBlocking( TestThreadUtils.runOnUiThreadBlocking(
() -> tab.loadUrl(new LoadUrlParams(UrlConstants.ABOUT_URL))); () -> tab.loadUrl(new LoadUrlParams(UrlConstants.ABOUT_URL)));
onView(withId(R.id.location_bar_status)).check(matches(isDisplayed()));
onView(withId(R.id.location_bar_status_icon))
.check((view, e) -> Assert.assertEquals(VISIBLE, statusIconView.getVisibility()));
setUrlBarTextAndFocus(""); setUrlBarTextAndFocus("");
onView(withId(R.id.location_bar_status_icon)) onView(withId(R.id.location_bar_status)).check(matches(isDisplayed()));
.check((view, e) -> Assert.assertEquals(VISIBLE, statusIconView.getVisibility()));
} }
@Test @Test
......
...@@ -6,6 +6,7 @@ package org.chromium.chrome.browser.omnibox; ...@@ -6,6 +6,7 @@ package org.chromium.chrome.browser.omnibox;
import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.assertTrue;
...@@ -13,17 +14,17 @@ import static org.mockito.ArgumentMatchers.any; ...@@ -13,17 +14,17 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyObject;
import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.notNull;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import android.content.Context; import android.content.res.ColorStateList;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.KeyEvent; import android.view.KeyEvent;
...@@ -39,8 +40,10 @@ import org.mockito.ArgumentCaptor; ...@@ -39,8 +40,10 @@ import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatcher; import org.mockito.ArgumentMatcher;
import org.mockito.Captor; import org.mockito.Captor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule; import org.mockito.junit.MockitoRule;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.chromium.base.BuildConfig; import org.chromium.base.BuildConfig;
...@@ -85,9 +88,7 @@ public class LocationBarMediatorTest { ...@@ -85,9 +88,7 @@ public class LocationBarMediatorTest {
public JniMocker mJniMocker = new JniMocker(); public JniMocker mJniMocker = new JniMocker();
@Mock @Mock
LocationBarLayout mLocationBarLayout; private LocationBarLayout mLocationBarLayout;
@Mock
Context mContext;
@Mock @Mock
private TemplateUrlService mTemplateUrlService; private TemplateUrlService mTemplateUrlService;
@Mock @Mock
...@@ -137,14 +138,14 @@ public class LocationBarMediatorTest { ...@@ -137,14 +138,14 @@ public class LocationBarMediatorTest {
@Before @Before
public void setUp() { public void setUp() {
doReturn(mContext).when(mLocationBarLayout).getContext();
doReturn(mTemplateUrlService).when(mTemplateUrlServiceSupplier).get(); doReturn(mTemplateUrlService).when(mTemplateUrlServiceSupplier).get();
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(mLocationBarLayout, mLocationBarDataProvider, mMediator = new LocationBarMediator(/* context= */ RuntimeEnvironment.application,
mAssistantVoiceSearchSupplier, mProfileSupplier, mPrivacyPreferencesManager, mLocationBarLayout, mLocationBarDataProvider, mProfileSupplier,
mOverrideUrlLoadingDelegate, mLocaleManager, mTemplateUrlServiceSupplier); mPrivacyPreferencesManager, mOverrideUrlLoadingDelegate, mLocaleManager,
mTemplateUrlServiceSupplier);
mMediator.setCoordinators(mUrlCoordinator, mAutocompleteCoordinator, mStatusCoordinator); mMediator.setCoordinators(mUrlCoordinator, mAutocompleteCoordinator, mStatusCoordinator);
SearchEngineLogoUtils.setDelegateForTesting(mSearchEngineDelegate); SearchEngineLogoUtils.setDelegateForTesting(mSearchEngineDelegate);
} }
...@@ -152,14 +153,14 @@ public class LocationBarMediatorTest { ...@@ -152,14 +153,14 @@ public class LocationBarMediatorTest {
@Test @Test
public void testVoiceSearchService_initializedWithNative() { public void testVoiceSearchService_initializedWithNative() {
mMediator.onFinishNativeInitialization(); mMediator.onFinishNativeInitialization();
verify(mAssistantVoiceSearchSupplier).set(notNull()); assertNotNull(mMediator.getAssistantVoiceSearchServiceSupplierForTesting().get());
} }
@Test @Test
@Features.DisableFeatures(ChromeFeatureList.OMNIBOX_ASSISTANT_VOICE_SEARCH) @Features.DisableFeatures(ChromeFeatureList.OMNIBOX_ASSISTANT_VOICE_SEARCH)
public void testVoiceSearchService_initializedWithNative_featureDisabled() { public void testVoiceSearchService_initializedWithNative_featureDisabled() {
mMediator.onFinishNativeInitialization(); mMediator.onFinishNativeInitialization();
verify(mAssistantVoiceSearchSupplier).set(notNull()); assertNotNull(mMediator.getAssistantVoiceSearchServiceSupplierForTesting().get());
} }
@Test @Test
...@@ -542,6 +543,45 @@ public class LocationBarMediatorTest { ...@@ -542,6 +543,45 @@ public class LocationBarMediatorTest {
false, SearchEngineLogoUtils.getSearchLogoUrl(mTemplateUrlService)); false, SearchEngineLogoUtils.getSearchLogoUrl(mTemplateUrlService));
} }
@Test
public void testUpdateAssistantVoiceSearchDrawablesAndColors() {
AssistantVoiceSearchService avs = Mockito.mock(AssistantVoiceSearchService.class);
ColorStateList csl = Mockito.mock(ColorStateList.class);
doReturn(csl).when(avs).getMicButtonColorStateList(anyInt(), anyObject());
mMediator.setAssistantVoiceSearchServiceForTesting(avs);
verify(mLocationBarLayout).setMicButtonTint(csl);
}
@Test
public void testUpdateAssistantVoiceSearchDrawablesAndColors_serviceNull() {
mMediator.updateAssistantVoiceSearchDrawableAndColors();
// If the service is null, the update method bails out.
verify(mLocationBarLayout, Mockito.times(0)).setMicButtonTint(/* arbitrary value */ null);
}
@Test
public void testUpdateUseDarkColors() {
mMediator.updateUseDarkColors();
verify(mLocationBarLayout).setDeleteButtonTint(anyObject());
verify(mStatusCoordinator).setUseDarkColors(false);
verify(mAutocompleteCoordinator)
.updateVisualsForState(/* useDarkColors= */ false, /* incognito= */ false);
}
@Test
public void testUpdateUseDarkColors_setUseDarkTextColors() {
doReturn("https://www.google.com").when(mLocationBarDataProvider).getCurrentUrl();
doReturn(true).when(mUrlCoordinator).setUseDarkTextColors(false);
mMediator.updateUseDarkColors();
verify(mLocationBarLayout).setDeleteButtonTint(anyObject());
verify(mLocationBarLayout).setUrl("https://www.google.com");
verify(mStatusCoordinator).setUseDarkColors(false);
verify(mAutocompleteCoordinator)
.updateVisualsForState(/* useDarkColors= */ false, /* incognito= */ false);
}
private ArgumentMatcher<UrlBarData> matchesUrlBarDataForQuery(String query) { private ArgumentMatcher<UrlBarData> matchesUrlBarDataForQuery(String query) {
return actual -> { return actual -> {
UrlBarData expected = UrlBarData.forNonUrlText(query); 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