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