[WebLayer] Reuse Chrome's InfoBarCompactLayout.java
//chrome's InfoBarCompactLayout.java has been componentized and //weblayer can now use it directly rather than a custom fork. This CL makes that change. The only differences in the //weblayer version were the following: - It had brought in the createCloseButton() implementation from //chrome's InfoBarLayout.java as InfoBarLayout.java wasn't brought into //weblayer for the initial implementation. The componentized InfoBarCompactLayout.java calls the now-componentized InfoBarLayout.java directly. The implementations are identical. - It forked a string resource; this CL undoes that forking. Again, the values of the resource were identical. There is no functional change. Bug: 1099169 Change-Id: Idefdf0c0726f79512f10cc82ddc93ffd453f7dc4 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2265994 Reviewed-by: Clark DuVall <cduvall@chromium.org> Commit-Queue: Colin Blundell <blundell@chromium.org> Cr-Commit-Position: refs/heads/master@{#782989}
This commit is contained in:

committed by
Commit Bot

parent
20117cbeed
commit
43f72917f8
weblayer/browser/java
@@ -96,7 +96,6 @@ android_library("java") {
|
|||||||
"org/chromium/weblayer_private/FragmentWindowAndroid.java",
|
"org/chromium/weblayer_private/FragmentWindowAndroid.java",
|
||||||
"org/chromium/weblayer_private/FullscreenCallbackProxy.java",
|
"org/chromium/weblayer_private/FullscreenCallbackProxy.java",
|
||||||
"org/chromium/weblayer_private/InfoBar.java",
|
"org/chromium/weblayer_private/InfoBar.java",
|
||||||
"org/chromium/weblayer_private/InfoBarCompactLayout.java",
|
|
||||||
"org/chromium/weblayer_private/InfoBarContainer.java",
|
"org/chromium/weblayer_private/InfoBarContainer.java",
|
||||||
"org/chromium/weblayer_private/InfoBarContainerLayout.java",
|
"org/chromium/weblayer_private/InfoBarContainerLayout.java",
|
||||||
"org/chromium/weblayer_private/InfoBarContainerView.java",
|
"org/chromium/weblayer_private/InfoBarContainerView.java",
|
||||||
@@ -249,6 +248,7 @@ android_library("test_java") {
|
|||||||
":java",
|
":java",
|
||||||
":weblayer_test_resources",
|
":weblayer_test_resources",
|
||||||
"//base:jni_java",
|
"//base:jni_java",
|
||||||
|
"//components/infobars/android:java",
|
||||||
"//components/location/android:location_java",
|
"//components/location/android:location_java",
|
||||||
"//components/permissions/android:java",
|
"//components/permissions/android:java",
|
||||||
"//content/public/test/android:content_java_test_support",
|
"//content/public/test/android:content_java_test_support",
|
||||||
|
@@ -16,6 +16,7 @@ import org.chromium.base.annotations.CalledByNative;
|
|||||||
import org.chromium.base.annotations.JNINamespace;
|
import org.chromium.base.annotations.JNINamespace;
|
||||||
import org.chromium.base.annotations.NativeMethods;
|
import org.chromium.base.annotations.NativeMethods;
|
||||||
import org.chromium.chrome.browser.infobar.InfoBarIdentifier;
|
import org.chromium.chrome.browser.infobar.InfoBarIdentifier;
|
||||||
|
import org.chromium.components.infobars.InfoBarCompactLayout;
|
||||||
import org.chromium.components.infobars.InfoBarInteractionHandler;
|
import org.chromium.components.infobars.InfoBarInteractionHandler;
|
||||||
import org.chromium.components.infobars.InfoBarLayout;
|
import org.chromium.components.infobars.InfoBarLayout;
|
||||||
import org.chromium.ui.modelutil.PropertyModel;
|
import org.chromium.ui.modelutil.PropertyModel;
|
||||||
|
@@ -1,238 +0,0 @@
|
|||||||
// Copyright 2017 The Chromium Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
package org.chromium.weblayer_private;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.ColorStateList;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.content.res.TypedArray;
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import android.text.SpannableString;
|
|
||||||
import android.text.SpannableStringBuilder;
|
|
||||||
import android.text.Spanned;
|
|
||||||
import android.text.method.LinkMovementMethod;
|
|
||||||
import android.view.Gravity;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.ImageButton;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.LinearLayout;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.ColorRes;
|
|
||||||
import androidx.annotation.StringRes;
|
|
||||||
import androidx.appcompat.content.res.AppCompatResources;
|
|
||||||
|
|
||||||
import org.chromium.base.ApiCompatibilityUtils;
|
|
||||||
import org.chromium.base.Callback;
|
|
||||||
import org.chromium.components.infobars.InfoBarInteractionHandler;
|
|
||||||
import org.chromium.components.infobars.InfoBarLayout;
|
|
||||||
import org.chromium.components.infobars.InfoBarMessageView;
|
|
||||||
import org.chromium.ui.text.NoUnderlineClickableSpan;
|
|
||||||
import org.chromium.ui.widget.ChromeImageButton;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Lays out controls along a line, sandwiched between an (optional) icon and close button.
|
|
||||||
* This should only be used by the {@link InfoBar} class, and is created when the InfoBar subclass
|
|
||||||
* declares itself to be using a compact layout via {@link InfoBar#usesCompactLayout}.
|
|
||||||
*/
|
|
||||||
public class InfoBarCompactLayout extends LinearLayout implements View.OnClickListener {
|
|
||||||
private final InfoBarInteractionHandler mInfoBar;
|
|
||||||
private final int mCompactInfoBarSize;
|
|
||||||
private final int mIconWidth;
|
|
||||||
private final View mCloseButton;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a compat layout for the specified infobar.
|
|
||||||
* @param context The context used to render.
|
|
||||||
* @param infoBar {@link InfoBarInteractionHandler} that listens to events.
|
|
||||||
* @param iconResourceId Resource ID of the icon to use for the infobar.
|
|
||||||
* @param iconTintId The {@link ColorRes} used as tint for {@code iconResourceId}.
|
|
||||||
* @param iconBitmap Bitmap for the icon to use, if {@code iconResourceId} is not set.
|
|
||||||
*/
|
|
||||||
// TODO(crbug/1056346): ctor is made public to allow access from InfoBar. Once
|
|
||||||
// InfoBar is modularized, restore access to package private.
|
|
||||||
public InfoBarCompactLayout(Context context, InfoBarInteractionHandler infoBar,
|
|
||||||
int iconResourceId, @ColorRes int iconTintId, Bitmap iconBitmap) {
|
|
||||||
super(context);
|
|
||||||
mInfoBar = infoBar;
|
|
||||||
mCompactInfoBarSize =
|
|
||||||
context.getResources().getDimensionPixelOffset(R.dimen.infobar_compact_size);
|
|
||||||
mIconWidth = context.getResources().getDimensionPixelOffset(R.dimen.infobar_big_icon_size);
|
|
||||||
|
|
||||||
setOrientation(LinearLayout.HORIZONTAL);
|
|
||||||
setGravity(Gravity.CENTER_VERTICAL);
|
|
||||||
|
|
||||||
prepareIcon(iconResourceId, iconTintId, iconBitmap);
|
|
||||||
mCloseButton = prepareCloseButton();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onClick(View view) {
|
|
||||||
if (view.getId() == R.id.infobar_close_button) {
|
|
||||||
mInfoBar.onCloseButtonClicked();
|
|
||||||
} else {
|
|
||||||
assert false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inserts a view before the close button.
|
|
||||||
* @param view View to insert.
|
|
||||||
* @param weight Weight to assign to it.
|
|
||||||
*/
|
|
||||||
// TODO(crbug/1056346): addContent is made public to allow access from InfoBar. Once
|
|
||||||
// InfoBar is modularized, restore access to protected.
|
|
||||||
public void addContent(View view, float weight) {
|
|
||||||
LinearLayout.LayoutParams params;
|
|
||||||
if (weight <= 0.0f) {
|
|
||||||
params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, mCompactInfoBarSize);
|
|
||||||
} else {
|
|
||||||
params = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, weight);
|
|
||||||
}
|
|
||||||
view.setMinimumHeight(mCompactInfoBarSize);
|
|
||||||
params.gravity = Gravity.BOTTOM;
|
|
||||||
addView(view, indexOfChild(mCloseButton), params);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds an icon to the start of the infobar, if the infobar requires one.
|
|
||||||
* @param iconResourceId Resource ID of the icon to use.
|
|
||||||
* @param iconTintId The {@link ColorRes} used as tint for {@code iconResourceId}.
|
|
||||||
* @param iconBitmap Raw {@link Bitmap} to use instead of a resource.
|
|
||||||
*/
|
|
||||||
private void prepareIcon(int iconResourceId, @ColorRes int iconTintId, Bitmap iconBitmap) {
|
|
||||||
ImageView iconView =
|
|
||||||
InfoBarLayout.createIconView(getContext(), iconResourceId, iconTintId, iconBitmap);
|
|
||||||
if (iconView != null) {
|
|
||||||
LinearLayout.LayoutParams iconParams =
|
|
||||||
new LinearLayout.LayoutParams(mIconWidth, mCompactInfoBarSize);
|
|
||||||
addView(iconView, iconParams);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a close button that can be inserted into an infobar.
|
|
||||||
* NOTE: This was forked from //chrome's InfoBarLayout.java, as WebLayer supports only compact
|
|
||||||
* infobars and does not have a corresponding InfoBarLayout.java.
|
|
||||||
* @param context Context to grab resources from.
|
|
||||||
* @return {@link ImageButton} that represents a close button.
|
|
||||||
*/
|
|
||||||
static ImageButton createCloseButton(Context context) {
|
|
||||||
final ColorStateList tint =
|
|
||||||
AppCompatResources.getColorStateList(context, R.color.default_icon_color);
|
|
||||||
TypedArray a =
|
|
||||||
context.obtainStyledAttributes(new int[] {android.R.attr.selectableItemBackground});
|
|
||||||
Drawable closeButtonBackground = a.getDrawable(0);
|
|
||||||
a.recycle();
|
|
||||||
|
|
||||||
ChromeImageButton closeButton = new ChromeImageButton(context);
|
|
||||||
closeButton.setId(R.id.infobar_close_button);
|
|
||||||
closeButton.setImageResource(R.drawable.btn_close);
|
|
||||||
ApiCompatibilityUtils.setImageTintList(closeButton, tint);
|
|
||||||
closeButton.setBackground(closeButtonBackground);
|
|
||||||
closeButton.setContentDescription(context.getString(R.string.weblayer_infobar_close));
|
|
||||||
closeButton.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
|
|
||||||
|
|
||||||
return closeButton;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Adds a close button to the end of the infobar. */
|
|
||||||
private View prepareCloseButton() {
|
|
||||||
ImageButton closeButton = createCloseButton(getContext());
|
|
||||||
closeButton.setOnClickListener(this);
|
|
||||||
LinearLayout.LayoutParams closeParams =
|
|
||||||
new LinearLayout.LayoutParams(mCompactInfoBarSize, mCompactInfoBarSize);
|
|
||||||
addView(closeButton, closeParams);
|
|
||||||
return closeButton;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helps building a standard message to display in a compact InfoBar. The message can feature
|
|
||||||
* a link to perform and action from this infobar.
|
|
||||||
*/
|
|
||||||
public static class MessageBuilder {
|
|
||||||
private final InfoBarCompactLayout mLayout;
|
|
||||||
private CharSequence mMessage;
|
|
||||||
private CharSequence mLink;
|
|
||||||
|
|
||||||
/** @param layout The layout we are building a message view for. */
|
|
||||||
public MessageBuilder(InfoBarCompactLayout layout) {
|
|
||||||
mLayout = layout;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MessageBuilder withText(CharSequence message) {
|
|
||||||
assert mMessage == null;
|
|
||||||
mMessage = message;
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MessageBuilder withText(@StringRes int messageResId) {
|
|
||||||
assert mMessage == null;
|
|
||||||
mMessage = mLayout.getResources().getString(messageResId);
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Appends a link after the main message, its displayed text being the specified string. */
|
|
||||||
public MessageBuilder withLink(CharSequence label, Callback<View> onTapCallback) {
|
|
||||||
assert mLink == null;
|
|
||||||
|
|
||||||
final Resources resources = mLayout.getResources();
|
|
||||||
SpannableString link = new SpannableString(label);
|
|
||||||
link.setSpan(new NoUnderlineClickableSpan(resources, onTapCallback), 0, label.length(),
|
|
||||||
Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
|
|
||||||
mLink = link;
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Appends a link after the main message, its displayed text being constructed from the
|
|
||||||
* given resource ID.
|
|
||||||
*/
|
|
||||||
public MessageBuilder withLink(@StringRes int textResId, Callback<View> onTapCallback) {
|
|
||||||
final Resources resources = mLayout.getResources();
|
|
||||||
String label = resources.getString(textResId);
|
|
||||||
return withLink(label, onTapCallback);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Finalizes the message view as set up in the builder and inserts it into the layout. */
|
|
||||||
public void buildAndInsert() {
|
|
||||||
mLayout.addContent(build(), 1f);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Finalizes the message view as set up in the builder. The caller is responsible for adding
|
|
||||||
* it to the parent layout.
|
|
||||||
*/
|
|
||||||
public View build() {
|
|
||||||
// TODO(dgn): Should be able to handle ReaderMode and Survey infobars but they have non
|
|
||||||
// standard interaction models (no button/link, whole bar is a button) or style (large
|
|
||||||
// rather than default text). Revisit after snowflake review.
|
|
||||||
|
|
||||||
assert mMessage != null;
|
|
||||||
|
|
||||||
final int messagePadding = mLayout.getResources().getDimensionPixelOffset(
|
|
||||||
R.dimen.infobar_compact_message_vertical_padding);
|
|
||||||
|
|
||||||
SpannableStringBuilder builder = new SpannableStringBuilder();
|
|
||||||
builder.append(mMessage);
|
|
||||||
if (mLink != null) builder.append(" ").append(mLink);
|
|
||||||
|
|
||||||
TextView prompt = new InfoBarMessageView(mLayout.getContext());
|
|
||||||
ApiCompatibilityUtils.setTextAppearance(
|
|
||||||
prompt, R.style.TextAppearance_TextMedium_Primary);
|
|
||||||
prompt.setText(builder);
|
|
||||||
prompt.setGravity(Gravity.CENTER_VERTICAL);
|
|
||||||
prompt.setPadding(0, messagePadding, 0, messagePadding);
|
|
||||||
|
|
||||||
if (mLink != null) prompt.setMovementMethod(LinkMovementMethod.getInstance());
|
|
||||||
|
|
||||||
return prompt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -20,6 +20,7 @@ import org.chromium.base.annotations.CalledByNative;
|
|||||||
import org.chromium.base.annotations.JNINamespace;
|
import org.chromium.base.annotations.JNINamespace;
|
||||||
import org.chromium.base.annotations.NativeMethods;
|
import org.chromium.base.annotations.NativeMethods;
|
||||||
import org.chromium.base.metrics.RecordHistogram;
|
import org.chromium.base.metrics.RecordHistogram;
|
||||||
|
import org.chromium.components.infobars.InfoBarCompactLayout;
|
||||||
import org.chromium.ui.widget.Toast;
|
import org.chromium.ui.widget.Toast;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -9,9 +9,9 @@ import androidx.annotation.VisibleForTesting;
|
|||||||
import org.chromium.base.annotations.CalledByNative;
|
import org.chromium.base.annotations.CalledByNative;
|
||||||
import org.chromium.base.annotations.JNINamespace;
|
import org.chromium.base.annotations.JNINamespace;
|
||||||
import org.chromium.base.annotations.NativeMethods;
|
import org.chromium.base.annotations.NativeMethods;
|
||||||
|
import org.chromium.components.infobars.InfoBarCompactLayout;
|
||||||
import org.chromium.content_public.browser.WebContents;
|
import org.chromium.content_public.browser.WebContents;
|
||||||
import org.chromium.weblayer_private.InfoBar;
|
import org.chromium.weblayer_private.InfoBar;
|
||||||
import org.chromium.weblayer_private.InfoBarCompactLayout;
|
|
||||||
import org.chromium.weblayer_private.TabImpl;
|
import org.chromium.weblayer_private.TabImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -175,9 +175,6 @@
|
|||||||
<message name="IDS_WEBLAYER_BOTTOM_BAR_SCREEN_POSITION" desc="Accessibility label to inform users about the InfoBar location">
|
<message name="IDS_WEBLAYER_BOTTOM_BAR_SCREEN_POSITION" desc="Accessibility label to inform users about the InfoBar location">
|
||||||
Options available near bottom of the screen
|
Options available near bottom of the screen
|
||||||
</message>
|
</message>
|
||||||
<message name="IDS_WEBLAYER_INFOBAR_CLOSE" desc="Accessibility label for the dismiss infobar Button">
|
|
||||||
Close
|
|
||||||
</message>
|
|
||||||
<!-- TranslateInfoBar -->
|
<!-- TranslateInfoBar -->
|
||||||
<message name="IDS_TRANSLATE_INFOBAR_ERROR">
|
<message name="IDS_TRANSLATE_INFOBAR_ERROR">
|
||||||
Oops. This page could not be translated.
|
Oops. This page could not be translated.
|
||||||
|
Reference in New Issue
Block a user