191051468dbc273da8d7e7608640e833a71d011e2Maurice Lam/* 291051468dbc273da8d7e7608640e833a71d011e2Maurice Lam * Copyright (C) 2015 The Android Open Source Project 391051468dbc273da8d7e7608640e833a71d011e2Maurice Lam * 491051468dbc273da8d7e7608640e833a71d011e2Maurice Lam * Licensed under the Apache License, Version 2.0 (the "License"); 591051468dbc273da8d7e7608640e833a71d011e2Maurice Lam * you may not use this file except in compliance with the License. 691051468dbc273da8d7e7608640e833a71d011e2Maurice Lam * You may obtain a copy of the License at 791051468dbc273da8d7e7608640e833a71d011e2Maurice Lam * 891051468dbc273da8d7e7608640e833a71d011e2Maurice Lam * http://www.apache.org/licenses/LICENSE-2.0 991051468dbc273da8d7e7608640e833a71d011e2Maurice Lam * 1091051468dbc273da8d7e7608640e833a71d011e2Maurice Lam * Unless required by applicable law or agreed to in writing, software 1191051468dbc273da8d7e7608640e833a71d011e2Maurice Lam * distributed under the License is distributed on an "AS IS" BASIS, 1291051468dbc273da8d7e7608640e833a71d011e2Maurice Lam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1391051468dbc273da8d7e7608640e833a71d011e2Maurice Lam * See the License for the specific language governing permissions and 1491051468dbc273da8d7e7608640e833a71d011e2Maurice Lam * limitations under the License. 1591051468dbc273da8d7e7608640e833a71d011e2Maurice Lam */ 1691051468dbc273da8d7e7608640e833a71d011e2Maurice Lam 1791051468dbc273da8d7e7608640e833a71d011e2Maurice Lampackage com.android.setupwizardlib.view; 1891051468dbc273da8d7e7608640e833a71d011e2Maurice Lam 1991051468dbc273da8d7e7608640e833a71d011e2Maurice Lamimport android.content.Context; 2091051468dbc273da8d7e7608640e833a71d011e2Maurice Lamimport android.content.res.ColorStateList; 21e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lamimport android.graphics.PorterDuff; 2291051468dbc273da8d7e7608640e833a71d011e2Maurice Lamimport android.graphics.drawable.Drawable; 23e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lamimport android.graphics.drawable.LayerDrawable; 2491051468dbc273da8d7e7608640e833a71d011e2Maurice Lamimport android.os.Build; 2591051468dbc273da8d7e7608640e833a71d011e2Maurice Lamimport android.util.AttributeSet; 2691051468dbc273da8d7e7608640e833a71d011e2Maurice Lamimport android.widget.Button; 2791051468dbc273da8d7e7608640e833a71d011e2Maurice Lam 2891051468dbc273da8d7e7608640e833a71d011e2Maurice Lampublic class NavigationBarButton extends Button { 2991051468dbc273da8d7e7608640e833a71d011e2Maurice Lam 3091051468dbc273da8d7e7608640e833a71d011e2Maurice Lam public NavigationBarButton(Context context) { 3191051468dbc273da8d7e7608640e833a71d011e2Maurice Lam super(context); 3291051468dbc273da8d7e7608640e833a71d011e2Maurice Lam init(); 3391051468dbc273da8d7e7608640e833a71d011e2Maurice Lam } 3491051468dbc273da8d7e7608640e833a71d011e2Maurice Lam 3591051468dbc273da8d7e7608640e833a71d011e2Maurice Lam public NavigationBarButton(Context context, AttributeSet attrs) { 3691051468dbc273da8d7e7608640e833a71d011e2Maurice Lam super(context, attrs); 3791051468dbc273da8d7e7608640e833a71d011e2Maurice Lam init(); 3891051468dbc273da8d7e7608640e833a71d011e2Maurice Lam } 3991051468dbc273da8d7e7608640e833a71d011e2Maurice Lam 4091051468dbc273da8d7e7608640e833a71d011e2Maurice Lam private void init() { 4191051468dbc273da8d7e7608640e833a71d011e2Maurice Lam // Unfortunately, drawableStart and drawableEnd set through XML does not call the setter, 4291051468dbc273da8d7e7608640e833a71d011e2Maurice Lam // so manually getting it and wrapping it in the compat drawable. 4391051468dbc273da8d7e7608640e833a71d011e2Maurice Lam if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 4491051468dbc273da8d7e7608640e833a71d011e2Maurice Lam Drawable[] drawables = getCompoundDrawablesRelative(); 4591051468dbc273da8d7e7608640e833a71d011e2Maurice Lam for (int i = 0; i < drawables.length; i++) { 4691051468dbc273da8d7e7608640e833a71d011e2Maurice Lam if (drawables[i] != null) { 47e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam drawables[i] = TintedDrawable.wrap(drawables[i].mutate()); 4891051468dbc273da8d7e7608640e833a71d011e2Maurice Lam } 4991051468dbc273da8d7e7608640e833a71d011e2Maurice Lam } 5091051468dbc273da8d7e7608640e833a71d011e2Maurice Lam setCompoundDrawablesRelativeWithIntrinsicBounds(drawables[0], drawables[1], 5191051468dbc273da8d7e7608640e833a71d011e2Maurice Lam drawables[2], drawables[3]); 5291051468dbc273da8d7e7608640e833a71d011e2Maurice Lam } 5391051468dbc273da8d7e7608640e833a71d011e2Maurice Lam } 5491051468dbc273da8d7e7608640e833a71d011e2Maurice Lam 5591051468dbc273da8d7e7608640e833a71d011e2Maurice Lam @Override 5691051468dbc273da8d7e7608640e833a71d011e2Maurice Lam public void setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom) { 57e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam if (left != null) left = TintedDrawable.wrap(left.mutate()); 58e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam if (top != null) top = TintedDrawable.wrap(top.mutate()); 59e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam if (right != null) right = TintedDrawable.wrap(right.mutate()); 60e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam if (bottom != null) bottom = TintedDrawable.wrap(bottom.mutate()); 6191051468dbc273da8d7e7608640e833a71d011e2Maurice Lam super.setCompoundDrawables(left, top, right, bottom); 6291051468dbc273da8d7e7608640e833a71d011e2Maurice Lam tintDrawables(); 6391051468dbc273da8d7e7608640e833a71d011e2Maurice Lam } 6491051468dbc273da8d7e7608640e833a71d011e2Maurice Lam 6591051468dbc273da8d7e7608640e833a71d011e2Maurice Lam @Override 6691051468dbc273da8d7e7608640e833a71d011e2Maurice Lam public void setCompoundDrawablesRelative(Drawable start, Drawable top, Drawable end, 6791051468dbc273da8d7e7608640e833a71d011e2Maurice Lam Drawable bottom) { 68e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam if (start != null) start = TintedDrawable.wrap(start.mutate()); 69e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam if (top != null) top = TintedDrawable.wrap(top.mutate()); 70e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam if (end != null) end = TintedDrawable.wrap(end.mutate()); 71e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam if (bottom != null) bottom = TintedDrawable.wrap(bottom.mutate()); 7291051468dbc273da8d7e7608640e833a71d011e2Maurice Lam super.setCompoundDrawablesRelative(start, top, end, bottom); 7391051468dbc273da8d7e7608640e833a71d011e2Maurice Lam tintDrawables(); 7491051468dbc273da8d7e7608640e833a71d011e2Maurice Lam } 7591051468dbc273da8d7e7608640e833a71d011e2Maurice Lam 7691051468dbc273da8d7e7608640e833a71d011e2Maurice Lam @Override 7791051468dbc273da8d7e7608640e833a71d011e2Maurice Lam public void setTextColor(ColorStateList colors) { 7891051468dbc273da8d7e7608640e833a71d011e2Maurice Lam super.setTextColor(colors); 7991051468dbc273da8d7e7608640e833a71d011e2Maurice Lam tintDrawables(); 8091051468dbc273da8d7e7608640e833a71d011e2Maurice Lam } 8191051468dbc273da8d7e7608640e833a71d011e2Maurice Lam 8291051468dbc273da8d7e7608640e833a71d011e2Maurice Lam private void tintDrawables() { 8391051468dbc273da8d7e7608640e833a71d011e2Maurice Lam final ColorStateList textColors = getTextColors(); 8491051468dbc273da8d7e7608640e833a71d011e2Maurice Lam if (textColors != null) { 8591051468dbc273da8d7e7608640e833a71d011e2Maurice Lam for (Drawable drawable : getAllCompoundDrawables()) { 86e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam if (drawable instanceof TintedDrawable) { 87e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam ((TintedDrawable) drawable).setTintListCompat(textColors); 8891051468dbc273da8d7e7608640e833a71d011e2Maurice Lam } 8991051468dbc273da8d7e7608640e833a71d011e2Maurice Lam } 9091051468dbc273da8d7e7608640e833a71d011e2Maurice Lam invalidate(); 9191051468dbc273da8d7e7608640e833a71d011e2Maurice Lam } 9291051468dbc273da8d7e7608640e833a71d011e2Maurice Lam } 9391051468dbc273da8d7e7608640e833a71d011e2Maurice Lam 9491051468dbc273da8d7e7608640e833a71d011e2Maurice Lam private Drawable[] getAllCompoundDrawables() { 9591051468dbc273da8d7e7608640e833a71d011e2Maurice Lam Drawable[] drawables = new Drawable[6]; 9691051468dbc273da8d7e7608640e833a71d011e2Maurice Lam Drawable[] compoundDrawables = getCompoundDrawables(); 9791051468dbc273da8d7e7608640e833a71d011e2Maurice Lam drawables[0] = compoundDrawables[0]; // left 9891051468dbc273da8d7e7608640e833a71d011e2Maurice Lam drawables[1] = compoundDrawables[1]; // top 9991051468dbc273da8d7e7608640e833a71d011e2Maurice Lam drawables[2] = compoundDrawables[2]; // right 10091051468dbc273da8d7e7608640e833a71d011e2Maurice Lam drawables[3] = compoundDrawables[3]; // bottom 10191051468dbc273da8d7e7608640e833a71d011e2Maurice Lam if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 10291051468dbc273da8d7e7608640e833a71d011e2Maurice Lam Drawable[] compoundDrawablesRelative = getCompoundDrawablesRelative(); 10391051468dbc273da8d7e7608640e833a71d011e2Maurice Lam drawables[4] = compoundDrawablesRelative[0]; // start 10491051468dbc273da8d7e7608640e833a71d011e2Maurice Lam drawables[5] = compoundDrawablesRelative[2]; // end 10591051468dbc273da8d7e7608640e833a71d011e2Maurice Lam } 10691051468dbc273da8d7e7608640e833a71d011e2Maurice Lam return drawables; 10791051468dbc273da8d7e7608640e833a71d011e2Maurice Lam } 108e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam 109e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam // TODO: Remove this class and use DrawableCompat.wrap() once we can use support library 22.1.0 110e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam // or above 111e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam private static class TintedDrawable extends LayerDrawable { 112e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam 113e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam public static TintedDrawable wrap(Drawable drawable) { 114e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam if (drawable instanceof TintedDrawable) { 115e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam return (TintedDrawable) drawable; 116e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam } 117e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam return new TintedDrawable(drawable); 118e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam } 119e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam 120e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam private ColorStateList mTintList = null; 121e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam 122e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam public TintedDrawable(Drawable wrapped) { 123e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam super(new Drawable[] { wrapped }); 124e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam } 125e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam 126e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam @Override 127c609ad41cf2769e8706779ae3ee61b994e74474aMaurice Lam public boolean isStateful() { 128c609ad41cf2769e8706779ae3ee61b994e74474aMaurice Lam return true; 129c609ad41cf2769e8706779ae3ee61b994e74474aMaurice Lam } 130c609ad41cf2769e8706779ae3ee61b994e74474aMaurice Lam 131c609ad41cf2769e8706779ae3ee61b994e74474aMaurice Lam @Override 132e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam public boolean setState(int[] stateSet) { 133e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam boolean needsInvalidate = super.setState(stateSet); 134e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam boolean needsInvalidateForState = updateState(); 135e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam return needsInvalidate || needsInvalidateForState; 136e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam } 137e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam 138e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam public void setTintListCompat(ColorStateList colors) { 139e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam mTintList = colors; 140e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam if (updateState()) { 141e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam invalidateSelf(); 142e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam } 143e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam } 144e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam 145e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam private boolean updateState() { 146e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam if (mTintList != null) { 147e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam final int color = mTintList.getColorForState(getState(), 0); 148e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam setColorFilter(color, PorterDuff.Mode.SRC_IN); 149e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam return true; // Needs invalidate 150e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam } 151e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam return false; 152e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam } 153e769891ec1653cd6798c116f485968bf1b5bc00aMaurice Lam } 15491051468dbc273da8d7e7608640e833a71d011e2Maurice Lam} 155