Gadgetbridge/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AudioSettingsActivity.java

169 lines
6.7 KiB
Java

/* Copyright (C) 2016-2017 Andreas Shimokawa, Carsten Pfeiffer
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.activities;
import android.os.Bundle;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Switch;
import android.widget.SeekBar;
import android.widget.TextView;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.List;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.devices.here.HereConstants;
import nodomain.freeyourgadget.gadgetbridge.entities.AudioEffect;
import nodomain.freeyourgadget.gadgetbridge.entities.AudioEffectType;
import nodomain.freeyourgadget.gadgetbridge.service.btle.BtLEAction;
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
public class AudioSettingsActivity extends AbstractGBActivity {
private static final Logger LOG = LoggerFactory.getLogger(AudioSettingsActivity.class);
private SeekBar seekBar;
private TextView volume_text;
// private boolean[] enabledEffects;
private int volume;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_audio_settings);
LOG.debug("Create Audio Settings interface");
// FIXME: read enabled effects too
// FIXME: and EQ values XD
seekBar = (SeekBar) findViewById(R.id.volume_seekbar);
volume_text = (TextView) findViewById(R.id.volume_seekbar_volume);
int startingVolume = 30; // FIXME: how do I read it?
seekBar.setProgress(startingVolume);
setdB(startingVolume);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int position, boolean fromUser) {
// HERE's volume range is from 0xdb (-30dB on their app) to 0xff (+6dB)
// 0xff - 0xdb = 36 -> seekbar max value
// volume = seekbar + Min_volume (= 0xdb = 219)
volume = position + 219;
// LOG.debug("Volume = " + (byte)volume + " = " + volume + "= " + position);
AudioEffect eff = new AudioEffect(AudioEffectType.VOLUME, volume);
GBApplication.deviceService().onSetAudioProperty(eff);
// Show the volume on the UI in dB (range -30;6)
setdB(position);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
// FIXME: we need to read the current value and display this.
// right now, I'm just showing 0 dB, Called after changeListener sets the value on
// the device too.
Map<Integer, AudioEffectType> switchIds = new HashMap<Integer, AudioEffectType>();
switchIds.put(R.id.audio_effect_echo, AudioEffectType.ECHO);
switchIds.put(R.id.audio_effect_bassboost, AudioEffectType.BASSBOOST);
switchIds.put(R.id.audio_effect_fuzz, AudioEffectType.FUZZ);
switchIds.put(R.id.audio_effect_flange, AudioEffectType.FLANGE);
switchIds.put(R.id.audio_effect_reverb, AudioEffectType.REVERB);
switchIds.put(R.id.audio_effect_noisemask, AudioEffectType.NOISEMASK);
switchIds.put(R.id.audio_effect_bitcrusher, AudioEffectType.BITCRUSHER);
switchIds.put(R.id.audio_effect_chorus, AudioEffectType.CHORUS);
for (int id : switchIds.keySet()) {
final AudioEffectType effect = switchIds.get(id);
Switch s = (Switch) findViewById(id);
s.setOnCheckedChangeListener(
new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
LOG.info("Toggled " + effect.name());
applyEffect(new AudioEffect(effect, isChecked));
}
});
}
List<String> defaultPresets = new ArrayList<String>();
defaultPresets.add("8bit");
defaultPresets.add("Example");
RadioGroup presets = (RadioGroup)findViewById(R.id.audio_presets);
for (String preset : defaultPresets) {
RadioButton radioButton = new RadioButton(getBaseContext());
radioButton.setText(preset);
presets.addView(radioButton);
radioButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RadioButton r = (RadioButton) findViewById(getCheckedPreset());
applyPreset(r.getText().toString());
}
});
}
}
private int getCheckedPreset() {
return ((RadioGroup)findViewById(R.id.audio_presets)).getCheckedRadioButtonId();
}
private void setdB(int volume) {
volume_text.setText(" " + (volume - 30) + " dB");
}
private void applyPreset(String preset) {
LOG.info("Applying preset " + preset);
switch(preset) {
case "8bit":
LOG.debug("8bit");
ArrayList<Object> values = new ArrayList<Object>();
values.add("3byte");
values.add(256.0f); // bits
values.add(20000.0f); // freq
AudioEffect effect = new AudioEffect(AudioEffectType.BITCRUSHER,
true, values);
GBApplication.deviceService().onSetAudioProperty(effect);
break;
default:
LOG.error("Missing preset! (Programming error!?");
}
}
private void applyEffect(AudioEffect effect) {
GBApplication.deviceService().onSetAudioProperty(effect);
}
}