/** Copyright (C) 2013 Louis Teboul (a.k.a Androguide) * * admin@pimpmyrom.org || louisteboul@gmail.com * http://pimpmyrom.org || http://androguide.fr * 71 quai Clémenceau, 69300 Caluire-et-Cuire, FRANCE. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. **/ package com.androguide.honamicontrol.soundcontrol; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.app.ActionBarActivity; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ScrollView; import android.widget.SeekBar; import android.widget.TextView; import com.androguide.honamicontrol.R; import com.androguide.honamicontrol.helpers.CPUHelper; import com.androguide.honamicontrol.helpers.Helpers; public class SoundControlFragment extends Fragment implements SoundControlInterface { private static ActionBarActivity fa; private static SharedPreferences bootPrefs; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { setHasOptionsMenu(true); ScrollView ll = (ScrollView) inflater.inflate(R.layout.sound_control, container, false); fa = (ActionBarActivity) super.getActivity(); fa.getSupportActionBar().setDisplayHomeAsUpEnabled(true); fa.getSupportActionBar().setHomeButtonEnabled(true); bootPrefs = fa.getSharedPreferences("BOOT_PREFS", 0); final Boolean isLinked = fa.getSharedPreferences("SOUND_CONTROL", 0).getBoolean("LINKED", true); assert ll != null; final SeekBar headphoneLeft = (SeekBar) ll.findViewById(R.id.headphone_seekbar_left); final SeekBar headphoneRight = (SeekBar) ll.findViewById(R.id.headphone_seekbar_right); final SeekBar headphonePALeft = (SeekBar) ll.findViewById(R.id.headphone_pa_seekbar_left); final SeekBar headphonePARight = (SeekBar) ll.findViewById(R.id.headphone_pa_seekbar_right); final SeekBar speakerLeft = (SeekBar) ll.findViewById(R.id.speaker_seekbar_left); final SeekBar speakerRight = (SeekBar) ll.findViewById(R.id.speaker_seekbar_right); final SeekBar micGain = (SeekBar) ll.findViewById(R.id.mic_seekbar); final SeekBar camMicGain = (SeekBar) ll.findViewById(R.id.cam_mic_seekbar); final TextView headUnitLeft = (TextView) ll.findViewById(R.id.headphone_unit_left); final TextView headUnitRight = (TextView) ll.findViewById(R.id.headphone_unit_right); final TextView headPAUnitLeft = (TextView) ll.findViewById(R.id.headphone_pa_unit_left); final TextView headPAUnitRight = (TextView) ll.findViewById(R.id.headphone_pa_unit_right); final TextView speakerUnitLeft = (TextView) ll.findViewById(R.id.speaker_unit_left); final TextView speakerUnitRight = (TextView) ll.findViewById(R.id.speaker_unit_right); final TextView micUnit = (TextView) ll.findViewById(R.id.mic_unit); final TextView camMicUnit = (TextView) ll.findViewById(R.id.cam_mic_unit); // Headphone L/R Gain if (Helpers.doesFileExist(FAUX_SC_HEADPHONE)) { headphoneLeft.setMax(40); headphoneRight.setMax(40); String[] headphoneGains = CPUHelper.readOneLineNotRoot(FAUX_SC_HEADPHONE).split(" "); int headphoneGainLeft = Integer.valueOf(headphoneGains[0]); if (headphoneGainLeft > 100) headphoneGainLeft -= 256; int headphoneGainRight = Integer.valueOf(headphoneGains[1]); if (headphoneGainRight > 100) headphoneGainRight -= 256; headphoneLeft.setProgress(headphoneGainLeft + 30); headphoneRight.setProgress(headphoneGainRight + 30); headUnitLeft.setText(headphoneGainLeft + ""); headUnitRight.setText(headphoneGainRight + ""); headphoneLeft.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { headUnitLeft.setText(i - 30 + ""); if (isLinked) { headUnitRight.setText(i - 30 + ""); headphoneRight.setProgress(i); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(final SeekBar seekBar) { int toApplyLeft = getSCInt(seekBar.getProgress()); int toApplyRight = getSCInt(headphoneRight.getProgress()); Helpers.CMDProcessorWrapper.runSuCommand("busybox echo 0 > " + FAUX_SC_LOCKED + "\n" + "busybox echo " + toApplyLeft + " " + toApplyRight + " " + Helpers.getSoundCountrolBitRepresentation(toApplyLeft, toApplyRight) + " > " + FAUX_SC_HEADPHONE + "\n" + "busybox echo 1 > " + FAUX_SC_LOCKED ); bootPrefs.edit().putString( "HEADPHONE", toApplyLeft + " " + toApplyRight + " " + Helpers.getSoundCountrolBitRepresentation(toApplyLeft, toApplyRight) ).commit(); } }); headphoneRight.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { headUnitRight.setText(i - 30 + ""); if (isLinked) { headUnitLeft.setText(i - 30 + ""); headphoneLeft.setProgress(i); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(final SeekBar seekBar) { int toApplyLeft = getSCInt(headphoneLeft.getProgress()); int toApplyRight = getSCInt(seekBar.getProgress()); Helpers.CMDProcessorWrapper.runSuCommand("busybox echo 0 > " + FAUX_SC_LOCKED + "\n" + "busybox echo " + toApplyLeft + " " + toApplyRight + " " + Helpers.getSoundCountrolBitRepresentation(toApplyLeft, toApplyRight) + " > " + FAUX_SC_HEADPHONE + "\n" + "busybox echo 1 > " + FAUX_SC_LOCKED ); bootPrefs.edit().putString( "HEADPHONE", toApplyLeft + " " + toApplyRight + " " + Helpers.getSoundCountrolBitRepresentation(toApplyLeft, toApplyRight) ).commit(); } }); } else { headphoneLeft.setMax(40); headphoneRight.setMax(40); headphoneLeft.setProgress(20); headphoneRight.setProgress(20); headphoneLeft.setEnabled(false); headphoneRight.setEnabled(false); headUnitLeft.setText("Unsupported"); headUnitRight.setText("Unsupported"); } // Headphone analog L/R gain if (Helpers.doesFileExist(FAUX_SC_HEADPHONE_POWERAMP)) { headphonePALeft.setMax(12); headphonePARight.setMax(12); String[] headphonePAGains = CPUHelper.readOneLineNotRoot(FAUX_SC_HEADPHONE_POWERAMP).split(" "); int headphonePAGainLeft = Integer.valueOf(headphonePAGains[0]); int headphonePAGainRight = Integer.valueOf(headphonePAGains[1]); headphonePALeft.setProgress(headphonePAGainLeft); headphonePARight.setProgress(headphonePAGainRight); headPAUnitLeft.setText(headphonePAGainLeft - 26 + ""); headPAUnitRight.setText(headphonePAGainRight - 26 + ""); headphonePALeft.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { headPAUnitLeft.setText(i - 6 + ""); if (isLinked) { headphonePARight.setProgress(i); headPAUnitRight.setText(i - 6 + ""); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(final SeekBar seekBar) { int toApplyLeft = getSysfsValue(seekBar.getProgress()); int toApplyRight = getSysfsValue(headphonePARight.getProgress()); Helpers.CMDProcessorWrapper.runSuCommand("busybox echo 0 > " + FAUX_SC_LOCKED + "\n" + "busybox echo " + toApplyLeft + " " + toApplyRight + " " + Helpers.getSoundCountrolBitRepresentation(toApplyLeft, toApplyRight) + " > " + FAUX_SC_HEADPHONE_POWERAMP + "\n" + "busybox echo 1 > " + FAUX_SC_LOCKED ); bootPrefs.edit().putString( "HEADPHONE_PA", toApplyLeft + " " + toApplyRight + " " + Helpers.getSoundCountrolBitRepresentation(toApplyLeft, toApplyRight) ).commit(); } }); headphonePARight.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { headPAUnitRight.setText(i - 6 + ""); if (isLinked) { headphonePALeft.setProgress(i); headPAUnitLeft.setText(i - 6 + ""); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(final SeekBar seekBar) { int toApplyLeft = getSysfsValue(headphonePALeft.getProgress()); int toApplyRight = getSysfsValue(seekBar.getProgress()); Helpers.CMDProcessorWrapper.runSuCommand("busybox echo 0 > " + FAUX_SC_LOCKED + "\n" + "busybox echo " + toApplyLeft + " " + toApplyRight + " " + Helpers.getSoundCountrolBitRepresentation(toApplyLeft, toApplyRight) + " > " + FAUX_SC_HEADPHONE_POWERAMP + "\n" + "busybox echo 1 > " + FAUX_SC_LOCKED ); bootPrefs.edit().putString( "HEADPHONE_PA", toApplyLeft + " " + toApplyRight + " " + Helpers.getSoundCountrolBitRepresentation(toApplyLeft, toApplyRight) ).commit(); } }); } else { headphonePALeft.setMax(40); headphonePARight.setMax(40); headphonePALeft.setProgress(20); headphonePARight.setProgress(20); headphonePALeft.setEnabled(false); headphonePARight.setEnabled(false); headPAUnitLeft.setText("Unsupported"); headPAUnitRight.setText("Unsupported"); } // Speaker L/R Gain if (Helpers.doesFileExist(FAUX_SC_SPEAKER)) { speakerLeft.setMax(40); speakerRight.setMax(40); String[] speakerGains = CPUHelper.readOneLineNotRoot(FAUX_SC_SPEAKER).split(" "); int speakerGainLeft = Integer.valueOf(speakerGains[0]); if (speakerGainLeft > 100) speakerGainLeft -= 256; int speakerGainRight = Integer.valueOf(speakerGains[1]); if (speakerGainRight > 100) speakerGainRight -= 256; speakerLeft.setProgress(speakerGainLeft + 30); speakerRight.setProgress(speakerGainRight + 30); speakerUnitLeft.setText(speakerGainLeft + ""); speakerUnitRight.setText(speakerGainRight + ""); speakerLeft.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { speakerUnitLeft.setText(i - 30 + ""); if (isLinked) { speakerUnitRight.setText(i - 30 + ""); speakerRight.setProgress(i); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(final SeekBar seekBar) { int toApplyLeft = getSCInt(seekBar.getProgress()); int toApplyRight = getSCInt(speakerRight.getProgress()); Helpers.CMDProcessorWrapper.runSuCommand("busybox echo 0 > " + FAUX_SC_LOCKED + "\n" + "busybox echo " + toApplyLeft + " " + toApplyRight + " " + Helpers.getSoundCountrolBitRepresentation(toApplyLeft, toApplyRight) + " > " + FAUX_SC_SPEAKER + "\n" + "busybox echo 1 > " + FAUX_SC_LOCKED ); bootPrefs.edit().putString( "SPEAKER", toApplyLeft + " " + toApplyRight + " " + Helpers.getSoundCountrolBitRepresentation(toApplyLeft, toApplyRight) ).commit(); } }); speakerRight.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { speakerUnitRight.setText(i - 30 + ""); if (isLinked) { speakerUnitLeft.setText(i - 30 + ""); speakerLeft.setProgress(i); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(final SeekBar seekBar) { int toApplyLeft = getSCInt(speakerLeft.getProgress()); int toApplyRight = getSCInt(seekBar.getProgress()); Helpers.CMDProcessorWrapper.runSuCommand("busybox echo 0 > " + FAUX_SC_LOCKED + "\n" + "busybox echo " + toApplyLeft + " " + toApplyRight + " " + Helpers.getSoundCountrolBitRepresentation(toApplyLeft, toApplyRight) + " > " + FAUX_SC_SPEAKER + "\n" + "busybox echo 1 > " + FAUX_SC_LOCKED ); bootPrefs.edit().putString( "SPEAKER", toApplyLeft + " " + toApplyRight + " " + Helpers.getSoundCountrolBitRepresentation(toApplyLeft, toApplyRight) ).commit(); } }); } else { speakerLeft.setMax(40); speakerRight.setMax(40); speakerLeft.setProgress(20); speakerRight.setProgress(20); speakerLeft.setEnabled(false); speakerRight.setEnabled(false); speakerUnitLeft.setText("Unsupported"); speakerUnitRight.setText("Unsupported"); } // Microphone Gain if (Helpers.doesFileExist(FAUX_SC_MIC)) { int micValue = Integer.valueOf(CPUHelper.readOneLine(FAUX_SC_MIC)); if (micValue > 100) micValue -= 256; micGain.setMax(40); micGain.setProgress(micValue + 30); micUnit.setText(micValue + ""); micGain.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { micUnit.setText(i - 30 + ""); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(final SeekBar seekBar) { int scProgress = seekBar.getProgress() - 30; if (scProgress < 0) scProgress += 256; Helpers.CMDProcessorWrapper.runSuCommand( "busybox echo 0 > " + FAUX_SC_LOCKED + "\n" + "busybox echo " + scProgress + " " + Helpers.getSoundCountrolBitRepresentation(scProgress, 0) + " > " + FAUX_SC_MIC + "\n" + "busybox echo 1 > " + FAUX_SC_LOCKED ); bootPrefs.edit().putString("SC_MIC", scProgress + " " + Helpers.getSoundCountrolBitRepresentation(scProgress, 0)).commit(); } }); } else { micGain.setMax(40); micGain.setProgress(20); micUnit.setText("Unsupported"); micGain.setEnabled(false); } // Camera Microphone Gain if (Helpers.doesFileExist(FAUX_SC_CAM_MIC)) { int camMicValue = Integer.valueOf(CPUHelper.readOneLine(FAUX_SC_CAM_MIC)); if (camMicValue > 100) camMicValue -= 256; camMicGain.setMax(40); camMicGain.setProgress(camMicValue + 30); camMicUnit.setText(camMicValue + ""); camMicGain.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { camMicUnit.setText(i - 30 + ""); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(final SeekBar seekBar) { int scProgress = seekBar.getProgress() - 30; if (scProgress < 0) scProgress += 256; Helpers.CMDProcessorWrapper.runSuCommand( "busybox echo 0 > " + FAUX_SC_LOCKED + "\n" + "busybox echo " + scProgress + " " + Helpers.getSoundCountrolBitRepresentation(scProgress, 0) + " > " + FAUX_SC_CAM_MIC + "\n" + "busybox echo 1 > " + FAUX_SC_LOCKED ); bootPrefs.edit().putString("SC_MIC", scProgress + " " + Helpers.getSoundCountrolBitRepresentation(scProgress, 0)).commit(); } }); } else { camMicGain.setMax(40); camMicGain.setProgress(20); camMicUnit.setText("Unsupported"); camMicGain.setEnabled(false); } return ll; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.sound_control, menu); SharedPreferences p = fa.getSharedPreferences("SOUND_CONTROL", 0); if (p.getBoolean("LINKED", true)) menu.getItem(0).setChecked(true); else menu.getItem(0).setChecked(false); } @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.link_seekbars: SharedPreferences soundPrefs = fa.getSharedPreferences("SOUND_CONTROL", 0); if (item.isChecked()) { item.setChecked(false); soundPrefs.edit().putBoolean("LINKED", false).commit(); } else { item.setChecked(true); soundPrefs.edit().putBoolean("LINKED", true).commit(); } break; } return super.onOptionsItemSelected(item); } public int getSCInt(int seekbarInt) { seekbarInt -= 30; if (seekbarInt < 0) seekbarInt += 256; return seekbarInt; } private int getSysfsValue(int progress) { switch (progress) { case 0: return 44; case 1: return 43; case 2: return 42; case 3: return 41; case 4: return 40; case 5: return 39; case 6: return 38; case 7: return 37; case 8: return 36; case 9: return 35; case 10: return 34; case 11: return 33; case 12: return 32; case 13: return 31; default: return 38; } } }