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