blob: 554ecb824d339e9872be4472de06b666450b904d [file] [log] [blame]
/*
* Copyright (C) 2015 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 android.support.design.widget;
import android.content.res.ColorStateList;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Outline;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
/**
* Lollipop version of {@link CircularBorderDrawable} which accepts tint calls.
*/
class CircularBorderDrawableLollipop extends CircularBorderDrawable {
private ColorStateList mTint;
private PorterDuff.Mode mTintMode = PorterDuff.Mode.SRC_IN;
private PorterDuffColorFilter mTintFilter;
@Override
public void draw(Canvas canvas) {
boolean clearColorFilter;
if (mTintFilter != null && mPaint.getColorFilter() == null) {
mPaint.setColorFilter(mTintFilter);
clearColorFilter = true;
} else {
clearColorFilter = false;
}
super.draw(canvas);
if (clearColorFilter) {
mPaint.setColorFilter(null);
}
}
@Override
public void setTintList(ColorStateList tint) {
mTint = tint;
mTintFilter = updateTintFilter(tint, mTintMode);
invalidateSelf();
}
@Override
public void setTintMode(PorterDuff.Mode tintMode) {
mTintMode = tintMode;
mTintFilter = updateTintFilter(mTint, tintMode);
invalidateSelf();
}
@Override
public void getOutline(Outline outline) {
copyBounds(mRect);
outline.setOval(mRect);
}
/**
* Ensures the tint filter is consistent with the current tint color and
* mode.
*/
private PorterDuffColorFilter updateTintFilter(ColorStateList tint, PorterDuff.Mode tintMode) {
if (tint == null || tintMode == null) {
return null;
}
final int color = tint.getColorForState(getState(), Color.TRANSPARENT);
return new PorterDuffColorFilter(color, tintMode);
}
}