From 56d05b8d1da1ba7d16791950bf00f8bbdfd21f64 Mon Sep 17 00:00:00 2001 From: NTeditor Date: Wed, 17 Jun 2026 05:18:07 +0300 Subject: [PATCH] oppo: dynamically request supported misc configs --- .../devices/oppo/OppoHeadphonesProtocol.java | 19 ++++++++------ .../devices/oppo/OppoHeadphonesSupport.java | 25 +++++++++++++++++-- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/oppo/OppoHeadphonesProtocol.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/oppo/OppoHeadphonesProtocol.java index de503d4480..838c10cf65 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/oppo/OppoHeadphonesProtocol.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/oppo/OppoHeadphonesProtocol.java @@ -517,13 +517,18 @@ public class OppoHeadphonesProtocol extends GBDeviceProtocol { return encodeMessage(OppoCommand.MISC_CONFIG_SET, payload); } - public byte[] encodeMiscConfigReq() { - return encodeMessage(OppoCommand.MISC_CONFIG_REQ, new byte[]{ - (byte) 0x03, - (byte) MiscConfigType.LDAC.getCode(), - (byte) MiscConfigType.MULTIPOINT.getCode(), - (byte) MiscConfigType.GAME_MODE.getCode() - }); + public byte[] encodeMiscConfigReq(List types) { + if (types == null || types.isEmpty()) { + return encodeMessage(OppoCommand.MISC_CONFIG_REQ, new byte[]{0x00}); + } + + byte[] payload = new byte[1 + types.size()]; + payload[0] = (byte) types.size(); + + for (int i = 0; i < types.size(); i++) { + payload[i + 1] = (byte) types.get(i).getCode(); + } + return encodeMessage(OppoCommand.MISC_CONFIG_REQ, payload); } public byte[] encodeAncConfigSet(final AncConfigValue mode) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/oppo/OppoHeadphonesSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/oppo/OppoHeadphonesSupport.java index 7532241712..0a89a78201 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/oppo/OppoHeadphonesSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/oppo/OppoHeadphonesSupport.java @@ -22,11 +22,15 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.UUID; +import java.util.List; +import java.util.ArrayList; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.BatteryState; import nodomain.freeyourgadget.gadgetbridge.service.btbr.TransactionBuilder; import nodomain.freeyourgadget.gadgetbridge.service.serial.AbstractHeadphoneSerialDeviceSupportV2; +import nodomain.freeyourgadget.gadgetbridge.service.devices.oppo.commands.MiscConfigType; +import nodomain.freeyourgadget.gadgetbridge.devices.oppo.OppoHeadphonesCoordinator; public class OppoHeadphonesSupport extends AbstractHeadphoneSerialDeviceSupportV2 { private static final Logger LOG = LoggerFactory.getLogger(OppoHeadphonesSupport.class); @@ -70,9 +74,26 @@ public class OppoHeadphonesSupport extends AbstractHeadphoneSerialDeviceSupportV @Override protected TransactionBuilder initializeDevice(final TransactionBuilder builder) { builder.write(mDeviceProtocol.encodeFirmwareVersionReq()); - builder.write(mDeviceProtocol.encodeMiscConfigReq()); + + final OppoHeadphonesCoordinator coordinator = (OppoHeadphonesCoordinator) getDevice().getDeviceCoordinator(); + final List supportedMiscConfigs = new ArrayList<>(); + if (coordinator.supportsLdac(getDevice())) { + supportedMiscConfigs.add(MiscConfigType.LDAC); + } + if (coordinator.supportsMultipoint(getDevice())) { + supportedMiscConfigs.add(MiscConfigType.MULTIPOINT); + } + if (coordinator.supportsGameMode(getDevice())) { + supportedMiscConfigs.add(MiscConfigType.GAME_MODE); + } + if (!supportedMiscConfigs.isEmpty()) { + builder.write(mDeviceProtocol.encodeMiscConfigReq(supportedMiscConfigs)); + } builder.write(mDeviceProtocol.encodeTouchConfigReq()); - builder.write(mDeviceProtocol.encodeAncConfigReq()); + if (coordinator.supportsAnc(getDevice())) { + builder.write(mDeviceProtocol.encodeAncConfigReq()); + } + builder.write(mDeviceProtocol.encodeBatteryReq()); builder.setDeviceState(GBDevice.State.INITIALIZED); scheduleBatteryRequestRetry();