From d6a4aad588d2f6e51b7972e16cd8d9329304a7bc Mon Sep 17 00:00:00 2001 From: iNeedADoctor Date: Wed, 25 Mar 2026 21:03:13 +0100 Subject: [PATCH] Redmi Buds 8 Active: Add device support --- .../DeviceSettingsPreferenceConst.java | 12 ++ .../DeviceSpecificSettingsFragment.java | 14 +- .../RedmiBuds8ActiveCoordinator.java | 46 +++++ .../RedmiBuds8ActiveSettingsCustomizer.java | 84 ++++++++++ .../gadgetbridge/model/DeviceType.java | 2 + .../RedmiBuds8ActiveDeviceSupport.java | 10 ++ .../redmibuds/RedmiBuds8ActiveProtocol.java | 158 ++++++++++++++++++ app/src/main/res/values/arrays.xml | 62 +++++++ app/src/main/res/values/strings.xml | 1 + ...vicesettings_redmibuds8active_gestures.xml | 95 +++++++++++ .../devicesettings_redmibuds8active_sound.xml | 130 ++++++++++++++ 11 files changed, 612 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/redmibuds/RedmiBuds8ActiveCoordinator.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/redmibuds/RedmiBuds8ActiveSettingsCustomizer.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/redmibuds/RedmiBuds8ActiveDeviceSupport.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/redmibuds/RedmiBuds8ActiveProtocol.java create mode 100644 app/src/main/res/xml/devicesettings_redmibuds8active_gestures.xml create mode 100644 app/src/main/res/xml/devicesettings_redmibuds8active_sound.xml diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java index e8edec2a49..733434b4fd 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java @@ -475,6 +475,18 @@ public class DeviceSettingsPreferenceConst { public static final String PREF_REDMI_BUDS_6_ACTIVE_CONTROL_LONG_TAP_MODE_RIGHT="pref_redmi_buds_6_active_control_long_tap_mode_right"; public static final String PREF_REDMI_BUDS_6_ACTIVE_EQUALIZER_PRESET="pref_redmi_buds_6_active_equalizer_preset"; + public static final String PREF_REDMI_BUDS_8_ACTIVE_CONTROL_SINGLE_TAP_LEFT="pref_redmi_buds_8_active_control_single_tap_left"; + public static final String PREF_REDMI_BUDS_8_ACTIVE_CONTROL_SINGLE_TAP_RIGHT="pref_redmi_buds_8_active_control_single_tap_right"; + public static final String PREF_REDMI_BUDS_8_ACTIVE_CONTROL_DOUBLE_TAP_LEFT="pref_redmi_buds_8_active_control_double_tap_left"; + public static final String PREF_REDMI_BUDS_8_ACTIVE_CONTROL_DOUBLE_TAP_RIGHT="pref_redmi_buds_8_active_control_double_tap_right"; + public static final String PREF_REDMI_BUDS_8_ACTIVE_CONTROL_TRIPLE_TAP_LEFT="pref_redmi_buds_8_active_control_triple_tap_left"; + public static final String PREF_REDMI_BUDS_8_ACTIVE_CONTROL_TRIPLE_TAP_RIGHT="pref_redmi_buds_8_active_control_triple_tap_right"; + public static final String PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_MODE_LEFT="pref_redmi_buds_8_active_control_long_tap_mode_left"; + public static final String PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_MODE_RIGHT="pref_redmi_buds_8_active_control_long_tap_mode_right"; + public static final String PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_SETTINGS_LEFT ="pref_redmi_buds_8_active_control_long_tap_settings_left"; + public static final String PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_SETTINGS_RIGHT ="pref_redmi_buds_8_active_control_long_tap_settings_right"; + public static final String PREF_REDMI_BUDS_8_ACTIVE_EQUALIZER_PRESET="pref_redmi_buds_8_active_equalizer_preset"; + public static final String PREF_SONY_AUDIO_CODEC = "pref_sony_audio_codec"; public static final String PREF_SONY_PROTOCOL_VERSION = "pref_protocol_version"; public static final String PREF_SONY_ACTUAL_PROTOCOL_VERSION = "pref_actual_protocol_version"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java index 8ad5d7829e..4073e56266 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java @@ -813,10 +813,20 @@ public class DeviceSpecificSettingsFragment extends AbstractPreferenceFragment i addPreferenceHandlerFor(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_DOUBLE_TAP_RIGHT); addPreferenceHandlerFor(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_TRIPLE_TAP_LEFT); addPreferenceHandlerFor(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_TRIPLE_TAP_RIGHT); - addPreferenceHandlerFor(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_LONG_TAP_MODE_LEFT ); - addPreferenceHandlerFor(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_LONG_TAP_MODE_RIGHT ); + addPreferenceHandlerFor(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_LONG_TAP_MODE_LEFT); + addPreferenceHandlerFor(PREF_REDMI_BUDS_6_ACTIVE_CONTROL_LONG_TAP_MODE_RIGHT); addPreferenceHandlerFor(PREF_REDMI_BUDS_6_ACTIVE_EQUALIZER_PRESET); + addPreferenceHandlerFor(PREF_REDMI_BUDS_8_ACTIVE_CONTROL_SINGLE_TAP_LEFT); + addPreferenceHandlerFor(PREF_REDMI_BUDS_8_ACTIVE_CONTROL_SINGLE_TAP_RIGHT); + addPreferenceHandlerFor(PREF_REDMI_BUDS_8_ACTIVE_CONTROL_DOUBLE_TAP_LEFT); + addPreferenceHandlerFor(PREF_REDMI_BUDS_8_ACTIVE_CONTROL_DOUBLE_TAP_RIGHT); + addPreferenceHandlerFor(PREF_REDMI_BUDS_8_ACTIVE_CONTROL_TRIPLE_TAP_LEFT); + addPreferenceHandlerFor(PREF_REDMI_BUDS_8_ACTIVE_CONTROL_TRIPLE_TAP_RIGHT); + addPreferenceHandlerFor(PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_MODE_LEFT); + addPreferenceHandlerFor(PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_MODE_RIGHT); + addPreferenceHandlerFor(PREF_REDMI_BUDS_8_ACTIVE_EQUALIZER_PRESET); + addPreferenceHandlerFor(PREF_SONY_AMBIENT_SOUND_CONTROL); addPreferenceHandlerFor(PREF_SONY_AMBIENT_SOUND_CONTROL_BUTTON_MODE); addPreferenceHandlerFor(PREF_SONY_FOCUS_VOICE); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/redmibuds/RedmiBuds8ActiveCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/redmibuds/RedmiBuds8ActiveCoordinator.java new file mode 100644 index 0000000000..aa5e8d3a0a --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/redmibuds/RedmiBuds8ActiveCoordinator.java @@ -0,0 +1,46 @@ +package nodomain.freeyourgadget.gadgetbridge.devices.redmibuds; + +import androidx.annotation.NonNull; + +import java.util.regex.Pattern; + +import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSpecificSettings; +import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSpecificSettingsCustomizer; +import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSpecificSettingsScreen; +import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; +import nodomain.freeyourgadget.gadgetbridge.service.DeviceSupport; +import nodomain.freeyourgadget.gadgetbridge.service.devices.redmibuds.RedmiBuds8ActiveDeviceSupport; + +public class RedmiBuds8ActiveCoordinator extends AbstractRedmiBudsCoordinator { + + @Override + public int getDeviceNameResource() { + return R.string.devicetype_redmi_buds_8_active; + } + + @Override + protected Pattern getSupportedDeviceName() { + return Pattern.compile("REDMI Buds 8 Active"); + } + + @NonNull + @Override + public Class getDeviceSupportClass(final GBDevice device) { + return RedmiBuds8ActiveDeviceSupport.class; + } + + @Override + public DeviceSpecificSettings getDeviceSpecificSettings(final GBDevice device) { + final DeviceSpecificSettings deviceSpecificSettings = new DeviceSpecificSettings(); + deviceSpecificSettings.addRootScreen(R.xml.devicesettings_redmibuds8active_sound); + deviceSpecificSettings.addRootScreen(R.xml.devicesettings_redmibuds8active_gestures); + deviceSpecificSettings.addSubScreen(DeviceSpecificSettingsScreen.CALLS_AND_NOTIFICATIONS); + return deviceSpecificSettings; + } + + @Override + public DeviceSpecificSettingsCustomizer getDeviceSpecificSettingsCustomizer(final GBDevice device) { + return new RedmiBuds8ActiveSettingsCustomizer(device); + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/redmibuds/RedmiBuds8ActiveSettingsCustomizer.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/redmibuds/RedmiBuds8ActiveSettingsCustomizer.java new file mode 100644 index 0000000000..7d295d89b4 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/redmibuds/RedmiBuds8ActiveSettingsCustomizer.java @@ -0,0 +1,84 @@ +package nodomain.freeyourgadget.gadgetbridge.devices.redmibuds; + +import androidx.preference.ListPreference; +import androidx.preference.Preference; + +import java.util.Arrays; +import java.util.List; + +import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst; +import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSpecificSettingsHandler; +import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; +import nodomain.freeyourgadget.gadgetbridge.util.Prefs; + +public class RedmiBuds8ActiveSettingsCustomizer extends RedmiBudsSettingsCustomizer { + + public RedmiBuds8ActiveSettingsCustomizer(final GBDevice device) { + super(device); + } + + @Override + public void customizeSettings(DeviceSpecificSettingsHandler handler, Prefs prefs, String rootKey) { + + final ListPreference longPressLeft = handler.findPreference(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_MODE_LEFT); + final ListPreference longPressRight = handler.findPreference(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_MODE_RIGHT); + + final Preference longPressLeftSettings = handler.findPreference(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_SETTINGS_LEFT); + final Preference longPressRightSettings = handler.findPreference(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_SETTINGS_RIGHT); + + final ListPreference equalizerPreset = handler.findPreference(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_EQUALIZER_PRESET); + + if (longPressLeft != null) { + final Preference.OnPreferenceChangeListener longPressLeftButtonListener = (preference, newVal) -> { + String mode = newVal.toString(); + if (longPressLeftSettings != null) { + longPressLeftSettings.setVisible(mode.equals("6")); + } + return true; + }; + longPressLeftButtonListener.onPreferenceChange(longPressLeft, prefs.getString(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_MODE_LEFT, "6")); + handler.addPreferenceHandlerFor(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_MODE_LEFT, longPressLeftButtonListener); + } + if (longPressRight != null) { + final Preference.OnPreferenceChangeListener longPressRightButtonListener = (preference, newVal) -> { + String mode = newVal.toString(); + if (longPressRightSettings != null) { + longPressRightSettings.setVisible(mode.equals("6")); + } + return true; + }; + longPressRightButtonListener.onPreferenceChange(longPressRight, prefs.getString(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_MODE_RIGHT, "6")); + handler.addPreferenceHandlerFor(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_MODE_RIGHT, longPressRightButtonListener); + } + + if (equalizerPreset != null) { + + final Preference.OnPreferenceChangeListener equalizerPresetListener = (preference, newVal) -> { + + final List prefsToDisable = Arrays.asList( + handler.findPreference(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_62), + handler.findPreference(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_125), + handler.findPreference(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_250), + handler.findPreference(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_500), + handler.findPreference(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_1k), + handler.findPreference(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_2k), + handler.findPreference(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_4k), + handler.findPreference(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_8k), + handler.findPreference(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_12k), + handler.findPreference(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_16k) + ); + + String mode = newVal.toString(); + for (Preference pref : prefsToDisable) { + if (pref != null) { + pref.setEnabled(mode.equals("10")); + } + } + return true; + }; + equalizerPresetListener.onPreferenceChange(equalizerPreset, prefs.getString(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_EQUALIZER_PRESET, "0")); + handler.addPreferenceHandlerFor(DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_EQUALIZER_PRESET, equalizerPresetListener); + } + } + +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceType.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceType.java index f1f7fc1fb0..baac13a8ae 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceType.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceType.java @@ -378,6 +378,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.redmibuds.RedmiBuds4ActiveCo import nodomain.freeyourgadget.gadgetbridge.devices.redmibuds.RedmiBuds5ProCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.redmibuds.RedmiBuds6ActiveCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.redmibuds.RedmiBuds6ProCoordinator; +import nodomain.freeyourgadget.gadgetbridge.devices.redmibuds.RedmiBuds8ActiveCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.roidmi.Roidmi1Coordinator; import nodomain.freeyourgadget.gadgetbridge.devices.roidmi.Roidmi3Coordinator; import nodomain.freeyourgadget.gadgetbridge.devices.sbm_67.SanitasSBM67Coordinator; @@ -530,6 +531,7 @@ public enum DeviceType { REDMIBUDS5PRO(RedmiBuds5ProCoordinator.class), REDMIBUDS6ACTIVE(RedmiBuds6ActiveCoordinator.class), REDMIBUDS6PRO(RedmiBuds6ProCoordinator.class), + REDMIBUDS8ACTIVE(RedmiBuds8ActiveCoordinator.class), REDMIWATCH3ACTIVE(RedmiWatch3ActiveCoordinator.class), REDMIWATCH3(RedmiWatch3Coordinator.class), REDMISMARTBAND2(RedmiSmartBand2Coordinator.class), diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/redmibuds/RedmiBuds8ActiveDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/redmibuds/RedmiBuds8ActiveDeviceSupport.java new file mode 100644 index 0000000000..a7c165eefd --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/redmibuds/RedmiBuds8ActiveDeviceSupport.java @@ -0,0 +1,10 @@ +package nodomain.freeyourgadget.gadgetbridge.service.devices.redmibuds; + +import nodomain.freeyourgadget.gadgetbridge.service.serial.GBDeviceIoThread; + +public class RedmiBuds8ActiveDeviceSupport extends RedmiBudsDeviceSupport { + @Override + protected RedmiBuds8ActiveProtocol createDeviceProtocol() { + return new RedmiBuds8ActiveProtocol(getDevice()); + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/redmibuds/RedmiBuds8ActiveProtocol.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/redmibuds/RedmiBuds8ActiveProtocol.java new file mode 100644 index 0000000000..cc34d90366 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/redmibuds/RedmiBuds8ActiveProtocol.java @@ -0,0 +1,158 @@ +package nodomain.freeyourgadget.gadgetbridge.service.devices.redmibuds; + +// EQ_PRESET +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_EQUALIZER_PRESET; + +// EQ_CURVE +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_62; +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_125; +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_250; +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_500; +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_1k; +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_2k; +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_4k; +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_8k; +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_12k; +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_16k; + +// DOUBLE_CONNECTION +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_DOUBLE_CONNECTION; + +// ADAPTIVE_SOUND +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_5_PRO_ADAPTIVE_SOUND; + +// SINGLE_TAP +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_CONTROL_SINGLE_TAP_LEFT; +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_CONTROL_SINGLE_TAP_RIGHT; +// DOUBLE_TAP +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_CONTROL_DOUBLE_TAP_LEFT; +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_CONTROL_DOUBLE_TAP_RIGHT; +// TRIPLE_TAP +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_CONTROL_TRIPLE_TAP_LEFT; +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_CONTROL_TRIPLE_TAP_RIGHT; +// LONG_TAP +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_MODE_LEFT; +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_MODE_RIGHT; + +import static nodomain.freeyourgadget.gadgetbridge.util.GB.hexdump; + +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import nodomain.freeyourgadget.gadgetbridge.devices.redmibuds.prefs.Configuration; +import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; +import nodomain.freeyourgadget.gadgetbridge.devices.redmibuds.prefs.Gestures.InteractionType; +import nodomain.freeyourgadget.gadgetbridge.devices.redmibuds.prefs.Gestures.Position; +import nodomain.freeyourgadget.gadgetbridge.devices.redmibuds.prefs.Configuration.Config; + +public class RedmiBuds8ActiveProtocol extends RedmiBudsProtocol { + private static final Logger LOG = LoggerFactory.getLogger(RedmiBuds8ActiveProtocol.class); + + protected RedmiBuds8ActiveProtocol(GBDevice device) { + super(device); + } + + @Override + public byte[] encodeSendConfiguration(String config) { + switch (config) { + // GESTURE + case PREF_REDMI_BUDS_8_ACTIVE_CONTROL_SINGLE_TAP_LEFT: + return encodeSetGesture(config, InteractionType.SINGLE, Position.LEFT); + case PREF_REDMI_BUDS_8_ACTIVE_CONTROL_SINGLE_TAP_RIGHT: + return encodeSetGesture(config, InteractionType.SINGLE, Position.RIGHT); + case PREF_REDMI_BUDS_8_ACTIVE_CONTROL_DOUBLE_TAP_LEFT: + return encodeSetGesture(config, InteractionType.DOUBLE, Position.LEFT); + case PREF_REDMI_BUDS_8_ACTIVE_CONTROL_DOUBLE_TAP_RIGHT: + return encodeSetGesture(config, InteractionType.DOUBLE, Position.RIGHT); + case PREF_REDMI_BUDS_8_ACTIVE_CONTROL_TRIPLE_TAP_LEFT: + return encodeSetGesture(config, InteractionType.TRIPLE, Position.LEFT); + case PREF_REDMI_BUDS_8_ACTIVE_CONTROL_TRIPLE_TAP_RIGHT: + return encodeSetGesture(config, InteractionType.TRIPLE, Position.RIGHT); + case PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_MODE_LEFT: + return encodeSetGesture(config, InteractionType.LONG, Position.LEFT); + case PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_MODE_RIGHT: + return encodeSetGesture(config, InteractionType.LONG, Position.RIGHT); + // EQ_PRESET + case PREF_REDMI_BUDS_8_ACTIVE_EQUALIZER_PRESET: + return encodeSetIntegerConfig(config, Config.EQ_PRESET); + // EQ_CURVE + case PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_62: + case PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_125: + case PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_250: + case PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_500: + case PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_1k: + case PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_2k: + case PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_4k: + case PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_8k: + case PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_12k: + case PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_16k: + return encodeSetCustomEqualizer(); + // DOUBLE_CONNECTION + case PREF_REDMI_BUDS_5_PRO_DOUBLE_CONNECTION: + return encodeSetBooleanConfig(config, Config.DOUBLE_CONNECTION); + // ADAPTIVE_SOUND + case PREF_REDMI_BUDS_5_PRO_ADAPTIVE_SOUND: + return encodeSetBooleanConfig(config, Config.ADAPTIVE_SOUND); + + default: + LOG.debug("Unsupported config: {}", config); + return null; + } + } + + @Override + public void decodeGetConfig(byte[] configPayload) { + if (configPayload.length < 3) + return; + + SharedPreferences preferences = getDevicePrefs().getPreferences(); + SharedPreferences.Editor editor = preferences.edit(); + Configuration.Config config = Configuration.Config.fromCode(configPayload[2]); + + switch (config) { + case GESTURES: + // SINGLE_TAP + editor.putString(PREF_REDMI_BUDS_8_ACTIVE_CONTROL_SINGLE_TAP_LEFT, Integer.toString(configPayload[4])); + editor.putString(PREF_REDMI_BUDS_8_ACTIVE_CONTROL_SINGLE_TAP_RIGHT, Integer.toString(configPayload[5])); + // DOUBLE_TAP + editor.putString(PREF_REDMI_BUDS_8_ACTIVE_CONTROL_DOUBLE_TAP_LEFT, Integer.toString(configPayload[7])); + editor.putString(PREF_REDMI_BUDS_8_ACTIVE_CONTROL_DOUBLE_TAP_RIGHT, Integer.toString(configPayload[8])); + // TRIPLE_TAP + editor.putString(PREF_REDMI_BUDS_8_ACTIVE_CONTROL_TRIPLE_TAP_LEFT, Integer.toString(configPayload[10])); + editor.putString(PREF_REDMI_BUDS_8_ACTIVE_CONTROL_TRIPLE_TAP_RIGHT, Integer.toString(configPayload[11])); + // LONG_TAP + editor.putString(PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_MODE_LEFT, Integer.toString(configPayload[13])); + editor.putString(PREF_REDMI_BUDS_8_ACTIVE_CONTROL_LONG_TAP_MODE_RIGHT, Integer.toString(configPayload[14])); + break; + case EQ_PRESET: + editor.putString(PREF_REDMI_BUDS_8_ACTIVE_EQUALIZER_PRESET, Integer.toString(configPayload[3])); + break; + case EQ_CURVE: + editor.putString(PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_62, Integer.toString(configPayload[12] & 0xFF)); + editor.putString(PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_125, Integer.toString(configPayload[15] & 0xFF)); + editor.putString(PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_250, Integer.toString(configPayload[18] & 0xFF)); + editor.putString(PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_500, Integer.toString(configPayload[21] & 0xFF)); + editor.putString(PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_1k, Integer.toString(configPayload[24] & 0xFF)); + editor.putString(PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_2k, Integer.toString(configPayload[27] & 0xFF)); + editor.putString(PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_4k, Integer.toString(configPayload[30] & 0xFF)); + editor.putString(PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_8k, Integer.toString(configPayload[33] & 0xFF)); + editor.putString(PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_12k, Integer.toString(configPayload[36] & 0xFF)); + editor.putString(PREF_REDMI_BUDS_5_PRO_EQUALIZER_BAND_16k, Integer.toString(configPayload[39] & 0xFF)); + break; + case DOUBLE_CONNECTION: + editor.putBoolean(PREF_REDMI_BUDS_5_PRO_DOUBLE_CONNECTION, configPayload[3] == 0x01); + break; + case ADAPTIVE_SOUND: + editor.putBoolean(PREF_REDMI_BUDS_5_PRO_ADAPTIVE_SOUND, configPayload[3] == 0x01); + break; + + default: + LOG.debug("Unhandled device update: {}", hexdump(configPayload)); + } + editor.apply(); + } + +} diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index b60d33891a..9fb15ac09b 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -4014,6 +4014,68 @@ 7 + + @string/none + @string/pref_media_playpause + @string/pref_media_previous + @string/pref_media_next + @string/pref_media_volumeup + @string/pref_media_volumedown + + + + 8 + 1 + 2 + 3 + 4 + 5 + + + + @string/pref_media_playpause + @string/pref_media_previous + @string/pref_media_next + @string/pref_media_volumeup + @string/pref_media_volumedown + + + + 1 + 2 + 3 + 4 + 5 + + + + @string/none + @string/pref_title_touch_voice_assistant + + + + 8 + 0 + + + + @string/redmi_buds_5_pro_anc_balanced + @string/redmi_buds_5_pro_equalizer_preset_treble + @string/redmi_buds_5_pro_equalizer_preset_bass + @string/redmi_buds_5_pro_equalizer_preset_voice + @string/redmi_buds_6_active_equalizer_preset_volume + @string/redmi_buds_5_pro_equalizer_preset_custom + + + + 21 + 6 + 5 + 1 + 7 + 10 + + @string/sony_ambient_sound_off @string/sony_ambient_sound_noise_cancelling diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8480784813..a1cc9ee6ad 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2179,6 +2179,7 @@ Redmi Buds 5 Pro Redmi Buds 6 Active Redmi Buds 6 Pro + Redmi Buds 8 Active Redmi Smart Band 2 Redmi Smart Band 3 Redmi Watch 2 diff --git a/app/src/main/res/xml/devicesettings_redmibuds8active_gestures.xml b/app/src/main/res/xml/devicesettings_redmibuds8active_gestures.xml new file mode 100644 index 0000000000..2fff85a61a --- /dev/null +++ b/app/src/main/res/xml/devicesettings_redmibuds8active_gestures.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/xml/devicesettings_redmibuds8active_sound.xml b/app/src/main/res/xml/devicesettings_redmibuds8active_sound.xml new file mode 100644 index 0000000000..80f293f8eb --- /dev/null +++ b/app/src/main/res/xml/devicesettings_redmibuds8active_sound.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +