11e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato/*
20087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright * Copyright (C) 2013 The Android Open Source Project
31e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato *
41e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
51e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * you may not use this file except in compliance with the License.
61e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * You may obtain a copy of the License at
71e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato *
81e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
91e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato *
101e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * Unless required by applicable law or agreed to in writing, software
111e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
121e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * See the License for the specific language governing permissions and
141e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * limitations under the License.
151e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato */
161e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
170087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightpackage com.android.systemui.settings;
181e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
191e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.content.Context;
201e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.content.res.Resources;
2175362101ac12a15c111f249ade5e7d15787d9e81Joe Onoratoimport android.content.res.TypedArray;
221e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.util.AttributeSet;
231e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.view.View;
241e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.widget.CompoundButton;
25f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viveretteimport android.widget.CompoundButton.OnCheckedChangeListener;
261e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.widget.RelativeLayout;
271e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.widget.SeekBar;
28f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viveretteimport android.widget.SeekBar.OnSeekBarChangeListener;
291e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.widget.TextView;
301e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
311e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport com.android.systemui.R;
325fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roosimport com.android.systemui.statusbar.policy.BrightnessMirrorController;
331e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
34f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverettepublic class ToggleSlider extends RelativeLayout {
351e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    public interface Listener {
3648f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock        public void onInit(ToggleSlider v);
371e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        public void onChanged(ToggleSlider v, boolean tracking, boolean checked, int value);
381e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    }
391e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
401e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    private Listener mListener;
411e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    private boolean mTracking;
421e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
4375362101ac12a15c111f249ade5e7d15787d9e81Joe Onorato    private CompoundButton mToggle;
441e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    private SeekBar mSlider;
451e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    private TextView mLabel;
461e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
475fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos    private ToggleSlider mMirror;
485fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos    private BrightnessMirrorController mMirrorController;
495fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos
501e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    public ToggleSlider(Context context) {
511e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        this(context, null);
521e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    }
531e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
541e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    public ToggleSlider(Context context, AttributeSet attrs) {
551e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        this(context, attrs, 0);
561e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    }
571e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
581e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    public ToggleSlider(Context context, AttributeSet attrs, int defStyle) {
591e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        super(context, attrs, defStyle);
60f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette
611e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        View.inflate(context, R.layout.status_bar_toggle_slider, this);
621e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
6375362101ac12a15c111f249ade5e7d15787d9e81Joe Onorato        final Resources res = context.getResources();
64f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette        final TypedArray a = context.obtainStyledAttributes(
65f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette                attrs, R.styleable.ToggleSlider, defStyle, 0);
6675362101ac12a15c111f249ade5e7d15787d9e81Joe Onorato
67f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette        mToggle = (CompoundButton) findViewById(R.id.toggle);
68f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette        mToggle.setOnCheckedChangeListener(mCheckListener);
691e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
70f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette        mSlider = (SeekBar) findViewById(R.id.slider);
71f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette        mSlider.setOnSeekBarChangeListener(mSeekListener);
721e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
73f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette        mLabel = (TextView) findViewById(R.id.label);
7475362101ac12a15c111f249ade5e7d15787d9e81Joe Onorato        mLabel.setText(a.getString(R.styleable.ToggleSlider_text));
7575362101ac12a15c111f249ade5e7d15787d9e81Joe Onorato
7675362101ac12a15c111f249ade5e7d15787d9e81Joe Onorato        a.recycle();
771e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    }
781e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
795fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos    public void setMirror(ToggleSlider toggleSlider) {
805fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos        mMirror = toggleSlider;
815fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos        if (mMirror != null) {
82959409b86f04700cb9898e4641b3bc1da30f5cb2Adrian Roos            mMirror.setChecked(mToggle.isChecked());
83959409b86f04700cb9898e4641b3bc1da30f5cb2Adrian Roos            mMirror.setMax(mSlider.getMax());
84959409b86f04700cb9898e4641b3bc1da30f5cb2Adrian Roos            mMirror.setValue(mSlider.getProgress());
855fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos        }
865fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos    }
875fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos
885fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos    public void setMirrorController(BrightnessMirrorController c) {
895fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos        mMirrorController = c;
905fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos    }
915fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos
9248f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock    @Override
9348f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock    protected void onAttachedToWindow() {
9448f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock        super.onAttachedToWindow();
9548f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock        if (mListener != null) {
9648f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock            mListener.onInit(this);
9748f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock        }
9848f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock    }
9948f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock
1001e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    public void setOnChangedListener(Listener l) {
1011e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        mListener = l;
1021e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    }
1031e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
1041e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    public void setChecked(boolean checked) {
1051e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        mToggle.setChecked(checked);
1061e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    }
1071e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
1081e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    public boolean isChecked() {
1091e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        return mToggle.isChecked();
1101e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    }
1111e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
1121e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    public void setMax(int max) {
1131e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        mSlider.setMax(max);
114959409b86f04700cb9898e4641b3bc1da30f5cb2Adrian Roos        if (mMirror != null) {
115959409b86f04700cb9898e4641b3bc1da30f5cb2Adrian Roos            mMirror.setMax(max);
116959409b86f04700cb9898e4641b3bc1da30f5cb2Adrian Roos        }
1171e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    }
1181e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
1191e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    public void setValue(int value) {
1201e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        mSlider.setProgress(value);
121959409b86f04700cb9898e4641b3bc1da30f5cb2Adrian Roos        if (mMirror != null) {
122959409b86f04700cb9898e4641b3bc1da30f5cb2Adrian Roos            mMirror.setValue(value);
123959409b86f04700cb9898e4641b3bc1da30f5cb2Adrian Roos        }
1241e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    }
125f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette
126f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette    private final OnCheckedChangeListener mCheckListener = new OnCheckedChangeListener() {
127f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette        @Override
128f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette        public void onCheckedChanged(CompoundButton toggle, boolean checked) {
129f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette            mSlider.setEnabled(!checked);
130f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette
131f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette            if (mListener != null) {
132f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette                mListener.onChanged(
133f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette                        ToggleSlider.this, mTracking, checked, mSlider.getProgress());
134f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette            }
1355fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos
1365fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos            if (mMirror != null) {
1375fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos                mMirror.mToggle.setChecked(checked);
1385fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos            }
139f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette        }
140f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette    };
141f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette
142f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette    private final OnSeekBarChangeListener mSeekListener = new OnSeekBarChangeListener() {
143f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette        @Override
144f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
145f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette            if (mListener != null) {
146f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette                mListener.onChanged(
147f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette                        ToggleSlider.this, mTracking, mToggle.isChecked(), progress);
148f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette            }
1495fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos
1505fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos            if (mMirror != null) {
151959409b86f04700cb9898e4641b3bc1da30f5cb2Adrian Roos                mMirror.setValue(progress);
1525fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos            }
153f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette        }
154f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette
155f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette        @Override
156f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette        public void onStartTrackingTouch(SeekBar seekBar) {
157f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette            mTracking = true;
158f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette
159f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette            if (mListener != null) {
160f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette                mListener.onChanged(
161f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette                        ToggleSlider.this, mTracking, mToggle.isChecked(), mSlider.getProgress());
162f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette            }
163f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette
164f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette            mToggle.setChecked(false);
1655fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos
1665fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos            if (mMirror != null) {
1675fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos                mMirror.mSlider.setPressed(true);
1685fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos            }
1695fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos
1705fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos            if (mMirrorController != null) {
1715fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos                mMirrorController.showMirror();
1725fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos                mMirrorController.setLocation((View) getParent());
1735fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos            }
174f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette        }
175f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette
176f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette        @Override
177f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette        public void onStopTrackingTouch(SeekBar seekBar) {
178f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette            mTracking = false;
179f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette
180f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette            if (mListener != null) {
181f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette                mListener.onChanged(
182f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette                        ToggleSlider.this, mTracking, mToggle.isChecked(), mSlider.getProgress());
183f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette            }
1845fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos
1855fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos            if (mMirror != null) {
1865fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos                mMirror.mSlider.setPressed(false);
1875fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos            }
1885fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos
1895fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos            if (mMirrorController != null) {
1905fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos                mMirrorController.hideMirror();
1915fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos            }
192f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette        }
193f6a679870f6e0cb9c4327e2b89049f3bd8893448Alan Viverette    };
1941e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato}
1951e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
196