BtBR/Xiaomi: fix disconnection logic/state handling

This commit is contained in:
MrYoranimo 2024-03-11 13:21:22 +01:00 committed by José Rebelo
parent 75dc546aa9
commit 3ad389d57d
6 changed files with 18 additions and 24 deletions

View File

@ -35,8 +35,8 @@ import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import java.util.Locale; import java.util.Locale;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.CountDownLatch;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.service.DeviceSupport; import nodomain.freeyourgadget.gadgetbridge.service.DeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.util.GB; import nodomain.freeyourgadget.gadgetbridge.util.GB;
@ -162,8 +162,8 @@ public final class BtBRQueue {
} }
} }
LOG.debug("Exited read thread loop, calling disconnect()"); LOG.debug("Exited read thread loop, disconnecting");
disconnect(); GBApplication.deviceService(mGbDevice).disconnect();
} }
}; };
@ -232,6 +232,9 @@ public final class BtBRQueue {
LOG.error("IO exception while closing socket in disconnect(): ", e); LOG.error("IO exception while closing socket in disconnect(): ", e);
} }
} }
mBtSocket = null;
setDeviceConnectionState(GBDevice.State.NOT_CONNECTED);
} }
/** /**

View File

@ -114,8 +114,15 @@ public class XiaomiAuthService extends AbstractXiaomiService {
// Watch nonce // Watch nonce
final XiaomiProto.Command command = handleWatchNonce(cmd.getAuth().getWatchNonce()); final XiaomiProto.Command command = handleWatchNonce(cmd.getAuth().getWatchNonce());
if (command == null) { if (command == null) {
getSupport().disconnect(); LOG.error("handleWatchNonce returned null, disconnecting");
final GBDevice device = getSupport().getDevice();
if (device != null) {
GBApplication.deviceService(device).disconnect();
}
return; return;
} }

View File

@ -241,11 +241,6 @@ public class XiaomiBleSupport extends XiaomiConnectionSupport {
this.commsSupport.setContext(device, adapter, context); this.commsSupport.setContext(device, adapter, context);
} }
@Override
public void disconnect() {
this.commsSupport.disconnect();
}
public void sendCommand(final String taskName, final XiaomiProto.Command command) { public void sendCommand(final String taskName, final XiaomiProto.Command command) {
if (this.characteristicCommandWrite == null) { if (this.characteristicCommandWrite == null) {
// Can sometimes happen in race conditions when connecting + receiving calendar event or weather updates // Can sometimes happen in race conditions when connecting + receiving calendar event or weather updates

View File

@ -31,7 +31,6 @@ public abstract class XiaomiConnectionSupport {
public abstract void runOnQueue(String taskName, Runnable run); public abstract void runOnQueue(String taskName, Runnable run);
public abstract void dispose(); public abstract void dispose();
public abstract void setContext(final GBDevice device, final BluetoothAdapter adapter, final Context context); 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 sendCommand(final String taskName, final XiaomiProto.Command command);
public abstract void sendDataChunk(final String taskName, final byte[] chunk, @Nullable final XiaomiCharacteristic.SendCallback callback); public abstract void sendDataChunk(final String taskName, final byte[] chunk, @Nullable final XiaomiCharacteristic.SendCallback callback);
} }

View File

@ -158,11 +158,6 @@ public class XiaomiSppSupport extends XiaomiConnectionSupport {
this.commsSupport.setContext(device, adapter, context); this.commsSupport.setContext(device, adapter, context);
} }
@Override
public void disconnect() {
this.commsSupport.disconnect();
}
private int findNextPossiblePreamble(final byte[] haystack) { private int findNextPossiblePreamble(final byte[] haystack) {
for (int i = 1; i + 2 < haystack.length; i++) { for (int i = 1; i + 2 < haystack.length; i++) {
// check if first byte matches // check if first byte matches

View File

@ -171,9 +171,10 @@ public class XiaomiSupport extends AbstractDeviceSupport {
@Override @Override
public void dispose() { public void dispose() {
if (getConnectionSpecificSupport() != null) { if (this.connectionSupport != null) {
getConnectionSpecificSupport().dispose(); XiaomiConnectionSupport connectionSupport = this.connectionSupport;
connectionSupport = null; this.connectionSupport = null;
connectionSupport.dispose();
} }
} }
@ -202,12 +203,6 @@ public class XiaomiSupport extends AbstractDeviceSupport {
this.cachedFirmwareVersion = version; this.cachedFirmwareVersion = version;
} }
public void disconnect() {
if (getConnectionSpecificSupport() != null) {
getConnectionSpecificSupport().disconnect();
}
}
public void handleCommandBytes(final byte[] plainValue) { public void handleCommandBytes(final byte[] plainValue) {
LOG.debug("Got command: {}", GB.hexdump(plainValue)); LOG.debug("Got command: {}", GB.hexdump(plainValue));