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