Commit e5d6de4d authored by Tomasz Wiszkowski's avatar Tomasz Wiszkowski Committed by Commit Bot

Refactor security icon

Change-Id: Id25261aac8f8f5228bf69ff46a6ee8763f96169e
Bug: 871798
Reviewed-on: https://chromium-review.googlesource.com/c/1380958Reviewed-by: default avatarYusuf Ozuysal <yusufo@chromium.org>
Reviewed-by: default avatarTheresa <twellington@chromium.org>
Commit-Queue: Tomasz Wiszkowski <ender@google.com>
Cr-Commit-Position: refs/heads/master@{#618331}
parent dbf4acb1
......@@ -198,7 +198,8 @@ public class LocationBarTablet extends LocationBarLayout {
}
private void finishUrlFocusChange(boolean hasFocus) {
mStatusViewCoordinator.setSecurityButtonVisibility(!hasFocus);
// Report focus change early to trigger animations.
mStatusViewCoordinator.onUrlFocusChange(hasFocus);
if (hasFocus) {
if (getWindowDelegate().getWindowSoftInputMode()
!= WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) {
......
......@@ -5,6 +5,7 @@
package org.chromium.chrome.browser.omnibox.status;
import android.support.annotation.ColorRes;
import android.support.annotation.DrawableRes;
import android.support.annotation.StringRes;
import org.chromium.chrome.R;
......@@ -23,20 +24,23 @@ class StatusMediator {
private boolean mVerboseStatusSpaceAvailable;
private boolean mPageIsPreview;
private boolean mPageIsOffline;
private boolean mTabletMode;
private int mUrlMinWidth;
private int mSeparatorMinWidth;
private int mVerboseStatusTextMinWidth;
private @DrawableRes int mSecurityIconRes;
public StatusMediator(PropertyModel model) {
mModel = model;
}
/**
* Specify type of displayed location bar button.
* Toggle animations of icon changes.
*/
public void setStatusButtonType(@StatusButtonType int type) {
mModel.set(StatusProperties.STATUS_BUTTON_TYPE, type);
public void setAnimationsEnabled(boolean enabled) {
mModel.set(StatusProperties.ANIMATIONS_ENABLED, enabled);
}
/**
......@@ -69,10 +73,26 @@ class StatusMediator {
}
/**
* Toggle animations of icon changes.
* Specify icon displayed by the security chip.
*/
public void setAnimationsEnabled(boolean enabled) {
mModel.set(StatusProperties.ANIMATIONS_ENABLED, enabled);
public void setSecurityIconResource(@DrawableRes int securityIcon) {
if (mSecurityIconRes == securityIcon) return;
mSecurityIconRes = securityIcon;
updateLocationBarIcon();
}
/**
* Specify tint of icon displayed by the security chip.
*/
public void setSecurityIconTint(@ColorRes int tintList) {
mModel.set(StatusProperties.SECURITY_ICON_TINT_RES, tintList);
}
/**
* Specify tint of icon displayed by the security chip.
*/
public void setSecurityIconDescription(@StringRes int desc) {
mModel.set(StatusProperties.SECURITY_ICON_DESCRIPTION_RES, desc);
}
/**
......@@ -82,6 +102,13 @@ class StatusMediator {
mSeparatorMinWidth = width;
}
/**
* Toggle tablet mode.
*/
public void setTabletMode(boolean isTablet) {
mTabletMode = isTablet;
}
/**
* Update unfocused location bar width to determine shape and content of the
* Status view.
......@@ -108,8 +135,11 @@ class StatusMediator {
* Report URL focus change.
*/
public void setUrlHasFocus(boolean urlHasFocus) {
if (mUrlHasFocus == urlHasFocus) return;
mUrlHasFocus = urlHasFocus;
updateStatusVisibility();
updateLocationBarIcon();
}
/**
......@@ -198,4 +228,30 @@ class StatusMediator {
if (textColor != 0) mModel.set(StatusProperties.VERBOSE_STATUS_TEXT_COLOR_RES, textColor);
}
/**
* Update selection of icon presented on the location bar.
*
* - Navigation button is:
* - shown only on large form factor devices (tablets and up),
* - shown only if URL is focused.
*
* - Security icon is:
* - shown only if specified,
* - not shown if URL is focused.
*/
private void updateLocationBarIcon() {
if (mUrlHasFocus && mTabletMode) {
mModel.set(StatusProperties.STATUS_BUTTON_TYPE, StatusButtonType.NAVIGATION_ICON);
return;
}
if (!mUrlHasFocus && mSecurityIconRes != 0) {
mModel.set(StatusProperties.SECURITY_ICON_RES, mSecurityIconRes);
mModel.set(StatusProperties.STATUS_BUTTON_TYPE, StatusButtonType.SECURITY_ICON);
return;
}
mModel.set(StatusProperties.STATUS_BUTTON_TYPE, StatusButtonType.NONE);
}
}
......@@ -23,6 +23,17 @@ class StatusProperties {
public static final WritableIntPropertyKey NAVIGATION_BUTTON_TYPE =
new WritableIntPropertyKey();
/** Specifies string resource holding content description for security icon. */
public static final WritableIntPropertyKey SECURITY_ICON_DESCRIPTION_RES =
new WritableIntPropertyKey();
/** Specifies resource displayed by security chip. */
public static final WritableIntPropertyKey SECURITY_ICON_RES = new WritableIntPropertyKey();
/** Specifies color tint list for icon displayed by security chip. */
public static final WritableIntPropertyKey SECURITY_ICON_TINT_RES =
new WritableIntPropertyKey();
/** Specifies status separator color. */
public static final WritableIntPropertyKey SEPARATOR_COLOR_RES = new WritableIntPropertyKey();
......@@ -46,8 +57,9 @@ class StatusProperties {
new WritableIntPropertyKey();
public static final PropertyKey[] ALL_KEYS = new PropertyKey[] {ANIMATIONS_ENABLED,
ICON_TINT_COLOR_RES, NAVIGATION_BUTTON_TYPE, SEPARATOR_COLOR_RES, STATUS_BUTTON_TYPE,
VERBOSE_STATUS_TEXT_COLOR_RES, VERBOSE_STATUS_TEXT_STRING_RES,
ICON_TINT_COLOR_RES, NAVIGATION_BUTTON_TYPE, SECURITY_ICON_RES,
SECURITY_ICON_DESCRIPTION_RES, SECURITY_ICON_TINT_RES, SEPARATOR_COLOR_RES,
STATUS_BUTTON_TYPE, VERBOSE_STATUS_TEXT_COLOR_RES, VERBOSE_STATUS_TEXT_STRING_RES,
VERBOSE_STATUS_TEXT_VISIBLE, VERBOSE_STATUS_TEXT_WIDTH};
private StatusProperties() {}
......
......@@ -11,10 +11,13 @@ import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.support.annotation.ColorRes;
import android.support.annotation.DrawableRes;
import android.support.annotation.IntDef;
import android.support.annotation.StringRes;
import android.support.v7.content.res.AppCompatResources;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageButton;
......@@ -58,17 +61,20 @@ public class StatusView extends LinearLayout {
int NAVIGATION_ICON = 2;
}
private View mLocationBarIcon;
private ImageView mNavigationButton;
private ImageButton mSecurityButton;
private TextView mVerboseStatusTextView;
private View mSeparatorView;
private View mStatusExtraSpace;
private View mLocationBarButtonContainer;
private boolean mAnimationsEnabled;
private StatusViewAnimator mLocationBarIconActiveAnimator;
private StatusViewAnimator mLocationBarSecurityButtonShowAnimator;
private StatusViewAnimator mLocationBarNavigationIconShowAnimator;
private StatusViewAnimator mLocationBarClearAnimator;
/**
* Class animating transition between FrameLayout children.
......@@ -79,7 +85,7 @@ public class StatusView extends LinearLayout {
private final class StatusViewAnimator {
private final AnimatorSet mAnimator;
// Target view that will be displayed at the end of animation.
private final View mTargetView;
private final View[] mTargetViews;
// Set of source views that should be made invisible at the end.
private final View[] mSourceViews;
......@@ -98,20 +104,35 @@ public class StatusView extends LinearLayout {
@Override
public void onAnimationStart(Animator animation) {
mTargetView.setVisibility(View.VISIBLE);
for (View target : mTargetViews) {
target.setVisibility(View.VISIBLE);
}
}
}
public StatusViewAnimator(View target, View... sources) {
public StatusViewAnimator(View[] targets, View[] sources) {
mAnimator = new AnimatorSet();
mTargetView = target;
mTargetViews = targets;
mSourceViews = sources;
AnimatorSet.Builder b =
mAnimator.play(ObjectAnimator.ofFloat(mTargetView, View.ALPHA, 1));
AnimatorSet.Builder b = null;
// Phase in these objects
for (View view : targets) {
if (b == null) {
b = mAnimator.play(ObjectAnimator.ofFloat(view, View.ALPHA, 1));
} else {
b.with(ObjectAnimator.ofFloat(view, View.ALPHA, 1));
}
}
// Phase out these objects
for (View view : sources) {
b.with(ObjectAnimator.ofFloat(view, View.ALPHA, 0));
if (b == null) {
b = mAnimator.play(ObjectAnimator.ofFloat(view, View.ALPHA, 0));
} else {
b.with(ObjectAnimator.ofFloat(view, View.ALPHA, 0));
}
}
mAnimator.addListener(new StatusViewAnimatorAdapter());
}
......@@ -139,6 +160,7 @@ public class StatusView extends LinearLayout {
mVerboseStatusTextView = findViewById(R.id.location_bar_verbose_status);
mSeparatorView = findViewById(R.id.location_bar_verbose_status_separator);
mStatusExtraSpace = findViewById(R.id.location_bar_verbose_status_extra_space);
mLocationBarIcon = findViewById(R.id.location_bar_icon);
assert mNavigationButton != null : "Missing navigation type view.";
configureLocationBarIconAnimations();
......@@ -146,12 +168,16 @@ public class StatusView extends LinearLayout {
void configureLocationBarIconAnimations() {
// Animation presenting Security button and hiding all others.
mLocationBarSecurityButtonShowAnimator =
new StatusViewAnimator(mSecurityButton, mNavigationButton);
mLocationBarSecurityButtonShowAnimator = new StatusViewAnimator(
new View[] {mSecurityButton}, new View[] {mNavigationButton});
// Animation presenting Navigation button and hiding all others.
mLocationBarNavigationIconShowAnimator =
new StatusViewAnimator(mNavigationButton, mSecurityButton);
mLocationBarNavigationIconShowAnimator = new StatusViewAnimator(
new View[] {mNavigationButton}, new View[] {mSecurityButton});
// Animation clearing up all location bar icons.
mLocationBarClearAnimator = new StatusViewAnimator(
new View[] {}, new View[] {mNavigationButton, mSecurityButton});
}
/**
......@@ -175,15 +201,18 @@ public class StatusView extends LinearLayout {
switch (type) {
case StatusButtonType.SECURITY_ICON:
mLocationBarIconActiveAnimator = mLocationBarSecurityButtonShowAnimator;
mLocationBarIcon.setVisibility(View.VISIBLE);
break;
case StatusButtonType.NAVIGATION_ICON:
mLocationBarIconActiveAnimator = mLocationBarNavigationIconShowAnimator;
mLocationBarIcon.setVisibility(View.VISIBLE);
break;
case StatusButtonType.NONE:
default:
mLocationBarIconActiveAnimator = null;
mNavigationButton.setVisibility(View.INVISIBLE);
mSecurityButton.setVisibility(View.INVISIBLE);
mLocationBarIconActiveAnimator = mLocationBarClearAnimator;
// TODO(ender): This call should only be invoked once animation completes. Fix
// animation system and hide the view once icons are invisible.
mLocationBarIcon.setVisibility(View.GONE);
return;
}
......@@ -198,6 +227,42 @@ public class StatusView extends LinearLayout {
mNavigationButton.setImageDrawable(image);
}
/**
* Specify security icon image.
*/
public void setSecurityIcon(@DrawableRes int imageRes) {
if (imageRes != 0) {
mSecurityButton.setImageResource(imageRes);
} else {
mSecurityButton.setImageDrawable(null);
}
}
/**
* Specify security icon tint color.
*/
public void setSecurityIconTint(@ColorRes int colorRes) {
// Note: There's no need to apply this each time icon changes:
// Subsequent calls to setImageDrawable will automatically
// mutate the drawable and apply the specified tint and tint mode.
ColorStateList list = null;
if (colorRes != 0) {
list = AppCompatResources.getColorStateList(getContext(), colorRes);
}
ApiCompatibilityUtils.setImageTintList(mSecurityButton, list);
}
/**
* Specify content description for security icon.
*/
public void setSecurityIconDescription(@StringRes int descriptionRes) {
String description = null;
if (descriptionRes != 0) {
description = getResources().getString(descriptionRes);
}
mSecurityButton.setContentDescription(description);
}
/**
* Select color of Separator view.
*/
......
......@@ -30,6 +30,13 @@ class StatusViewBinder implements ViewBinder<PropertyModel, StatusView, Property
|| StatusProperties.ICON_TINT_COLOR_RES.equals(propertyKey)) {
updateNavigationButtonType(view, model.get(StatusProperties.NAVIGATION_BUTTON_TYPE),
model.get(StatusProperties.ICON_TINT_COLOR_RES));
} else if (StatusProperties.SECURITY_ICON_RES.equals(propertyKey)) {
view.setSecurityIcon(model.get(StatusProperties.SECURITY_ICON_RES));
} else if (StatusProperties.SECURITY_ICON_TINT_RES.equals(propertyKey)) {
view.setSecurityIconTint(model.get(StatusProperties.SECURITY_ICON_TINT_RES));
} else if (StatusProperties.SECURITY_ICON_DESCRIPTION_RES.equals(propertyKey)) {
view.setSecurityIconDescription(
model.get(StatusProperties.SECURITY_ICON_DESCRIPTION_RES));
} else if (StatusProperties.SEPARATOR_COLOR_RES.equals(propertyKey)) {
view.setSeparatorColor(model.get(StatusProperties.SEPARATOR_COLOR_RES));
} else if (StatusProperties.VERBOSE_STATUS_TEXT_COLOR_RES.equals(propertyKey)) {
......
......@@ -8,10 +8,8 @@ import android.app.Activity;
import android.content.res.Resources;
import android.support.annotation.DrawableRes;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.modelutil.PropertyModel;
......@@ -30,16 +28,11 @@ public class StatusViewCoordinator implements View.OnClickListener {
private final boolean mIsTablet;
private final StatusView mStatusView;
private final StatusMediator mMediator;
private final PropertyModel mModel;
private ToolbarDataProvider mToolbarDataProvider;
private WindowAndroid mWindowAndroid;
// The type of the security icon currently active.
@DrawableRes
private int mSecurityIconResource;
@StatusButtonType
private int mStatusButtonType;
private boolean mUrlHasFocus;
/**
......@@ -51,15 +44,14 @@ public class StatusViewCoordinator implements View.OnClickListener {
mIsTablet = isTablet;
mStatusView = statusView;
PropertyModel model =
new PropertyModel.Builder(StatusProperties.ALL_KEYS)
.with(StatusProperties.ICON_TINT_COLOR_RES,
R.color.locationbar_status_separator_color)
.with(StatusProperties.STATUS_BUTTON_TYPE, StatusButtonType.NONE)
.build();
mModel = new PropertyModel.Builder(StatusProperties.ALL_KEYS)
.with(StatusProperties.ICON_TINT_COLOR_RES,
R.color.locationbar_status_separator_color)
.with(StatusProperties.STATUS_BUTTON_TYPE, StatusButtonType.NONE)
.build();
PropertyModelChangeProcessor.create(model, mStatusView, new StatusViewBinder());
mMediator = new StatusMediator(model);
PropertyModelChangeProcessor.create(mModel, mStatusView, new StatusViewBinder());
mMediator = new StatusMediator(mModel);
Resources res = mStatusView.getResources();
mMediator.setUrlMinWidth(res.getDimensionPixelSize(R.dimen.location_bar_min_url_width)
......@@ -73,11 +65,8 @@ public class StatusViewCoordinator implements View.OnClickListener {
mMediator.setVerboseStatusTextMinWidth(
res.getDimensionPixelSize(R.dimen.location_bar_min_verbose_status_text_width));
if (mIsTablet) {
mMediator.setNavigationButtonType(NavigationButtonType.PAGE);
}
mSecurityIconResource = 0;
mMediator.setTabletMode(mIsTablet);
mMediator.setNavigationButtonType(NavigationButtonType.PAGE);
}
/**
......@@ -112,9 +101,7 @@ public class StatusViewCoordinator implements View.OnClickListener {
public void onUrlFocusChange(boolean urlHasFocus) {
mMediator.setUrlHasFocus(urlHasFocus);
mUrlHasFocus = urlHasFocus;
changeLocationBarIcon();
updateVerboseStatusVisibility();
updateLocationBarIconContainerVisibility();
}
/**
......@@ -128,52 +115,17 @@ public class StatusViewCoordinator implements View.OnClickListener {
updateSecurityIcon();
}
@StatusButtonType
private int getLocationBarButtonToShow() {
// The navigation icon type is only applicable on tablets. While smaller form factors do
// not have an icon visible to the user when the URL is focused, BUTTON_TYPE_NONE is not
// returned as it will trigger an undesired jump during the animation as it attempts to
// hide the icon.
if (mUrlHasFocus && mIsTablet) return StatusButtonType.NAVIGATION_ICON;
return mToolbarDataProvider.getSecurityIconResource(mIsTablet) != 0
? StatusButtonType.SECURITY_ICON
: StatusButtonType.NONE;
}
private void changeLocationBarIcon() {
mStatusButtonType = getLocationBarButtonToShow();
mMediator.setStatusButtonType(mStatusButtonType);
}
/**
* Updates the security icon displayed in the LocationBar.
*/
public void updateSecurityIcon() {
@DrawableRes
int id = mToolbarDataProvider.getSecurityIconResource(mIsTablet);
if (id == 0) {
mStatusView.getSecurityButton().setImageDrawable(null);
} else {
// ImageView#setImageResource is no-op if given resource is the current one.
mStatusView.getSecurityButton().setImageResource(id);
ApiCompatibilityUtils.setImageTintList(mStatusView.getSecurityButton(),
mToolbarDataProvider.getSecurityIconColorStateList());
}
int contentDescriptionId = mToolbarDataProvider.getSecurityIconContentDescription();
String contentDescription = mStatusView.getContext().getString(contentDescriptionId);
mStatusView.getSecurityButton().setContentDescription(contentDescription);
mMediator.setSecurityIconResource(mToolbarDataProvider.getSecurityIconResource(mIsTablet));
mMediator.setSecurityIconTint(mToolbarDataProvider.getSecurityIconColorStateList());
mMediator.setSecurityIconDescription(
mToolbarDataProvider.getSecurityIconContentDescription());
// TODO(ender): drop these during final cleanup round.
updateVerboseStatusVisibility();
if (mSecurityIconResource == id && mStatusButtonType == getLocationBarButtonToShow()) {
return;
}
mSecurityIconResource = id;
changeLocationBarIcon();
updateLocationBarIconContainerVisibility();
}
/**
......@@ -188,7 +140,7 @@ public class StatusViewCoordinator implements View.OnClickListener {
*/
@VisibleForTesting
public boolean isSecurityButtonShown() {
return mStatusButtonType == StatusButtonType.SECURITY_ICON;
return mModel.get(StatusProperties.STATUS_BUTTON_TYPE) == StatusButtonType.SECURITY_ICON;
}
/**
......@@ -197,7 +149,7 @@ public class StatusViewCoordinator implements View.OnClickListener {
@VisibleForTesting
@DrawableRes
public int getSecurityIconResourceId() {
return mSecurityIconResource;
return mModel.get(StatusProperties.SECURITY_ICON_RES);
}
/**
......@@ -205,32 +157,15 @@ public class StatusViewCoordinator implements View.OnClickListener {
* @param buttonType The type of navigation button to be shown.
*/
public void setNavigationButtonType(@NavigationButtonType int buttonType) {
ImageView navigationButton = mStatusView.getNavigationButton();
// TODO(twellington): Return early if the navigation button type and tint hasn't changed.
if (!mIsTablet) return;
mMediator.setNavigationButtonType(buttonType);
ImageView navigationButton = mStatusView.getNavigationButton();
if (navigationButton.getVisibility() != View.VISIBLE) {
navigationButton.setVisibility(View.VISIBLE);
}
updateLocationBarIconContainerVisibility();
}
/**
* @param visible Whether the navigation button should be visible.
*/
public void setSecurityButtonVisibility(boolean visible) {
ImageButton securityButton = mStatusView.getSecurityButton();
if (!visible && securityButton.getVisibility() == View.VISIBLE) {
securityButton.setVisibility(View.GONE);
} else if (visible && securityButton.getVisibility() == View.GONE
&& securityButton.getDrawable() != null
&& securityButton.getDrawable().getIntrinsicWidth() > 0
&& securityButton.getDrawable().getIntrinsicHeight() > 0) {
securityButton.setVisibility(View.VISIBLE);
}
}
/**
......@@ -245,17 +180,6 @@ public class StatusViewCoordinator implements View.OnClickListener {
mMediator.setPageIsPreview(mToolbarDataProvider.isPreview());
}
/**
* Update the visibility of the location bar icon container based on the state of the
* security and navigation icons.
*/
protected void updateLocationBarIconContainerVisibility() {
@StatusButtonType
int buttonToShow = getLocationBarButtonToShow();
mStatusView.findViewById(R.id.location_bar_icon)
.setVisibility(buttonToShow != StatusButtonType.NONE ? View.VISIBLE : View.GONE);
}
/**
* Whether {@code v} is a view (location icon, verbose status, ...) which can be clicked to
* show the Page Info popup.
......
......@@ -4,7 +4,7 @@
package org.chromium.chrome.browser.searchwidget;
import android.content.res.ColorStateList;
import android.support.annotation.ColorRes;
import org.chromium.base.library_loader.LibraryLoader;
import org.chromium.chrome.browser.ntp.NewTabPage;
......@@ -104,8 +104,8 @@ class SearchBoxDataProvider implements ToolbarDataProvider {
}
@Override
public ColorStateList getSecurityIconColorStateList() {
return null;
public @ColorRes int getSecurityIconColorStateList() {
return 0;
}
@Override
......
......@@ -5,10 +5,9 @@
package org.chromium.chrome.browser.toolbar;
import android.content.Context;
import android.content.res.ColorStateList;
import android.support.annotation.ColorRes;
import android.support.annotation.DrawableRes;
import android.support.annotation.Nullable;
import android.support.v7.content.res.AppCompatResources;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
......@@ -397,44 +396,46 @@ public class LocationBarModel implements ToolbarDataProvider {
}
@Override
public ColorStateList getSecurityIconColorStateList() {
public @ColorRes int getSecurityIconColorStateList() {
int securityLevel = getSecurityLevel();
ColorStateList list = null;
int color = getPrimaryColor();
boolean needLightIcon = ColorUtils.shouldUseLightForegroundOnBackground(color);
if (isIncognito() || needLightIcon) {
// For a dark theme color, use light icons.
list = AppCompatResources.getColorStateList(mContext, R.color.light_mode_tint);
} else if (isPreview()) {
return R.color.light_mode_tint;
}
if (isPreview()) {
// There will never be a preview in incognito. Always use the darker color rather than
// incorporating with the block above.
list = AppCompatResources.getColorStateList(
mContext, R.color.locationbar_status_preview_color);
} else if (!hasTab() || isUsingBrandColor()
return R.color.locationbar_status_preview_color;
}
if (!hasTab() || isUsingBrandColor()
|| ChromeFeatureList.isEnabled(
ChromeFeatureList.OMNIBOX_HIDE_SCHEME_IN_STEADY_STATE)
ChromeFeatureList.OMNIBOX_HIDE_SCHEME_IN_STEADY_STATE)
|| ChromeFeatureList.isEnabled(
ChromeFeatureList.OMNIBOX_HIDE_TRIVIAL_SUBDOMAINS_IN_STEADY_STATE)) {
ChromeFeatureList.OMNIBOX_HIDE_TRIVIAL_SUBDOMAINS_IN_STEADY_STATE)) {
// For theme colors which are not dark and are also not
// light enough to warrant an opaque URL bar, use dark
// icons.
list = AppCompatResources.getColorStateList(mContext, R.color.dark_mode_tint);
} else {
return R.color.dark_mode_tint;
}
if (securityLevel == ConnectionSecurityLevel.DANGEROUS) {
// For the default toolbar color, use a green or red icon.
if (securityLevel == ConnectionSecurityLevel.DANGEROUS) {
assert !shouldDisplaySearchTerms();
list = AppCompatResources.getColorStateList(mContext, R.color.google_red_700);
} else if (!shouldDisplaySearchTerms()
&& (securityLevel == ConnectionSecurityLevel.SECURE
|| securityLevel == ConnectionSecurityLevel.EV_SECURE)) {
list = AppCompatResources.getColorStateList(mContext, R.color.google_green_700);
} else {
list = AppCompatResources.getColorStateList(mContext, R.color.dark_mode_tint);
}
assert !shouldDisplaySearchTerms();
return R.color.google_red_700;
}
assert list != null : "Missing ColorStateList for Security Button.";
return list;
if (!shouldDisplaySearchTerms()
&& (securityLevel == ConnectionSecurityLevel.SECURE
|| securityLevel == ConnectionSecurityLevel.EV_SECURE)) {
return R.color.google_green_700;
}
return R.color.dark_mode_tint;
}
@Override
......
......@@ -5,6 +5,7 @@
package org.chromium.chrome.browser.toolbar;
import android.content.res.ColorStateList;
import android.support.annotation.ColorRes;
import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
......@@ -124,7 +125,8 @@ public interface ToolbarDataProvider {
/**
* @return The {@link ColorStateList} to use to tint the security state icon.
*/
ColorStateList getSecurityIconColorStateList();
@ColorRes
int getSecurityIconColorStateList();
/**
* @return Whether or not we should display search terms instead of a URL for query in omnibox.
......
......@@ -23,6 +23,7 @@ import android.os.Build;
import android.support.annotation.Nullable;
import android.support.v4.text.BidiFormatter;
import android.support.v4.view.MarginLayoutParamsCompat;
import android.support.v7.content.res.AppCompatResources;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
......@@ -548,8 +549,9 @@ public class CustomTabToolbar
} else {
// ImageView#setImageResource is no-op if given resource is the current one.
mSecurityButton.setImageResource(securityIconResource);
ApiCompatibilityUtils.setImageTintList(
mSecurityButton, getToolbarDataProvider().getSecurityIconColorStateList());
ColorStateList colorStateList = AppCompatResources.getColorStateList(
getContext(), getToolbarDataProvider().getSecurityIconColorStateList());
ApiCompatibilityUtils.setImageTintList(mSecurityButton, colorStateList);
mAnimDelegate.showSecurityButton();
}
......
......@@ -13,6 +13,7 @@ import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.SystemClock;
import android.support.annotation.ColorRes;
import android.support.annotation.DrawableRes;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
......@@ -263,8 +264,8 @@ public abstract class ToolbarLayout extends FrameLayout {
}
@Override
public ColorStateList getSecurityIconColorStateList() {
return null;
public @ColorRes int getSecurityIconColorStateList() {
return 0;
}
@Override
......
......@@ -8,9 +8,9 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.ColorStateList;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.support.annotation.ColorRes;
import android.support.test.filters.SmallTest;
import android.view.ViewGroup;
......@@ -245,8 +245,8 @@ public class LocationBarVoiceRecognitionHandlerTest {
}
@Override
public ColorStateList getSecurityIconColorStateList() {
return null;
public @ColorRes int getSecurityIconColorStateList() {
return 0;
}
@Override
......
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