mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-12-28 03:25:49 +01:00
fixed file upload bug
This commit is contained in:
parent
64b407da92
commit
161236f3a2
@ -123,6 +123,7 @@ public class QHybridAppChoserActivity extends AbstractGBActivity {
|
|||||||
if(success){
|
if(success){
|
||||||
try {
|
try {
|
||||||
helper.saveNotificationConfiguration(config);
|
helper.saveNotificationConfiguration(config);
|
||||||
|
LocalBroadcastManager.getInstance(QHybridAppChoserActivity.this).sendBroadcast(new Intent(QHybridSupport.QHYBRID_COMMAND_NOTIFICATION_CONFIG_CHANGED));
|
||||||
} catch (GBException e) {
|
} catch (GBException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
GB.toast("error saving configuration", Toast.LENGTH_SHORT, GB.ERROR, e);
|
GB.toast("error saving configuration", Toast.LENGTH_SHORT, GB.ERROR, e);
|
||||||
|
@ -26,6 +26,7 @@ import java.io.StringWriter;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import androidx.annotation.RequiresApi;
|
||||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
@ -294,7 +295,7 @@ public class QHybridSupport extends QHybridBaseSupport {
|
|||||||
showNotificationsByAllActive(true);
|
showNotificationsByAllActive(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showNotificationsByAllActive(boolean enforceByNotification) {
|
private void showNotificationsByAllActive(boolean enforceByNotification) {
|
||||||
if (!this.useActivityHand) return;
|
if (!this.useActivityHand) return;
|
||||||
double progress = calculateNotificationProgress();
|
double progress = calculateNotificationProgress();
|
||||||
showNotificationCountOnActivityHand(progress);
|
showNotificationCountOnActivityHand(progress);
|
||||||
@ -342,6 +343,13 @@ public class QHybridSupport extends QHybridBaseSupport {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
|
||||||
|
super.onMtuChanged(gatt, mtu, status);
|
||||||
|
if(watchAdapter == null) return;
|
||||||
|
watchAdapter.onMtuChanged(gatt, mtu, status);
|
||||||
|
}
|
||||||
|
|
||||||
private void playNotification(NotificationConfiguration config) {
|
private void playNotification(NotificationConfiguration config) {
|
||||||
if (config.getMin() == -1 && config.getHour() == -1 && config.getVibration() == PlayNotificationRequest.VibrationType.NO_VIBE)
|
if (config.getMin() == -1 && config.getHour() == -1 && config.getVibration() == PlayNotificationRequest.VibrationType.NO_VIBE)
|
||||||
return;
|
return;
|
||||||
@ -508,6 +516,7 @@ public class QHybridSupport extends QHybridBaseSupport {
|
|||||||
@Override
|
@Override
|
||||||
public boolean onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic
|
public boolean onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic
|
||||||
characteristic) {
|
characteristic) {
|
||||||
|
if(watchAdapter == null) return super.onCharacteristicChanged(gatt, characteristic);
|
||||||
return watchAdapter.onCharacteristicChanged(gatt, characteristic);
|
return watchAdapter.onCharacteristicChanged(gatt, characteristic);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ public abstract class WatchAdapter {
|
|||||||
public abstract void onFetchActivityData();
|
public abstract void onFetchActivityData();
|
||||||
|
|
||||||
public abstract boolean onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic);
|
public abstract boolean onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic);
|
||||||
|
public void onMtuChanged(BluetoothGatt gatt, int mtu, int status){};
|
||||||
|
|
||||||
|
|
||||||
public String arrayToString(byte[] bytes) {
|
public String arrayToString(byte[] bytes) {
|
||||||
|
@ -2,16 +2,21 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fos
|
|||||||
|
|
||||||
import android.bluetooth.BluetoothGatt;
|
import android.bluetooth.BluetoothGatt;
|
||||||
import android.bluetooth.BluetoothGattCharacteristic;
|
import android.bluetooth.BluetoothGattCharacteristic;
|
||||||
|
import android.os.Build;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.annotation.RequiresApi;
|
||||||
|
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.GregorianCalendar;
|
import java.util.GregorianCalendar;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBException;
|
import nodomain.freeyourgadget.gadgetbridge.GBException;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.Logging;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.NotificationConfiguration;
|
import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.NotificationConfiguration;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.PackageConfigHelper;
|
import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.PackageConfigHelper;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.entities.NotificationFilter;
|
import nodomain.freeyourgadget.gadgetbridge.entities.NotificationFilter;
|
||||||
@ -22,11 +27,15 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSuppo
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.WatchAdapter;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.WatchAdapter;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.Request;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.Request;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.FossilRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.FossilRequest;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.RequestMtuRequest;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.SetDeviceStateRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.configuration.ConfigurationGetRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.configuration.ConfigurationGetRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.configuration.ConfigurationPutRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.configuration.ConfigurationPutRequest;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.connection.SetConnectionParametersRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FileCloseRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FileCloseRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FileDeleteRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FileDeleteRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FilePutRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FilePutRequest;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file.FileVerifyRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.NotificationFilterPutRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.NotificationFilterPutRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.PlayNotificationRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.notification.PlayNotificationRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.AnimationRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.misfit.AnimationRequest;
|
||||||
@ -49,11 +58,13 @@ public class FossilWatchAdapter extends WatchAdapter {
|
|||||||
public void initialize() {
|
public void initialize() {
|
||||||
// playPairingAnimation();
|
// playPairingAnimation();
|
||||||
// queueWrite(new FileDeleteRequest((short) 0x0200));
|
// queueWrite(new FileDeleteRequest((short) 0x0200));
|
||||||
// queueWrite(new ConfigurationGetRequest(this));
|
queueWrite(new RequestMtuRequest(512));
|
||||||
//
|
queueWrite(new ConfigurationGetRequest(this));
|
||||||
// syncNotificationSettings();
|
// queueWrite(new SetConnectionParametersRequest());
|
||||||
getDeviceSupport().getDevice().setState(GBDevice.State.INITIALIZED);
|
|
||||||
getDeviceSupport().getDevice().sendDeviceUpdateIntent(getContext());
|
syncNotificationSettings();
|
||||||
|
|
||||||
|
queueWrite(new SetDeviceStateRequest(GBDevice.State.INITIALIZED));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -139,14 +150,13 @@ public class FossilWatchAdapter extends WatchAdapter {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setVibrationStrength(short strength) {
|
public void setVibrationStrength(short strength) {
|
||||||
|
ConfigurationPutRequest.ConfigItem vibrationItem = new ConfigurationPutRequest.VibrationStrengthConfigItem((byte)strength);
|
||||||
|
|
||||||
|
|
||||||
queueWrite(
|
queueWrite(
|
||||||
new ConfigurationPutRequest(
|
new ConfigurationPutRequest(new ConfigurationPutRequest.ConfigItem[]{vibrationItem, vibrationItem, vibrationItem}, this)
|
||||||
new ConfigurationPutRequest.VibrationStrengthConfigItem(
|
|
||||||
(byte) strength
|
|
||||||
),
|
|
||||||
this
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
// queueWrite(new FileVerifyRequest((short) 0x0800));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -179,6 +189,7 @@ public class FossilWatchAdapter extends WatchAdapter {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTestNewFunction() {
|
public void onTestNewFunction() {
|
||||||
|
queueWrite(new ConfigurationPutRequest(new ConfigurationPutRequest.ConfigItem[0], this));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -226,7 +237,8 @@ public class FossilWatchAdapter extends WatchAdapter {
|
|||||||
public void onFetchActivityData() {
|
public void onFetchActivityData() {
|
||||||
|
|
||||||
// queueWrite(new ConfigurationPutRequest(new ConfigurationPutRequest.ConfigItem[0], this));
|
// queueWrite(new ConfigurationPutRequest(new ConfigurationPutRequest.ConfigItem[0], this));
|
||||||
queueWrite(new ConfigurationPutRequest(new ConfigurationPutRequest.VibrationStrengthConfigItem((byte) 100), this));
|
setVibrationStrength((byte) 50);
|
||||||
|
// queueWrite(new FileCloseRequest((short) 0x0800));
|
||||||
// queueWrite(new ConfigurationGetRequest(this));
|
// queueWrite(new ConfigurationGetRequest(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -237,14 +249,20 @@ public class FossilWatchAdapter extends WatchAdapter {
|
|||||||
handleBackgroundCharacteristic(characteristic);
|
handleBackgroundCharacteristic(characteristic);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "3dda0002-957f-7d4a-34a6-74696673696d": {
|
case "3dda0002-957f-7d4a-34a6-74696673696d":
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "3dda0004-957f-7d4a-34a6-74696673696d":
|
case "3dda0004-957f-7d4a-34a6-74696673696d":
|
||||||
case "3dda0003-957f-7d4a-34a6-74696673696d": {
|
case "3dda0003-957f-7d4a-34a6-74696673696d": {
|
||||||
if (fossilRequest != null) {
|
if (fossilRequest != null) {
|
||||||
boolean requestFinished;
|
boolean requestFinished;
|
||||||
try {
|
try {
|
||||||
|
if(characteristic.getUuid().toString().equals("3dda0003-957f-7d4a-34a6-74696673696d")){
|
||||||
|
byte requestType = (byte)(characteristic.getValue()[0] & 0x0F);
|
||||||
|
|
||||||
|
if(requestType != 0x0A && requestType != fossilRequest.getType()){
|
||||||
|
// throw new RuntimeException("Answer type " + requestType + " does not match current request " + fossilRequest.getType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fossilRequest.handleResponse(characteristic);
|
fossilRequest.handleResponse(characteristic);
|
||||||
requestFinished = fossilRequest.isFinished();
|
requestFinished = fossilRequest.isFinished();
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
@ -294,14 +312,44 @@ public class FossilWatchAdapter extends WatchAdapter {
|
|||||||
this.queueWrite(request, false);
|
this.queueWrite(request, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
|
||||||
|
super.onMtuChanged(gatt, mtu, status);
|
||||||
|
((RequestMtuRequest)fossilRequest).setFinished(true);
|
||||||
|
try {
|
||||||
|
queueWrite(requestQueue.remove(0));
|
||||||
|
} catch (IndexOutOfBoundsException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO split to multiple methods instead of switch
|
||||||
public void queueWrite(Request request, boolean priorise) {
|
public void queueWrite(Request request, boolean priorise) {
|
||||||
if (request.isBasicRequest()) {
|
if(request instanceof RequestMtuRequest){
|
||||||
|
//TODO mtu on older devices
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
|
new TransactionBuilder("requestMtu")
|
||||||
|
.requestMtu(512)
|
||||||
|
.queue(getDeviceSupport().getQueue());
|
||||||
|
|
||||||
|
this.fossilRequest = (FossilRequest) request;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}else if(request instanceof SetDeviceStateRequest){
|
||||||
|
log("setting device state: " + ((SetDeviceStateRequest)request).getDeviceState());
|
||||||
|
getDeviceSupport().getDevice().setState(((SetDeviceStateRequest)request).getDeviceState());
|
||||||
|
getDeviceSupport().getDevice().sendDeviceUpdateIntent(getContext());
|
||||||
|
try {
|
||||||
|
queueWrite(requestQueue.remove(0));
|
||||||
|
} catch (IndexOutOfBoundsException e) {
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} else if (request.isBasicRequest()) {
|
||||||
try {
|
try {
|
||||||
queueWrite(requestQueue.remove(0));
|
queueWrite(requestQueue.remove(0));
|
||||||
} catch (IndexOutOfBoundsException e) {
|
} catch (IndexOutOfBoundsException e) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (fossilRequest != null) {
|
if (fossilRequest != null && !fossilRequest.isFinished()) {
|
||||||
log("queing request: " + request.getName());
|
log("queing request: " + request.getName());
|
||||||
if (priorise) {
|
if (priorise) {
|
||||||
requestQueue.add(0, request);
|
requestQueue.add(0, request);
|
||||||
|
@ -7,6 +7,9 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.Req
|
|||||||
public abstract class FossilRequest extends Request {
|
public abstract class FossilRequest extends Request {
|
||||||
public abstract boolean isFinished();
|
public abstract boolean isFinished();
|
||||||
|
|
||||||
|
public byte getType(){
|
||||||
|
return getStartSequence()[0];
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public UUID getRequestUUID() {
|
public UUID getRequestUUID() {
|
||||||
|
@ -0,0 +1,28 @@
|
|||||||
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil;
|
||||||
|
|
||||||
|
public class RequestMtuRequest extends FossilRequest {
|
||||||
|
private int mtu;
|
||||||
|
private boolean finished = false;
|
||||||
|
|
||||||
|
public RequestMtuRequest(int mtu) {
|
||||||
|
this.mtu = mtu;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMtu() {
|
||||||
|
return mtu;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isFinished() {
|
||||||
|
return finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFinished(boolean finished) {
|
||||||
|
this.finished = finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] getStartSequence() {
|
||||||
|
return new byte[0];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
||||||
|
|
||||||
|
public class SetDeviceStateRequest extends FossilRequest {
|
||||||
|
private GBDevice.State deviceState;
|
||||||
|
|
||||||
|
public SetDeviceStateRequest(GBDevice.State deviceState) {
|
||||||
|
this.deviceState = deviceState;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GBDevice.State getDeviceState() {
|
||||||
|
return deviceState;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isFinished() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] getStartSequence() {
|
||||||
|
return new byte[0];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.connection;
|
||||||
|
|
||||||
|
import android.bluetooth.BluetoothGattCharacteristic;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.FossilRequest;
|
||||||
|
|
||||||
|
public class SetConnectionParametersRequest extends FossilRequest {
|
||||||
|
private boolean finished = false;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isFinished() {
|
||||||
|
return finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UUID getRequestUUID() {
|
||||||
|
return UUID.fromString("3dda0002-957f-7d4a-34a6-74696673696d");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleResponse(BluetoothGattCharacteristic characteristic) {
|
||||||
|
super.handleResponse(characteristic);
|
||||||
|
this.finished = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] getStartSequence() {
|
||||||
|
return new byte[]{0x02, 0x09, 0x0C, 0x00, 0x0C, 0x00, 0x2D, 0x00, 0x58, 0x02};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isBasicRequest() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@ -66,7 +66,7 @@ public class FileLookupRequest extends FossilRequest {
|
|||||||
byte status = buffer.get(3);
|
byte status = buffer.get(3);
|
||||||
|
|
||||||
if(status != 0){
|
if(status != 0){
|
||||||
throw new RuntimeException("FileGet error: " + status);
|
throw new RuntimeException("file lookup error: " + status);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(this.handle != handle){
|
if(this.handle != handle){
|
||||||
|
@ -0,0 +1,75 @@
|
|||||||
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.file;
|
||||||
|
|
||||||
|
import android.bluetooth.BluetoothGattCharacteristic;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.ByteOrder;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.requests.fossil.FossilRequest;
|
||||||
|
|
||||||
|
public class FileVerifyRequest extends FossilRequest {
|
||||||
|
private boolean isFinished = false;
|
||||||
|
private short handle;
|
||||||
|
|
||||||
|
public FileVerifyRequest(short fileHandle) {
|
||||||
|
this.handle = fileHandle;
|
||||||
|
ByteBuffer buffer = this.createBuffer();
|
||||||
|
buffer.putShort(fileHandle);
|
||||||
|
|
||||||
|
this.data = buffer.array();
|
||||||
|
}
|
||||||
|
|
||||||
|
public short getHandle() {
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleResponse(BluetoothGattCharacteristic characteristic) {
|
||||||
|
super.handleResponse(characteristic);
|
||||||
|
|
||||||
|
if(!characteristic.getUuid().toString().equals(this.getRequestUUID().toString())){
|
||||||
|
throw new RuntimeException("wrong response UUID");
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] value = characteristic.getValue();
|
||||||
|
|
||||||
|
byte type = (byte)(value[0] & 0x0F);
|
||||||
|
|
||||||
|
if(type == 0x0A) return;
|
||||||
|
|
||||||
|
if(type != 4) throw new RuntimeException("wrong response type");
|
||||||
|
|
||||||
|
if(value.length != 4) throw new RuntimeException("wrong response length");
|
||||||
|
|
||||||
|
ByteBuffer buffer = ByteBuffer.wrap(value);
|
||||||
|
buffer.order(ByteOrder.LITTLE_ENDIAN);
|
||||||
|
|
||||||
|
if(this.handle != buffer.getShort(1)) throw new RuntimeException("wrong response handle");
|
||||||
|
|
||||||
|
byte status = buffer.get(3);
|
||||||
|
|
||||||
|
if(status != 0) throw new RuntimeException("wrong response status");
|
||||||
|
|
||||||
|
this.isFinished = true;
|
||||||
|
|
||||||
|
this.onPrepare();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onPrepare(){}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] getStartSequence() {
|
||||||
|
return new byte[]{4};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getPayloadLength() {
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isFinished(){
|
||||||
|
return this.isFinished;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user