/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.contacts.list;
import com.android.contacts.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Typeface;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
/**
* A custom view for the pinned section header shown at the top of the contact list.
*/
public class ContactListPinnedHeaderView extends ViewGroup {
protected final Context mContext;
private final int mHeaderTextColor;
private final int mHeaderTextIndent;
private final int mHeaderTextSize;
private final int mHeaderUnderlineHeight;
private final int mHeaderUnderlineColor;
private final int mPaddingRight;
private final int mPaddingLeft;
private final int mContactsCountTextColor;
private final int mCountViewTextSize;
private int mHeaderBackgroundHeight;
private TextView mHeaderTextView;
private TextView mCountTextView = null;
private View mHeaderDivider;
public ContactListPinnedHeaderView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ContactListItemView);
mHeaderTextIndent = a.getDimensionPixelOffset(
R.styleable.ContactListItemView_list_item_header_text_indent, 0);
mHeaderTextColor = a.getColor(
R.styleable.ContactListItemView_list_item_header_text_color, Color.BLACK);
mHeaderTextSize = a.getDimensionPixelSize(
R.styleable.ContactListItemView_list_item_header_text_size, 12);
mHeaderUnderlineHeight = a.getDimensionPixelSize(
R.styleable.ContactListItemView_list_item_header_underline_height, 1);
mHeaderUnderlineColor = a.getColor(
R.styleable.ContactListItemView_list_item_header_underline_color, 0);
mHeaderBackgroundHeight = a.getDimensionPixelSize(
R.styleable.ContactListItemView_list_item_header_height, 30);
mPaddingLeft = a.getDimensionPixelOffset(
R.styleable.ContactListItemView_list_item_padding_left, 0);
mPaddingRight = a.getDimensionPixelOffset(
R.styleable.ContactListItemView_list_item_padding_right, 0);
mContactsCountTextColor = a.getColor(
R.styleable.ContactListItemView_list_item_contacts_count_text_color, Color.BLACK);
mCountViewTextSize = (int)a.getDimensionPixelSize(
R.styleable.ContactListItemView_list_item_contacts_count_text_size, 12);
a.recycle();
mHeaderTextView = new TextView(mContext);
mHeaderTextView.setTextColor(mHeaderTextColor);
mHeaderTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mHeaderTextSize);
mHeaderTextView.setTypeface(mHeaderTextView.getTypeface(), Typeface.BOLD);
mHeaderTextView.setGravity(Gravity.CENTER_VERTICAL);
mHeaderTextView.setAllCaps(true);
addView(mHeaderTextView);
mHeaderDivider = new View(mContext);
mHeaderDivider.setBackgroundColor(mHeaderUnderlineColor);
addView(mHeaderDivider);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// We will match parent's width and wrap content vertically.
int width = resolveSize(0, widthMeasureSpec);
mHeaderTextView.measure(
MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST),
MeasureSpec.makeMeasureSpec(mHeaderBackgroundHeight, MeasureSpec.EXACTLY));
if (isViewMeasurable(mCountTextView)) {
mCountTextView.measure(
MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST),
MeasureSpec.makeMeasureSpec(mHeaderBackgroundHeight, MeasureSpec.EXACTLY));
}
setMeasuredDimension(width, mHeaderBackgroundHeight + mHeaderUnderlineHeight);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
int width = right - left;
// Take into account left and right padding when laying out the below views.
mHeaderTextView.layout(mHeaderTextIndent + mPaddingLeft,
0,
mHeaderTextView.getMeasuredWidth() + mHeaderTextIndent + mPaddingLeft,
mHeaderBackgroundHeight);
if (isViewMeasurable(mCountTextView)) {
mCountTextView.layout(width - mPaddingRight - mCountTextView.getMeasuredWidth(),
0,
width - mPaddingRight,
mHeaderBackgroundHeight);
}
mHeaderDivider.layout(mPaddingLeft,
mHeaderBackgroundHeight,
width - mPaddingRight,
mHeaderBackgroundHeight + mHeaderUnderlineHeight);
}
/**
* Sets section header or makes it invisible if the title is null.
*/
public void setSectionHeader(String title) {
if (!TextUtils.isEmpty(title)) {
mHeaderTextView.setText(title);
mHeaderTextView.setVisibility(View.VISIBLE);
mHeaderDivider.setVisibility(View.VISIBLE);
} else {
mHeaderTextView.setVisibility(View.GONE);
mHeaderDivider.setVisibility(View.GONE);
}
}
@Override
public void requestLayout() {
// We will assume that once measured this will not need to resize
// itself, so there is no need to pass the layout request to the parent
// view (ListView).
forceLayout();
}
public void setCountView(String count) {
if (mCountTextView == null) {
mCountTextView = new TextView(mContext);
mCountTextView.setTextColor(mContactsCountTextColor);
mCountTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mCountViewTextSize);
mCountTextView.setGravity(Gravity.CENTER_VERTICAL);
addView(mCountTextView);
}
mCountTextView.setText(count);
if (count == null || count.isEmpty()) {
mCountTextView.setVisibility(View.GONE);
} else {
mCountTextView.setVisibility(View.VISIBLE);
}
}
private boolean isViewMeasurable(View view) {
return (view != null && view.getVisibility() == View.VISIBLE);
}
}