blob: e7d19f95f03077351acc40479ec710eef27005b1 [file] [log] [blame]
// Copyright 2019 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.chrome.browser.tasks.tab_management;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.LinearLayout;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.chrome.tab_ui.R;
import org.chromium.components.browser_ui.widget.text.TemplatePreservingTextView;
import org.chromium.ui.widget.ButtonCompat;
import org.chromium.ui.widget.ChromeImageView;
import java.lang.ref.WeakReference;
/**
* Represents a secondary card view in Grid Tab Switcher. The view contains an icon, a description,
* an action button for acceptance, and a close button for dismissal.
*/
class MessageCardView extends LinearLayout {
private static WeakReference<Bitmap> sCloseButtonBitmapWeakRef;
/**
* An interface to get the icon to be shown inside the message card.
*/
public interface IconProvider { Drawable getIconDrawable(); }
/**
* An interface to handle the review action.
*/
public interface ReviewActionProvider { void review(); }
/**
* An interface to handle the dismiss action.
*/
public interface DismissActionProvider {
void dismiss(@MessageService.MessageType int messageType);
}
private ChromeImageView mIcon;
private TemplatePreservingTextView mDescription;
private ButtonCompat mActionButton;
private ChromeImageView mCloseButton;
public MessageCardView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mIcon = findViewById(R.id.icon);
mDescription = findViewById(R.id.description);
mActionButton = findViewById(R.id.action_button);
mCloseButton = findViewById(R.id.close_button);
if (sCloseButtonBitmapWeakRef == null || sCloseButtonBitmapWeakRef.get() == null) {
int closeButtonSize =
(int) getResources().getDimension(R.dimen.tab_grid_close_button_size);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.btn_close);
sCloseButtonBitmapWeakRef = new WeakReference<>(
Bitmap.createScaledBitmap(bitmap, closeButtonSize, closeButtonSize, true));
}
mCloseButton.setImageBitmap(sCloseButtonBitmapWeakRef.get());
}
/**
* @see TemplatePreservingTextView#setTemplate(String), setDescriptionText() must be called
* after calling this method for the new template text to take effect.
*/
void setDescriptionTextTemplate(String template) {
mDescription.setTemplate(template);
}
/**
* @see TemplatePreservingTextView#setText(CharSequence).
*/
void setDescriptionText(CharSequence text) {
mDescription.setText(text);
}
/**
* Set action text for the action button.
* @param actionText Text to be displayed.
*/
void setActionText(String actionText) {
mActionButton.setText(actionText);
}
/**
* Set icon drawable.
* @param iconDrawable Drawable to be shown.
*/
void setIcon(Drawable iconDrawable) {
mIcon.setImageDrawable(iconDrawable);
}
/**
* Set click listener for the action button.
* @param listener {@link android.view.View.OnClickListener} for the action button.
*/
void setActionButtonOnClickListener(OnClickListener listener) {
mActionButton.setOnClickListener(listener);
}
/**
* Set content description for dismiss button.
* @param description The content description.
*/
void setDismissButtonContentDescription(String description) {
mCloseButton.setContentDescription(description);
}
/**
* Set {@link android.view.View.OnClickListener} for dismiss button.
* @param listener {@link android.view.View.OnClickListener} to set.
*/
void setDismissButtonOnClickListener(OnClickListener listener) {
mCloseButton.setOnClickListener(listener);
}
/**
* Modify the view based on the visibility of the icon. For messages that doesn't have an icon,
* remove the icon and update the margin of the description text field.
* @param visible Whether icon is visible.
*/
void setIconVisibility(boolean visible) {
MarginLayoutParams params = (MarginLayoutParams) mDescription.getLayoutParams();
if (visible) {
if (indexOfChild(mIcon) == -1) {
addView(mIcon, 0);
params.setMargins(0, 0, 0, 0);
}
} else {
int margin = (int) getContext().getResources().getDimension(
R.dimen.tab_grid_iph_item_description_margin);
removeView(mIcon);
params.setMargins(margin, 0, 0, 0);
}
}
/**
* Set background resource.
* @param isIncognito Whether the resource is used for incognito mode.
*/
private void setBackground(boolean isIncognito) {
setBackgroundResource(TabUiThemeProvider.getMessageCardBackgroundResourceId(isIncognito));
}
/**
* Set text appearance for description.
* @param isIncognito Whether the text appearance is used for incognito mode.
*/
private void setDescriptionTextAppearance(boolean isIncognito) {
ApiCompatibilityUtils.setTextAppearance(mDescription,
TabUiThemeProvider.getMessageCardDescriptionTextAppearance(isIncognito));
}
/**
* Set text appearance for action button.
* @param isIncognito Whether the text appearance is used for incognito mode.
*/
private void setActionButtonTextAppearance(boolean isIncognito) {
ApiCompatibilityUtils.setTextAppearance(mActionButton,
TabUiThemeProvider.getMessageCardActionButtonTextAppearance(isIncognito));
}
/**
* Set tint for close button.
* @param isIncognito Whether the tint is used for incognito mode.
*/
private void setCloseButtonTint(boolean isIncognito) {
ApiCompatibilityUtils.setImageTintList(mCloseButton,
TabUiThemeProvider.getMessageCardCloseButtonTintList(
mCloseButton.getContext(), isIncognito));
}
/**
* Update Message Card when switching between normal mode and incognito mode.
* @param isIncognito Whether it is in the incognito mode.
*/
void updateMessageCardColor(boolean isIncognito) {
setBackground(isIncognito);
setDescriptionTextAppearance(isIncognito);
setActionButtonTextAppearance(isIncognito);
// TODO(crbug.com/1139194): Set action button ripple color.
setCloseButtonTint(isIncognito);
}
}