ColorChipView.java revision 980d530f002b335916e8b31662e50a94b43cae18
1056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson/*
2056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * Copyright (C) 2011 The Android Open Source Project
3056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson *
4056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * Licensed under the Apache License, Version 2.0 (the "License");
5056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * you may not use this file except in compliance with the License.
6056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * You may obtain a copy of the License at
7056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson *
8056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson *      http://www.apache.org/licenses/LICENSE-2.0
9056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson *
10056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * Unless required by applicable law or agreed to in writing, software
11056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * distributed under the License is distributed on an "AS IS" BASIS,
12056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * See the License for the specific language governing permissions and
14056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * limitations under the License.
15056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson */
16056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
17056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonpackage com.android.calendar;
18056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
19056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonimport android.content.Context;
20980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelsonimport android.graphics.BitmapFactory;
21056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonimport android.graphics.Canvas;
22056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonimport android.graphics.Paint;
23056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonimport android.graphics.Paint.Style;
24980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelsonimport android.graphics.drawable.BitmapDrawable;
25056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonimport android.graphics.drawable.Drawable;
26980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelsonimport android.graphics.Shader.TileMode;
27980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelsonimport android.graphics.PorterDuff;
28056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonimport android.util.AttributeSet;
29056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonimport android.util.Log;
30056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonimport android.view.View;
31056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
32056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
33056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
34056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
35056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson/**
36056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * A custom view for a color chip for an event that can be drawn differently
37056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * accroding to the event's status.
38056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson *
39056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson */
40056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonpublic class ColorChipView extends View {
41056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
42056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    private static final String TAG = "ColorChipView";
43056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    // Style of drawing
44056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    // Full rectangle for accepted events
45056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    // Border for tentative events
46056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    // Cross-hatched with 50% transparency for declined events
47056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
48980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson    public static final int DRAW_FULL = 0;
49980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson    public static final int DRAW_BORDER = 1;
50980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson    public static final int DRAW_CROSS_HATCHED = 2;
51056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
52980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson    private static final float DECLINED_ALPHA = (float) 0.4;
53980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson    private static final float DEFAULT_ALPHA = 1;
54056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
55056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    int mDrawStyle = DRAW_FULL;
56056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
57980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson    private static final int DEF_BORDER_WIDTH = 4;
58056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
59056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    int mBorderWidth = DEF_BORDER_WIDTH;
60056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
61056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    int mColor;
62980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson    BitmapDrawable mCrosshatchedPattern;
63056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
64056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    public ColorChipView(Context context) {
65056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson        super(context);
66980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson        init(context);
67056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    }
68056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
69056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    public ColorChipView(Context context, AttributeSet attrs) {
70056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson        super(context, attrs);
71980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson        init(context);
72056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    }
73056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
74056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    public void setDrawStyle(int style) {
75056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson        if (style != DRAW_FULL && style != DRAW_BORDER && style != DRAW_CROSS_HATCHED) {
76056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson            return;
77056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson        }
78056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson        mDrawStyle = style;
79980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson        if (style == DRAW_CROSS_HATCHED) {
80980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson            mCrosshatchedPattern.setColorFilter(mColor, PorterDuff.Mode.OVERLAY);
81980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson            setBackgroundDrawable(mCrosshatchedPattern);
82980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson            setAlpha(DECLINED_ALPHA);
83980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson        } else {
84980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson            setBackgroundDrawable(null);
85980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson            setAlpha(DEFAULT_ALPHA);
86980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson        }
87d002bd24937d9c0823f283884961adc2c902558eIsaac Katzenelson        invalidate();
88056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    }
89056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
90056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    public void setBorderWidth(int width) {
91056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson        if (width >= 0) {
92056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson            mBorderWidth = width;
93d002bd24937d9c0823f283884961adc2c902558eIsaac Katzenelson            invalidate();
94056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson        }
95056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    }
96056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
97056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    public void setColor(int color) {
98056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson        mColor = color;
99980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson        mCrosshatchedPattern.setColorFilter(mColor, PorterDuff.Mode.OVERLAY);
100d002bd24937d9c0823f283884961adc2c902558eIsaac Katzenelson        invalidate();
101056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    }
102056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
103980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson    private void init(Context c) {
104980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson        mCrosshatchedPattern = new BitmapDrawable(BitmapFactory.decodeResource(getResources(),
105980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson                R.drawable.event_bg_declined));
106980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson        mCrosshatchedPattern.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
107980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson    }
108980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson
109056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    @Override
110056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    public void onDraw(Canvas c) {
111056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
112056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson        int right = getWidth() - 1;
113056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson        int bottom = getHeight() - 1;
114056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson        Paint p = new Paint();
115056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson        p.setColor(mColor);
116056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson        p.setStyle(Style.FILL_AND_STROKE);
117056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
118056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson        switch (mDrawStyle) {
119056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson            case DRAW_FULL:
120056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                c.drawRect(0, 0, right, bottom, p);
121056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                break;
122056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson            case DRAW_BORDER:
123056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                if (mBorderWidth <= 0) {
124056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                    return;
125056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                }
126980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson                int halfBorderWidth = mBorderWidth / 2;
127056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                int top = halfBorderWidth;
128056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                int left = halfBorderWidth;
129056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                p.setStrokeWidth(mBorderWidth);
130056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson
131980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson                float[] lines = new float[16];
132056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                int ptr = 0;
133056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                lines [ptr++] = 0;
134056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                lines [ptr++] = top;
135056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                lines [ptr++] = right;
136056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                lines [ptr++] = top;
137056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                lines [ptr++] = 0;
138056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                lines [ptr++] = bottom - halfBorderWidth;
139056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                lines [ptr++] = right;
140056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                lines [ptr++] = bottom - halfBorderWidth;
141056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                lines [ptr++] = left;
142056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                lines [ptr++] = 0;
143056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                lines [ptr++] = left;
144056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                lines [ptr++] = bottom;
145056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                lines [ptr++] = right - halfBorderWidth;
146056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                lines [ptr++] = 0;
147056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                lines [ptr++] = right - halfBorderWidth;
148056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                lines [ptr++] = bottom;
149056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                c.drawLines(lines, p);
150056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                break;
151056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson            default:
152980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson                // Don't need to do anything for DRAW_CROSS_HATCHED since the
153980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson                // pattern is already set in the background drawable in "setStyle"
154056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson                break;
155056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson        }
156056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson    }
157056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson}
158