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 d61fa848d..86feecb11 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 @@ -427,4 +427,5 @@ public class DeviceSettingsPreferenceConst { public static final String PREF_DEVICE_ACTION_START_NON_WEAR_BROADCAST = "prefs_events_forwarding_startnonwear_broadcast"; public static final String PREF_CLAP_HANDS_TO_WAKEUP_DEVICE = "pref_key_clap_hands_to_wakeup_device"; public static final String PREF_POWER_SAVING = "pref_key_power_saving"; + public static final String PREF_FORCE_CONNECTION_TYPE = "pref_force_connection_type"; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xiaomi/XiaomiCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xiaomi/XiaomiCoordinator.java index 07d066ec6..9a1e7b90a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xiaomi/XiaomiCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xiaomi/XiaomiCoordinator.java @@ -355,6 +355,20 @@ public abstract class XiaomiCoordinator extends AbstractBLEDeviceCoordinator { return true; } + @Override + public int[] getSupportedDeviceSpecificConnectionSettings() { + final List settings = new ArrayList<>(); + + if (getConnectionType().equals(ConnectionType.BOTH)) { + settings.add(R.xml.devicesettings_force_connection_type); + } + + return ArrayUtils.addAll( + super.getSupportedDeviceSpecificConnectionSettings(), + ArrayUtils.toPrimitive(settings.toArray(new Integer[0])) + ); + } + @Override public int[] getSupportedDeviceSpecificSettings(final GBDevice device) { final List settings = new ArrayList<>(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiSupport.java index b9783023d..c6e86a8ee 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiSupport.java @@ -17,6 +17,8 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.xiaomi; +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_FORCE_CONNECTION_TYPE; + import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.location.Location; @@ -39,6 +41,7 @@ import java.util.UUID; import nodomain.freeyourgadget.gadgetbridge.BuildConfig; import nodomain.freeyourgadget.gadgetbridge.GBApplication; +import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.xiaomi.XiaomiCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.xiaomi.XiaomiFWHelper; @@ -115,9 +118,27 @@ public class XiaomiSupport extends AbstractDeviceSupport { return false; } + private DeviceCoordinator.ConnectionType getForcedConnectionTypeFromPrefs() { + final String connTypeAuto = getContext().getString(R.string.pref_force_connection_type_auto_value); + String connTypePref = getDevicePrefs().getString(PREF_FORCE_CONNECTION_TYPE, connTypeAuto); + + if (getContext().getString(R.string.pref_force_connection_type_ble_value).equals(connTypePref)) + return DeviceCoordinator.ConnectionType.BLE; + + if (getContext().getString(R.string.pref_force_connection_type_bt_classic_value).equals(connTypePref)) + return DeviceCoordinator.ConnectionType.BT_CLASSIC; + + // either set to default, unknown option selected, or has not been set + return DeviceCoordinator.ConnectionType.BOTH; + } + private XiaomiConnectionSupport createConnectionSpecificSupport() { DeviceCoordinator.ConnectionType connType = getCoordinator().getConnectionType(); + if (connType == DeviceCoordinator.ConnectionType.BOTH) { + connType = getForcedConnectionTypeFromPrefs(); + } + switch (connType) { case BLE: case BOTH: diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index d92181dde..e1042e8dd 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -3581,4 +3581,14 @@ ignore + + @string/pref_force_connection_type_auto + @string/pref_force_connection_type_ble + @string/pref_force_connection_type_bt_classic + + + @string/pref_force_connection_type_auto_value + @string/pref_force_connection_type_ble_value + @string/pref_force_connection_type_bt_classic_value + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2d2ed46c9..5ce3067aa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2579,4 +2579,12 @@ Uploading watchface Watchface installation completed Watchface installation failed + Force connection type + You may try forcing the connection type in case your device does not respond to Gadgetbridge + Automatic + Bluetooth LE + Bluetooth Classic + BOTH + BLE + BT_CLASSIC diff --git a/app/src/main/res/xml/devicesettings_force_connection_type.xml b/app/src/main/res/xml/devicesettings_force_connection_type.xml new file mode 100644 index 000000000..3b584e03f --- /dev/null +++ b/app/src/main/res/xml/devicesettings_force_connection_type.xml @@ -0,0 +1,12 @@ + + + +