1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.systemui.settings;
18
19import android.content.Context;
20import android.content.res.Resources;
21import android.content.res.TypedArray;
22import android.util.AttributeSet;
23import android.view.MotionEvent;
24import android.view.View;
25import android.widget.CompoundButton;
26import android.widget.CompoundButton.OnCheckedChangeListener;
27import android.widget.RelativeLayout;
28import android.widget.SeekBar;
29import android.widget.SeekBar.OnSeekBarChangeListener;
30import android.widget.TextView;
31
32import com.android.systemui.R;
33import com.android.systemui.statusbar.policy.BrightnessMirrorController;
34
35public class ToggleSlider extends RelativeLayout {
36    public interface Listener {
37        public void onInit(ToggleSlider v);
38        public void onChanged(ToggleSlider v, boolean tracking, boolean checked, int value,
39                boolean stopTracking);
40    }
41
42    private Listener mListener;
43    private boolean mTracking;
44
45    private CompoundButton mToggle;
46    private ToggleSeekBar mSlider;
47    private TextView mLabel;
48
49    private ToggleSlider mMirror;
50    private BrightnessMirrorController mMirrorController;
51
52    public ToggleSlider(Context context) {
53        this(context, null);
54    }
55
56    public ToggleSlider(Context context, AttributeSet attrs) {
57        this(context, attrs, 0);
58    }
59
60    public ToggleSlider(Context context, AttributeSet attrs, int defStyle) {
61        super(context, attrs, defStyle);
62
63        View.inflate(context, R.layout.status_bar_toggle_slider, this);
64
65        final Resources res = context.getResources();
66        final TypedArray a = context.obtainStyledAttributes(
67                attrs, R.styleable.ToggleSlider, defStyle, 0);
68
69        mToggle = (CompoundButton) findViewById(R.id.toggle);
70        mToggle.setOnCheckedChangeListener(mCheckListener);
71
72        mSlider = (ToggleSeekBar) findViewById(R.id.slider);
73        mSlider.setOnSeekBarChangeListener(mSeekListener);
74
75        mLabel = (TextView) findViewById(R.id.label);
76        mLabel.setText(a.getString(R.styleable.ToggleSlider_text));
77
78        mSlider.setAccessibilityLabel(getContentDescription().toString());
79
80        a.recycle();
81    }
82
83    public void setMirror(ToggleSlider toggleSlider) {
84        mMirror = toggleSlider;
85        if (mMirror != null) {
86            mMirror.setChecked(mToggle.isChecked());
87            mMirror.setMax(mSlider.getMax());
88            mMirror.setValue(mSlider.getProgress());
89        }
90    }
91
92    public void setMirrorController(BrightnessMirrorController c) {
93        mMirrorController = c;
94    }
95
96    @Override
97    protected void onAttachedToWindow() {
98        super.onAttachedToWindow();
99        if (mListener != null) {
100            mListener.onInit(this);
101        }
102    }
103
104    public void setOnChangedListener(Listener l) {
105        mListener = l;
106    }
107
108    public void setChecked(boolean checked) {
109        mToggle.setChecked(checked);
110    }
111
112    public boolean isChecked() {
113        return mToggle.isChecked();
114    }
115
116    public void setMax(int max) {
117        mSlider.setMax(max);
118        if (mMirror != null) {
119            mMirror.setMax(max);
120        }
121    }
122
123    public void setValue(int value) {
124        mSlider.setProgress(value);
125        if (mMirror != null) {
126            mMirror.setValue(value);
127        }
128    }
129
130    @Override
131    public boolean dispatchTouchEvent(MotionEvent ev) {
132        if (mMirror != null) {
133            MotionEvent copy = ev.copy();
134            mMirror.dispatchTouchEvent(copy);
135            copy.recycle();
136        }
137        return super.dispatchTouchEvent(ev);
138    }
139
140    private final OnCheckedChangeListener mCheckListener = new OnCheckedChangeListener() {
141        @Override
142        public void onCheckedChanged(CompoundButton toggle, boolean checked) {
143            mSlider.setEnabled(!checked);
144
145            if (mListener != null) {
146                mListener.onChanged(
147                        ToggleSlider.this, mTracking, checked, mSlider.getProgress(), false);
148            }
149
150            if (mMirror != null) {
151                mMirror.mToggle.setChecked(checked);
152            }
153        }
154    };
155
156    private final OnSeekBarChangeListener mSeekListener = new OnSeekBarChangeListener() {
157        @Override
158        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
159            if (mListener != null) {
160                mListener.onChanged(
161                        ToggleSlider.this, mTracking, mToggle.isChecked(), progress, false);
162            }
163        }
164
165        @Override
166        public void onStartTrackingTouch(SeekBar seekBar) {
167            mTracking = true;
168
169            if (mListener != null) {
170                mListener.onChanged(ToggleSlider.this, mTracking, mToggle.isChecked(),
171                        mSlider.getProgress(), false);
172            }
173
174            mToggle.setChecked(false);
175
176            if (mMirrorController != null) {
177                mMirrorController.showMirror();
178                mMirrorController.setLocation((View) getParent());
179            }
180        }
181
182        @Override
183        public void onStopTrackingTouch(SeekBar seekBar) {
184            mTracking = false;
185
186            if (mListener != null) {
187                mListener.onChanged(ToggleSlider.this, mTracking, mToggle.isChecked(),
188                        mSlider.getProgress(), true);
189            }
190
191            if (mMirrorController != null) {
192                mMirrorController.hideMirror();
193            }
194        }
195    };
196}
197
198