From 79c0acf51984256d640b38ea3c394f308cc3b314 Mon Sep 17 00:00:00 2001 From: satok Date: Tue, 11 Oct 2011 16:39:11 +0900 Subject: [PATCH] Add a settings to change the sound effect volume Bug: 5345401 Bug: 5402541 Change-Id: I1e653573a3362160104b77388d6cbd1700424649 --- .../res/layout/sound_effect_volume_dialog.xml | 44 ++++++ java/res/values/strings.xml | 6 +- java/res/xml/prefs.xml | 5 +- .../android/inputmethod/latin/LatinIME.java | 12 +- .../android/inputmethod/latin/Settings.java | 139 +++++++++++++++--- .../com/android/inputmethod/latin/Utils.java | 18 ++- 6 files changed, 190 insertions(+), 34 deletions(-) create mode 100644 java/res/layout/sound_effect_volume_dialog.xml diff --git a/java/res/layout/sound_effect_volume_dialog.xml b/java/res/layout/sound_effect_volume_dialog.xml new file mode 100644 index 000000000..c5b2f10e2 --- /dev/null +++ b/java/res/layout/sound_effect_volume_dialog.xml @@ -0,0 +1,44 @@ + + + + + + + + + diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 8bc97f66e..e00547a62 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -342,6 +342,8 @@ Usability study mode - - Vibration duration settings + + Keypress vibration duration settings + + Keypress sound volume settings diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml index b54df2686..dcaa2029c 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -121,7 +121,10 @@ android:defaultValue="true" /> + android:title="@string/prefs_keypress_vibration_duration_settings"/> + diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 958092bc7..28d920557 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -28,7 +28,6 @@ import android.content.res.Resources; import android.inputmethodservice.InputMethodService; import android.media.AudioManager; import android.net.ConnectivityManager; -import android.os.Build; import android.os.Debug; import android.os.Message; import android.os.SystemClock; @@ -2097,16 +2096,9 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar } }; - // update sound effect volume + // update keypress sound volume private void updateSoundEffectVolume() { - final String[] volumePerHardwareList = mResources.getStringArray(R.array.keypress_volumes); - final String hardwarePrefix = Build.HARDWARE + ","; - for (final String element : volumePerHardwareList) { - if (element.startsWith(hardwarePrefix)) { - mFxVolume = Float.parseFloat(element.substring(element.lastIndexOf(',') + 1)); - break; - } - } + mFxVolume = Utils.getCurrentKeypressSoundVolume(mPrefs, mResources); } // update flags for silent mode diff --git a/java/src/com/android/inputmethod/latin/Settings.java b/java/src/com/android/inputmethod/latin/Settings.java index d9508f4c1..eeb0299b1 100644 --- a/java/src/com/android/inputmethod/latin/Settings.java +++ b/java/src/com/android/inputmethod/latin/Settings.java @@ -26,6 +26,7 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Resources; +import android.media.AudioManager; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.ListPreference; @@ -91,9 +92,11 @@ public class Settings extends InputMethodSettingsActivity public static final String PREF_USABILITY_STUDY_MODE = "usability_study_mode"; - public static final String PREF_VIBRATION_DURATION_SETTINGS = + public static final String PREF_KEYPRESS_VIBRATION_DURATION_SETTINGS = "pref_vibration_duration_settings"; + public static final String PREF_KEYPRESS_SOUND_VOLUME = + "pref_keypress_sound_volume"; // Dialog ids private static final int VOICE_INPUT_CONFIRM_DIALOG = 0; @@ -327,7 +330,8 @@ public class Settings extends InputMethodSettingsActivity } private PreferenceScreen mInputLanguageSelection; - private PreferenceScreen mVibrationDurationSettingsPref; + private PreferenceScreen mKeypressVibrationDurationSettingsPref; + private PreferenceScreen mKeypressSoundVolumeSettingsPref; private ListPreference mVoicePreference; private CheckBoxPreference mShowSettingsKeyPreference; private ListPreference mShowCorrectionSuggestionsPreference; @@ -341,7 +345,8 @@ public class Settings extends InputMethodSettingsActivity private boolean mVoiceOn; private AlertDialog mDialog; - private TextView mVibrationSettingsTextView; + private TextView mKeypressVibrationDurationSettingsTextView; + private TextView mKeypressSoundVolumeSettingsTextView; private boolean mOkClicked = false; private String mVoiceModeOff; @@ -477,19 +482,34 @@ public class Settings extends InputMethodSettingsActivity } } - mVibrationDurationSettingsPref = - (PreferenceScreen) findPreference(PREF_VIBRATION_DURATION_SETTINGS); - if (mVibrationDurationSettingsPref != null) { - mVibrationDurationSettingsPref.setOnPreferenceClickListener( + mKeypressVibrationDurationSettingsPref = + (PreferenceScreen) findPreference(PREF_KEYPRESS_VIBRATION_DURATION_SETTINGS); + if (mKeypressVibrationDurationSettingsPref != null) { + mKeypressVibrationDurationSettingsPref.setOnPreferenceClickListener( new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference arg0) { - showVibrationSettingsDialog(); + showKeypressVibrationDurationSettingsDialog(); return true; } }); - updateVibrationDurationSettingsSummary(prefs, res); + updateKeypressVibrationDurationSettingsSummary(prefs, res); } + + mKeypressSoundVolumeSettingsPref = + (PreferenceScreen) findPreference(PREF_KEYPRESS_SOUND_VOLUME); + if (mKeypressSoundVolumeSettingsPref != null) { + mKeypressSoundVolumeSettingsPref.setOnPreferenceClickListener( + new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference arg0) { + showKeypressSoundVolumeSettingDialog(); + return true; + } + }); + updateKeypressSoundVolumeSummary(prefs, res); + } + refreshEnablingsOfKeypressSoundAndVibrationSettings(prefs, res); } @SuppressWarnings("unused") @@ -537,6 +557,7 @@ public class Settings extends InputMethodSettingsActivity updateVoiceModeSummary(); updateShowCorrectionSuggestionsSummary(); updateKeyPreviewPopupDelaySummary(); + refreshEnablingsOfKeypressSoundAndVibrationSettings(prefs, getResources()); } @Override @@ -637,26 +658,44 @@ public class Settings extends InputMethodSettingsActivity } } - private void updateVibrationDurationSettingsSummary(SharedPreferences sp, Resources res) { - if (mVibrationDurationSettingsPref != null) { - mVibrationDurationSettingsPref.setSummary( + private void refreshEnablingsOfKeypressSoundAndVibrationSettings( + SharedPreferences sp, Resources res) { + if (mKeypressVibrationDurationSettingsPref != null) { + final boolean hasVibrator = VibratorCompatWrapper.getInstance(this).hasVibrator(); + final boolean vibrateOn = hasVibrator && sp.getBoolean(Settings.PREF_VIBRATE_ON, + res.getBoolean(R.bool.config_default_vibration_enabled)); + mKeypressVibrationDurationSettingsPref.setEnabled(vibrateOn); + } + + if (mKeypressSoundVolumeSettingsPref != null) { + final boolean soundOn = sp.getBoolean(Settings.PREF_SOUND_ON, + res.getBoolean(R.bool.config_default_sound_enabled)); + mKeypressSoundVolumeSettingsPref.setEnabled(soundOn); + } + } + + private void updateKeypressVibrationDurationSettingsSummary( + SharedPreferences sp, Resources res) { + if (mKeypressVibrationDurationSettingsPref != null) { + mKeypressVibrationDurationSettingsPref.setSummary( Utils.getCurrentVibrationDuration(sp, res) + res.getString(R.string.settings_ms)); } } - private void showVibrationSettingsDialog() { + private void showKeypressVibrationDurationSettingsDialog() { final SharedPreferences sp = getPreferenceManager().getSharedPreferences(); final Activity context = getActivityInternal(); final Resources res = context.getResources(); final AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(R.string.prefs_vibration_duration_settings); + builder.setTitle(R.string.prefs_keypress_vibration_duration_settings); builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int whichButton) { - final int ms = Integer.valueOf(mVibrationSettingsTextView.getText().toString()); - sp.edit().putInt(Settings.PREF_VIBRATION_DURATION_SETTINGS, ms).apply(); - updateVibrationDurationSettingsSummary(sp, res); + final int ms = Integer.valueOf( + mKeypressVibrationDurationSettingsTextView.getText().toString()); + sp.edit().putInt(Settings.PREF_KEYPRESS_VIBRATION_DURATION_SETTINGS, ms).apply(); + updateKeypressVibrationDurationSettingsSummary(sp, res); } }); builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @@ -669,13 +708,13 @@ public class Settings extends InputMethodSettingsActivity R.layout.vibration_settings_dialog, null); final int currentMs = Utils.getCurrentVibrationDuration( getPreferenceManager().getSharedPreferences(), getResources()); - mVibrationSettingsTextView = (TextView)v.findViewById(R.id.vibration_value); + mKeypressVibrationDurationSettingsTextView = (TextView)v.findViewById(R.id.vibration_value); final SeekBar sb = (SeekBar)v.findViewById(R.id.vibration_settings); sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) { final int tempMs = arg1; - mVibrationSettingsTextView.setText(String.valueOf(tempMs)); + mKeypressVibrationDurationSettingsTextView.setText(String.valueOf(tempMs)); } @Override @@ -689,7 +728,67 @@ public class Settings extends InputMethodSettingsActivity } }); sb.setProgress(currentMs); - mVibrationSettingsTextView.setText(String.valueOf(currentMs)); + mKeypressVibrationDurationSettingsTextView.setText(String.valueOf(currentMs)); + builder.setView(v); + builder.create().show(); + } + + private void updateKeypressSoundVolumeSummary(SharedPreferences sp, Resources res) { + if (mKeypressSoundVolumeSettingsPref != null) { + mKeypressSoundVolumeSettingsPref.setSummary( + String.valueOf((int)(Utils.getCurrentKeypressSoundVolume(sp, res) * 100))); + } + } + + private void showKeypressSoundVolumeSettingDialog() { + final AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); + final SharedPreferences sp = getPreferenceManager().getSharedPreferences(); + final Activity context = getActivityInternal(); + final Resources res = context.getResources(); + final AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(R.string.prefs_keypress_sound_volume_settings); + builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int whichButton) { + final float volume = + ((float)Integer.valueOf( + mKeypressSoundVolumeSettingsTextView.getText().toString())) / 100; + sp.edit().putFloat(Settings.PREF_KEYPRESS_SOUND_VOLUME, volume).apply(); + updateKeypressSoundVolumeSummary(sp, res); + } + }); + builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int whichButton) { + dialog.dismiss(); + } + }); + final View v = context.getLayoutInflater().inflate( + R.layout.sound_effect_volume_dialog, null); + final int currentVolumeInt = (int)(Utils.getCurrentKeypressSoundVolume( + getPreferenceManager().getSharedPreferences(), getResources()) * 100); + mKeypressSoundVolumeSettingsTextView = + (TextView)v.findViewById(R.id.sound_effect_volume_value); + final SeekBar sb = (SeekBar)v.findViewById(R.id.sound_effect_volume_bar); + sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) { + final int tempVolume = arg1; + mKeypressSoundVolumeSettingsTextView.setText(String.valueOf(tempVolume)); + } + + @Override + public void onStartTrackingTouch(SeekBar arg0) { + } + + @Override + public void onStopTrackingTouch(SeekBar arg0) { + final float tempVolume = ((float)arg0.getProgress()) / 100; + am.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD, tempVolume); + } + }); + sb.setProgress(currentVolumeInt); + mKeypressSoundVolumeSettingsTextView.setText(String.valueOf(currentVolumeInt)); builder.setView(v); builder.create().show(); } diff --git a/java/src/com/android/inputmethod/latin/Utils.java b/java/src/com/android/inputmethod/latin/Utils.java index de2930460..34c8c894b 100644 --- a/java/src/com/android/inputmethod/latin/Utils.java +++ b/java/src/com/android/inputmethod/latin/Utils.java @@ -776,7 +776,7 @@ public class Utils { } public static int getCurrentVibrationDuration(SharedPreferences sp, Resources res) { - final int ms = sp.getInt(Settings.PREF_VIBRATION_DURATION_SETTINGS, -1); + final int ms = sp.getInt(Settings.PREF_KEYPRESS_VIBRATION_DURATION_SETTINGS, -1); if (ms >= 0) { return ms; } @@ -791,6 +791,22 @@ public class Utils { return -1; } + public static float getCurrentKeypressSoundVolume(SharedPreferences sp, Resources res) { + final float volume = sp.getFloat(Settings.PREF_KEYPRESS_SOUND_VOLUME, -1.0f); + if (volume >= 0) { + return volume; + } + + final String[] volumePerHardwareList = res.getStringArray(R.array.keypress_volumes); + final String hardwarePrefix = Build.HARDWARE + ","; + for (final String element : volumePerHardwareList) { + if (element.startsWith(hardwarePrefix)) { + return Float.parseFloat(element.substring(element.lastIndexOf(',') + 1)); + } + } + return -1.0f; + } + public static boolean willAutoCorrect(SuggestedWords suggestions) { return !suggestions.mTypedWordValid && suggestions.mHasMinimalSuggestion; }