btle+br: use DeviceSupport.createTransactionBuilder instead of TransactionBuilder's constructor to prepare for queue isolation

This commit is contained in:
Thomas Kuehne
2025-07-13 21:06:04 +02:00
parent a67613072c
commit 78578cc86d
36 changed files with 98 additions and 92 deletions
@@ -37,7 +37,7 @@ public class TransactionBuilder {
private final Transaction mTransaction;
private boolean mQueued;
public TransactionBuilder(String taskName) {
TransactionBuilder(String taskName) {
mTransaction = new Transaction(taskName);
}
@@ -230,8 +230,8 @@ public abstract class AbstractBTLEMultiDeviceSupport extends AbstractBTLEDeviceS
}
}
public TransactionBuilder createTransactionBuilder(String taskName) {
return new TransactionBuilder(taskName);
public TransactionBuilder createTransactionBuilder(String taskName, int deviceIdx) {
return new TransactionBuilder(taskName + "_" + deviceIdx);
}
public ServerTransactionBuilder createServerTransactionBuilder(String taskName) {
@@ -268,12 +268,12 @@ public abstract class AbstractBTLEMultiDeviceSupport extends AbstractBTLEDeviceS
if (!devices[deviceIdx].isInitialized()) {
logger.debug("Initializing device for {}", taskName);
// first, add a transaction that performs device initialization
TransactionBuilder builder = createTransactionBuilder("Initialize device");
TransactionBuilder builder = createTransactionBuilder("Initialize device", deviceIdx);
builder.add(new CheckInitializedAction(devices[deviceIdx]));
initializeDevice(builder, deviceIdx);
builder.queue(getQueue(deviceIdx));
}
return createTransactionBuilder(taskName);
return createTransactionBuilder(taskName, deviceIdx);
}
/**
@@ -447,7 +447,7 @@ public abstract class AbstractBTLEMultiDeviceSupport extends AbstractBTLEDeviceS
getDevice(deviceIdx), deviceIdx, getDevice(deviceIdx).getState());
return;
}
TransactionBuilder builder = createTransactionBuilder("Initializing device_" + deviceIdx);
TransactionBuilder builder = createTransactionBuilder("Initializing device", deviceIdx);
if (bleApis[deviceIdx] != null) {
bleApis[deviceIdx].initializeDevice(builder);
@@ -53,7 +53,7 @@ public class TransactionBuilder {
private final Transaction mTransaction;
private boolean mQueued;
public TransactionBuilder(String taskName) {
TransactionBuilder(String taskName) {
mTransaction = new Transaction(taskName);
}
@@ -121,7 +121,7 @@ public class AsteroidOSDeviceSupport extends AbstractBTLESingleDeviceSupport {
@Override
public void onNotification(NotificationSpec notificationSpec) {
AsteroidOSNotification notif = new AsteroidOSNotification(notificationSpec);
TransactionBuilder builder = new TransactionBuilder("send notification");
TransactionBuilder builder = createTransactionBuilder("send notification");
safeWriteToCharacteristic(builder, AsteroidOSConstants.NOTIFICATION_UPDATE_CHAR, notif.toString().getBytes(StandardCharsets.UTF_8));
builder.queue(getQueue());
}
@@ -129,14 +129,14 @@ public class AsteroidOSDeviceSupport extends AbstractBTLESingleDeviceSupport {
@Override
public void onDeleteNotification(int id) {
AsteroidOSNotification notif = new AsteroidOSNotification(id);
TransactionBuilder builder = new TransactionBuilder("delete notification");
TransactionBuilder builder = createTransactionBuilder("delete notification");
safeWriteToCharacteristic(builder, AsteroidOSConstants.NOTIFICATION_UPDATE_CHAR, notif.toString().getBytes(StandardCharsets.UTF_8));
builder.queue(getQueue());
}
@Override
public void onSetTime() {
TransactionBuilder builder = new TransactionBuilder("set time");
TransactionBuilder builder = createTransactionBuilder("set time");
onSetTime(builder);
builder.queue(getQueue());
}
@@ -157,14 +157,14 @@ public class AsteroidOSDeviceSupport extends AbstractBTLESingleDeviceSupport {
@Override
public void onSetCallState(CallSpec callSpec) {
AsteroidOSNotification call = new AsteroidOSNotification(callSpec);
TransactionBuilder builder = new TransactionBuilder("send call");
TransactionBuilder builder = createTransactionBuilder("send call");
safeWriteToCharacteristic(builder, AsteroidOSConstants.NOTIFICATION_UPDATE_CHAR, call.toString().getBytes(StandardCharsets.UTF_8));
builder.queue(getQueue());
}
@Override
public void onSetMusicState(MusicStateSpec stateSpec) {
TransactionBuilder builder = new TransactionBuilder("set music state");
TransactionBuilder builder = createTransactionBuilder("set music state");
if (stateSpec.state == MusicStateSpec.STATE_PLAYING) {
safeWriteToCharacteristic(builder, AsteroidOSConstants.MEDIA_PLAYING_CHAR, new byte[]{1});
} else {
@@ -175,7 +175,7 @@ public class AsteroidOSDeviceSupport extends AbstractBTLESingleDeviceSupport {
@Override
public void onSetMusicInfo(MusicSpec musicSpec) {
TransactionBuilder builder = new TransactionBuilder("send music information");
TransactionBuilder builder = createTransactionBuilder("send music information");
// Send title
{
byte[] track_bytes;
@@ -208,7 +208,7 @@ public class AsteroidOSDeviceSupport extends AbstractBTLESingleDeviceSupport {
@Override
public void onSetPhoneVolume(float volume) {
TransactionBuilder builder = new TransactionBuilder("send volume information");
TransactionBuilder builder = createTransactionBuilder("send volume information");
byte volByte = (byte) Math.round(volume);
safeWriteToCharacteristic(builder, AsteroidOSConstants.MEDIA_VOLUME_CHAR, new byte[]{volByte});
builder.queue(getQueue());
@@ -226,7 +226,7 @@ public class AsteroidOSDeviceSupport extends AbstractBTLESingleDeviceSupport {
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
WeatherSpec weatherSpec = weatherSpecs.get(0);
AsteroidOSWeather asteroidOSWeather = new AsteroidOSWeather(weatherSpec);
TransactionBuilder builder = new TransactionBuilder("send weather info");
TransactionBuilder builder = createTransactionBuilder("send weather info");
// Send city name
safeWriteToCharacteristic(builder, AsteroidOSConstants.WEATHER_CITY_CHAR, asteroidOSWeather.getCityName());
// Send conditions
@@ -187,7 +187,7 @@ public class ATCBLEOEPLDeviceSupport extends AbstractBTLESingleDeviceSupport {
if (!success) {
GB.toast(getContext().getString(R.string.same_image_already_on_device), Toast.LENGTH_LONG, GB.WARN);
}
final TransactionBuilder builder = new TransactionBuilder("finish upload");
final TransactionBuilder builder = createTransactionBuilder("finish upload");
builder.add(new SetProgressAction(getContext().getString(R.string.sending_image), false, 100, getContext()));
if (!is_firmware) {
builder.write(getCharacteristic(UUID_CHARACTERISTIC_MAIN), new byte[]{0x00, 0x03});
@@ -205,7 +205,7 @@ public class ATCBLEOEPLDeviceSupport extends AbstractBTLESingleDeviceSupport {
}
private void handleNextBlockRequest(byte[] value) {
final TransactionBuilder builder = new TransactionBuilder("send image start");
final TransactionBuilder builder = createTransactionBuilder("send image start");
builder.write(getCharacteristic(UUID_CHARACTERISTIC_MAIN), new byte[]{0x00, 0x02});
current_chunk = 0;
current_block = value[11];
@@ -217,7 +217,7 @@ public class ATCBLEOEPLDeviceSupport extends AbstractBTLESingleDeviceSupport {
}
private void handleNextChunkRequest(boolean success) {
final TransactionBuilder builder = new TransactionBuilder("send image chunk");
final TransactionBuilder builder = createTransactionBuilder("send image chunk");
if (success) {
current_chunk++; // only send next chunk when successful, else resend last chunk
}
@@ -264,7 +264,7 @@ public class ATCBLEOEPLDeviceSupport extends AbstractBTLESingleDeviceSupport {
editor.putBoolean(DeviceSettingsPreferenceConst.PREF_ATC_BLE_OEPL_OEPL_PROTOCOL_ENABLE, oepl_enabled);
editor.apply();
final TransactionBuilder builder = new TransactionBuilder("set initialized");
final TransactionBuilder builder = createTransactionBuilder("set initialized");
builder.add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZED, getContext()));
builder.queue(getQueue());
}
@@ -457,7 +457,7 @@ public class ATCBLEOEPLDeviceSupport extends AbstractBTLESingleDeviceSupport {
buf.put((byte) 0x00);
buf.putShort((byte) 0x00);
final TransactionBuilder builder = new TransactionBuilder("send image prepare");
final TransactionBuilder builder = createTransactionBuilder("send image prepare");
builder.write(getCharacteristic(UUID_CHARACTERISTIC_MAIN), buf.array());
builder.setBusyTask(getDevice(), R.string.sending_image, getContext());
builder.queue(getQueue());
@@ -146,7 +146,7 @@ public class BinarySensorSupport extends BinarySensorBaseSupport {
for (Parameter parameter : response.getParameters()) {
if (parameter instanceof SensorState) {
if(getDevice().getState() != GBDevice.State.INITIALIZED){
new TransactionBuilder("set device state")
createTransactionBuilder("set device state")
.setUpdateState(getDevice(), GBDevice.State.INITIALIZED, getContext())
.queue(getQueue());
}
@@ -171,7 +171,7 @@ public class BinarySensorSupport extends BinarySensorBaseSupport {
}
private void sendPacketToDevice(byte[] data) {
TransactionBuilder builder = new TransactionBuilder("BSS control");
TransactionBuilder builder = createTransactionBuilder("BSS control");
sendPacketToDevice(data, builder);
builder.queue(getQueue());
}
@@ -207,7 +207,7 @@ public class DomyosT540Support extends AbstractBTLESingleDeviceSupport {
command[3] = getChecksum(command);
BluetoothGattCharacteristic characteristic = getCharacteristic(UUUD_CHARACTERISTICS_WRITE);
TransactionBuilder builder = new TransactionBuilder("beep");
TransactionBuilder builder = createTransactionBuilder("beep");
builder.write(characteristic, command);
builder.queue(getQueue());
@@ -247,7 +247,7 @@ public class DomyosT540Support extends AbstractBTLESingleDeviceSupport {
buf.get(); // ??
boolean workoutStarted = buf.get() > 0;
TransactionBuilder builder = new TransactionBuilder("send update");
TransactionBuilder builder = createTransactionBuilder("send update");
if (buttonCode == 6 || buttonCode == 7) {
if (workoutStarted || buttonCode == 7) {
@@ -295,7 +295,7 @@ public class DomyosT540Support extends AbstractBTLESingleDeviceSupport {
@Override
public void onTestNewFunction() {
TransactionBuilder builder = new TransactionBuilder("xxx");
TransactionBuilder builder = createTransactionBuilder("xxx");
//setDisplayValues(builder, 1, 10, 10, 10, 10);
//writeChunked(builder, COMMAND_SET_DISPLAY);
@@ -236,11 +236,13 @@ public class G1DeviceSupport extends AbstractBTLEMultiDeviceSupport {
// Create the desired side.
if (deviceIdx == G1Constants.Side.LEFT.getDeviceIndex()) {
leftSide = new G1SideManager(G1Constants.Side.LEFT, backgroundTasksHandler, getQueue,
getDevice, handleEvent, this::getDevicePrefs, rx, tx);
getDevice, handleEvent, this::getDevicePrefs, rx, tx,
this::createTransactionBuilder);
return leftSide;
} else if (deviceIdx == G1Constants.Side.RIGHT.getDeviceIndex()) {
rightSide = new G1SideManager(G1Constants.Side.RIGHT, backgroundTasksHandler, getQueue,
getDevice, handleEvent, this::getDevicePrefs, rx, tx);
getDevice, handleEvent, this::getDevicePrefs, rx, tx,
this::createTransactionBuilder);
return rightSide;
}
@@ -12,6 +12,7 @@ import java.nio.charset.StandardCharsets;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.function.BiFunction;
import java.util.function.Function;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
@@ -43,6 +44,7 @@ public class G1SideManager {
private final Callable<GBDevice> getDeviceHandler;
private final Function<GBDeviceEvent, Void> sendEventHandler;
private final Callable<DevicePrefs> getPrefsHandler;
private final BiFunction<String, Integer, TransactionBuilder> createTransactionBuilder;
private final BluetoothGattCharacteristic rx;
private final BluetoothGattCharacteristic tx;
private final Runnable batteryRunner;
@@ -57,13 +59,15 @@ public class G1SideManager {
public G1SideManager(G1Constants.Side mySide, Handler backgroundTasksHandler,
Callable<BtLEQueue> getQueue, Callable<GBDevice> getDevice,
Function<GBDeviceEvent, Void> sendEvent, Callable<DevicePrefs> getPrefs,
BluetoothGattCharacteristic rx, BluetoothGattCharacteristic tx) {
BluetoothGattCharacteristic rx, BluetoothGattCharacteristic tx,
BiFunction<String, Integer, TransactionBuilder> createTransactionBuilder) {
this.mySide = mySide;
this.backgroundTasksHandler = backgroundTasksHandler;
this.getQueueHandler = getQueue;
this.getDeviceHandler = getDevice;
this.sendEventHandler = sendEvent;
this.getPrefsHandler = getPrefs;
this.createTransactionBuilder = createTransactionBuilder;
this.rx = rx;
this.tx = tx;
this.batteryRunner = () -> {
@@ -163,7 +167,7 @@ public class G1SideManager {
public void postInitializeLeft() {
TransactionBuilder transaction =
new TransactionBuilder("post_initialize_left_" + mySide.getDeviceIndex());
createTransactionBuilder.apply("post_initialize_left", mySide.getDeviceIndex());
postInitializeCommon(transaction);
// These can be sent to both, but the left lens is used as the master for these settings.
@@ -175,7 +179,7 @@ public class G1SideManager {
public void postInitializeRight() {
TransactionBuilder transaction =
new TransactionBuilder( "post_initialize_right_" + mySide.getDeviceIndex());
createTransactionBuilder.apply( "post_initialize_right", mySide.getDeviceIndex());
postInitializeCommon(transaction);
// This settings are only sent to the right lens in the official app, so we copy that.
@@ -277,7 +281,7 @@ public class G1SideManager {
public void send(G1Communications.CommandHandler command) {
TransactionBuilder transaction =
new TransactionBuilder(command.getName() + "_" + mySide.getDeviceIndex());
createTransactionBuilder.apply(command.getName(), mySide.getDeviceIndex());
sendInTransaction(transaction, command);
transaction.queue(getQueue());
}
@@ -175,7 +175,7 @@ public class FemometerVinca2DeviceSupport extends AbstractBTLESingleDeviceSuppor
@Override
public void onSetTime() {
TransactionBuilder builder = new TransactionBuilder("set time");
TransactionBuilder builder = createTransactionBuilder("set time");
setCurrentTime(builder);
builder.queue(getQueue());
}
@@ -402,7 +402,7 @@ public class FitProDeviceSupport extends AbstractBTLESingleDeviceSupport {
//the band does not like to answer when asked together for both hw info, so ask now,
// after data is already received
TransactionBuilder builder = new TransactionBuilder("notification");
TransactionBuilder builder = createTransactionBuilder("notification");
builder.write(writeCharacteristic, craftData(CMD_GROUP_BAND_INFO, CMD_RX_BAND_INFO));
builder.queue(getQueue());
@@ -432,7 +432,7 @@ public class FitProDeviceSupport extends AbstractBTLESingleDeviceSupport {
@Override
public void onSetCallState(CallSpec callSpec) {
LOG.debug("FitPro send call notification");
TransactionBuilder builder = new TransactionBuilder("CALL");
TransactionBuilder builder = createTransactionBuilder("CALL");
if (callSpec.command == CallSpec.CALL_INCOMING) {
@@ -530,7 +530,7 @@ public class FitProDeviceSupport extends AbstractBTLESingleDeviceSupport {
public void sendAck(byte command_group, byte length_high, byte length_low, byte command) {
LOG.debug(" ACKing data: " + nodomain.freeyourgadget.gadgetbridge.util.ArrayUtils.arrayToString(new byte[]{command_group}) + " " + nodomain.freeyourgadget.gadgetbridge.util.ArrayUtils.arrayToString(new byte[]{command}));
TransactionBuilder builder = new TransactionBuilder("notification");
TransactionBuilder builder = createTransactionBuilder("notification");
short size = (short) (ByteBuffer.wrap(new byte[]{length_high, length_low}).getShort() + 3);
byte[] sizeArray = ByteBuffer.allocate(2).putShort(size).array();
builder.write(writeCharacteristic, new byte[]{FitProConstants.DATA_HEADER_ACK, 0, 5, command_group, 1, sizeArray[0], sizeArray[1], 1});
@@ -557,7 +557,7 @@ public class FitProDeviceSupport extends AbstractBTLESingleDeviceSupport {
}
byte currentConditionCode = Weather.mapToFitProCondition(weatherSpec.currentConditionCode);
TransactionBuilder builder = new TransactionBuilder("weather");
TransactionBuilder builder = createTransactionBuilder("weather");
writeChunkedData(builder, craftData(CMD_GROUP_GENERAL, CMD_WEATHER, new byte[]{(byte) todayMin, (byte) todayMax, (byte) currentConditionCode, (byte) weatherUnit}));
builder.queue(getQueue());
}
@@ -570,7 +570,7 @@ public class FitProDeviceSupport extends AbstractBTLESingleDeviceSupport {
@Override
public void onNotification(NotificationSpec notificationSpec) {
LOG.debug("FitPro notification: " + notificationSpec.type);
TransactionBuilder builder = new TransactionBuilder("notification");
TransactionBuilder builder = createTransactionBuilder("notification");
byte icon = NOTIFICATION_ICON_SMS;
switch (notificationSpec.type) {
case GENERIC_SMS:
@@ -738,7 +738,7 @@ public class FitProDeviceSupport extends AbstractBTLESingleDeviceSupport {
@Override
public void onFetchRecordedData(int dataTypes) {
indicateFinishedFetchingOperation();
TransactionBuilder builder = new TransactionBuilder("fetch data1");
TransactionBuilder builder = createTransactionBuilder("fetch data1");
builder.setBusyTask(getDevice(), R.string.busy_task_fetch_activity_data, getContext());
builder.write(writeCharacteristic, craftData(CMD_GROUP_RECEIVE_SPORTS_DATA, CMD_REQUEST_STEPS_DATA1, VALUE_ON));
builder.queue(getQueue());
@@ -868,7 +868,7 @@ public class FitProDeviceSupport extends AbstractBTLESingleDeviceSupport {
@Override
public void onSetTime() {
LOG.debug("FitPro set date and time");
TransactionBuilder builder = new TransactionBuilder("Set date and time");
TransactionBuilder builder = createTransactionBuilder("Set date and time");
setTime(builder);
builder.queue(getQueue());
}
@@ -964,14 +964,14 @@ public class FitProDeviceSupport extends AbstractBTLESingleDeviceSupport {
}
getQueue().clear();
TransactionBuilder builder = new TransactionBuilder("resetting");
TransactionBuilder builder = createTransactionBuilder("resetting");
builder.write(writeCharacteristic, command);
builder.queue(getQueue());
}
@Override
public void onHeartRateTest() {
TransactionBuilder builder = new TransactionBuilder("notification");
TransactionBuilder builder = createTransactionBuilder("notification");
builder.write(writeCharacteristic, craftData(CMD_GROUP_GENERAL, CMD_HEART_RATE_MEASUREMENT, VALUE_ON));
builder.queue(getQueue());
}
@@ -980,7 +980,7 @@ public class FitProDeviceSupport extends AbstractBTLESingleDeviceSupport {
public void onFindDevice(boolean start) {
getQueue().clear();
LOG.debug("FitPro find device");
TransactionBuilder builder = new TransactionBuilder("searching");
TransactionBuilder builder = createTransactionBuilder("searching");
builder.write(writeCharacteristic, craftData(CMD_GROUP_GENERAL, CMD_FIND_BAND, start ? VALUE_ON : VALUE_OFF));
builder.queue(getQueue());
}
@@ -168,7 +168,7 @@ public class FlipperZeroSupport extends FlipperZeroBaseSupport{
}
private void sendSerialData(byte[] data){
new TransactionBuilder("send serial data")
createTransactionBuilder("send serial data")
.write(getCharacteristic(UUID.fromString(UUID_SERIAL_CHARACTERISTIC_WRITE)), data)
.queue(getQueue());
}
@@ -74,7 +74,7 @@ public class CommunicatorV1 implements ICommunicator {
final byte[] payload = cobsCoDec.encode(message);
final TransactionBuilder builder = new TransactionBuilder(taskName);
final TransactionBuilder builder = mSupport.createTransactionBuilder(taskName);
int remainingBytes = payload.length;
if (remainingBytes > maxWriteSize - 1) {
int position = 0;
@@ -108,7 +108,7 @@ public class CommunicatorV2 implements ICommunicator {
}
final byte[] payload = cobsCoDec.encode(message);
// LOG.debug("SENDING MESSAGE: {} - COBS ENCODED: {}", GB.hexdump(message), GB.hexdump(payload));
final TransactionBuilder builder = new TransactionBuilder(taskName);
final TransactionBuilder builder = mSupport.createTransactionBuilder(taskName);
int remainingBytes = payload.length;
if (remainingBytes > maxWriteSize - 1) {
int position = 0;
@@ -161,7 +161,7 @@ public class CommunicatorV2 implements ICommunicator {
public void onHeartRateTest() {
realtimeHrOneShot = true;
if (realtimeHrHandle == 0) {
new TransactionBuilder("heart rate test")
mSupport.createTransactionBuilder("heart rate test")
.write(characteristicSend, registerService(Service.REALTIME_HR, false))
.queue(this.mSupport.getQueue());
}
@@ -181,12 +181,12 @@ public class CommunicatorV2 implements ICommunicator {
private boolean toggleService(final Service service, final int currentHandle, final boolean enable) {
if (enable && currentHandle == 0) {
new TransactionBuilder(service + " = true")
mSupport.createTransactionBuilder(service + " = true")
.write(characteristicSend, registerService(service, false))
.queue(this.mSupport.getQueue());
return true;
} else if (!enable && currentHandle != 0) {
new TransactionBuilder(service + " = false")
mSupport.createTransactionBuilder(service + " = false")
.write(characteristicSend, closeService(service, currentHandle))
.queue(this.mSupport.getQueue());
return true;
@@ -245,7 +245,7 @@ public class CommunicatorV2 implements ICommunicator {
break;
case REALTIME_ACCELEROMETER:
this.realtimeAccelHandle = handle;
new TransactionBuilder("start realtime accel")
mSupport.createTransactionBuilder("start realtime accel")
.write(characteristicSend, new byte[]{(byte) handle, 0x01})
.queue(this.mSupport.getQueue());
break;
@@ -303,7 +303,7 @@ public class CommunicatorV2 implements ICommunicator {
this.realtimeSpo2Handle = 0;
this.realtimeRespirationHandle = 0;
this.realtimeHrvHandle = 0;
new TransactionBuilder("open GFDI")
mSupport.createTransactionBuilder("open GFDI")
.write(characteristicSend, registerService(Service.GFDI, false))
.queue(this.mSupport.getQueue());
break;
@@ -164,7 +164,7 @@ class HPlusHandlerThread extends GBDeviceIoThread {
if (!mHPlusSupport.isConnected())
mHPlusSupport.connect();
TransactionBuilder builder = new TransactionBuilder("startSyncDayStats");
TransactionBuilder builder = mHPlusSupport.createTransactionBuilder("startSyncDayStats");
builder.write(mHPlusSupport.ctrlCharacteristic, new byte[]{HPlusConstants.CMD_GET_DEVICE_ID});
builder.write(mHPlusSupport.ctrlCharacteristic, new byte[]{HPlusConstants.CMD_GET_VERSION});
@@ -182,7 +182,7 @@ class HPlusHandlerThread extends GBDeviceIoThread {
public void sendHello() {
try {
TransactionBuilder builder = new TransactionBuilder("hello");
TransactionBuilder builder = mHPlusSupport.createTransactionBuilder("hello");
builder.write(mHPlusSupport.ctrlCharacteristic, HPlusConstants.CMD_ACTION_HELLO);
mHPlusSupport.performConnected(builder.getTransaction());
@@ -540,7 +540,7 @@ class HPlusHandlerThread extends GBDeviceIoThread {
*/
private void requestNextSleepData() {
try {
TransactionBuilder builder = new TransactionBuilder("requestSleepStats");
TransactionBuilder builder = mHPlusSupport.createTransactionBuilder("requestSleepStats");
builder.write(mHPlusSupport.ctrlCharacteristic, new byte[]{HPlusConstants.CMD_GET_SLEEP});
mHPlusSupport.performConnected(builder.getTransaction());
} catch (Exception e) {
@@ -595,7 +595,7 @@ class HPlusHandlerThread extends GBDeviceIoThread {
byte[] msg = new byte[]{HPlusConstants.CMD_GET_ACTIVE_DAY, hour, minute, nextHour, nextMinute};
try {
TransactionBuilder builder = new TransactionBuilder("getNextDaySlot");
TransactionBuilder builder = mHPlusSupport.createTransactionBuilder("getNextDaySlot");
builder.write(mHPlusSupport.ctrlCharacteristic, msg);
mHPlusSupport.performConnected(builder.getTransaction());
} catch (Exception e) {
@@ -608,7 +608,7 @@ class HPlusHandlerThread extends GBDeviceIoThread {
*/
public void requestDaySummaryData() {
try {
TransactionBuilder builder = new TransactionBuilder("startSyncDaySummary");
TransactionBuilder builder = mHPlusSupport.createTransactionBuilder("startSyncDaySummary");
builder.write(mHPlusSupport.ctrlCharacteristic, new byte[]{HPlusConstants.CMD_GET_DAY_DATA});
mHPlusSupport.performConnected(builder.getTransaction());
} catch (Exception e) {
@@ -1684,7 +1684,7 @@ public abstract class HuamiSupport extends AbstractBTLESingleDeviceSupport
case HuamiDeviceEvent.ALARM_TOGGLED:
case HuamiDeviceEvent.ALARM_CHANGED:
LOG.info("An alarm was toggled or changed");
TransactionBuilder builder = new TransactionBuilder("requestAlarms");
TransactionBuilder builder = createTransactionBuilder("requestAlarms");
requestAlarms(builder);
builder.queue(getQueue());
break;
@@ -32,7 +32,7 @@ public class ZeppOsBtbrTransactionBuilder implements ZeppOsTransactionBuilder {
public ZeppOsBtbrTransactionBuilder(final ZeppOsBtbrSupport mSupport, final String taskName) {
this.mSupport = mSupport;
this.mBuilder = new TransactionBuilder(taskName);
this.mBuilder = mSupport.createTransactionBuilder(taskName);
}
public ZeppOsBtbrTransactionBuilder(final ZeppOsBtbrSupport mSupport, final TransactionBuilder builder) {
@@ -32,7 +32,7 @@ public class ZeppOsBtleTransactionBuilder implements ZeppOsTransactionBuilder {
public ZeppOsBtleTransactionBuilder(final ZeppOsBtleSupport mSupport, final String taskName) {
this.mSupport = mSupport;
this.mBuilder = new TransactionBuilder(taskName);
this.mBuilder = mSupport.createTransactionBuilder(taskName);
}
public ZeppOsBtleTransactionBuilder(final ZeppOsBtleSupport mSupport, final TransactionBuilder builder) {
@@ -95,7 +95,7 @@ public class IdasenDeviceSupport extends AbstractBTLESingleDeviceSupport {
// needs to get from the lowest to the highest point.
int cutOff = 100;
do {
TransactionBuilder builder = new TransactionBuilder("height");
TransactionBuilder builder = createTransactionBuilder("height");
builder.write(characteristic, setHeightRequest);
builder.queue(getQueue());
@@ -168,7 +168,7 @@ public class IdasenDeviceSupport extends AbstractBTLESingleDeviceSupport {
private void readCharacteristic(String taskName, UUID charac) {
BluetoothGattCharacteristic characteristic = getCharacteristic(charac);
TransactionBuilder builder = new TransactionBuilder(taskName);
TransactionBuilder builder = createTransactionBuilder(taskName);
builder.read(characteristic);
builder.queue(getQueue());
}
@@ -200,7 +200,7 @@ public class IdasenDeviceSupport extends AbstractBTLESingleDeviceSupport {
}
private void sendCommand(String taskName, UUID charac, byte[] contents) {
TransactionBuilder builder = new TransactionBuilder(taskName);
TransactionBuilder builder = createTransactionBuilder(taskName);
BluetoothGattCharacteristic characteristic = getCharacteristic(charac);
if (characteristic != null) {
builder.write(characteristic, contents);
@@ -116,7 +116,7 @@ public class ITagSupport extends AbstractBTLESingleDeviceSupport {
getQueue().clear();
BluetoothGattCharacteristic characteristic = getCharacteristic(ITagConstants.UUID_LINK_LOSS_ALERT_LEVEL);
TransactionBuilder builder = new TransactionBuilder("beeping");
TransactionBuilder builder = createTransactionBuilder("beeping");
builder.write(characteristic, new byte[]{(byte) intensity});
builder.queue(getQueue());
}
@@ -129,7 +129,7 @@ public class MarstekB2500DeviceSupport extends AbstractBTLESingleDeviceSupport {
}
private void sendCommand(String taskName, byte[] contents) {
TransactionBuilder builder = new TransactionBuilder(taskName);
TransactionBuilder builder = createTransactionBuilder(taskName);
BluetoothGattCharacteristic characteristic = getCharacteristic(UUID_CHARACTERISTIC_MAIN);
if (characteristic != null && contents != null) {
builder.write(characteristic, contents);
@@ -457,7 +457,7 @@ public class NutSupport extends AbstractBTLESingleDeviceSupport {
private void writeCharacteristic(String taskName, UUID charac, byte[] data) {
BluetoothGattCharacteristic characteristic = getCharacteristic(charac);
TransactionBuilder builder = new TransactionBuilder(taskName);
TransactionBuilder builder = createTransactionBuilder(taskName);
builder.write(characteristic, data);
builder.queue(getQueue());
}
@@ -471,7 +471,7 @@ public class NutSupport extends AbstractBTLESingleDeviceSupport {
private void readCharacteristic(String taskName, UUID charac) {
BluetoothGattCharacteristic characteristic = getCharacteristic(charac);
TransactionBuilder builder = new TransactionBuilder(taskName);
TransactionBuilder builder = createTransactionBuilder(taskName);
builder.read(characteristic);
builder.queue(getQueue());
}
@@ -298,7 +298,7 @@ public class PineTimeJFSupport extends AbstractBTLESingleDeviceSupport implement
@Override
public void onNotification(NotificationSpec notificationSpec) {
TransactionBuilder builder = new TransactionBuilder("notification");
TransactionBuilder builder = createTransactionBuilder("notification");
String message;
String source = null;
@@ -341,7 +341,7 @@ public class PineTimeJFSupport extends AbstractBTLESingleDeviceSupport implement
@Override
public void onSetNavigationInfo(NavigationInfoSpec navigationInfoSpec) {
TransactionBuilder builder = new TransactionBuilder("navigation info");
TransactionBuilder builder = createTransactionBuilder("navigation info");
if (navigationInfoSpec.instruction == null) {
navigationInfoSpec.instruction = "";
}
@@ -413,7 +413,7 @@ public class PineTimeJFSupport extends AbstractBTLESingleDeviceSupport implement
byte[] bytesCurrentTime = BLETypeConversions.calendarToCurrentTime(now, 0);
byte[] bytesLocalTime = BLETypeConversions.calendarToLocalTime(now);
TransactionBuilder builder = new TransactionBuilder("set time");
TransactionBuilder builder = createTransactionBuilder("set time");
builder.write(getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_CURRENT_TIME), bytesCurrentTime);
builder.write(getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_LOCAL_TIME), bytesLocalTime);
builder.queue(getQueue());
@@ -422,7 +422,7 @@ public class PineTimeJFSupport extends AbstractBTLESingleDeviceSupport implement
@Override
public void onSetCallState(CallSpec callSpec) {
if (callSpec.command == CallSpec.CALL_INCOMING) {
TransactionBuilder builder = new TransactionBuilder("incomingcall");
TransactionBuilder builder = createTransactionBuilder("incomingcall");
String message;
if (isFirmwareAtLeastVersion0_15() && callSpec.sourceName != null) {
@@ -631,7 +631,7 @@ public class PineTimeJFSupport extends AbstractBTLESingleDeviceSupport implement
baos.write(new byte[9]);
}
TransactionBuilder builder = new TransactionBuilder("set world clocks");
TransactionBuilder builder = createTransactionBuilder("set world clocks");
builder.write(getCharacteristic(PineTimeJFConstants.UUID_CHARACTERISTIC_WORLD_TIME), baos.toByteArray());
builder.queue(getQueue());
} catch (Exception e) {
@@ -702,14 +702,14 @@ public class FossilWatchAdapter extends WatchAdapter {
try {
if (!this.supportsExtendedVibration()) {
if (start) {
new TransactionBuilder("vibrate find")
getDeviceSupport().createTransactionBuilder("vibrate find")
.write(
getDeviceSupport().getCharacteristic(UUID.fromString("3dda0005-957f-7d4a-34a6-74696673696d")),
new byte[]{(byte) 0x01, (byte) 0x04, (byte) 0x30, (byte) 0x75, (byte) 0x00, (byte) 0x00}
)
.queue(getDeviceSupport().getQueue());
} else {
new TransactionBuilder("vibrate find")
getDeviceSupport().createTransactionBuilder("vibrate find")
.write(
getDeviceSupport().getCharacteristic(UUID.fromString("3dda0005-957f-7d4a-34a6-74696673696d")),
new byte[]{(byte) 0x02, (byte) 0x05, (byte) 0x04}
@@ -817,7 +817,7 @@ public class FossilWatchAdapter extends WatchAdapter {
log("dropping requetst " + request.getName());
return;
}
new TransactionBuilder("requestMtu")
getDeviceSupport().createTransactionBuilder("requestMtu")
.requestMtu(512)
.queue(getDeviceSupport().getQueue());
@@ -865,7 +865,7 @@ public class FossilWatchAdapter extends WatchAdapter {
log("executing request: " + request.getName());
restartRequestTimeout();
this.fossilRequest = request;
new TransactionBuilder(request.getClass().getSimpleName()).write(getDeviceSupport().getCharacteristic(request.getRequestUUID()), request.getRequestData()).queue(getDeviceSupport().getQueue());
getDeviceSupport().createTransactionBuilder(request.getClass().getSimpleName()).write(getDeviceSupport().getCharacteristic(request.getRequestUUID()), request.getRequestData()).queue(getDeviceSupport().getQueue());
if (request.isFinished()) {
this.fossilRequest = null;
@@ -881,7 +881,7 @@ public class FossilWatchAdapter extends WatchAdapter {
return;
}
restartRequestTimeout();
new TransactionBuilder(request.getClass().getSimpleName()).write(getDeviceSupport().getCharacteristic(request.getRequestUUID()), request.getRequestData()).queue(getDeviceSupport().getQueue());
getDeviceSupport().createTransactionBuilder(request.getClass().getSimpleName()).write(getDeviceSupport().getCharacteristic(request.getRequestUUID()), request.getRequestData()).queue(getDeviceSupport().getQueue());
queueNextRequest();
}
@@ -314,7 +314,7 @@ public class MisfitWatchAdapter extends WatchAdapter {
break;
case UPLOAD:
for (byte[] packet : this.uploadFileRequest.packets) {
new TransactionBuilder("File upload").write(characteristic, packet).queue(getDeviceSupport().getQueue());
getDeviceSupport().createTransactionBuilder("File upload").write(characteristic, packet).queue(getDeviceSupport().getQueue());
}
break;
case UPLOADED:
@@ -495,7 +495,7 @@ public class MisfitWatchAdapter extends WatchAdapter {
}
private void queueWrite(Request request) {
new TransactionBuilder(request.getClass().getSimpleName()).write(getDeviceSupport().getCharacteristic(request.getRequestUUID()), request.getRequestData()).queue(getDeviceSupport().getQueue());
getDeviceSupport().createTransactionBuilder(request.getClass().getSimpleName()).write(getDeviceSupport().getCharacteristic(request.getRequestUUID()), request.getRequestData()).queue(getDeviceSupport().getQueue());
// if (request instanceof FileRequest) this.fileRequest = request;
if (!request.expectsResponse()) {
@@ -83,7 +83,7 @@ public class FilePutRawRequest extends FossilRequest {
}
state = UploadState.UPLOADING;
TransactionBuilder transactionBuilder = new TransactionBuilder("file upload");
TransactionBuilder transactionBuilder = adapter.getDeviceSupport().createTransactionBuilder("file upload");
BluetoothGattCharacteristic uploadCharacteristic = adapter.getDeviceSupport().getCharacteristic(UUID.fromString("3dda0004-957f-7d4a-34a6-74696673696d"));
this.prepareFilePackets(this.file);
@@ -124,7 +124,7 @@ public class FilePutRawRequest extends FossilRequest {
buffer2.put((byte) 4);
buffer2.putShort(this.handle);
new TransactionBuilder("file close")
adapter.getDeviceSupport().createTransactionBuilder("file close")
.write(
adapter.getDeviceSupport().getCharacteristic(UUID.fromString("3dda0003-957f-7d4a-34a6-74696673696d")),
buffer2.array()
@@ -90,7 +90,7 @@ public class VerifyPrivateKeyRequest extends AuthenticationRequest {
System.arraycopy(result, 0, payload, 3, 16);
new TransactionBuilder("send encrypted random numbers")
adapter.getDeviceSupport().createTransactionBuilder("send encrypted random numbers")
.write(characteristic, payload)
.queue(this.adapter.getDeviceSupport().getQueue());
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException | InvalidAlgorithmParameterException e) {
@@ -84,7 +84,7 @@ public class FileEncryptedPutRequest extends FossilRequest implements FileEncryp
}
state = UploadState.UPLOADING;
TransactionBuilder transactionBuilder = new TransactionBuilder("file upload");
TransactionBuilder transactionBuilder = adapter.getDeviceSupport().createTransactionBuilder("file upload");
BluetoothGattCharacteristic uploadCharacteristic = adapter.getDeviceSupport().getCharacteristic(UUID.fromString("3dda0004-957f-7d4a-34a6-74696673696d"));
this.prepareFilePackets(this.file);
@@ -150,7 +150,7 @@ public class FileEncryptedPutRequest extends FossilRequest implements FileEncryp
buffer2.put((byte) 4);
buffer2.putShort(this.handle);
new TransactionBuilder("file close")
adapter.getDeviceSupport().createTransactionBuilder("file close")
.write(
adapter.getDeviceSupport().getCharacteristic(UUID.fromString("3dda0003-957f-7d4a-34a6-74696673696d")),
buffer2.array()
@@ -156,7 +156,7 @@ public class SuperCarsSupport extends AbstractBTLESingleDeviceSupport {
SuperCarsConstants.Direction direction) {
byte[] command = craft_packet(speed, direction, movement, light);
TransactionBuilder builder = new TransactionBuilder("send data");
TransactionBuilder builder = createTransactionBuilder("send data");
BluetoothGattCharacteristic writeCharacteristic = getCharacteristic(SuperCarsConstants.CHARACTERISTIC_UUID_FFF1);
builder.write(writeCharacteristic, encryptData(command));
builder.queue(getQueue());
@@ -387,7 +387,7 @@ public class GenericThermalPrinterSupport extends AbstractBTLESingleDeviceSuppor
}
public void send(String taskname, byte[] command) {
TransactionBuilder builder = new TransactionBuilder(taskname);
TransactionBuilder builder = createTransactionBuilder(taskname);
builder.writeChunkedData(getCharacteristic(writeCharUUID), command, 123);
builder.queue(getQueue());
}
@@ -91,7 +91,7 @@ public class UM25Support extends UM25BaseSupport {
if(!ACTION_RESET_STATS.equals(intent.getAction())){
return;
}
new TransactionBuilder("reset stats")
createTransactionBuilder("reset stats")
.write(getCharacteristic(UUID.fromString(UUID_CHAR)), COMMAND_RESET_STATS)
.queue(getQueue());
}
@@ -162,7 +162,7 @@ public class UM25Support extends UM25BaseSupport {
logger.debug("sending read command");
buffer.reset();
new TransactionBuilder("send read command")
createTransactionBuilder("send read command")
.write(getCharacteristic(UUID.fromString(UUID_CHAR)), COMMAND_UPDATE)
.queue(getQueue());
logger.debug("sent command");
@@ -288,7 +288,7 @@ public class VescDeviceSupport extends VescBaseDeviceSupport {
}
public void queryPacket(byte[] data) {
new TransactionBuilder("write serial packet")
createTransactionBuilder("write serial packet")
.write(this.serialWriteCharacteristic, data)
.queue(getQueue());
}
@@ -118,7 +118,7 @@ public class VibratissimoSupport extends AbstractBTLESingleDeviceSupport {
BluetoothGattCharacteristic characteristic2 = getCharacteristic(UUID.fromString("00001526-1212-efde-1523-785feabcd123"));
BluetoothGattCharacteristic characteristic1 = getCharacteristic(UUID.fromString("00001524-1212-efde-1523-785feabcd123"));
TransactionBuilder builder = new TransactionBuilder("vibration");
TransactionBuilder builder = createTransactionBuilder("vibration");
builder.write(characteristic1, new byte[]{0x03, (byte) 0x80});
builder.write(characteristic2, new byte[]{(byte) intensity, 0x00});
@@ -464,7 +464,7 @@ public class YawellRingDeviceSupport extends AbstractBTLESingleDeviceSupport {
}
private void sendWrite(String taskName, byte[] contents) {
TransactionBuilder builder = new TransactionBuilder(taskName);
TransactionBuilder builder = createTransactionBuilder(taskName);
BluetoothGattCharacteristic characteristic = getCharacteristic(YawellRingConstants.CHARACTERISTIC_WRITE);
if (characteristic != null) {
builder.write(characteristic, contents);
@@ -473,7 +473,7 @@ public class YawellRingDeviceSupport extends AbstractBTLESingleDeviceSupport {
}
private void sendCommand(String taskName, byte[] contents) {
TransactionBuilder builder = new TransactionBuilder(taskName);
TransactionBuilder builder = createTransactionBuilder(taskName);
BluetoothGattCharacteristic characteristic = getCharacteristic(YawellRingConstants.CHARACTERISTIC_COMMAND);
if (characteristic != null) {
builder.write(characteristic, contents);
@@ -1011,7 +1011,7 @@ public class ZeTimeDeviceSupport extends AbstractBTLESingleDeviceSupport {
}
evaluateGBDeviceEvent(versionCmd);
TransactionBuilder builder = new TransactionBuilder("setDeviceInitialized");
TransactionBuilder builder = createTransactionBuilder("setDeviceInitialized");
builder.setUpdateState(getDevice(), GBDevice.State.INITIALIZED, getContext());
try {
performConnected(builder.getTransaction());
@@ -38,8 +38,8 @@ import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.WriteAction;
public class HuamiSupportTest {
@Test
public void testSetCurrentTime() {
final TransactionBuilder testTransactionBuilder = new TransactionBuilder("test");
final HuamiSupport huamiSupport = createSupport();
final TransactionBuilder testTransactionBuilder = huamiSupport.createTransactionBuilder("test");
huamiSupport.setCurrentTime(testTransactionBuilder);
final WriteAction action = (WriteAction) testTransactionBuilder.getTransaction().getActions().get(0);