1ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock/* 2ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock * Copyright (C) 2014 The Android Open Source Project 3ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock * 4ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock * Licensed under the Apache License, Version 2.0 (the "License"); 5ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock * you may not use this file except in compliance with the License. 6ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock * You may obtain a copy of the License at 7ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock * 8ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock * http://www.apache.org/licenses/LICENSE-2.0 9ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock * 10ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock * Unless required by applicable law or agreed to in writing, software 11ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock * distributed under the License is distributed on an "AS IS" BASIS, 12ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock * See the License for the specific language governing permissions and 14ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock * limitations under the License. 15ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock */ 16ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 17ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlockpackage com.android.systemui.volume; 18ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 19ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlockimport android.content.Context; 20d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlockimport android.graphics.Typeface; 21ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlockimport android.util.AttributeSet; 22ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlockimport android.view.LayoutInflater; 23ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlockimport android.view.View; 24ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlockimport android.widget.Button; 25ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlockimport android.widget.LinearLayout; 26eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlockimport android.widget.TextView; 27ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 28ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlockimport com.android.systemui.R; 29ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 30ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlockimport java.util.Objects; 31ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 32ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlockpublic class SegmentedButtons extends LinearLayout { 334291fb79c70ba77af4357d53dac2e5626eabba45John Spurlock private static final int LABEL_RES_KEY = R.id.label; 34d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock private static final Typeface REGULAR = Typeface.create("sans-serif", Typeface.NORMAL); 35d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock private static final Typeface MEDIUM = Typeface.create("sans-serif-medium", Typeface.NORMAL); 36ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 37ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock private final Context mContext; 3829cbe66c7d623a2bea7fb74474a1a8520cc5b809Muyuan Li protected final LayoutInflater mInflater; 39d896323eab66be9394cd33d3b3bf16372cbbaa07John Spurlock private final SpTexts mSpTexts; 40ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 41ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock private Callback mCallback; 4229cbe66c7d623a2bea7fb74474a1a8520cc5b809Muyuan Li protected Object mSelectedValue; 43ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 44ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock public SegmentedButtons(Context context, AttributeSet attrs) { 45ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock super(context, attrs); 46ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock mContext = context; 47ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock mInflater = LayoutInflater.from(mContext); 48ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock setOrientation(HORIZONTAL); 49d896323eab66be9394cd33d3b3bf16372cbbaa07John Spurlock mSpTexts = new SpTexts(mContext); 50ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 51ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 52ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock public void setCallback(Callback callback) { 53ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock mCallback = callback; 54ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 55ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 56ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock public Object getSelectedValue() { 57ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock return mSelectedValue; 58ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 59ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 604572cbc917b62aeece4afcd73713eeabed2a5d92Chris Wren public void setSelectedValue(Object value, boolean fromClick) { 61ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock if (Objects.equals(value, mSelectedValue)) return; 62ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock mSelectedValue = value; 63ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock for (int i = 0; i < getChildCount(); i++) { 64eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock final TextView c = (TextView) getChildAt(i); 65ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock final Object tag = c.getTag(); 66eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock final boolean selected = Objects.equals(mSelectedValue, tag); 67eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock c.setSelected(selected); 6829cbe66c7d623a2bea7fb74474a1a8520cc5b809Muyuan Li setSelectedStyle(c, selected); 69ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 704572cbc917b62aeece4afcd73713eeabed2a5d92Chris Wren fireOnSelected(fromClick); 71ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 72ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 7329cbe66c7d623a2bea7fb74474a1a8520cc5b809Muyuan Li protected void setSelectedStyle(TextView textView, boolean selected) { 7429cbe66c7d623a2bea7fb74474a1a8520cc5b809Muyuan Li textView.setTypeface(selected ? MEDIUM : REGULAR); 7529cbe66c7d623a2bea7fb74474a1a8520cc5b809Muyuan Li } 7629cbe66c7d623a2bea7fb74474a1a8520cc5b809Muyuan Li 7729cbe66c7d623a2bea7fb74474a1a8520cc5b809Muyuan Li public Button inflateButton() { 7829cbe66c7d623a2bea7fb74474a1a8520cc5b809Muyuan Li return (Button) mInflater.inflate(R.layout.segmented_button, this, false); 7929cbe66c7d623a2bea7fb74474a1a8520cc5b809Muyuan Li } 8029cbe66c7d623a2bea7fb74474a1a8520cc5b809Muyuan Li 81a1c7ffe755d414a1082920ce1742a8ae82d81529John Spurlock public void addButton(int labelResId, int contentDescriptionResId, Object value) { 8229cbe66c7d623a2bea7fb74474a1a8520cc5b809Muyuan Li final Button b = inflateButton(); 834291fb79c70ba77af4357d53dac2e5626eabba45John Spurlock b.setTag(LABEL_RES_KEY, labelResId); 84ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock b.setText(labelResId); 85a1c7ffe755d414a1082920ce1742a8ae82d81529John Spurlock b.setContentDescription(getResources().getString(contentDescriptionResId)); 86ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock final LayoutParams lp = (LayoutParams) b.getLayoutParams(); 87ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock if (getChildCount() == 0) { 88ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock lp.leftMargin = lp.rightMargin = 0; // first button has no margin 89ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 90ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock b.setLayoutParams(lp); 91ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock addView(b); 92ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock b.setTag(value); 93ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock b.setOnClickListener(mClick); 94a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock Interaction.register(b, new Interaction.Callback() { 95a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock @Override 96a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock public void onInteraction() { 97a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock fireInteraction(); 98a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock } 99a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock }); 100d896323eab66be9394cd33d3b3bf16372cbbaa07John Spurlock mSpTexts.add(b); 101ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 102ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 1034291fb79c70ba77af4357d53dac2e5626eabba45John Spurlock public void updateLocale() { 1044291fb79c70ba77af4357d53dac2e5626eabba45John Spurlock for (int i = 0; i < getChildCount(); i++) { 1054291fb79c70ba77af4357d53dac2e5626eabba45John Spurlock final Button b = (Button) getChildAt(i); 1064291fb79c70ba77af4357d53dac2e5626eabba45John Spurlock final int labelResId = (Integer) b.getTag(LABEL_RES_KEY); 1074291fb79c70ba77af4357d53dac2e5626eabba45John Spurlock b.setText(labelResId); 1084291fb79c70ba77af4357d53dac2e5626eabba45John Spurlock } 1094291fb79c70ba77af4357d53dac2e5626eabba45John Spurlock } 1104291fb79c70ba77af4357d53dac2e5626eabba45John Spurlock 1114572cbc917b62aeece4afcd73713eeabed2a5d92Chris Wren private void fireOnSelected(boolean fromClick) { 112ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock if (mCallback != null) { 1134572cbc917b62aeece4afcd73713eeabed2a5d92Chris Wren mCallback.onSelected(mSelectedValue, fromClick); 114ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 115ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 116ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 117a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock private void fireInteraction() { 118a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock if (mCallback != null) { 119a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock mCallback.onInteraction(); 120a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock } 121a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock } 122a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock 123ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock private final View.OnClickListener mClick = new View.OnClickListener() { 124ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock @Override 125ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock public void onClick(View v) { 1264572cbc917b62aeece4afcd73713eeabed2a5d92Chris Wren setSelectedValue(v.getTag(), true /* fromClick */); 127ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 128ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock }; 129ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 130a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock public interface Callback extends Interaction.Callback { 1314572cbc917b62aeece4afcd73713eeabed2a5d92Chris Wren void onSelected(Object value, boolean fromClick); 132ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 133ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock} 134