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