Skip to content

Commit b613a6e

Browse files
DvTonderGodFox
authored andcommitted
Framework: Cleanup Quick Settings Sound tiles
Change-Id: I45ba7098ef8c58a6e8e232abaa16780cab2df186
1 parent 42a178f commit b613a6e

4 files changed

Lines changed: 190 additions & 365 deletions

File tree

Lines changed: 168 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
package com.android.systemui.quicksettings;
22

33
import android.content.BroadcastReceiver;
4+
import android.content.ContentResolver;
45
import android.content.Context;
56
import android.content.Intent;
67
import android.content.IntentFilter;
78
import android.media.AudioManager;
9+
import android.net.Uri;
10+
import android.os.Handler;
11+
import android.os.Vibrator;
12+
import android.provider.Settings;
13+
import android.text.TextUtils;
814
import android.view.LayoutInflater;
915
import android.view.View;
1016
import android.view.View.OnLongClickListener;
@@ -15,51 +21,195 @@
1521

1622
public class RingerModeTile extends QuickSettingsTile {
1723

24+
private static final String SEPARATOR = "OV=I=XseparatorX=I=VO";
25+
26+
// Define the available ringer modes
27+
private final Ringer mSilentRinger = new Ringer(AudioManager.RINGER_MODE_SILENT, false);
28+
private final Ringer mVibrateRinger = new Ringer(AudioManager.RINGER_MODE_VIBRATE, true);
29+
private final Ringer mSoundRinger = new Ringer(AudioManager.RINGER_MODE_NORMAL, false);
30+
private final Ringer mSoundVibrateRinger = new Ringer(AudioManager.RINGER_MODE_NORMAL, true);
31+
private final Ringer[] mRingers = new Ringer[] {
32+
mSilentRinger, mVibrateRinger, mSoundRinger, mSoundVibrateRinger
33+
};
34+
35+
private int mRingersIndex;
36+
private int[] mRingerValues = new int[] {
37+
0, 1, 2, 3
38+
};
39+
private int mRingerValuesIndex;
40+
1841
private AudioManager mAudioManager;
42+
private Handler mHandler;
1943

2044
public RingerModeTile(Context context, LayoutInflater inflater,
2145
QuickSettingsContainerView container, QuickSettingsController qsc) {
2246
super(context, inflater, container, qsc);
2347

2448
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
49+
mHandler = new Handler();
2550

26-
mOnClick = new View.OnClickListener() {
51+
// Load the available ringer modes
52+
updateSettings(mContext.getContentResolver());
2753

54+
// Make sure we show the initial state correctly
55+
updateState();
56+
57+
// Tile actions
58+
mOnClick = new View.OnClickListener() {
2859
@Override
2960
public void onClick(View v) {
30-
if(mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_NORMAL){
31-
if(mAudioManager.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER) == AudioManager.VIBRATE_SETTING_ON){
32-
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
33-
}else{
34-
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
35-
}
36-
}else{
37-
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
38-
}
61+
toggleState();
62+
applyVibrationChanges();
3963
}
4064
};
4165

4266
mOnLongClick = new OnLongClickListener() {
43-
4467
@Override
4568
public boolean onLongClick(View v) {
4669
startSettingsActivity(android.provider.Settings.ACTION_SOUND_SETTINGS);
4770
return true;
4871
}
4972
};
5073
qsc.registerAction(AudioManager.RINGER_MODE_CHANGED_ACTION, this);
74+
qsc.registerObservedContent(Settings.System.getUriFor(Settings.System.EXPANDED_RING_MODE)
75+
, this);
76+
qsc.registerObservedContent(Settings.System.getUriFor(Settings.System.VIBRATE_WHEN_RINGING)
77+
, this);
5178
}
5279

5380
@Override
5481
public void onReceive(Context context, Intent intent) {
55-
if(mAudioManager.isSilentMode()){
56-
mDrawable = R.drawable.ic_qs_ring_off;
57-
mLabel = mContext.getString(R.string.quick_settings_ringer_off);
58-
}else{
59-
mDrawable = R.drawable.ic_qs_ring_on;
60-
mLabel = mContext.getString(R.string.quick_settings_ringer_on);
61-
}
82+
applyVibrationChanges();
83+
}
84+
85+
@Override
86+
public void onChangeUri(ContentResolver resolver, Uri uri) {
87+
updateSettings(mContext.getContentResolver());
88+
applyVibrationChanges();
89+
}
90+
91+
private void applyVibrationChanges(){
92+
updateState();
6293
updateQuickSettings();
6394
}
6495

96+
protected void updateState() {
97+
// The title does not change
98+
mLabel = mContext.getString(R.string.quick_settings_ringer_normal);
99+
100+
// The icon will change depending on index
101+
findCurrentState();
102+
switch (mRingersIndex) {
103+
case 0:
104+
mDrawable = R.drawable.ic_qs_ring_off;
105+
break;
106+
case 1:
107+
mDrawable = R.drawable.ic_qs_vibrate_on;
108+
break;
109+
case 2:
110+
mDrawable = R.drawable.ic_qs_ring_on;
111+
break;
112+
case 3:
113+
mDrawable = R.drawable.ic_qs_ring_vibrate_on;
114+
break;
115+
}
116+
117+
for (int i = 0; i < mRingerValues.length; i++) {
118+
if (mRingersIndex == mRingerValues[i]) {
119+
mRingerValuesIndex = i;
120+
break;
121+
}
122+
}
123+
}
124+
125+
protected void toggleState() {
126+
mRingerValuesIndex++;
127+
if (mRingerValuesIndex > mRingerValues.length - 1) {
128+
mRingerValuesIndex = 0;
129+
}
130+
131+
mRingersIndex = mRingerValues[mRingerValuesIndex];
132+
if (mRingersIndex > mRingers.length - 1) {
133+
mRingersIndex = 0;
134+
}
135+
136+
Ringer ringer = mRingers[mRingersIndex];
137+
ringer.execute(mContext);
138+
}
139+
140+
public String[] parseStoredValue(CharSequence val) {
141+
if (TextUtils.isEmpty(val)) {
142+
return null;
143+
} else {
144+
return val.toString().split(SEPARATOR);
145+
}
146+
}
147+
148+
private void updateSettings(ContentResolver resolver) {
149+
String[] modes = parseStoredValue(Settings.System.getString(
150+
resolver, Settings.System.EXPANDED_RING_MODE));
151+
if (modes == null || modes.length == 0) {
152+
mRingerValues = new int[] {
153+
0, 1, 2, 3
154+
};
155+
} else {
156+
mRingerValues = new int[modes.length];
157+
for (int i = 0; i < modes.length; i++) {
158+
mRingerValues[i] = Integer.valueOf(modes[i]);
159+
}
160+
}
161+
}
162+
163+
private void findCurrentState() {
164+
ContentResolver resolver = mContext.getContentResolver();
165+
boolean vibrateWhenRinging = Settings.System.getInt(resolver,
166+
Settings.System.VIBRATE_WHEN_RINGING, 0) == 1;
167+
int ringerMode = mAudioManager.getRingerMode();
168+
169+
Ringer ringer = new Ringer(ringerMode, vibrateWhenRinging);
170+
for (int i = 0; i < mRingers.length; i++) {
171+
if (mRingers[i].equals(ringer)) {
172+
mRingersIndex = i;
173+
break;
174+
}
175+
}
176+
}
177+
178+
private class Ringer {
179+
final boolean mVibrateWhenRinging;
180+
final int mRingerMode;
181+
182+
Ringer( int ringerMode, boolean vibrateWhenRinging) {
183+
mVibrateWhenRinging = vibrateWhenRinging;
184+
mRingerMode = ringerMode;
185+
}
186+
187+
void execute(Context context) {
188+
// If we are setting a vibrating state, vibrate to indicate it
189+
if (mVibrateWhenRinging) {
190+
Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
191+
vibrator.vibrate(250);
192+
}
193+
194+
// Set the desired state
195+
ContentResolver resolver = context.getContentResolver();
196+
Settings.System.putInt(resolver, Settings.System.VIBRATE_WHEN_RINGING,
197+
(mVibrateWhenRinging ? 1 : 0));
198+
mAudioManager.setRingerMode(mRingerMode);
199+
}
200+
201+
@Override
202+
public boolean equals(Object o) {
203+
if (o == null) {
204+
return false;
205+
}
206+
if (o.getClass() != getClass()) {
207+
return false;
208+
}
209+
210+
Ringer r = (Ringer) o;
211+
return r.mVibrateWhenRinging == mVibrateWhenRinging
212+
&& r.mRingerMode == mRingerMode;
213+
}
214+
}
65215
}

0 commit comments

Comments
 (0)