package com.android.settings.widget.buttons; import android.content.Context; import android.content.SharedPreferences; import android.media.AudioManager; import android.provider.Settings; import com.android.settings.R; import com.android.settings.widget.SettingsAppWidgetProvider; import com.android.settings.widget.WidgetSettings; public class SoundButton extends WidgetButton { static SoundButton ownButton=null; public static final int RINGER_MODE_UNKNOWN=0; public static final int RINGER_MODE_SILENT=1; public static final int RINGER_MODE_VIBRATE_ONLY=2; public static final int RINGER_MODE_SOUND_ONLY=3; public static final int RINGER_MODE_SOUND_AND_VIBRATE=4; public static final int MODE_SOUNDVIB_VIB=0; public static final int MODE_SOUND_VIB=1; public static final int MODE_SOUND_SILENT=2; public static final int MODE_SOUNDVIB_VIB_SILENT=3; public static final int MODE_SOUND_VIB_SILENT=4; private static final int DEFAULT_SETTTING = 0; private static int currentMode; private static int getSoundState(Context context) { AudioManager mAudioManager = (AudioManager) context .getSystemService(Context.AUDIO_SERVICE); int ringMode = mAudioManager.getRingerMode(); int vibrateMode = mAudioManager.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER); if (ringMode==AudioManager.RINGER_MODE_NORMAL && vibrateMode == AudioManager.VIBRATE_SETTING_ON) { return RINGER_MODE_SOUND_AND_VIBRATE; } else if (ringMode==AudioManager.RINGER_MODE_NORMAL) { return RINGER_MODE_SOUND_ONLY; } else if (ringMode==AudioManager.RINGER_MODE_VIBRATE) { return RINGER_MODE_VIBRATE_ONLY; } else if (ringMode==AudioManager.RINGER_MODE_SILENT) { return RINGER_MODE_SILENT; } return RINGER_MODE_UNKNOWN; } /** * Toggles the state of 2G3G. * * @param context */ public void toggleState(Context context) { int currentMode = getSoundState(context); AudioManager mAudioManager = (AudioManager) context .getSystemService(Context.AUDIO_SERVICE); switch (currentMode) { case RINGER_MODE_SOUND_AND_VIBRATE: if(supports(RINGER_MODE_SOUND_ONLY)) { Settings.System.putInt(context.getContentResolver(),Settings.System.VIBRATE_IN_SILENT,1); mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_ONLY_SILENT); mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); } else if(supports(RINGER_MODE_VIBRATE_ONLY)) { Settings.System.putInt(context.getContentResolver(),Settings.System.VIBRATE_IN_SILENT,1); mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_ONLY_SILENT); mAudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); } else if(supports(RINGER_MODE_SILENT)) { Settings.System.putInt(context.getContentResolver(),Settings.System.VIBRATE_IN_SILENT,0); mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_OFF); mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT); } else { //Fall Back Settings.System.putInt(context.getContentResolver(),Settings.System.VIBRATE_IN_SILENT,1); mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_ON); mAudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); } break; case RINGER_MODE_SOUND_ONLY: if(supports(RINGER_MODE_VIBRATE_ONLY)) { Settings.System.putInt(context.getContentResolver(),Settings.System.VIBRATE_IN_SILENT,1); mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_ONLY_SILENT); mAudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); } else if(supports(RINGER_MODE_SILENT)) { Settings.System.putInt(context.getContentResolver(),Settings.System.VIBRATE_IN_SILENT,0); mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_OFF); mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT); } else if(supports(RINGER_MODE_SOUND_AND_VIBRATE)) { Settings.System.putInt(context.getContentResolver(),Settings.System.VIBRATE_IN_SILENT,1); mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_ON); mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); } else { //Fall back Settings.System.putInt(context.getContentResolver(),Settings.System.VIBRATE_IN_SILENT,1); mAudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_ON); } break; case RINGER_MODE_VIBRATE_ONLY: if(supports(RINGER_MODE_SILENT)) { Settings.System.putInt(context.getContentResolver(),Settings.System.VIBRATE_IN_SILENT,0); mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT); mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_OFF); } else if(supports(RINGER_MODE_SOUND_AND_VIBRATE)) { Settings.System.putInt(context.getContentResolver(),Settings.System.VIBRATE_IN_SILENT,1); mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_ON); } else if(supports(RINGER_MODE_SOUND_ONLY)) { Settings.System.putInt(context.getContentResolver(),Settings.System.VIBRATE_IN_SILENT,1); mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_ONLY_SILENT); } else { //Fall Back Settings.System.putInt(context.getContentResolver(),Settings.System.VIBRATE_IN_SILENT,1); mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_ON); } break; case RINGER_MODE_SILENT: if(supports(RINGER_MODE_SOUND_AND_VIBRATE)) { Settings.System.putInt(context.getContentResolver(),Settings.System.VIBRATE_IN_SILENT,1); mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_ON); } else if(supports(RINGER_MODE_SOUND_ONLY)) { Settings.System.putInt(context.getContentResolver(),Settings.System.VIBRATE_IN_SILENT,1); mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_ONLY_SILENT); } else if(supports(RINGER_MODE_VIBRATE_ONLY)) { Settings.System.putInt(context.getContentResolver(),Settings.System.VIBRATE_IN_SILENT,1); mAudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_ONLY_SILENT); } else { //Fall Back Settings.System.putInt(context.getContentResolver(),Settings.System.VIBRATE_IN_SILENT,1); mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_ON); } break; default: Settings.System.putInt(context.getContentResolver(),Settings.System.VIBRATE_IN_SILENT,1); mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_ON); } } private boolean supports(int ringerMode) { switch (ringerMode) { case RINGER_MODE_SILENT: if (currentMode==MODE_SOUND_SILENT || currentMode==MODE_SOUNDVIB_VIB_SILENT || currentMode==MODE_SOUND_VIB_SILENT) return true; break; case RINGER_MODE_VIBRATE_ONLY: if (currentMode==MODE_SOUND_VIB || currentMode==MODE_SOUNDVIB_VIB || currentMode==MODE_SOUNDVIB_VIB_SILENT || currentMode==MODE_SOUND_VIB_SILENT) return true; break; case RINGER_MODE_SOUND_ONLY: if (currentMode==MODE_SOUND_VIB || currentMode==MODE_SOUND_SILENT || currentMode==MODE_SOUND_VIB_SILENT) return true; break; case RINGER_MODE_SOUND_AND_VIBRATE: if (currentMode==MODE_SOUNDVIB_VIB || currentMode==MODE_SOUNDVIB_VIB_SILENT) return true; } return false; } public static SoundButton getInstance() { if (ownButton==null) ownButton = new SoundButton(); return ownButton; } @Override void initButton() { buttonID=WidgetButton.BUTTON_SOUND; preferenceName=WidgetSettings.TOGGLE_SOUND; } @Override public void updateState(Context context, SharedPreferences globalPreferences, int[] appWidgetIds) { int soundState = getSoundState(context); currentMode=globalPreferences.getInt(WidgetSettings.RING_MODE_SPINNER, DEFAULT_SETTTING); switch (soundState) { case RINGER_MODE_SOUND_AND_VIBRATE: if (globalPreferences.getBoolean(WidgetSettings.RING_MODE_VIBRATE_AS_ON, false)) { currentIcon=R.drawable.ic_appwidget_settings_sound_ring_off; currentState=SettingsAppWidgetProvider.STATE_DISABLED; } else { currentIcon=R.drawable.ic_appwidget_settings_sound_ring_on; currentState=SettingsAppWidgetProvider.STATE_ENABLED; } break; case RINGER_MODE_SOUND_ONLY: if (globalPreferences.getBoolean(WidgetSettings.RING_MODE_VIBRATE_AS_ON, false)) { currentIcon=R.drawable.ic_appwidget_settings_sound_ring_off; currentState=SettingsAppWidgetProvider.STATE_INTERMEDIATE; } else { currentIcon=R.drawable.ic_appwidget_settings_sound_ring_on; currentState=SettingsAppWidgetProvider.STATE_INTERMEDIATE; } break; case RINGER_MODE_VIBRATE_ONLY: if (globalPreferences.getBoolean(WidgetSettings.RING_MODE_VIBRATE_AS_ON, false)) { currentIcon=R.drawable.ic_appwidget_settings_sound_vibrate_on; currentState=SettingsAppWidgetProvider.STATE_ENABLED; } else { currentIcon=R.drawable.ic_appwidget_settings_sound_vibrate_off; currentState=SettingsAppWidgetProvider.STATE_DISABLED; } break; case RINGER_MODE_SILENT: if (globalPreferences.getBoolean(WidgetSettings.RING_MODE_VIBRATE_AS_ON, false)) { currentIcon=R.drawable.ic_appwidget_settings_sound_silent; currentState=SettingsAppWidgetProvider.STATE_INTERMEDIATE; } else { currentIcon=R.drawable.ic_appwidget_settings_sound_silent; currentState=SettingsAppWidgetProvider.STATE_DISABLED; } break; } } }