From 3ad389d57dd1a2d8d7b719c3d73e8fab45f696ee Mon Sep 17 00:00:00 2001 From: MrYoranimo Date: Mon, 11 Mar 2024 13:21:22 +0100 Subject: [PATCH] BtBR/Xiaomi: fix disconnection logic/state handling --- .../gadgetbridge/service/btbr/BtBRQueue.java | 9 ++++++--- .../service/devices/xiaomi/XiaomiAuthService.java | 9 ++++++++- .../service/devices/xiaomi/XiaomiBleSupport.java | 5 ----- .../devices/xiaomi/XiaomiConnectionSupport.java | 1 - .../service/devices/xiaomi/XiaomiSppSupport.java | 5 ----- .../service/devices/xiaomi/XiaomiSupport.java | 13 ++++--------- 6 files changed, 18 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btbr/BtBRQueue.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btbr/BtBRQueue.java index 21715c3f2..325231e5f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btbr/BtBRQueue.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btbr/BtBRQueue.java @@ -35,8 +35,8 @@ import java.io.IOException; import java.util.Arrays; import java.util.Locale; import java.util.UUID; -import java.util.concurrent.CountDownLatch; +import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.service.DeviceSupport; import nodomain.freeyourgadget.gadgetbridge.util.GB; @@ -162,8 +162,8 @@ public final class BtBRQueue { } } - LOG.debug("Exited read thread loop, calling disconnect()"); - disconnect(); + LOG.debug("Exited read thread loop, disconnecting"); + GBApplication.deviceService(mGbDevice).disconnect(); } }; @@ -232,6 +232,9 @@ public final class BtBRQueue { LOG.error("IO exception while closing socket in disconnect(): ", e); } } + + mBtSocket = null; + setDeviceConnectionState(GBDevice.State.NOT_CONNECTED); } /** diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiAuthService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiAuthService.java index f1bd341ff..fbad5fbab 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiAuthService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiAuthService.java @@ -114,8 +114,15 @@ public class XiaomiAuthService extends AbstractXiaomiService { // Watch nonce final XiaomiProto.Command command = handleWatchNonce(cmd.getAuth().getWatchNonce()); + if (command == null) { - getSupport().disconnect(); + LOG.error("handleWatchNonce returned null, disconnecting"); + final GBDevice device = getSupport().getDevice(); + + if (device != null) { + GBApplication.deviceService(device).disconnect(); + } + return; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiBleSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiBleSupport.java index 5b8f95206..84c9fcce0 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiBleSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiBleSupport.java @@ -241,11 +241,6 @@ public class XiaomiBleSupport extends XiaomiConnectionSupport { this.commsSupport.setContext(device, adapter, context); } - @Override - public void disconnect() { - this.commsSupport.disconnect(); - } - public void sendCommand(final String taskName, final XiaomiProto.Command command) { if (this.characteristicCommandWrite == null) { // Can sometimes happen in race conditions when connecting + receiving calendar event or weather updates diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiConnectionSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiConnectionSupport.java index 1911bfbb4..1b380977f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiConnectionSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiConnectionSupport.java @@ -31,7 +31,6 @@ public abstract class XiaomiConnectionSupport { public abstract void runOnQueue(String taskName, Runnable run); public abstract void dispose(); public abstract void setContext(final GBDevice device, final BluetoothAdapter adapter, final Context context); - public abstract void disconnect(); public abstract void sendCommand(final String taskName, final XiaomiProto.Command command); public abstract void sendDataChunk(final String taskName, final byte[] chunk, @Nullable final XiaomiCharacteristic.SendCallback callback); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiSppSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiSppSupport.java index 61febce5c..217214b64 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiSppSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/XiaomiSppSupport.java @@ -158,11 +158,6 @@ public class XiaomiSppSupport extends XiaomiConnectionSupport { this.commsSupport.setContext(device, adapter, context); } - @Override - public void disconnect() { - this.commsSupport.disconnect(); - } - private int findNextPossiblePreamble(final byte[] haystack) { for (int i = 1; i + 2 < haystack.length; i++) { // check if first byte matches 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 fafc21269..9c0214c7b 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 @@ -171,9 +171,10 @@ public class XiaomiSupport extends AbstractDeviceSupport { @Override public void dispose() { - if (getConnectionSpecificSupport() != null) { - getConnectionSpecificSupport().dispose(); - connectionSupport = null; + if (this.connectionSupport != null) { + XiaomiConnectionSupport connectionSupport = this.connectionSupport; + this.connectionSupport = null; + connectionSupport.dispose(); } } @@ -202,12 +203,6 @@ public class XiaomiSupport extends AbstractDeviceSupport { this.cachedFirmwareVersion = version; } - public void disconnect() { - if (getConnectionSpecificSupport() != null) { - getConnectionSpecificSupport().disconnect(); - } - } - public void handleCommandBytes(final byte[] plainValue) { LOG.debug("Got command: {}", GB.hexdump(plainValue));