CircularBorderDrawableLollipop.java revision 80de0674c28a2bd9ade11f24a3b0e46ea83b6847
180de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes/*
280de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * Copyright (C) 2015 The Android Open Source Project
380de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes *
480de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * Licensed under the Apache License, Version 2.0 (the "License");
580de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * you may not use this file except in compliance with the License.
680de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * You may obtain a copy of the License at
780de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes *
880de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes *      http://www.apache.org/licenses/LICENSE-2.0
980de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes *
1080de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * Unless required by applicable law or agreed to in writing, software
1180de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * distributed under the License is distributed on an "AS IS" BASIS,
1280de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1380de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * See the License for the specific language governing permissions and
1480de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * limitations under the License.
1580de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes */
1680de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes
1780de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banespackage android.support.design.widget;
1880de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes
1980de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes
2080de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banesimport android.content.res.ColorStateList;
2180de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banesimport android.graphics.Canvas;
2280de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banesimport android.graphics.Color;
2380de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banesimport android.graphics.PorterDuff;
2480de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banesimport android.graphics.PorterDuffColorFilter;
2580de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes
2680de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes/**
2780de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes * Lollipop version of {@link CircularBorderDrawable} which accepts tint calls.
2880de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes */
2980de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banesclass CircularBorderDrawableLollipop extends CircularBorderDrawable {
3080de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes
3180de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes    private ColorStateList mTint;
3280de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes    private PorterDuff.Mode mTintMode = PorterDuff.Mode.SRC_IN;
3380de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes    private PorterDuffColorFilter mTintFilter;
3480de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes
3580de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes    @Override
3680de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes    public void draw(Canvas canvas) {
3780de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes        boolean clearColorFilter;
3880de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes        if (mTintFilter != null && mPaint.getColorFilter() == null) {
3980de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes            mPaint.setColorFilter(mTintFilter);
4080de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes            clearColorFilter = true;
4180de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes        } else {
4280de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes            clearColorFilter = false;
4380de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes        }
4480de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes
4580de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes        super.draw(canvas);
4680de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes
4780de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes        if (clearColorFilter) {
4880de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes            mPaint.setColorFilter(null);
4980de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes        }
5080de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes    }
5180de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes
5280de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes    @Override
5380de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes    public void setTintList(ColorStateList tint) {
5480de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes        mTint = tint;
5580de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes        mTintFilter = updateTintFilter(tint, mTintMode);
5680de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes        invalidateSelf();
5780de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes    }
5880de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes
5980de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes    @Override
6080de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes    public void setTintMode(PorterDuff.Mode tintMode) {
6180de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes        mTintMode = tintMode;
6280de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes        mTintFilter = updateTintFilter(mTint, tintMode);
6380de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes        invalidateSelf();
6480de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes    }
6580de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes
6680de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes    /**
6780de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes     * Ensures the tint filter is consistent with the current tint color and
6880de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes     * mode.
6980de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes     */
7080de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes    private PorterDuffColorFilter updateTintFilter(ColorStateList tint, PorterDuff.Mode tintMode) {
7180de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes        if (tint == null || tintMode == null) {
7280de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes            return null;
7380de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes        }
7480de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes
7580de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes        final int color = tint.getColorForState(getState(), Color.TRANSPARENT);
7680de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes        return new PorterDuffColorFilter(color, tintMode);
7780de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes    }
7880de0674c28a2bd9ade11f24a3b0e46ea83b6847Chris Banes}
79