diff options
author | sbrissen <sbrissen@hotmail.com> | 2013-06-10 11:23:52 -0400 |
---|---|---|
committer | sbrissen <sbrissen@hotmail.com> | 2013-06-13 09:33:36 -0400 |
commit | 53080972f7dfb0f234a82ad64deb1536dfe0d860 (patch) | |
tree | 30bc70253a0deda3132c35b6ab15d60c0eb5c73d /DeviceSettings/src/com/cyanogenmod/settings/device/AudioOut.java | |
parent | c1818cd5a44e8d529a61b7c69d451237d1602e44 (diff) | |
download | device_samsung_smdk4412-common-53080972f7dfb0f234a82ad64deb1536dfe0d860.zip device_samsung_smdk4412-common-53080972f7dfb0f234a82ad64deb1536dfe0d860.tar.gz device_samsung_smdk4412-common-53080972f7dfb0f234a82ad64deb1536dfe0d860.tar.bz2 |
t0lte: user configureable voice/streaming volumes [2/2]
relies on http://review.cyanogenmod.org/#/c/43834/
Change-Id: I03367bf0424257d906a6c8e059e4ca6d9faa7dec
Diffstat (limited to 'DeviceSettings/src/com/cyanogenmod/settings/device/AudioOut.java')
-rw-r--r-- | DeviceSettings/src/com/cyanogenmod/settings/device/AudioOut.java | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/DeviceSettings/src/com/cyanogenmod/settings/device/AudioOut.java b/DeviceSettings/src/com/cyanogenmod/settings/device/AudioOut.java new file mode 100644 index 0000000..e3b5b9f --- /dev/null +++ b/DeviceSettings/src/com/cyanogenmod/settings/device/AudioOut.java @@ -0,0 +1,269 @@ +/* + * Copyright (C) 2013 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.settings.device; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; +import android.graphics.Color; +import android.graphics.LightingColorFilter; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.LayerDrawable; +import android.os.Bundle; +import android.os.Vibrator; +import android.preference.DialogPreference; +import android.preference.PreferenceManager; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; +import android.widget.SeekBar; +import android.widget.TextView; +import android.widget.Button; + +import java.lang.Math; +import java.text.DecimalFormat; + +/** + * Special preference type that allows configuration of audio out volume on some smdk4412 + * Devices + */ +public class AudioOut extends DialogPreference implements SeekBar.OnSeekBarChangeListener { + private static final String TAG = "DeviceSettings_AudioOut"; + + private static String AUDIOOUT_HEADPHONE_FILE = "/data/local/audio/out_headphone"; + private static String AUDIOOUT_SPEAKER_FILE = "/data/local/audio/out_speaker"; + private static int MAX_VALUE; + private static int WARNING_THRESHOLD; + private static int DEFAULT_VALUE; + private static int MIN_VALUE; + + private SeekBar mHeadphoneSeekBar; + private SeekBar mSpeakerSeekBar; + private TextView mHeadphoneValue; + private TextView mSpeakerValue; + private TextView mWarning; + + private String mHeadphoneOgValue; + private String mSpeakerOgValue; + private int mHeadphoneOgPercent; + private int mSpeakerOgPercent; + + private Drawable mHeadphoneProgressDrawable; + private Drawable mSpeakerProgressDrawable; + private Drawable mHeadphoneProgressThumb; + private Drawable mSpeakerProgressThumb; + private LightingColorFilter mRedFilter; + + private enum Device { + headphone, + speaker + } + + public AudioOut(Context context, AttributeSet attrs) { + super(context, attrs); + + MAX_VALUE = Integer.valueOf(context.getResources().getString(R.string.audioout_max_value)); + WARNING_THRESHOLD = Integer.valueOf(context.getResources().getString(R.string.audioout_warning_threshold)); + DEFAULT_VALUE = Integer.valueOf(context.getResources().getString(R.string.audioout_default_value)); + MIN_VALUE = Integer.valueOf(context.getResources().getString(R.string.audioout_min_value)); + + setDialogLayoutResource(R.layout.preference_dialog_output_audio_tuning); + } + + @Override + protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { + builder.setNeutralButton(R.string.defaults_button, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }); + } + + @Override + protected void onBindDialogView(View view) { + super.onBindDialogView(view); + + mHeadphoneSeekBar = (SeekBar) view.findViewById(R.id.audioout_headphone_seekbar); + mHeadphoneValue = (TextView) view.findViewById(R.id.audioout_headphone_value); + mSpeakerSeekBar = (SeekBar) view.findViewById(R.id.audioout_speaker_seekbar); + mSpeakerValue = (TextView) view.findViewById(R.id.audioout_speaker_value); + mWarning = (TextView) view.findViewById(R.id.audioout_textWarn); + + String strWarnMsg = getContext().getResources().getString(R.string.audioout_warning, volumeToPercent(WARNING_THRESHOLD)); + mWarning.setText(strWarnMsg); + + Drawable progressDrawableHeadphone = mHeadphoneSeekBar.getProgressDrawable(); + if (progressDrawableHeadphone instanceof LayerDrawable) { + LayerDrawable ldHeadphone = (LayerDrawable) progressDrawableHeadphone; + mHeadphoneProgressDrawable = ldHeadphone.findDrawableByLayerId(android.R.id.progress); + } + Drawable progressDrawableSpeaker = mSpeakerSeekBar.getProgressDrawable(); + if (progressDrawableSpeaker instanceof LayerDrawable) { + LayerDrawable ldSpeaker = (LayerDrawable) progressDrawableSpeaker; + mSpeakerProgressDrawable = ldSpeaker.findDrawableByLayerId(android.R.id.progress); + } + + mHeadphoneProgressThumb = mHeadphoneSeekBar.getThumb(); + mSpeakerProgressThumb = mSpeakerSeekBar.getThumb(); + + mRedFilter = new LightingColorFilter(Color.BLACK, + getContext().getResources().getColor(android.R.color.holo_red_light)); + + mHeadphoneOgValue = Utils.readOneLine(AUDIOOUT_HEADPHONE_FILE); + mHeadphoneOgPercent = volumeToPercent(Integer.parseInt(mHeadphoneOgValue)); + + mHeadphoneSeekBar.setOnSeekBarChangeListener(this); + mHeadphoneSeekBar.setProgress(Integer.valueOf(mHeadphoneOgPercent)); + + mSpeakerOgValue = Utils.readOneLine(AUDIOOUT_SPEAKER_FILE); + mSpeakerOgPercent = volumeToPercent(Integer.parseInt(mSpeakerOgValue)); + + mSpeakerSeekBar.setOnSeekBarChangeListener(this); + mSpeakerSeekBar.setProgress(Integer.valueOf(mSpeakerOgPercent)); + } + + @Override + protected void showDialog(Bundle state) { + super.showDialog(state); + + // can't use onPrepareDialogBuilder for this as we want the dialog + // to be kept open on click + AlertDialog d = (AlertDialog) getDialog(); + Button defaultsButton = d.getButton(DialogInterface.BUTTON_NEUTRAL); + defaultsButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mHeadphoneSeekBar.setProgress(volumeToPercent(DEFAULT_VALUE)); + mSpeakerSeekBar.setProgress(volumeToPercent(DEFAULT_VALUE)); + } + }); + } + + @Override + protected void onDialogClosed(boolean positiveResult) { + super.onDialogClosed(positiveResult); + int volumeHeadphone, volumeSpeaker; + + if (positiveResult) { + Editor editor = getEditor(); + + volumeHeadphone = percentToVolume(mHeadphoneSeekBar.getProgress()); + editor.putString(AUDIOOUT_HEADPHONE_FILE, String.valueOf(volumeHeadphone)); + volumeSpeaker = percentToVolume(mSpeakerSeekBar.getProgress()); + editor.putString(AUDIOOUT_SPEAKER_FILE, String.valueOf(volumeSpeaker)); + editor.commit(); + } else { + Utils.writeValue(AUDIOOUT_HEADPHONE_FILE, String.valueOf(mHeadphoneOgPercent)); + Utils.writeValue(AUDIOOUT_SPEAKER_FILE, String.valueOf(mSpeakerOgPercent)); + } + } + + public static void restore(Context context) { + SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); + + if (isSupported("headphone")) + Utils.writeValue(AUDIOOUT_HEADPHONE_FILE, sharedPrefs.getString(AUDIOOUT_HEADPHONE_FILE, "50")); + if (isSupported("speaker")) + Utils.writeValue(AUDIOOUT_SPEAKER_FILE, sharedPrefs.getString(AUDIOOUT_SPEAKER_FILE, "50")); + } + + public static boolean isSupported(String output) { + String FILE = null; + Device outputDevice = Device.valueOf(output); + + switch(outputDevice) { + case headphone: + FILE = AUDIOOUT_HEADPHONE_FILE; + case speaker: + FILE = AUDIOOUT_SPEAKER_FILE; + } + return Utils.fileExists(FILE); + } + + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + boolean shouldWarn = progress >= volumeToPercent(WARNING_THRESHOLD); + int stepSize = 1; + progress = Math.round(progress/stepSize)*stepSize; + + if(seekBar == mHeadphoneSeekBar){ + if (mHeadphoneProgressDrawable != null) { + mHeadphoneProgressDrawable.setColorFilter(shouldWarn ? mRedFilter : null); + } + if (mHeadphoneProgressThumb != null) { + mHeadphoneProgressThumb.setColorFilter(shouldWarn ? mRedFilter : null); + } + mHeadphoneSeekBar.setProgress(progress); + Utils.writeValue(AUDIOOUT_HEADPHONE_FILE, String.valueOf(percentToVolume(progress))); + mHeadphoneValue.setText(String.format("%d%%", progress)); + }else if(seekBar == mSpeakerSeekBar){ + if (mSpeakerProgressDrawable != null) { + mSpeakerProgressDrawable.setColorFilter(shouldWarn ? mRedFilter : null); + } + if (mSpeakerProgressThumb != null) { + mSpeakerProgressThumb.setColorFilter(shouldWarn ? mRedFilter : null); + } + mSpeakerSeekBar.setProgress(progress); + Utils.writeValue(AUDIOOUT_SPEAKER_FILE, String.valueOf(percentToVolume(progress))); + mSpeakerValue.setText(String.format("%d%%", progress)); + } + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + // Do nothing + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + //Vibrator vib = (Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE); + //vib.vibrate(200); + } + + /** + * Convert volume to percent + */ + public static int volumeToPercent(int volume) { + double maxValue = MAX_VALUE; + double minValue = MIN_VALUE; + + double percent = (volume - minValue) * (100 / (maxValue - minValue)); + + if (percent > 100) + percent = 100; + else if (percent < 0) + percent = 0; + + return (int) percent; + } + + /** + * Convert percent to volume + */ + public static int percentToVolume(int percent) { + int volume = Math.round((((MAX_VALUE - MIN_VALUE) * percent) / 100) + MIN_VALUE); + + if (volume > MAX_VALUE) + volume = MAX_VALUE; + else if (volume < MIN_VALUE) + volume = MIN_VALUE; + + return volume; + } +} |