blob: 20c3667bf0f4bcd31446470184592309b54229ed [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.v7.widget;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.annotation.Nullable;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v4.widget.CompoundButtonCompat;
import android.support.v7.appcompat.R;
import android.support.v7.graphics.drawable.DrawableUtils;
import android.support.v7.internal.widget.TintManager;
import android.util.AttributeSet;
import android.widget.CompoundButton;
class AppCompatCompoundButtonHelper {
private final CompoundButton mView;
private final TintManager mTintManager;
private ColorStateList mButtonTintList = null;
private PorterDuff.Mode mButtonTintMode = null;
private boolean mHasButtonTint = false;
private boolean mHasButtonTintMode = false;
private boolean mSkipNextApply;
/**
* Interface which allows us to directly set a button, bypass any calls back to ourselves.
*/
interface DirectSetButtonDrawableInterface {
void setButtonDrawable(Drawable buttonDrawable);
}
AppCompatCompoundButtonHelper(CompoundButton view, TintManager tintManager) {
mView = view;
mTintManager = tintManager;
}
void loadFromAttributes(AttributeSet attrs, int defStyleAttr) {
TypedArray a = mView.getContext().obtainStyledAttributes(attrs, R.styleable.CompoundButton,
defStyleAttr, 0);
try {
if (a.hasValue(R.styleable.CompoundButton_android_button)) {
final int resourceId = a.getResourceId(
R.styleable.CompoundButton_android_button, 0);
if (resourceId != 0) {
mView.setButtonDrawable(mTintManager.getDrawable(resourceId));
}
}
if (a.hasValue(R.styleable.CompoundButton_buttonTint)) {
CompoundButtonCompat.setButtonTintList(mView,
a.getColorStateList(R.styleable.CompoundButton_buttonTint));
}
if (a.hasValue(R.styleable.CompoundButton_buttonTintMode)) {
CompoundButtonCompat.setButtonTintMode(mView,
DrawableUtils.parseTintMode(
a.getInt(R.styleable.CompoundButton_buttonTintMode, -1),
null));
}
} finally {
a.recycle();
}
}
void setSupportButtonTintList(ColorStateList tint) {
mButtonTintList = tint;
mHasButtonTint = true;
applyButtonTint();
}
ColorStateList getSupportButtonTintList() {
return mButtonTintList;
}
void setSupportButtonTintMode(@Nullable PorterDuff.Mode tintMode) {
mButtonTintMode = tintMode;
mHasButtonTintMode = true;
applyButtonTint();
}
PorterDuff.Mode getSupportButtonTintMode() {
return mButtonTintMode;
}
void onSetButtonDrawable() {
if (mSkipNextApply) {
mSkipNextApply = false;
return;
}
mSkipNextApply = true;
applyButtonTint();
}
void applyButtonTint() {
Drawable buttonDrawable = CompoundButtonCompat.getButtonDrawable(mView);
if (buttonDrawable != null && (mHasButtonTint || mHasButtonTintMode)) {
buttonDrawable = DrawableCompat.wrap(buttonDrawable);
buttonDrawable = buttonDrawable.mutate();
if (mHasButtonTint) {
DrawableCompat.setTintList(buttonDrawable, mButtonTintList);
}
if (mHasButtonTintMode) {
DrawableCompat.setTintMode(buttonDrawable, mButtonTintMode);
}
// The drawable (or one of its children) may not have been
// stateful before applying the tint, so let's try again.
if (buttonDrawable.isStateful()) {
buttonDrawable.setState(mView.getDrawableState());
}
mView.setButtonDrawable(buttonDrawable);
}
}
int getCompoundPaddingLeft(int superValue) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
// Before JB-MR1 the button drawable wasn't taken into account for padding. We'll
// workaround that here
Drawable buttonDrawable = CompoundButtonCompat.getButtonDrawable(mView);
if (buttonDrawable != null) {
superValue += buttonDrawable.getIntrinsicWidth();
}
}
return superValue;
}
}