1bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio/*
2bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * Copyright (C) 2014 The Android Open Source Project
3bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio *
4bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * Licensed under the Apache License, Version 2.0 (the "License");
5bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * you may not use this file except in compliance with the License.
6bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * You may obtain a copy of the License at
7bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio *
8bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio *      http://www.apache.org/licenses/LICENSE-2.0
9bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio *
10bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * Unless required by applicable law or agreed to in writing, software
11bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * distributed under the License is distributed on an "AS IS" BASIS,
12bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * See the License for the specific language governing permissions and
14bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * limitations under the License.
15bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio */
16bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
17bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Megliopackage android.widget;
18bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
19bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglioimport android.content.Context;
20bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglioimport android.content.res.Resources;
21bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglioimport android.content.res.TypedArray;
22bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglioimport android.graphics.Canvas;
23bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglioimport android.graphics.Paint;
24bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglioimport android.graphics.Typeface;
25bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglioimport android.util.AttributeSet;
26bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
27bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglioimport com.android.internal.R;
28bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
29bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglioclass TextViewWithCircularIndicator extends TextView {
30bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
31bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    private static final int SELECTED_CIRCLE_ALPHA = 60;
32bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
33bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    private final Paint mCirclePaint = new Paint();
34bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
35bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    private final String mItemIsSelectedText;
36bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    private int mCircleColor;
37bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    private boolean mDrawIndicator;
38bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
39bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    public TextViewWithCircularIndicator(Context context) {
40bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        this(context, null);
41bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    }
42bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
43bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    public TextViewWithCircularIndicator(Context context, AttributeSet attrs) {
44bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        this(context, attrs, 0);
45bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    }
46bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
47bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    public TextViewWithCircularIndicator(Context context, AttributeSet attrs, int defStyleAttr) {
48bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        this(context, attrs, defStyleAttr, 0);
49bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    }
50bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
51bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    public TextViewWithCircularIndicator(Context context, AttributeSet attrs,
52bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio            int defStyleAttr, int defStyleRes) {
53bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        super(context, attrs);
5460727e07c6ef72e2f494266939c02494a3df28f8Alan Viverette
55bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
56bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        // Use Theme attributes if possible
57bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        final TypedArray a = mContext.obtainStyledAttributes(attrs,
58bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio                R.styleable.DatePicker, defStyleAttr, defStyleRes);
5960727e07c6ef72e2f494266939c02494a3df28f8Alan Viverette        final int resId = a.getResourceId(R.styleable.DatePicker_yearListItemTextAppearance, -1);
60bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        if (resId != -1) {
61bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio            setTextAppearance(context, resId);
62bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        }
63bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
6460727e07c6ef72e2f494266939c02494a3df28f8Alan Viverette        final Resources res = context.getResources();
65bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        mItemIsSelectedText = res.getString(R.string.item_is_selected);
66bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
67bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        a.recycle();
68bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
69bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        init();
70bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    }
71bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
72bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    private void init() {
73bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        mCirclePaint.setTypeface(Typeface.create(mCirclePaint.getTypeface(), Typeface.BOLD));
74bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        mCirclePaint.setAntiAlias(true);
75bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        mCirclePaint.setTextAlign(Paint.Align.CENTER);
76bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        mCirclePaint.setStyle(Paint.Style.FILL);
77bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    }
78bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
79bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    public void setCircleColor(int color) {
80bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        if (color != mCircleColor) {
81bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio            mCircleColor = color;
82bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio            mCirclePaint.setColor(mCircleColor);
83bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio            mCirclePaint.setAlpha(SELECTED_CIRCLE_ALPHA);
84bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio            requestLayout();
85bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        }
86bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    }
87bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
88bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    public void setDrawIndicator(boolean drawIndicator) {
89bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        mDrawIndicator = drawIndicator;
90bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    }
91bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
92bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    @Override
93bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    public void onDraw(Canvas canvas) {
94bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        super.onDraw(canvas);
95bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        if (mDrawIndicator) {
96bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio            final int width = getWidth();
97bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio            final int height = getHeight();
98bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio            int radius = Math.min(width, height) / 2;
99bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio            canvas.drawCircle(width / 2, height / 2, radius, mCirclePaint);
100bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        }
101bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    }
102bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
103bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    @Override
104bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    public CharSequence getContentDescription() {
105bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        CharSequence itemText = getText();
106bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        if (mDrawIndicator) {
107bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio            return String.format(mItemIsSelectedText, itemText);
108bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        } else {
109bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio            return itemText;
110bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        }
111bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    }
112bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio}