From f8c31d5d853bc5dec25279c4fc8e50c5e48453fb Mon Sep 17 00:00:00 2001
From: schdro <>
Date: Wed, 24 Sep 2025 23:43:44 +0200
Subject: [PATCH] Add Huawei FreeArc support
Basically they use same protocol as previous FreeBuds series,
and only lack features like ANC or LDAC.
Battery (earphones and case) and device version info work fine.
---
.../freearc/HuaweiFreearcCoordinator.java | 64 +++++++++++++++++++
.../gadgetbridge/model/DeviceType.java | 2 +
app/src/main/res/values/strings.xml | 1 +
3 files changed, 67 insertions(+)
create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/freearc/HuaweiFreearcCoordinator.java
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/freearc/HuaweiFreearcCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/freearc/HuaweiFreearcCoordinator.java
new file mode 100644
index 0000000000..6e043271f5
--- /dev/null
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/freearc/HuaweiFreearcCoordinator.java
@@ -0,0 +1,64 @@
+/* Copyright (C) 2025
+
+ 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 . */
+
+package nodomain.freeyourgadget.gadgetbridge.devices.huawei.freearc;
+
+import androidx.annotation.NonNull;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import nodomain.freeyourgadget.gadgetbridge.R;
+import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiFreebudsCoordinator;
+import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiHeadphonesCapabilities;
+import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
+import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
+import nodomain.freeyourgadget.gadgetbridge.service.DeviceSupport;
+import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiFreebudsSupport;
+
+public class HuaweiFreearcCoordinator extends HuaweiFreebudsCoordinator {
+
+ @Override
+ protected Pattern getSupportedDeviceName() {
+ return Pattern.compile("huawei freearc", Pattern.CASE_INSENSITIVE);
+ }
+
+ @Override
+ public Set getCapabilities() {
+ return new HashSet<>(
+ // None
+ );
+ }
+
+ @NonNull
+ @Override
+ public Class extends DeviceSupport> getDeviceSupportClass(final GBDevice device) {
+ return HuaweiFreebudsSupport.class;
+ }
+
+ @Override
+ public DeviceType getDeviceType() {
+ return DeviceType.HUAWEI_FREEARC;
+ }
+
+ @Override
+ public int getDeviceNameResource() {
+ return R.string.devicetype_huawei_freearc;
+ }
+}
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 a4dcaf61bc..c10ad0929d 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceType.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceType.java
@@ -223,6 +223,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.huami.zeppos.watches.Amazfit
import nodomain.freeyourgadget.gadgetbridge.devices.huami.zeppos.watches.AmazfitTRex3Coordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.zeppos.watches.AmazfitTRexUltraCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.zeppos.watches.MiBand7Coordinator;
+import nodomain.freeyourgadget.gadgetbridge.devices.huawei.freearc.HuaweiFreearcCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.freebuds5i.HuaweiFreebuds5iCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.freebuds6.HuaweiFreebuds6Coordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.freebudspro.HuaweiFreebudsProCoordinator;
@@ -733,6 +734,7 @@ public enum DeviceType {
HUAWEIWATCH3(HuaweiWatch3Coordinator.class),
HUAWEIWATCH4PRO(HuaweiWatch4ProCoordinator.class),
HUAWEIWATCH5(HuaweiWatch5Coordinator.class),
+ HUAWEI_FREEARC(HuaweiFreearcCoordinator.class),
HUAWEI_FREEBUDS5I(HuaweiFreebuds5iCoordinator.class),
HUAWEI_FREEBUDS_PRO(HuaweiFreebudsProCoordinator.class),
HUAWEI_FREEBUDS6(HuaweiFreebuds6Coordinator.class),
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 7b23eaedf3..f054be9600 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -2060,6 +2060,7 @@
Huawei Watch 3 (Pro)
Huawei Watch 4 (Pro)
Huawei Watch 5
+ Huawei FreeArc
Huawei FreeBuds 5i
Huawei FreeBuds Pro
Huawei FreeBuds 6