From 6c313e2e9bcd764c0e944bc46d1ec73a27a355f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Balzarotti?= Date: Tue, 10 Oct 2017 00:05:43 +0200 Subject: [PATCH] All effects working! --- .../activities/AudioSettingsActivity.java | 108 +++--- .../adapter/GBDeviceAdapterv2.java | 327 +++++++++--------- .../gadgetbridge/devices/EventHandler.java | 4 +- .../gadgetbridge/impl/GBDeviceService.java | 17 +- .../gadgetbridge/model/DeviceService.java | 5 +- .../gadgetbridge/model/DeviceType.java | 2 +- .../service/DeviceCommunicationService.java | 14 +- .../service/DeviceSupportFactory.java | 4 +- .../service/ServiceDeviceSupport.java | 6 +- .../service/devices/here/HereSupport.java | 151 +------- .../service/devices/hplus/HPlusSupport.java | 3 +- .../devices/jyou/TeclastH30Support.java | 3 +- .../devices/liveview/LiveviewSupport.java | 4 +- .../service/devices/miband/MiBandSupport.java | 3 +- .../devices/miband2/MiBand2Support.java | 3 +- .../service/devices/no1f1/No1F1Support.java | 3 +- .../service/devices/pebble/PebbleSupport.java | 4 +- .../vibratissimo/VibratissimoSupport.java | 5 +- .../res/layout/activity_audio_settings.xml | 267 ++++++++------ app/src/main/res/values-it/strings.xml | 8 +- app/src/main/res/values/strings.xml | 2 + 21 files changed, 438 insertions(+), 505 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AudioSettingsActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AudioSettingsActivity.java index 6f3ba137..5f910588 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AudioSettingsActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/AudioSettingsActivity.java @@ -26,54 +26,55 @@ 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 CheckedTextView cbBassBoost; - private CheckedTextView cbNoiseMask; // 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 Setttings interface"); - - // All of this is because HERE can't handle more than 2 effects. - // You _can_ enable them, but the device will not be able to manage them in realtime - // and you'll get "Xruns". We prevent more than 2 simultaneous checks (like their app does) - // But it's commented out until I'll read the one already enabled. Else this is useless :D - /*enabledEffects = new boolean[] { - false // echo - , false // reverb - , false // noise mask - , false // fuzz - , false // flange - , false // bass boost - };*/ + 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 0xe3 (-22dB on their app) to 0xff (+6dB) - // 0xff - 0xe3 = 28 -> seekbar max value - // volume = seekbar + Min_volume (= 0xe3 = 227) - volume = position + 227; + // 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); - GBApplication.deviceService().onSetAudioProperty(AudioEffectType.VOLUME.getKey(), - new float[] {volume}); - // Show the volume on the UI in dB (range -22;6) - volume_text.setText(" " + (position - 22) + " dB"); + 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 @@ -89,46 +90,35 @@ public class AudioSettingsActivity extends AbstractGBActivity { // 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. - seekBar.setProgress(22); - cbBassBoost = (CheckedTextView) findViewById(R.id.audio_effect_bassboost); + Map checkboxesIds = new HashMap(); + checkboxesIds.put(R.id.audio_effect_echo, AudioEffectType.ECHO); + checkboxesIds.put(R.id.audio_effect_bassboost, AudioEffectType.BASSBOOST); + checkboxesIds.put(R.id.audio_effect_fuzz, AudioEffectType.FUZZ); + checkboxesIds.put(R.id.audio_effect_flange, AudioEffectType.FLANGE); + checkboxesIds.put(R.id.audio_effect_reverb, AudioEffectType.REVERB); + checkboxesIds.put(R.id.audio_effect_noisemask, AudioEffectType.NOISEMASK); + checkboxesIds.put(R.id.audio_effect_bitcrusher, AudioEffectType.BITCRUSHER); + checkboxesIds.put(R.id.audio_effect_chorus, AudioEffectType.CHORUS); - cbBassBoost.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - ((CheckedTextView) v).toggle(); - LOG.info("Enabled bassBoost"); - applyEffect(AudioEffectType.BASSBOOST, ((CheckedTextView) v).isChecked()); - } - }); + for (int id : checkboxesIds.keySet()) { + final AudioEffectType effect = checkboxesIds.get(id); - cbNoiseMask = (CheckedTextView) findViewById(R.id.audio_effect_noisemask); - - cbNoiseMask.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - ((CheckedTextView) v).toggle(); - LOG.info("Enabled noisemask"); - applyEffect(AudioEffectType.NOISEMASK, ((CheckedTextView) v).isChecked()); - } - }); - - cbNoiseMask = (CheckedTextView) findViewById(R.id.audio_effect_echo); - - cbNoiseMask.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - ((CheckedTextView) v).toggle(); - LOG.info("Enabled echo"); - applyEffect(AudioEffectType.ECHO, ((CheckedTextView) v).isChecked()); - } - }); + ((CheckedTextView) findViewById(id)).setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + ((CheckedTextView) v).toggle(); + LOG.info("Toggled " + effect.name()); + applyEffect(new AudioEffect(effect, ((CheckedTextView) v).isChecked())); + } + }); + } } - void applyEffect(AudioEffectType effect, boolean enable) { - GBApplication.deviceService().onSetAudioProperty( - effect.getId(), - new float[] { - enable ? 1.0f : 0.0f, - // FIXME: add other params? - }); + private void setdB(int volume) { + volume_text.setText(" " + (volume - 30) + " dB"); + } + void applyEffect(AudioEffect effect) { + GBApplication.deviceService().onSetAudioProperty(effect); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java index c3bbcd15..ba66218f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java @@ -5,17 +5,17 @@ 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. + 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. + 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 . */ - package nodomain.freeyourgadget.gadgetbridge.adapter; + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.adapter; import android.app.Activity; import android.app.AlertDialog; @@ -85,27 +85,27 @@ public class GBDeviceAdapterv2 extends RecyclerView.Adapter appsManagementActivity = coordinator.getAppsManagementActivity(); - if (appsManagementActivity != null) { - Intent startIntent = new Intent(context, appsManagementActivity); - startIntent.putExtra(GBDevice.EXTRA_DEVICE, device); - context.startActivity(startIntent); - } - } - } - ); + { + @Override + public void onClick(View v) { + DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(device); + Class appsManagementActivity = coordinator.getAppsManagementActivity(); + if (appsManagementActivity != null) { + Intent startIntent = new Intent(context, appsManagementActivity); + startIntent.putExtra(GBDevice.EXTRA_DEVICE, device); + context.startActivity(startIntent); + } + } + } + ); //set alarms holder.setAlarmsView.setVisibility(coordinator.supportsAlarmConfiguration() ? View.VISIBLE : View.GONE); holder.setAlarmsView.setOnClickListener(new View.OnClickListener() - { - @Override - public void onClick(View v) { - Intent startIntent; - startIntent = new Intent(context, ConfigureAlarms.class); - startIntent.putExtra(GBDevice.EXTRA_DEVICE, device); - context.startActivity(startIntent); - } - } - ); + { + @Override + public void onClick(View v) { + Intent startIntent; + startIntent = new Intent(context, ConfigureAlarms.class); + startIntent.putExtra(GBDevice.EXTRA_DEVICE, device); + context.startActivity(startIntent); + } + } + ); //show graphs holder.showActivityGraphs.setVisibility(coordinator.supportsActivityTracking() ? View.VISIBLE : View.GONE); holder.showActivityGraphs.setOnClickListener(new View.OnClickListener() - { - @Override - public void onClick(View v) { - Intent startIntent; - startIntent = new Intent(context, ChartsActivity.class); - startIntent.putExtra(GBDevice.EXTRA_DEVICE, device); - context.startActivity(startIntent); - } - } - ); + { + @Override + public void onClick(View v) { + Intent startIntent; + startIntent = new Intent(context, ChartsActivity.class); + startIntent.putExtra(GBDevice.EXTRA_DEVICE, device); + context.startActivity(startIntent); + } + } + ); // audio settings holder.showAudioSettings.setVisibility(device.isInitialized() && coordinator.supportsAudioSettings() ? View.VISIBLE : View.GONE); - holder.showAudioSettings.setOnClickListener(new View.OnClickListener() - { - @Override - public void onClick(View v) { - showTransientSnackbar(R.string.controlcenter_snackbar_requested_screenshot); - Intent startIntent; - startIntent = new Intent(context, AudioSettingsActivity.class); - startIntent.putExtra(GBDevice.EXTRA_DEVICE, device); - context.startActivity(startIntent); - } - } - ); + holder.showAudioSettings.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showTransientSnackbar(R.string.controlcenter_snackbar_requested_screenshot); + Intent startIntent; + startIntent = new Intent(context, AudioSettingsActivity.class); + startIntent.putExtra(GBDevice.EXTRA_DEVICE, device); + context.startActivity(startIntent); + } + } + ); ItemWithDetailsAdapter infoAdapter = new ItemWithDetailsAdapter(context, device.getDeviceInfos()); infoAdapter.setHorizontalAlignment(true); @@ -239,96 +238,96 @@ public class GBDeviceAdapterv2 extends RecyclerView.Adapter