mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-11-24 02:46:50 +01:00
reformat code with androidstudio
This commit is contained in:
parent
09914e6da0
commit
dd12bb11b2
@ -21,11 +21,11 @@ public abstract class AbstractDeviceSupport implements DeviceSupport {
|
||||
public boolean isConnected() {
|
||||
return gbDevice.isConnected();
|
||||
}
|
||||
|
||||
|
||||
protected boolean isInitialized() {
|
||||
return gbDevice.isInitialized();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public GBDevice getDevice() {
|
||||
return gbDevice;
|
||||
|
@ -7,10 +7,10 @@ import android.content.Context;
|
||||
* Provides support for a specific device. Has hooks to manage the life cycle
|
||||
* of a device: instances of this interface will be created, initialized, and disposed
|
||||
* as needed.
|
||||
*
|
||||
* <p/>
|
||||
* Implementations need to act accordingly, in order to establish, reestablish or close
|
||||
* the connection to the device.
|
||||
*
|
||||
* <p/>
|
||||
* This interface is agnostic to the kind transport, i.e. whether the device is connected
|
||||
* via Bluetooth, Bluetooth LE, Wifi or something else.
|
||||
*/
|
||||
@ -18,7 +18,7 @@ public interface DeviceSupport extends EventHandler {
|
||||
public void initialize(GBDevice gbDevice, BluetoothAdapter btAdapter, Context context);
|
||||
|
||||
public boolean isConnected();
|
||||
|
||||
|
||||
public boolean connect();
|
||||
|
||||
public void dispose();
|
||||
|
@ -36,11 +36,11 @@ public class GBDevice {
|
||||
public boolean isConnected() {
|
||||
return state.ordinal() >= State.CONNECTED.ordinal();
|
||||
}
|
||||
|
||||
|
||||
public boolean isInitialized() {
|
||||
return state.ordinal() >= State.INITIALIZED.ordinal();
|
||||
}
|
||||
|
||||
|
||||
public State getState() {
|
||||
return state;
|
||||
}
|
||||
|
@ -1,5 +1,10 @@
|
||||
package nodomain.freeyourgadget.gadgetbridge.btle;
|
||||
|
||||
import android.bluetooth.BluetoothGatt;
|
||||
import android.bluetooth.BluetoothGattCharacteristic;
|
||||
import android.bluetooth.BluetoothGattService;
|
||||
import android.util.Log;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
@ -8,19 +13,14 @@ import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
import nodomain.freeyourgadget.gadgetbridge.AbstractDeviceSupport;
|
||||
import android.bluetooth.BluetoothGatt;
|
||||
import android.bluetooth.BluetoothGattCharacteristic;
|
||||
import android.bluetooth.BluetoothGattService;
|
||||
import android.util.Log;
|
||||
|
||||
/**
|
||||
*
|
||||
* @see TransactionBuilder
|
||||
* @see BtLEQueue
|
||||
*/
|
||||
public abstract class AbstractBTLEDeviceSupport extends AbstractDeviceSupport implements GattCallback {
|
||||
private static final String TAG = "AbstractBTLEDeviceSupport";
|
||||
|
||||
|
||||
private BtLEQueue mQueue;
|
||||
private HashMap<UUID, BluetoothGattCharacteristic> mAvailableCharacteristics;
|
||||
private Set<UUID> mSupportedServices = new HashSet<>(4);
|
||||
@ -35,6 +35,7 @@ public abstract class AbstractBTLEDeviceSupport extends AbstractDeviceSupport im
|
||||
|
||||
/**
|
||||
* Subclasses should populate the given builder to initialize the device (if necessary).
|
||||
*
|
||||
* @param builder
|
||||
* @return the same builder as passed as the argument
|
||||
*/
|
||||
@ -48,13 +49,14 @@ public abstract class AbstractBTLEDeviceSupport extends AbstractDeviceSupport im
|
||||
mQueue.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Send commands like this to the device:
|
||||
* <p>
|
||||
* <code>perform("sms notification").write(someCharacteristic, someByteArray).queue(getQueue());</code>
|
||||
* </p>
|
||||
* TODO: support orchestration of multiple reads and writes depending on returned values
|
||||
*
|
||||
* @see #performConnected(Transaction)
|
||||
* @see #initializeDevice(TransactionBuilder)
|
||||
*/
|
||||
@ -73,7 +75,6 @@ public abstract class AbstractBTLEDeviceSupport extends AbstractDeviceSupport im
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param transaction
|
||||
* @throws IOException
|
||||
* @see {@link #performInitialized(String)}
|
||||
@ -90,10 +91,11 @@ public abstract class AbstractBTLEDeviceSupport extends AbstractDeviceSupport im
|
||||
public BtLEQueue getQueue() {
|
||||
return mQueue;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Subclasses should call this method to add services they support.
|
||||
* Only supported services will be queried for characteristics.
|
||||
*
|
||||
* @param aSupportedService
|
||||
* @see #getCharacteristic(UUID)
|
||||
*/
|
||||
@ -104,6 +106,7 @@ public abstract class AbstractBTLEDeviceSupport extends AbstractDeviceSupport im
|
||||
/**
|
||||
* Returns the characteristic matching the given UUID. Only characteristics
|
||||
* are returned whose service is marked as supported.
|
||||
*
|
||||
* @param uuid
|
||||
* @return the characteristic for the given UUID or <code>null</code>
|
||||
* @see #addSupportedService(UUID)
|
||||
@ -122,7 +125,7 @@ public abstract class AbstractBTLEDeviceSupport extends AbstractDeviceSupport im
|
||||
return;
|
||||
}
|
||||
Set<UUID> supportedServices = getSupportedServices();
|
||||
|
||||
|
||||
for (BluetoothGattService service : discoveredGattServices) {
|
||||
if (supportedServices.contains(service.getUuid())) {
|
||||
List<BluetoothGattCharacteristic> characteristics = service.getCharacteristics();
|
||||
@ -146,27 +149,27 @@ public abstract class AbstractBTLEDeviceSupport extends AbstractDeviceSupport im
|
||||
@Override
|
||||
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onServicesDiscovered(BluetoothGatt gatt) {
|
||||
gattServicesDiscovered(getQueue().getSupportedGattServices());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onCharacteristicRead(BluetoothGatt gatt,
|
||||
BluetoothGattCharacteristic characteristic, int status) {
|
||||
BluetoothGattCharacteristic characteristic, int status) {
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onCharacteristicWrite(BluetoothGatt gatt,
|
||||
BluetoothGattCharacteristic characteristic, int status) {
|
||||
BluetoothGattCharacteristic characteristic, int status) {
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onCharacteristicChanged(BluetoothGatt gatt,
|
||||
BluetoothGattCharacteristic characteristic) {
|
||||
BluetoothGattCharacteristic characteristic) {
|
||||
}
|
||||
|
||||
|
||||
public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {
|
||||
}
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ import android.bluetooth.BluetoothGattCharacteristic;
|
||||
* The Bluedroid implementation only allows performing one GATT request at a time.
|
||||
* As they are asynchronous anyway, we encapsulate every GATT request (read and write)
|
||||
* inside a runnable action.
|
||||
*
|
||||
* <p/>
|
||||
* These actions are then executed one after another, ensuring that every action's result
|
||||
* has been posted before invoking the next action.
|
||||
*/
|
||||
@ -17,20 +17,22 @@ public abstract class BtLEAction {
|
||||
public BtLEAction() {
|
||||
this(null);
|
||||
}
|
||||
|
||||
|
||||
public BtLEAction(BluetoothGattCharacteristic characteristic) {
|
||||
this.characteristic = characteristic;
|
||||
}
|
||||
|
||||
|
||||
public abstract boolean run(BluetoothGatt gatt);
|
||||
|
||||
/**
|
||||
* Returns the GATT characteristic being read/written/...
|
||||
*
|
||||
* @return the GATT characteristic, or <code>null</code>
|
||||
*/
|
||||
public BluetoothGattCharacteristic getCharacteristic() {
|
||||
return characteristic;
|
||||
}
|
||||
|
||||
|
||||
public String toString() {
|
||||
BluetoothGattCharacteristic characteristic = getCharacteristic();
|
||||
String uuid = characteristic == null ? "(null)" : characteristic.getUuid().toString();
|
||||
|
@ -1,14 +1,5 @@
|
||||
package nodomain.freeyourgadget.gadgetbridge.btle;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
|
||||
import nodomain.freeyourgadget.gadgetbridge.DeviceSupport;
|
||||
import nodomain.freeyourgadget.gadgetbridge.GBDevice;
|
||||
import nodomain.freeyourgadget.gadgetbridge.GBDevice.State;
|
||||
import android.bluetooth.BluetoothAdapter;
|
||||
import android.bluetooth.BluetoothDevice;
|
||||
import android.bluetooth.BluetoothGatt;
|
||||
@ -19,69 +10,79 @@ import android.bluetooth.BluetoothProfile;
|
||||
import android.content.Context;
|
||||
import android.util.Log;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
|
||||
import nodomain.freeyourgadget.gadgetbridge.DeviceSupport;
|
||||
import nodomain.freeyourgadget.gadgetbridge.GBDevice;
|
||||
import nodomain.freeyourgadget.gadgetbridge.GBDevice.State;
|
||||
|
||||
/**
|
||||
* One queue/thread per connectable device.
|
||||
*/
|
||||
public final class BtLEQueue {
|
||||
private static final String TAG = BtLEQueue.class.getSimpleName();
|
||||
|
||||
|
||||
private GBDevice mGbDevice;
|
||||
private BluetoothAdapter mBluetoothAdapter;
|
||||
private BluetoothGatt mBluetoothGatt;
|
||||
private volatile BlockingQueue<Transaction> mTransactions = new LinkedBlockingQueue<Transaction>();
|
||||
private volatile boolean mDisposed;
|
||||
private volatile boolean mAbortTransaction;
|
||||
|
||||
|
||||
private Context mContext;
|
||||
private CountDownLatch mWaitForActionResultLatch;
|
||||
private CountDownLatch mConnectionLatch;
|
||||
private BluetoothGattCharacteristic mWaitCharacteristic;
|
||||
private GattCallback mExternalGattCallback;
|
||||
|
||||
|
||||
private Thread dispatchThread = new Thread("Bluetooth GATT Dispatcher") {
|
||||
|
||||
public void run() {
|
||||
while (!mDisposed) {
|
||||
try {
|
||||
Transaction transaction = mTransactions.take();
|
||||
if (!isConnected()) {
|
||||
// TODO: request connection and initialization from the outside and wait until finished
|
||||
|
||||
// wait until the connection succeeds before running the actions
|
||||
// Note that no automatic connection is performed. This has to be triggered
|
||||
// on the outside typically by the DeviceSupport. The reason is that
|
||||
// devices have different kinds of initializations and this class has no
|
||||
// idea about them.
|
||||
mConnectionLatch = new CountDownLatch(1);
|
||||
mConnectionLatch.await();
|
||||
mConnectionLatch = null;
|
||||
}
|
||||
|
||||
mAbortTransaction = false;
|
||||
// Run all actions of the transaction until one doesn't succeed
|
||||
for (BtLEAction action : transaction.getActions()) {
|
||||
mWaitCharacteristic = action.getCharacteristic();
|
||||
if (action.run(mBluetoothGatt)) {
|
||||
mWaitForActionResultLatch = new CountDownLatch(1);
|
||||
mWaitForActionResultLatch.await();
|
||||
mWaitForActionResultLatch = null;
|
||||
if (mAbortTransaction) {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
Log.e(TAG, "Action returned false: " + action);
|
||||
break; // abort the transaction
|
||||
}
|
||||
}
|
||||
} catch (InterruptedException ignored) {
|
||||
mWaitForActionResultLatch = null;
|
||||
mConnectionLatch = null;
|
||||
} finally {
|
||||
mWaitCharacteristic = null;
|
||||
}
|
||||
}
|
||||
Log.i(TAG, "Queue Dispatch Thread terminated.");
|
||||
}
|
||||
while (!mDisposed) {
|
||||
try {
|
||||
Transaction transaction = mTransactions.take();
|
||||
if (!isConnected()) {
|
||||
// TODO: request connection and initialization from the outside and wait until finished
|
||||
|
||||
// wait until the connection succeeds before running the actions
|
||||
// Note that no automatic connection is performed. This has to be triggered
|
||||
// on the outside typically by the DeviceSupport. The reason is that
|
||||
// devices have different kinds of initializations and this class has no
|
||||
// idea about them.
|
||||
mConnectionLatch = new CountDownLatch(1);
|
||||
mConnectionLatch.await();
|
||||
mConnectionLatch = null;
|
||||
}
|
||||
|
||||
mAbortTransaction = false;
|
||||
// Run all actions of the transaction until one doesn't succeed
|
||||
for (BtLEAction action : transaction.getActions()) {
|
||||
mWaitCharacteristic = action.getCharacteristic();
|
||||
if (action.run(mBluetoothGatt)) {
|
||||
mWaitForActionResultLatch = new CountDownLatch(1);
|
||||
mWaitForActionResultLatch.await();
|
||||
mWaitForActionResultLatch = null;
|
||||
if (mAbortTransaction) {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
Log.e(TAG, "Action returned false: " + action);
|
||||
break; // abort the transaction
|
||||
}
|
||||
}
|
||||
} catch (InterruptedException ignored) {
|
||||
mWaitForActionResultLatch = null;
|
||||
mConnectionLatch = null;
|
||||
} finally {
|
||||
mWaitCharacteristic = null;
|
||||
}
|
||||
}
|
||||
Log.i(TAG, "Queue Dispatch Thread terminated.");
|
||||
}
|
||||
};
|
||||
|
||||
public BtLEQueue(BluetoothAdapter bluetoothAdapter, GBDevice gbDevice, GattCallback externalGattCallback, Context context) {
|
||||
@ -89,10 +90,10 @@ public final class BtLEQueue {
|
||||
mGbDevice = gbDevice;
|
||||
mExternalGattCallback = externalGattCallback;
|
||||
mContext = context;
|
||||
|
||||
|
||||
dispatchThread.start();
|
||||
}
|
||||
|
||||
|
||||
protected boolean isConnected() {
|
||||
return mGbDevice.isConnected();
|
||||
}
|
||||
@ -101,7 +102,7 @@ public final class BtLEQueue {
|
||||
* Connects to the given remote device. Note that this does not perform any device
|
||||
* specific initialization. This should be done in the specific {@link DeviceSupport}
|
||||
* class.
|
||||
*
|
||||
*
|
||||
* @return true whether the connection attempt was successfully triggered
|
||||
*/
|
||||
public boolean connect() {
|
||||
@ -114,7 +115,7 @@ public final class BtLEQueue {
|
||||
setDeviceConnectionState(result ? State.CONNECTING : State.NOT_CONNECTED);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
private void setDeviceConnectionState(State newState) {
|
||||
mGbDevice.setState(newState);
|
||||
mGbDevice.sendDeviceUpdateIntent(mContext);
|
||||
@ -139,24 +140,25 @@ public final class BtLEQueue {
|
||||
}
|
||||
setDeviceConnectionState(State.NOT_CONNECTED);
|
||||
}
|
||||
|
||||
|
||||
public void dispose() {
|
||||
if (mDisposed) {
|
||||
return;
|
||||
}
|
||||
mDisposed = true;
|
||||
// try {
|
||||
disconnect();
|
||||
dispatchThread.interrupt();
|
||||
dispatchThread = null;
|
||||
disconnect();
|
||||
dispatchThread.interrupt();
|
||||
dispatchThread = null;
|
||||
// dispatchThread.join();
|
||||
// } catch (InterruptedException ex) {
|
||||
// Log.e(TAG, "Exception while disposing BtLEQueue", ex);
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds a transaction to the end of the queue.
|
||||
*
|
||||
* @param transaction
|
||||
*/
|
||||
public void add(Transaction transaction) {
|
||||
@ -164,11 +166,11 @@ public final class BtLEQueue {
|
||||
mTransactions.add(transaction);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void clear() {
|
||||
mTransactions.clear();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Retrieves a list of supported GATT services on the connected device. This should be
|
||||
* invoked only after {@code BluetoothGatt#discoverServices()} completes successfully.
|
||||
@ -188,21 +190,21 @@ public final class BtLEQueue {
|
||||
@Override
|
||||
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
|
||||
switch (newState) {
|
||||
case BluetoothProfile.STATE_CONNECTED:
|
||||
Log.i(TAG, "Connected to GATT server.");
|
||||
setDeviceConnectionState(State.CONNECTED);
|
||||
// Attempts to discover services after successful connection.
|
||||
Log.i(TAG, "Attempting to start service discovery:" +
|
||||
mBluetoothGatt.discoverServices());
|
||||
break;
|
||||
case BluetoothProfile.STATE_DISCONNECTED:
|
||||
Log.i(TAG, "Disconnected from GATT server.");
|
||||
handleDisconnected();
|
||||
break;
|
||||
case BluetoothProfile.STATE_CONNECTING:
|
||||
Log.i(TAG, "Connecting to GATT server...");
|
||||
setDeviceConnectionState(State.CONNECTING);
|
||||
break;
|
||||
case BluetoothProfile.STATE_CONNECTED:
|
||||
Log.i(TAG, "Connected to GATT server.");
|
||||
setDeviceConnectionState(State.CONNECTED);
|
||||
// Attempts to discover services after successful connection.
|
||||
Log.i(TAG, "Attempting to start service discovery:" +
|
||||
mBluetoothGatt.discoverServices());
|
||||
break;
|
||||
case BluetoothProfile.STATE_DISCONNECTED:
|
||||
Log.i(TAG, "Disconnected from GATT server.");
|
||||
handleDisconnected();
|
||||
break;
|
||||
case BluetoothProfile.STATE_CONNECTING:
|
||||
Log.i(TAG, "Connecting to GATT server...");
|
||||
setDeviceConnectionState(State.CONNECTING);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -223,7 +225,7 @@ public final class BtLEQueue {
|
||||
if (status == BluetoothGatt.GATT_SUCCESS) {
|
||||
Log.e(TAG, "Writing characteristic " + characteristic.getUuid() + " succeeded.");
|
||||
} else {
|
||||
Log.e(TAG, "Writing characteristic " + characteristic.getUuid() + " failed: "+ status);
|
||||
Log.e(TAG, "Writing characteristic " + characteristic.getUuid() + " failed: " + status);
|
||||
}
|
||||
if (mExternalGattCallback != null) {
|
||||
mExternalGattCallback.onCharacteristicWrite(gatt, characteristic, status);
|
||||
@ -258,7 +260,7 @@ public final class BtLEQueue {
|
||||
mExternalGattCallback.onReadRemoteRssi(gatt, rssi, status);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void checkWaitingCharacteristic(BluetoothGattCharacteristic characteristic, int status) {
|
||||
if (status != BluetoothGatt.GATT_SUCCESS) {
|
||||
mAbortTransaction = true;
|
||||
|
@ -28,40 +28,40 @@ import android.bluetooth.BluetoothGattCharacteristic;
|
||||
public interface GattCallback {
|
||||
|
||||
/**
|
||||
* @see BluetoothGattCallback#onConnectionStateChange(BluetoothGatt, int, int)
|
||||
* @param gatt
|
||||
* @param status
|
||||
* @param newState
|
||||
* @see BluetoothGattCallback#onConnectionStateChange(BluetoothGatt, int, int)
|
||||
*/
|
||||
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState);
|
||||
|
||||
/**
|
||||
* @see BluetoothGattCallback#onServicesDiscovered(BluetoothGatt, int)
|
||||
* @param gatt
|
||||
* @see BluetoothGattCallback#onServicesDiscovered(BluetoothGatt, int)
|
||||
*/
|
||||
public void onServicesDiscovered(BluetoothGatt gatt);
|
||||
|
||||
/**
|
||||
* @see BluetoothGattCallback#onCharacteristicRead(BluetoothGatt, BluetoothGattCharacteristic, int)
|
||||
* @param gatt
|
||||
* @param characteristic
|
||||
* @param status
|
||||
* @see BluetoothGattCallback#onCharacteristicRead(BluetoothGatt, BluetoothGattCharacteristic, int)
|
||||
*/
|
||||
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status);
|
||||
|
||||
/**
|
||||
* @see BluetoothGattCallback#onCharacteristicWrite(BluetoothGatt, BluetoothGattCharacteristic, int)
|
||||
* @param gatt
|
||||
* @param characteristic
|
||||
* @param status
|
||||
* @see BluetoothGattCallback#onCharacteristicWrite(BluetoothGatt, BluetoothGattCharacteristic, int)
|
||||
*/
|
||||
public void onCharacteristicWrite(BluetoothGatt gatt,
|
||||
BluetoothGattCharacteristic characteristic, int status);
|
||||
|
||||
/**
|
||||
* @see BluetoothGattCallback#onCharacteristicChanged(BluetoothGatt, BluetoothGattCharacteristic)
|
||||
* @param gatt
|
||||
* @param characteristic
|
||||
* @see BluetoothGattCallback#onCharacteristicChanged(BluetoothGatt, BluetoothGattCharacteristic)
|
||||
*/
|
||||
public void onCharacteristicChanged(BluetoothGatt gatt,
|
||||
BluetoothGattCharacteristic characteristic);
|
||||
@ -92,10 +92,10 @@ public interface GattCallback {
|
||||
// public void onReliableWriteCompleted(BluetoothGatt gatt, int status);
|
||||
|
||||
/**
|
||||
* @see BluetoothGattCallback#onReadRemoteRssi(BluetoothGatt, int, int)
|
||||
* @param gatt
|
||||
* @param rssi
|
||||
* @param status
|
||||
* @see BluetoothGattCallback#onReadRemoteRssi(BluetoothGatt, int, int)
|
||||
*/
|
||||
public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status);
|
||||
|
||||
|
@ -14,7 +14,7 @@ public class ReadAction extends BtLEAction {
|
||||
public ReadAction(BluetoothGattCharacteristic characteristic) {
|
||||
super(characteristic);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean run(BluetoothGatt gatt) {
|
||||
return gatt.readCharacteristic(getCharacteristic());
|
||||
|
@ -8,7 +8,7 @@ import java.util.Locale;
|
||||
/**
|
||||
* Groups a bunch of {@link BtLEAction actions} together, making sure
|
||||
* that upon failure of one action, all subsequent actions are discarded.
|
||||
*
|
||||
*
|
||||
* @author TREND
|
||||
*/
|
||||
public class Transaction {
|
||||
@ -18,19 +18,19 @@ public class Transaction {
|
||||
public Transaction(String taskName) {
|
||||
this.mName = taskName;
|
||||
}
|
||||
|
||||
|
||||
public String getTaskName() {
|
||||
return mName;
|
||||
}
|
||||
|
||||
|
||||
public void add(BtLEAction action) {
|
||||
mActions.add(action);
|
||||
}
|
||||
|
||||
|
||||
public List<BtLEAction> getActions() {
|
||||
return Collections.unmodifiableList(mActions);
|
||||
}
|
||||
|
||||
|
||||
public boolean isEmpty() {
|
||||
return mActions.isEmpty();
|
||||
}
|
||||
|
@ -7,11 +7,11 @@ public class TransactionBuilder {
|
||||
private static final String TAG = TransactionBuilder.class.getSimpleName();
|
||||
|
||||
private Transaction mTransaction;
|
||||
|
||||
|
||||
public TransactionBuilder(String taskName) {
|
||||
mTransaction = new Transaction(taskName);
|
||||
}
|
||||
|
||||
|
||||
public TransactionBuilder read(BluetoothGattCharacteristic characteristic) {
|
||||
if (characteristic == null) {
|
||||
Log.w(TAG, "Unable to read characteristic: null");
|
||||
@ -20,7 +20,7 @@ public class TransactionBuilder {
|
||||
ReadAction action = new ReadAction(characteristic);
|
||||
return add(action);
|
||||
}
|
||||
|
||||
|
||||
public TransactionBuilder write(BluetoothGattCharacteristic characteristic, byte[] data) {
|
||||
if (characteristic == null) {
|
||||
Log.w(TAG, "Unable to write characteristic: null");
|
||||
@ -29,19 +29,20 @@ public class TransactionBuilder {
|
||||
WriteAction action = new WriteAction(characteristic, data);
|
||||
return add(action);
|
||||
}
|
||||
|
||||
|
||||
public TransactionBuilder wait(int millis) {
|
||||
WaitAction action = new WaitAction(millis);
|
||||
return add(action);
|
||||
}
|
||||
|
||||
|
||||
public TransactionBuilder add(BtLEAction action) {
|
||||
mTransaction.add(action);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* To be used as the final step to execute the transaction by the given queue.
|
||||
*
|
||||
* @param queue
|
||||
*/
|
||||
public void queue(BtLEQueue queue) {
|
||||
|
@ -7,7 +7,7 @@ public class WaitAction extends BtLEAction {
|
||||
private int mMillis;
|
||||
|
||||
public WaitAction(int millis) {
|
||||
mMillis = millis;
|
||||
mMillis = millis;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -17,7 +17,7 @@ public class WriteAction extends BtLEAction {
|
||||
super(characteristic);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean run(BluetoothGatt gatt) {
|
||||
if (getCharacteristic().setValue(value)) {
|
||||
|
@ -184,7 +184,7 @@ public class MiBandService {
|
||||
|
||||
*/
|
||||
|
||||
private static Map<UUID,String> MIBAND_DEBUG;
|
||||
private static Map<UUID, String> MIBAND_DEBUG;
|
||||
|
||||
static {
|
||||
MIBAND_DEBUG = new HashMap<>();
|
||||
|
@ -1,14 +1,15 @@
|
||||
package nodomain.freeyourgadget.gadgetbridge.miband;
|
||||
|
||||
import android.bluetooth.BluetoothGatt;
|
||||
import android.bluetooth.BluetoothGattCharacteristic;
|
||||
import android.util.Log;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.UUID;
|
||||
|
||||
import nodomain.freeyourgadget.gadgetbridge.GBCommand;
|
||||
import nodomain.freeyourgadget.gadgetbridge.btle.AbstractBTLEDeviceSupport;
|
||||
import nodomain.freeyourgadget.gadgetbridge.btle.TransactionBuilder;
|
||||
import android.bluetooth.BluetoothGatt;
|
||||
import android.bluetooth.BluetoothGattCharacteristic;
|
||||
import android.util.Log;
|
||||
|
||||
public class MiBandSupport extends AbstractBTLEDeviceSupport {
|
||||
|
||||
@ -28,7 +29,7 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport {
|
||||
public boolean useAutoConnect() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
private byte[] getDefaultNotification() {
|
||||
final int vibrateTimes = 1;
|
||||
final long vibrateDuration = 250l;
|
||||
@ -47,7 +48,7 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport {
|
||||
}
|
||||
|
||||
private byte[] getNotification(long vibrateDuration, int vibrateTimes, int flashTimes, int flashColour, int originalColour, long flashDuration) {
|
||||
byte[] vibrate = new byte[]{ (byte) 8, (byte) 1 };
|
||||
byte[] vibrate = new byte[]{(byte) 8, (byte) 1};
|
||||
byte r = 6;
|
||||
byte g = 0;
|
||||
byte b = 6;
|
||||
@ -72,6 +73,7 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport {
|
||||
|
||||
/**
|
||||
* Part of device initialization process. Do not call manually.
|
||||
*
|
||||
* @param builder
|
||||
* @return
|
||||
*/
|
||||
@ -84,6 +86,7 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport {
|
||||
|
||||
/**
|
||||
* Part of device initialization process. Do not call manually.
|
||||
*
|
||||
* @param builder
|
||||
* @return
|
||||
*/
|
||||
@ -161,7 +164,7 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport {
|
||||
|
||||
@Override
|
||||
public void onCharacteristicWrite(BluetoothGatt gatt,
|
||||
BluetoothGattCharacteristic characteristic, int status) {
|
||||
BluetoothGattCharacteristic characteristic, int status) {
|
||||
UUID characteristicUUID = characteristic.getUuid();
|
||||
if (MiBandService.UUID_CHARACTERISTIC_PAIR.equals(characteristicUUID)) {
|
||||
handlePairResult(characteristic.getValue(), status);
|
||||
|
@ -17,6 +17,7 @@ public class UserInfo {
|
||||
|
||||
/**
|
||||
* Creates a default user info.
|
||||
*
|
||||
* @param btAddress the address of the MI Band to connect to.
|
||||
*/
|
||||
public static UserInfo getDefault(String btAddress) {
|
||||
@ -25,6 +26,7 @@ public class UserInfo {
|
||||
|
||||
/**
|
||||
* Creates a user info with the given data
|
||||
*
|
||||
* @param address the address of the MI Band to connect to.
|
||||
*/
|
||||
public UserInfo(String address, String alias, int gender, int age, int height, int weight, int type) {
|
||||
@ -53,7 +55,7 @@ public class UserInfo {
|
||||
sequence[8] = (byte) (type & 0xff);
|
||||
|
||||
for (int u = 9; u < 19; u++)
|
||||
sequence[u] = alias.getBytes()[u-9];
|
||||
sequence[u] = alias.getBytes()[u - 9];
|
||||
|
||||
byte[] crcSequence = new byte[19];
|
||||
for (int u = 0; u < crcSequence.length; u++)
|
||||
@ -80,7 +82,7 @@ public class UserInfo {
|
||||
sum = (byte) ((sum & 0xff) & 0x01);
|
||||
crc = (byte) ((crc & 0xff) >>> 1);
|
||||
if (sum != 0) {
|
||||
crc = (byte)((crc & 0xff) ^ 0x8c);
|
||||
crc = (byte) ((crc & 0xff) ^ 0x8c);
|
||||
}
|
||||
extract = (byte) ((extract & 0xff) >>> 1);
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ public class PebbleSupport extends AbstractBTDeviceSupport {
|
||||
protected GBDeviceIoThread createDeviceIOThread() {
|
||||
return new PebbleIoThread(getDevice(), getDeviceProtocol(), getBluetoothAdapter(), getContext());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean useAutoConnect() {
|
||||
return false;
|
||||
|
Loading…
Reference in New Issue
Block a user