blob: 90744a62677dd4747a4479bc7a550b5ff7e7529d [file] [log] [blame]
Muyuan Li3b0f8922016-04-18 19:27:29 -07001/*
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
yuemingweb2bf7d182018-01-23 16:05:08 +000032import com.android.settingslib.RestrictedLockUtils;
Muyuan Li3b0f8922016-04-18 19:27:29 -070033import com.android.systemui.R;
34import com.android.systemui.statusbar.policy.BrightnessMirrorController;
35
36public class ToggleSliderView extends RelativeLayout implements ToggleSlider {
37 private Listener mListener;
38 private boolean mTracking;
39
40 private CompoundButton mToggle;
41 private ToggleSeekBar mSlider;
42 private TextView mLabel;
43
44 private ToggleSliderView mMirror;
45 private BrightnessMirrorController mMirrorController;
46
47 public ToggleSliderView(Context context) {
48 this(context, null);
49 }
50
51 public ToggleSliderView(Context context, AttributeSet attrs) {
52 this(context, attrs, 0);
53 }
54
55 public ToggleSliderView(Context context, AttributeSet attrs, int defStyle) {
56 super(context, attrs, defStyle);
57
58 View.inflate(context, R.layout.status_bar_toggle_slider, this);
59
60 final Resources res = context.getResources();
61 final TypedArray a = context.obtainStyledAttributes(
62 attrs, R.styleable.ToggleSliderView, defStyle, 0);
63
Alan Viverette51efddb2017-04-05 10:00:01 -040064 mToggle = findViewById(R.id.toggle);
Muyuan Li3b0f8922016-04-18 19:27:29 -070065 mToggle.setOnCheckedChangeListener(mCheckListener);
66
Alan Viverette51efddb2017-04-05 10:00:01 -040067 mSlider = findViewById(R.id.slider);
Muyuan Li3b0f8922016-04-18 19:27:29 -070068 mSlider.setOnSeekBarChangeListener(mSeekListener);
69
Alan Viverette51efddb2017-04-05 10:00:01 -040070 mLabel = findViewById(R.id.label);
Muyuan Li3b0f8922016-04-18 19:27:29 -070071 mLabel.setText(a.getString(R.styleable.ToggleSliderView_text));
72
73 mSlider.setAccessibilityLabel(getContentDescription().toString());
74
75 a.recycle();
76 }
77
78 public void setMirror(ToggleSliderView toggleSlider) {
79 mMirror = toggleSlider;
80 if (mMirror != null) {
81 mMirror.setChecked(mToggle.isChecked());
82 mMirror.setMax(mSlider.getMax());
83 mMirror.setValue(mSlider.getProgress());
84 }
85 }
86
87 public void setMirrorController(BrightnessMirrorController c) {
88 mMirrorController = c;
89 }
90
91 @Override
92 protected void onAttachedToWindow() {
93 super.onAttachedToWindow();
94 if (mListener != null) {
95 mListener.onInit(this);
96 }
97 }
98
yuemingweb2bf7d182018-01-23 16:05:08 +000099 public void setEnforcedAdmin(RestrictedLockUtils.EnforcedAdmin admin) {
100 mToggle.setEnabled(admin == null);
101 mSlider.setEnabled(admin == null);
102 mSlider.setEnforcedAdmin(admin);
103 }
104
Muyuan Li3b0f8922016-04-18 19:27:29 -0700105 public void setOnChangedListener(Listener l) {
106 mListener = l;
107 }
108
109 @Override
110 public void setChecked(boolean checked) {
111 mToggle.setChecked(checked);
112 }
113
114 @Override
115 public boolean isChecked() {
116 return mToggle.isChecked();
117 }
118
119 @Override
120 public void setMax(int max) {
121 mSlider.setMax(max);
122 if (mMirror != null) {
123 mMirror.setMax(max);
124 }
125 }
126
127 @Override
128 public void setValue(int value) {
129 mSlider.setProgress(value);
130 if (mMirror != null) {
131 mMirror.setValue(value);
132 }
133 }
134
135 @Override
Michael Wrightd8460232018-01-16 18:04:59 +0000136 public int getValue() {
137 return mSlider.getProgress();
138 }
139
140 @Override
Muyuan Li3b0f8922016-04-18 19:27:29 -0700141 public boolean dispatchTouchEvent(MotionEvent ev) {
142 if (mMirror != null) {
143 MotionEvent copy = ev.copy();
144 mMirror.dispatchTouchEvent(copy);
145 copy.recycle();
146 }
147 return super.dispatchTouchEvent(ev);
148 }
149
150 private final OnCheckedChangeListener mCheckListener = new OnCheckedChangeListener() {
151 @Override
152 public void onCheckedChanged(CompoundButton toggle, boolean checked) {
153 mSlider.setEnabled(!checked);
154
155 if (mListener != null) {
156 mListener.onChanged(
157 ToggleSliderView.this, mTracking, checked, mSlider.getProgress(), false);
158 }
159
160 if (mMirror != null) {
161 mMirror.mToggle.setChecked(checked);
162 }
163 }
164 };
165
166 private final OnSeekBarChangeListener mSeekListener = new OnSeekBarChangeListener() {
167 @Override
168 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
169 if (mListener != null) {
170 mListener.onChanged(
171 ToggleSliderView.this, mTracking, mToggle.isChecked(), progress, false);
172 }
173 }
174
175 @Override
176 public void onStartTrackingTouch(SeekBar seekBar) {
177 mTracking = true;
178
179 if (mListener != null) {
180 mListener.onChanged(ToggleSliderView.this, mTracking, mToggle.isChecked(),
181 mSlider.getProgress(), false);
182 }
183
184 mToggle.setChecked(false);
185
186 if (mMirrorController != null) {
187 mMirrorController.showMirror();
188 mMirrorController.setLocation((View) getParent());
189 }
190 }
191
192 @Override
193 public void onStopTrackingTouch(SeekBar seekBar) {
194 mTracking = false;
195
196 if (mListener != null) {
197 mListener.onChanged(ToggleSliderView.this, mTracking, mToggle.isChecked(),
198 mSlider.getProgress(), true);
199 }
200
201 if (mMirrorController != null) {
202 mMirrorController.hideMirror();
203 }
204 }
205 };
206}
207