1ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim/* 2ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim * Copyright (C) 2015 The Android Open Source Project 3ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim * 4ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim * Licensed under the Apache License, Version 2.0 (the "License"); 5ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim * you may not use this file except in compliance with the License. 6ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim * You may obtain a copy of the License at 7ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim * 8ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim * http://www.apache.org/licenses/LICENSE-2.0 9ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim * 10ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim * Unless required by applicable law or agreed to in writing, software 11ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim * distributed under the License is distributed on an "AS IS" BASIS, 12ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim * See the License for the specific language governing permissions and 14ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim * limitations under the License. 15ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim */ 16ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim 17ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kimpackage android.support.v7.app; 18ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim 19ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kimimport android.content.Context; 20d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seoimport android.graphics.Color; 21ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kimimport android.graphics.PorterDuff; 22ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kimimport android.graphics.drawable.Drawable; 23ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kimimport android.support.v7.mediarouter.R; 24ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kimimport android.support.v7.widget.AppCompatSeekBar; 25ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kimimport android.util.AttributeSet; 26d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seoimport android.util.Log; 27ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim 28ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim/** 29ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim * Volume slider with showing, hiding, and applying alpha supports to the thumb. 30ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim */ 31ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kimclass MediaRouteVolumeSlider extends AppCompatSeekBar { 32d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo private static final String TAG = "MediaRouteVolumeSlider"; 33d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo 34d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo private final float mDisabledAlpha; 35d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo 360b72510d7bc402b71065e069852d10a8592d55deJaewan Kim private boolean mHideThumb; 37ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim private Drawable mThumb; 380b72510d7bc402b71065e069852d10a8592d55deJaewan Kim private int mColor; 39ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim 40ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim public MediaRouteVolumeSlider(Context context) { 41d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo this(context, null); 42ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim } 43ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim 44ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim public MediaRouteVolumeSlider(Context context, AttributeSet attrs) { 456759b1021d8198ad1d239bb30e5a102b99624bceAdam Lesinski this(context, attrs, android.support.v7.appcompat.R.attr.seekBarStyle); 46ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim } 47ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim 48ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim public MediaRouteVolumeSlider(Context context, AttributeSet attrs, int defStyleAttr) { 49ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim super(context, attrs, defStyleAttr); 50d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo mDisabledAlpha = MediaRouterThemeHelper.getDisabledAlpha(context); 51ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim } 52ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim 53ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim @Override 54ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim protected void drawableStateChanged() { 55ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim super.drawableStateChanged(); 56d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo int alpha = isEnabled() ? 0xFF : (int) (0xFF * mDisabledAlpha); 57f5e8e4e6c1e751584b95194b9a55d30563dd7d7dJae Seo 58f5e8e4e6c1e751584b95194b9a55d30563dd7d7dJae Seo // The thumb drawable is a collection of drawables and its current drawables are changed per 59f5e8e4e6c1e751584b95194b9a55d30563dd7d7dJae Seo // state. Apply the color filter and alpha on every state change. 60f5e8e4e6c1e751584b95194b9a55d30563dd7d7dJae Seo mThumb.setColorFilter(mColor, PorterDuff.Mode.SRC_IN); 610b72510d7bc402b71065e069852d10a8592d55deJaewan Kim mThumb.setAlpha(alpha); 62f5e8e4e6c1e751584b95194b9a55d30563dd7d7dJae Seo 630b72510d7bc402b71065e069852d10a8592d55deJaewan Kim getProgressDrawable().setColorFilter(mColor, PorterDuff.Mode.SRC_IN); 64f5e8e4e6c1e751584b95194b9a55d30563dd7d7dJae Seo getProgressDrawable().setAlpha(alpha); 650b72510d7bc402b71065e069852d10a8592d55deJaewan Kim } 660b72510d7bc402b71065e069852d10a8592d55deJaewan Kim 67d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo @Override 68d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo public void setThumb(Drawable thumb) { 69d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo mThumb = thumb; 70d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo super.setThumb(mHideThumb ? null : mThumb); 71d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo } 72d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo 730b72510d7bc402b71065e069852d10a8592d55deJaewan Kim /** 74d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo * Sets whether to show or hide thumb. 750b72510d7bc402b71065e069852d10a8592d55deJaewan Kim */ 760b72510d7bc402b71065e069852d10a8592d55deJaewan Kim public void setHideThumb(boolean hideThumb) { 770b72510d7bc402b71065e069852d10a8592d55deJaewan Kim if (mHideThumb == hideThumb) { 780b72510d7bc402b71065e069852d10a8592d55deJaewan Kim return; 790b72510d7bc402b71065e069852d10a8592d55deJaewan Kim } 800b72510d7bc402b71065e069852d10a8592d55deJaewan Kim mHideThumb = hideThumb; 810b72510d7bc402b71065e069852d10a8592d55deJaewan Kim super.setThumb(mHideThumb ? null : mThumb); 82ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim } 83d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo 84d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo /** 85d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo * Sets the volume slider color. The change takes effect next time drawable state is changed. 86d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo * <p> 87d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo * The color cannot be translucent, otherwise the underlying progress bar will be seen through 88d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo * the thumb. 89d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo * </p> 90d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo */ 91d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo public void setColor(int color) { 92d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo if (mColor == color) { 93d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo return; 94d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo } 95d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo if (Color.alpha(color) != 0xFF) { 96d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo Log.e(TAG, "Volume slider color cannot be translucent: #" + Integer.toHexString(color)); 97d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo } 98d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo mColor = color; 99d807ca0f601dc0b9807e0ed635b3f502fddec083Jae Seo } 100ea15dd5d0313d55452f552d8583eb230b2c9506fJaewan Kim} 101