ContactListPinnedHeaderView.java revision 08c87460331cbab92e94d96b704bd8f713a65202
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.contacts.list; 18 19import com.android.contacts.R; 20 21import android.content.Context; 22import android.content.res.TypedArray; 23import android.graphics.Color; 24import android.graphics.Typeface; 25import android.text.TextUtils; 26import android.util.AttributeSet; 27import android.util.TypedValue; 28import android.view.Gravity; 29import android.view.View; 30import android.view.ViewGroup; 31import android.widget.TextView; 32 33/** 34 * A custom view for the pinned section header shown at the top of the contact list. 35 */ 36public class ContactListPinnedHeaderView extends ViewGroup { 37 38 protected final Context mContext; 39 40 private final int mHeaderTextColor; 41 private final int mHeaderTextIndent; 42 private final int mHeaderTextSize; 43 private final int mHeaderUnderlineHeight; 44 private final int mHeaderUnderlineColor; 45 private final int mPaddingRight; 46 private final int mPaddingLeft; 47 private final int mContactsCountTextColor; 48 private final int mCountViewTextSize; 49 50 private int mHeaderBackgroundHeight; 51 private TextView mHeaderTextView; 52 private TextView mCountTextView = null; 53 private View mHeaderDivider; 54 55 public ContactListPinnedHeaderView(Context context, AttributeSet attrs) { 56 super(context, attrs); 57 mContext = context; 58 59 TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ContactListItemView); 60 61 mHeaderTextIndent = a.getDimensionPixelOffset( 62 R.styleable.ContactListItemView_list_item_header_text_indent, 0); 63 mHeaderTextColor = a.getColor( 64 R.styleable.ContactListItemView_list_item_header_text_color, Color.BLACK); 65 mHeaderTextSize = a.getDimensionPixelSize( 66 R.styleable.ContactListItemView_list_item_header_text_size, 12); 67 mHeaderUnderlineHeight = a.getDimensionPixelSize( 68 R.styleable.ContactListItemView_list_item_header_underline_height, 1); 69 mHeaderUnderlineColor = a.getColor( 70 R.styleable.ContactListItemView_list_item_header_underline_color, 0); 71 mHeaderBackgroundHeight = a.getDimensionPixelSize( 72 R.styleable.ContactListItemView_list_item_header_height, 30); 73 mPaddingLeft = a.getDimensionPixelOffset( 74 R.styleable.ContactListItemView_list_item_padding_left, 0); 75 mPaddingRight = a.getDimensionPixelOffset( 76 R.styleable.ContactListItemView_list_item_padding_right, 0); 77 mContactsCountTextColor = a.getColor( 78 R.styleable.ContactListItemView_list_item_contacts_count_text_color, Color.BLACK); 79 mCountViewTextSize = (int)a.getDimensionPixelSize( 80 R.styleable.ContactListItemView_list_item_contacts_count_text_size, 12); 81 82 a.recycle(); 83 84 mHeaderTextView = new TextView(mContext); 85 mHeaderTextView.setTextColor(mHeaderTextColor); 86 mHeaderTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mHeaderTextSize); 87 mHeaderTextView.setTypeface(mHeaderTextView.getTypeface(), Typeface.BOLD); 88 mHeaderTextView.setGravity(Gravity.CENTER_VERTICAL); 89 addView(mHeaderTextView); 90 mHeaderDivider = new View(mContext); 91 mHeaderDivider.setBackgroundColor(mHeaderUnderlineColor); 92 addView(mHeaderDivider); 93 } 94 95 @Override 96 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 97 98 // We will match parent's width and wrap content vertically. 99 int width = resolveSize(0, widthMeasureSpec); 100 101 mHeaderTextView.measure( 102 MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), 103 MeasureSpec.makeMeasureSpec(mHeaderBackgroundHeight, MeasureSpec.EXACTLY)); 104 if (isViewMeasurable(mCountTextView)) { 105 mCountTextView.measure( 106 MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), 107 MeasureSpec.makeMeasureSpec(mHeaderBackgroundHeight, MeasureSpec.EXACTLY)); 108 } 109 110 setMeasuredDimension(width, mHeaderBackgroundHeight + mHeaderUnderlineHeight); 111 } 112 113 @Override 114 protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 115 int width = right - left - mPaddingRight; 116 117 mHeaderTextView.layout(mHeaderTextIndent + mPaddingLeft, 118 0, 119 mHeaderTextView.getMeasuredWidth() + mHeaderTextIndent + mPaddingLeft, 120 mHeaderBackgroundHeight); 121 122 if (isViewMeasurable(mCountTextView)) { 123 mCountTextView.layout(width - mPaddingRight - mCountTextView.getMeasuredWidth(), 124 0, 125 width - mPaddingRight, 126 mHeaderBackgroundHeight); 127 } 128 129 mHeaderDivider.layout(mPaddingLeft, 130 mHeaderBackgroundHeight, 131 width, 132 mHeaderBackgroundHeight + mHeaderUnderlineHeight); 133 } 134 135 /** 136 * Sets section header or makes it invisible if the title is null. 137 */ 138 public void setSectionHeader(String title) { 139 if (!TextUtils.isEmpty(title)) { 140 mHeaderTextView.setText(title); 141 mHeaderTextView.setVisibility(View.VISIBLE); 142 mHeaderDivider.setVisibility(View.VISIBLE); 143 } else { 144 mHeaderTextView.setVisibility(View.GONE); 145 mHeaderDivider.setVisibility(View.GONE); 146 } 147 } 148 149 @Override 150 public void requestLayout() { 151 // We will assume that once measured this will not need to resize 152 // itself, so there is no need to pass the layout request to the parent 153 // view (ListView). 154 forceLayout(); 155 } 156 157 public void setCountView(String count) { 158 if (mCountTextView == null) { 159 mCountTextView = new TextView(mContext); 160 mCountTextView.setTextColor(mContactsCountTextColor); 161 mCountTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mCountViewTextSize); 162 mCountTextView.setGravity(Gravity.CENTER_VERTICAL); 163 addView(mCountTextView); 164 } 165 mCountTextView.setText(count); 166 if (count == null || count.isEmpty()) { 167 mCountTextView.setVisibility(View.GONE); 168 } else { 169 mCountTextView.setVisibility(View.VISIBLE); 170 } 171 } 172 173 private boolean isViewMeasurable(View view) { 174 return (view != null && view.getVisibility() == View.VISIBLE); 175 } 176} 177