1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 package org.chromium.components.page_info;
6 
7 import android.content.Context;
8 import android.content.res.ColorStateList;
9 import android.util.AttributeSet;
10 import android.util.DisplayMetrics;
11 import android.view.LayoutInflater;
12 import android.widget.FrameLayout;
13 import android.widget.TextView;
14 
15 import androidx.annotation.ColorRes;
16 import androidx.annotation.DrawableRes;
17 import androidx.annotation.NonNull;
18 import androidx.annotation.Nullable;
19 
20 import org.chromium.base.ApiCompatibilityUtils;
21 import org.chromium.ui.base.ViewUtils;
22 import org.chromium.ui.widget.ChromeImageView;
23 
24 /**
25  * View showing an icon, title and subtitle for a page info row.
26  */
27 public class PageInfoRowView extends FrameLayout {
28     /**  Parameters to configure the row view. */
29     public static class ViewParams {
30         public boolean visible;
31         public @DrawableRes int iconResId;
32         public @ColorRes int iconTint;
33         public CharSequence title;
34         public CharSequence subtitle;
35         public Runnable clickCallback;
36         public boolean decreaseIconSize;
37     }
38 
39     private final ChromeImageView mIcon;
40     private final TextView mTitle;
41     private final TextView mSubtitle;
42 
PageInfoRowView(@onNull Context context, @Nullable AttributeSet attrs)43     public PageInfoRowView(@NonNull Context context, @Nullable AttributeSet attrs) {
44         super(context, attrs);
45         LayoutInflater.from(context).inflate(R.layout.page_info_row, this, true);
46         mIcon = findViewById(R.id.page_info_row_icon);
47         mTitle = findViewById(R.id.page_info_row_title);
48         mSubtitle = findViewById(R.id.page_info_row_subtitle);
49     }
50 
setParams(ViewParams params)51     public void setParams(ViewParams params) {
52         setVisibility(params.visible ? VISIBLE : GONE);
53         DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
54         mIcon.setImageResource(params.iconResId);
55         if (params.decreaseIconSize) {
56             // All icons are 24dp but some are effectively 20dp because fill the side with padding.
57             // Add 2dp padding for the images that are otherwise too large to make them
58             // equal size.
59             // TODO(crbug.com/1135124): Figure out why we have these differences.
60             int p = ViewUtils.dpToPx(displayMetrics, 2);
61             mIcon.setPadding(p, p, p, p);
62         }
63         ApiCompatibilityUtils.setImageTintList(mIcon,
64                 ColorStateList.valueOf(getResources().getColor(
65                         params.iconTint != 0 ? params.iconTint : R.color.default_icon_color)));
66 
67         mTitle.setText(params.title);
68         mTitle.setVisibility(params.title != null ? VISIBLE : GONE);
69         updateSubtitle(params.subtitle);
70         if (params.title != null && params.subtitle != null) {
71             mTitle.setPadding(0, 0, 0, ViewUtils.dpToPx(displayMetrics, 4));
72         }
73         if (params.clickCallback != null) {
74             setClickable(true);
75             setFocusable(true);
76             getChildAt(0).setOnClickListener((v) -> params.clickCallback.run());
77         }
78     }
79 
updateSubtitle(CharSequence subtitle)80     public void updateSubtitle(CharSequence subtitle) {
81         mSubtitle.setText(subtitle);
82         mSubtitle.setVisibility(subtitle != null ? VISIBLE : GONE);
83     }
84 }
85