package com.android.systemui.statusbar.powerwidget;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Vibrator;
import android.provider.Settings;
import android.view.View;
import com.android.systemui.R;
public class SoundButton extends PowerButton {
private static final String TAG = "SoundButton";
private static final int VIBRATE_DURATION = 500; // 0.5s
private static final IntentFilter INTENT_FILTER = new IntentFilter();
static {
INTENT_FILTER.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
INTENT_FILTER.addAction(AudioManager.VIBRATE_SETTING_CHANGED_ACTION);
}
private static final List<Uri> OBSERVED_URIS = new ArrayList<Uri>();
static {
OBSERVED_URIS.add(Settings.System.getUriFor(Settings.System.EXPANDED_RING_MODE));
OBSERVED_URIS.add(Settings.System.getUriFor(Settings.System.EXPANDED_HAPTIC_FEEDBACK));
OBSERVED_URIS.add(Settings.System.getUriFor(Settings.System.HAPTIC_FEEDBACK_ENABLED));
}
private final Ringer mSilentRinger = new Ringer(false, AudioManager.VIBRATE_SETTING_OFF,
AudioManager.RINGER_MODE_SILENT, false);
private final Ringer mVibrateRinger = new Ringer(true, AudioManager.VIBRATE_SETTING_ON,
AudioManager.RINGER_MODE_VIBRATE, true);
private final Ringer mSoundRinger = new Ringer(true, AudioManager.VIBRATE_SETTING_ONLY_SILENT,
AudioManager.RINGER_MODE_NORMAL, false);
private final Ringer mSoundVibrateRinger = new Ringer(true, AudioManager.VIBRATE_SETTING_ON,
AudioManager.RINGER_MODE_NORMAL, true);
private final Ringer[] mRingers = new Ringer[] {
mSilentRinger, mVibrateRinger, mSoundRinger, mSoundVibrateRinger
};
private int mRingersIndex = 0;
private int[] mRingerValues = new int[] {
0, 1, 2, 3
};
private int mRingerValuesIndex = 0;
private boolean mHapticFeedbackEnabled = false;
private AudioManager mAudioManager;
private Vibrator mVibrator;
public SoundButton() {
mType = BUTTON_SOUND;
}
@Override
protected void setupButton(View view) {
super.setupButton(view);
if (mView != null) {
Context context = mView.getContext();
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
updateSettings();
}
}
@Override
protected void updateState() {
findCurrentState();
switch (mRingersIndex) {
case 0:
mIcon = R.drawable.stat_silent;
mState = STATE_DISABLED;
break;
case 1:
mIcon = R.drawable.stat_vibrate_off;
mState = STATE_DISABLED;
break;
case 2:
mIcon = R.drawable.stat_ring_on;
mState = STATE_ENABLED;
break;
case 3:
mIcon = R.drawable.stat_ring_vibrate_on;
mState = STATE_ENABLED;
break;
}
}
@Override
protected void toggleState() {
mRingerValuesIndex++;
if (mRingerValuesIndex > mRingerValues.length - 1) {
mRingerValuesIndex = 0;
}
mRingersIndex = mRingerValues[mRingerValuesIndex];
if (mRingersIndex > mRingers.length - 1) {
mRingersIndex = 0;
}
Ringer ringer = mRingers[mRingersIndex];
ringer.execute();
}
@Override
protected boolean handleLongClick() {
Intent intent = new Intent("android.settings.SOUND_SETTINGS");
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mView.getContext().startActivity(intent);
return true;
}
@Override
protected void onChangeUri(Uri uri) {
updateSettings();
}
@Override
protected List<Uri> getObservedUris() {
return OBSERVED_URIS;
}
@Override
protected IntentFilter getBroadcastIntentFilter() {
return INTENT_FILTER;
}
private void updateSettings() {
ContentResolver resolver = mView.getContext().getContentResolver();
int expandedHapticFeedback = Settings.System.getInt(resolver,
Settings.System.EXPANDED_HAPTIC_FEEDBACK, 2);
if (expandedHapticFeedback == 2) {
mHapticFeedbackEnabled = (Settings.System.getInt(resolver,
Settings.System.HAPTIC_FEEDBACK_ENABLED, 1) == 1);
} else {
mHapticFeedbackEnabled = (expandedHapticFeedback == 1);
}
String[] modes = MultiSelectListPreference.parseStoredValue(Settings.System.getString(
resolver, Settings.System.EXPANDED_RING_MODE));
if (modes != null) {
mRingerValues = new int[modes.length];
for (int i = 0; i < modes.length; i++) {
mRingerValues[i] = Integer.valueOf(modes[i]);
}
} else {
mRingerValues = new int[] {
2
};
}
updateState();
for (int i = 0; i < mRingerValues.length; i++) {
if (mRingersIndex == mRingerValues[i]) {
mRingerValuesIndex = i;
break;
}
}
}
private void findCurrentState() {
ContentResolver resolver = mView.getContext().getContentResolver();
boolean vibrateInSilent = Settings.System.getInt(resolver,
Settings.System.VIBRATE_IN_SILENT, 0) == 1;
int vibrateSetting = mAudioManager.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER);
int ringerMode = mAudioManager.getRingerMode();
Ringer ringer = new Ringer(vibrateInSilent, vibrateSetting, ringerMode, false);
for (int i = 0; i < mRingers.length; i++) {
if (mRingers[i].equals(ringer)) {
mRingersIndex = i;
break;
}
}
}
private class Ringer {
final boolean mVibrateInSilent;
final int mVibrateSetting;
final int mRingerMode;
final boolean mDoHapticFeedback;
Ringer(boolean vibrateInSilent, int vibrateSetting, int ringerMode, boolean doHapticFeedback) {
mVibrateInSilent = vibrateInSilent;
mVibrateSetting = vibrateSetting;
mRingerMode = ringerMode;
mDoHapticFeedback = doHapticFeedback;
}
void execute() {
ContentResolver resolver = mView.getContext().getContentResolver();
Settings.System.putInt(resolver, Settings.System.VIBRATE_IN_SILENT,
(mVibrateInSilent ? 1 : 0));
mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, mVibrateSetting);
mAudioManager.setRingerMode(mRingerMode);
if (mDoHapticFeedback && mHapticFeedbackEnabled) {
mVibrator.vibrate(VIBRATE_DURATION);
}
}
@Override
public boolean equals(Object o) {
if (o == null) {
return false;
}
if (o.getClass() != getClass()) {
return false;
}
Ringer r = (Ringer) o;
return r.mVibrateInSilent == mVibrateInSilent && r.mVibrateSetting == mVibrateSetting
&& r.mRingerMode == mRingerMode;
}
}
}