mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2026-07-31 07:44:24 +02:00
Huawei: Basic errors handling on workouts data sync
This commit is contained in:
+51
-1
@@ -21,7 +21,6 @@ import androidx.annotation.NonNull;
|
|||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket;
|
||||||
@@ -71,12 +70,19 @@ public class Workout {
|
|||||||
public short count;
|
public short count;
|
||||||
public List<WorkoutNumbers> workoutNumbers;
|
public List<WorkoutNumbers> workoutNumbers;
|
||||||
|
|
||||||
|
public Integer error = null;
|
||||||
|
|
||||||
public Response(ParamsProvider paramsProvider) {
|
public Response(ParamsProvider paramsProvider) {
|
||||||
super(paramsProvider);
|
super(paramsProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void parseTlv() throws ParseException {
|
public void parseTlv() throws ParseException {
|
||||||
|
if (this.tlv.contains(0x7f)) {
|
||||||
|
error = this.tlv.getAsInteger(0x7f);
|
||||||
|
this.count = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
HuaweiTLV container = this.tlv.getObject(0x81);
|
HuaweiTLV container = this.tlv.getObject(0x81);
|
||||||
|
|
||||||
this.count = container.getShort(0x02);
|
this.count = container.getShort(0x02);
|
||||||
@@ -129,6 +135,8 @@ public class Workout {
|
|||||||
public static class Response extends HuaweiPacket {
|
public static class Response extends HuaweiPacket {
|
||||||
public byte[] rawData;
|
public byte[] rawData;
|
||||||
|
|
||||||
|
public Integer error = null;
|
||||||
|
|
||||||
public short number;
|
public short number;
|
||||||
public byte status = -1; // TODO: enum?
|
public byte status = -1; // TODO: enum?
|
||||||
public int startTime;
|
public int startTime;
|
||||||
@@ -192,6 +200,11 @@ public class Workout {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void parseTlv() throws ParseException {
|
public void parseTlv() throws ParseException {
|
||||||
|
if (this.tlv.contains(0x7f)) {
|
||||||
|
error = this.tlv.getAsInteger(0x7f);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
HuaweiTLV container = this.tlv.getObject(0x81);
|
HuaweiTLV container = this.tlv.getObject(0x81);
|
||||||
|
|
||||||
this.rawData = container.serialize();
|
this.rawData = container.serialize();
|
||||||
@@ -422,6 +435,8 @@ public class Workout {
|
|||||||
private final byte[] bitmapLengths = {1, 2, 1, 2, 2, 4, -1, 2, 2, 2};
|
private final byte[] bitmapLengths = {1, 2, 1, 2, 2, 4, -1, 2, 2, 2};
|
||||||
private final byte[] innerBitmapLengths = {2, 2, 2, 1, 2, 1, 1, 1, 1, 2, 2, 1, 2, 2, 2, 2, 1, 1, 1, 2};
|
private final byte[] innerBitmapLengths = {2, 2, 2, 1, 2, 1, 1, 1, 1, 2, 2, 1, 2, 2, 2, 2, 1, 1, 1, 2};
|
||||||
|
|
||||||
|
public Integer error = null;
|
||||||
|
|
||||||
public short workoutNumber;
|
public short workoutNumber;
|
||||||
public short dataNumber;
|
public short dataNumber;
|
||||||
public byte[] rawHeader;
|
public byte[] rawHeader;
|
||||||
@@ -449,6 +464,12 @@ public class Workout {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void parseTlv() throws ParseException {
|
public void parseTlv() throws ParseException {
|
||||||
|
|
||||||
|
if (this.tlv.contains(0x7f)) {
|
||||||
|
error = this.tlv.getAsInteger(0x7f);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
HuaweiTLV container = this.tlv.getObject(0x81);
|
HuaweiTLV container = this.tlv.getObject(0x81);
|
||||||
|
|
||||||
this.workoutNumber = container.getShort(0x02);
|
this.workoutNumber = container.getShort(0x02);
|
||||||
@@ -682,6 +703,8 @@ public class Workout {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Integer error = null;
|
||||||
|
|
||||||
public short workoutNumber;
|
public short workoutNumber;
|
||||||
public short paceNumber;
|
public short paceNumber;
|
||||||
public List<Block> blocks;
|
public List<Block> blocks;
|
||||||
@@ -692,6 +715,12 @@ public class Workout {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void parseTlv() throws ParseException {
|
public void parseTlv() throws ParseException {
|
||||||
|
|
||||||
|
if (this.tlv.contains(0x7f)) {
|
||||||
|
error = this.tlv.getAsInteger(0x7f);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
HuaweiTLV container = this.tlv.getObject(0x81);
|
HuaweiTLV container = this.tlv.getObject(0x81);
|
||||||
|
|
||||||
this.workoutNumber = container.getShort(0x02);
|
this.workoutNumber = container.getShort(0x02);
|
||||||
@@ -767,6 +796,9 @@ public class Workout {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Integer error = null;
|
||||||
|
|
||||||
public short workoutNumber;
|
public short workoutNumber;
|
||||||
public short segmentNumber;
|
public short segmentNumber;
|
||||||
public List<Block> blocks;
|
public List<Block> blocks;
|
||||||
@@ -777,6 +809,11 @@ public class Workout {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void parseTlv() throws ParseException {
|
public void parseTlv() throws ParseException {
|
||||||
|
if (this.tlv.contains(0x7f)) {
|
||||||
|
error = this.tlv.getAsInteger(0x7f);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
HuaweiTLV container = this.tlv.getObject(0x81);
|
HuaweiTLV container = this.tlv.getObject(0x81);
|
||||||
|
|
||||||
this.workoutNumber = container.getShort(0x02);
|
this.workoutNumber = container.getShort(0x02);
|
||||||
@@ -846,6 +883,8 @@ public class Workout {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Integer error = null;
|
||||||
|
|
||||||
public short spO2Number1; //TODO: meaning of this field
|
public short spO2Number1; //TODO: meaning of this field
|
||||||
public short spO2Number2; //TODO: meaning of this field
|
public short spO2Number2; //TODO: meaning of this field
|
||||||
public List<Block> blocks;
|
public List<Block> blocks;
|
||||||
@@ -857,6 +896,10 @@ public class Workout {
|
|||||||
@Override
|
@Override
|
||||||
public void parseTlv() throws ParseException {
|
public void parseTlv() throws ParseException {
|
||||||
|
|
||||||
|
if (this.tlv.contains(0x7f)) {
|
||||||
|
error = this.tlv.getAsInteger(0x7f);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.spO2Number1 = this.tlv.getShort(0x01);
|
this.spO2Number1 = this.tlv.getShort(0x01);
|
||||||
this.spO2Number2 = this.tlv.getShort(0x02);
|
this.spO2Number2 = this.tlv.getShort(0x02);
|
||||||
@@ -986,6 +1029,8 @@ public class Workout {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Integer error = null;
|
||||||
|
|
||||||
public short workoutId;
|
public short workoutId;
|
||||||
public short number; //TODO: meaning of this field
|
public short number; //TODO: meaning of this field
|
||||||
public List<Block> blocks;
|
public List<Block> blocks;
|
||||||
@@ -997,6 +1042,11 @@ public class Workout {
|
|||||||
@Override
|
@Override
|
||||||
public void parseTlv() throws ParseException {
|
public void parseTlv() throws ParseException {
|
||||||
|
|
||||||
|
if (this.tlv.contains(0x7f)) {
|
||||||
|
error = this.tlv.getAsInteger(0x7f);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.workoutId = this.tlv.getShort(0x01);
|
this.workoutId = this.tlv.getShort(0x01);
|
||||||
this.number = this.tlv.getShort(0x02);
|
this.number = this.tlv.getShort(0x02);
|
||||||
|
|
||||||
|
|||||||
+21
@@ -143,6 +143,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.GetN
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.GetOTAChangeLog;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.GetOTAChangeLog;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.GetSmartAlarmList;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.GetSmartAlarmList;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.GetWatchfaceParams;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.GetWatchfaceParams;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.GetWorkoutTotalsRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendCameraRemoteSetupEvent;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendCameraRemoteSetupEvent;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendDeviceReportThreshold;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendDeviceReportThreshold;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendExtendedAccountRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendExtendedAccountRequest;
|
||||||
@@ -2859,6 +2860,26 @@ public class HuaweiSupportProvider {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void nextWorkoutSync(List<Workout.WorkoutCount.Response.WorkoutNumbers> remainder, RequestCallback finalizeReq) {
|
||||||
|
if (!remainder.isEmpty()) {
|
||||||
|
GetWorkoutTotalsRequest nextRequest = new GetWorkoutTotalsRequest(
|
||||||
|
this,
|
||||||
|
remainder.remove(0),
|
||||||
|
remainder
|
||||||
|
);
|
||||||
|
nextRequest.setFinalizeReq(finalizeReq);
|
||||||
|
// Cannot do this with nextRequest because it's in a callback
|
||||||
|
try {
|
||||||
|
nextRequest.doPerform();
|
||||||
|
} catch (IOException e) {
|
||||||
|
finalizeReq.handleException(new Request.ResponseParseException("Cannot send next request", e));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.endOfWorkoutSync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void endOfWorkoutSync() {
|
public void endOfWorkoutSync() {
|
||||||
this.syncState.setWorkoutSync(false);
|
this.syncState.setWorkoutSync(false);
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-2
@@ -81,6 +81,15 @@ public class GetWorkoutCountRequest extends Request {
|
|||||||
|
|
||||||
Workout.WorkoutCount.Response packet = (Workout.WorkoutCount.Response) receivedPacket;
|
Workout.WorkoutCount.Response packet = (Workout.WorkoutCount.Response) receivedPacket;
|
||||||
|
|
||||||
|
if (packet.count == 0 || packet.workoutNumbers == null || packet.error != null) {
|
||||||
|
if(packet.error != null) {
|
||||||
|
LOG.warn("Error occurred during workout sync: {}", packet.error);
|
||||||
|
GB.toast("Error occurred during workout sync", Toast.LENGTH_LONG, GB.WARN);
|
||||||
|
}
|
||||||
|
this.supportProvider.endOfWorkoutSync();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (packet.count > packet.workoutNumbers.size()) {
|
if (packet.count > packet.workoutNumbers.size()) {
|
||||||
LOG.warn("Packet count is greater than workoutNumbers size: {} > {}", packet.count, packet.workoutNumbers.size());
|
LOG.warn("Packet count is greater than workoutNumbers size: {} > {}", packet.count, packet.workoutNumbers.size());
|
||||||
GB.toast("Workout count mismatch, after this sync is complete, try synchronising again", Toast.LENGTH_LONG, GB.WARN);
|
GB.toast("Workout count mismatch, after this sync is complete, try synchronising again", Toast.LENGTH_LONG, GB.WARN);
|
||||||
@@ -104,8 +113,6 @@ public class GetWorkoutCountRequest extends Request {
|
|||||||
);
|
);
|
||||||
nextRequest.setFinalizeReq(this.finalizeReq);
|
nextRequest.setFinalizeReq(this.finalizeReq);
|
||||||
this.nextRequest(nextRequest);
|
this.nextRequest(nextRequest);
|
||||||
} else {
|
|
||||||
this.supportProvider.endOfWorkoutSync();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-22
@@ -16,10 +16,11 @@
|
|||||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||||
package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests;
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests;
|
||||||
|
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -27,6 +28,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.Workout;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.Workout;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiWorkoutGbParser;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiWorkoutGbParser;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
|
|
||||||
public class GetWorkoutPaceRequest extends Request {
|
public class GetWorkoutPaceRequest extends Request {
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(GetWorkoutPaceRequest.class);
|
private static final Logger LOG = LoggerFactory.getLogger(GetWorkoutPaceRequest.class);
|
||||||
@@ -65,6 +67,13 @@ public class GetWorkoutPaceRequest extends Request {
|
|||||||
|
|
||||||
Workout.WorkoutPace.Response packet = (Workout.WorkoutPace.Response) receivedPacket;
|
Workout.WorkoutPace.Response packet = (Workout.WorkoutPace.Response) receivedPacket;
|
||||||
|
|
||||||
|
if (packet.error != null) {
|
||||||
|
LOG.warn("Error {} occurred during workout pace sync. ignoring", packet.error);
|
||||||
|
GB.toast("Error occurred during workout sync", Toast.LENGTH_LONG, GB.WARN);
|
||||||
|
supportProvider.nextWorkoutSync(remainder, GetWorkoutPaceRequest.this.finalizeReq);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (packet.workoutNumber != this.workoutNumbers.workoutNumber)
|
if (packet.workoutNumber != this.workoutNumbers.workoutNumber)
|
||||||
throw new WorkoutParseException("Incorrect workout number!");
|
throw new WorkoutParseException("Incorrect workout number!");
|
||||||
|
|
||||||
@@ -121,27 +130,7 @@ public class GetWorkoutPaceRequest extends Request {
|
|||||||
this.nextRequest(nextRequest);
|
this.nextRequest(nextRequest);
|
||||||
} else {
|
} else {
|
||||||
new HuaweiWorkoutGbParser(getDevice(), getContext()).parseWorkout(this.databaseId);
|
new HuaweiWorkoutGbParser(getDevice(), getContext()).parseWorkout(this.databaseId);
|
||||||
supportProvider.downloadWorkoutGpsFiles(this.workoutNumbers.workoutNumber, this.databaseId, new Runnable() {
|
supportProvider.downloadWorkoutGpsFiles(this.workoutNumbers.workoutNumber, this.databaseId, () -> supportProvider.nextWorkoutSync(remainder, GetWorkoutPaceRequest.this.finalizeReq));
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if (!remainder.isEmpty()) {
|
|
||||||
GetWorkoutTotalsRequest nextRequest = new GetWorkoutTotalsRequest(
|
|
||||||
GetWorkoutPaceRequest.this.supportProvider,
|
|
||||||
remainder.remove(0),
|
|
||||||
remainder
|
|
||||||
);
|
|
||||||
nextRequest.setFinalizeReq(GetWorkoutPaceRequest.this.finalizeReq);
|
|
||||||
// Cannot do this with nextRequest because it's in a callback
|
|
||||||
try {
|
|
||||||
nextRequest.doPerform();
|
|
||||||
} catch (IOException e) {
|
|
||||||
finalizeReq.handleException(new ResponseParseException("Cannot send next request", e));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
supportProvider.endOfWorkoutSync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-22
@@ -16,10 +16,11 @@
|
|||||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||||
package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests;
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests;
|
||||||
|
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -27,6 +28,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.Workout;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.Workout;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiWorkoutGbParser;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiWorkoutGbParser;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
|
|
||||||
public class GetWorkoutSectionsRequest extends Request {
|
public class GetWorkoutSectionsRequest extends Request {
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(GetWorkoutSectionsRequest.class);
|
private static final Logger LOG = LoggerFactory.getLogger(GetWorkoutSectionsRequest.class);
|
||||||
@@ -65,6 +67,13 @@ public class GetWorkoutSectionsRequest extends Request {
|
|||||||
|
|
||||||
Workout.WorkoutSections.Response packet = (Workout.WorkoutSections.Response) receivedPacket;
|
Workout.WorkoutSections.Response packet = (Workout.WorkoutSections.Response) receivedPacket;
|
||||||
|
|
||||||
|
if (packet.error != null) {
|
||||||
|
LOG.warn("Error {} occurred during workout swim segments sync. ignoring", packet.error);
|
||||||
|
GB.toast("Error occurred during workout sync", Toast.LENGTH_LONG, GB.WARN);
|
||||||
|
supportProvider.nextWorkoutSync(remainder, GetWorkoutSectionsRequest.this.finalizeReq);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
LOG.info("Workout {} section {}:", this.workoutNumbers.workoutNumber, this.number);
|
LOG.info("Workout {} section {}:", this.workoutNumbers.workoutNumber, this.number);
|
||||||
LOG.info("workoutId : {}", packet.workoutId);
|
LOG.info("workoutId : {}", packet.workoutId);
|
||||||
@@ -86,27 +95,7 @@ public class GetWorkoutSectionsRequest extends Request {
|
|||||||
this.nextRequest(nextRequest);
|
this.nextRequest(nextRequest);
|
||||||
} else {
|
} else {
|
||||||
new HuaweiWorkoutGbParser(getDevice(), getContext()).parseWorkout(this.databaseId);
|
new HuaweiWorkoutGbParser(getDevice(), getContext()).parseWorkout(this.databaseId);
|
||||||
supportProvider.downloadWorkoutGpsFiles(this.workoutNumbers.workoutNumber, this.databaseId, new Runnable() {
|
supportProvider.downloadWorkoutGpsFiles(this.workoutNumbers.workoutNumber, this.databaseId, () -> supportProvider.nextWorkoutSync(remainder, GetWorkoutSectionsRequest.this.finalizeReq));
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if (!remainder.isEmpty()) {
|
|
||||||
GetWorkoutTotalsRequest nextRequest = new GetWorkoutTotalsRequest(
|
|
||||||
GetWorkoutSectionsRequest.this.supportProvider,
|
|
||||||
remainder.remove(0),
|
|
||||||
remainder
|
|
||||||
);
|
|
||||||
nextRequest.setFinalizeReq(GetWorkoutSectionsRequest.this.finalizeReq);
|
|
||||||
// Cannot do this with nextRequest because it's in a callback
|
|
||||||
try {
|
|
||||||
nextRequest.doPerform();
|
|
||||||
} catch (IOException e) {
|
|
||||||
finalizeReq.handleException(new ResponseParseException("Cannot send next request", e));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
supportProvider.endOfWorkoutSync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-22
@@ -16,10 +16,11 @@
|
|||||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||||
package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests;
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests;
|
||||||
|
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -27,6 +28,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.Workout;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.Workout;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiWorkoutGbParser;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiWorkoutGbParser;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
|
|
||||||
public class GetWorkoutSpO2Request extends Request {
|
public class GetWorkoutSpO2Request extends Request {
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(GetWorkoutSpO2Request.class);
|
private static final Logger LOG = LoggerFactory.getLogger(GetWorkoutSpO2Request.class);
|
||||||
@@ -65,6 +67,12 @@ public class GetWorkoutSpO2Request extends Request {
|
|||||||
|
|
||||||
Workout.WorkoutSpO2.Response packet = (Workout.WorkoutSpO2.Response) receivedPacket;
|
Workout.WorkoutSpO2.Response packet = (Workout.WorkoutSpO2.Response) receivedPacket;
|
||||||
|
|
||||||
|
if (packet.error != null) {
|
||||||
|
LOG.warn("Error {} occurred during workout swim segments sync. ignoring", packet.error);
|
||||||
|
GB.toast("Error occurred during workout sync", Toast.LENGTH_LONG, GB.WARN);
|
||||||
|
supportProvider.nextWorkoutSync(remainder, GetWorkoutSpO2Request.this.finalizeReq);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
LOG.info("Workout {} current {}:", this.workoutNumbers.workoutNumber, this.number);
|
LOG.info("Workout {} current {}:", this.workoutNumbers.workoutNumber, this.number);
|
||||||
LOG.info("spO2Number1: {}", packet.spO2Number1);
|
LOG.info("spO2Number1: {}", packet.spO2Number1);
|
||||||
@@ -96,27 +104,7 @@ public class GetWorkoutSpO2Request extends Request {
|
|||||||
this.nextRequest(nextRequest);
|
this.nextRequest(nextRequest);
|
||||||
} else {
|
} else {
|
||||||
new HuaweiWorkoutGbParser(getDevice(), getContext()).parseWorkout(this.databaseId);
|
new HuaweiWorkoutGbParser(getDevice(), getContext()).parseWorkout(this.databaseId);
|
||||||
supportProvider.downloadWorkoutGpsFiles(this.workoutNumbers.workoutNumber, this.databaseId, new Runnable() {
|
supportProvider.downloadWorkoutGpsFiles(this.workoutNumbers.workoutNumber, this.databaseId, () -> supportProvider.nextWorkoutSync(remainder, GetWorkoutSpO2Request.this.finalizeReq));
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if (!remainder.isEmpty()) {
|
|
||||||
GetWorkoutTotalsRequest nextRequest = new GetWorkoutTotalsRequest(
|
|
||||||
GetWorkoutSpO2Request.this.supportProvider,
|
|
||||||
remainder.remove(0),
|
|
||||||
remainder
|
|
||||||
);
|
|
||||||
nextRequest.setFinalizeReq(GetWorkoutSpO2Request.this.finalizeReq);
|
|
||||||
// Cannot do this with nextRequest because it's in a callback
|
|
||||||
try {
|
|
||||||
nextRequest.doPerform();
|
|
||||||
} catch (IOException e) {
|
|
||||||
finalizeReq.handleException(new ResponseParseException("Cannot send next request", e));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
supportProvider.endOfWorkoutSync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-22
@@ -16,10 +16,11 @@
|
|||||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||||
package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests;
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests;
|
||||||
|
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -27,6 +28,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.Workout;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.Workout;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiWorkoutGbParser;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiWorkoutGbParser;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
|
|
||||||
public class GetWorkoutSwimSegmentsRequest extends Request {
|
public class GetWorkoutSwimSegmentsRequest extends Request {
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(GetWorkoutSwimSegmentsRequest.class);
|
private static final Logger LOG = LoggerFactory.getLogger(GetWorkoutSwimSegmentsRequest.class);
|
||||||
@@ -65,6 +67,13 @@ public class GetWorkoutSwimSegmentsRequest extends Request {
|
|||||||
|
|
||||||
Workout.WorkoutSwimSegments.Response packet = (Workout.WorkoutSwimSegments.Response) receivedPacket;
|
Workout.WorkoutSwimSegments.Response packet = (Workout.WorkoutSwimSegments.Response) receivedPacket;
|
||||||
|
|
||||||
|
if (packet.error != null) {
|
||||||
|
LOG.warn("Error {} occurred during workout swim segments sync. ignoring", packet.error);
|
||||||
|
GB.toast("Error occurred during workout sync", Toast.LENGTH_LONG, GB.WARN);
|
||||||
|
supportProvider.nextWorkoutSync(remainder, GetWorkoutSwimSegmentsRequest.this.finalizeReq);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (packet.workoutNumber != this.workoutNumbers.workoutNumber)
|
if (packet.workoutNumber != this.workoutNumbers.workoutNumber)
|
||||||
throw new WorkoutParseException("Incorrect workout number!");
|
throw new WorkoutParseException("Incorrect workout number!");
|
||||||
|
|
||||||
@@ -111,27 +120,7 @@ public class GetWorkoutSwimSegmentsRequest extends Request {
|
|||||||
this.nextRequest(nextRequest);
|
this.nextRequest(nextRequest);
|
||||||
} else {
|
} else {
|
||||||
new HuaweiWorkoutGbParser(getDevice(), getContext()).parseWorkout(this.databaseId);
|
new HuaweiWorkoutGbParser(getDevice(), getContext()).parseWorkout(this.databaseId);
|
||||||
supportProvider.downloadWorkoutGpsFiles(this.workoutNumbers.workoutNumber, this.databaseId, new Runnable() {
|
supportProvider.downloadWorkoutGpsFiles(this.workoutNumbers.workoutNumber, this.databaseId, () -> supportProvider.nextWorkoutSync(remainder, GetWorkoutSwimSegmentsRequest.this.finalizeReq));
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if (!remainder.isEmpty()) {
|
|
||||||
GetWorkoutTotalsRequest nextRequest = new GetWorkoutTotalsRequest(
|
|
||||||
GetWorkoutSwimSegmentsRequest.this.supportProvider,
|
|
||||||
remainder.remove(0),
|
|
||||||
remainder
|
|
||||||
);
|
|
||||||
nextRequest.setFinalizeReq(GetWorkoutSwimSegmentsRequest.this.finalizeReq);
|
|
||||||
// Cannot do this with nextRequest because it's in a callback
|
|
||||||
try {
|
|
||||||
nextRequest.doPerform();
|
|
||||||
} catch (IOException e) {
|
|
||||||
finalizeReq.handleException(new ResponseParseException("Cannot send next request", e));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
supportProvider.endOfWorkoutSync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+12
-22
@@ -16,16 +16,18 @@
|
|||||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||||
package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests;
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests;
|
||||||
|
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.Workout;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.Workout;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiWorkoutGbParser;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiWorkoutGbParser;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
|
|
||||||
public class GetWorkoutTotalsRequest extends Request {
|
public class GetWorkoutTotalsRequest extends Request {
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(GetWorkoutTotalsRequest.class);
|
private static final Logger LOG = LoggerFactory.getLogger(GetWorkoutTotalsRequest.class);
|
||||||
@@ -66,9 +68,17 @@ public class GetWorkoutTotalsRequest extends Request {
|
|||||||
|
|
||||||
Workout.WorkoutTotals.Response packet = (Workout.WorkoutTotals.Response) receivedPacket;
|
Workout.WorkoutTotals.Response packet = (Workout.WorkoutTotals.Response) receivedPacket;
|
||||||
|
|
||||||
|
if (packet.error != null) {
|
||||||
|
LOG.warn("Error {} occurred during workout pace sync. ignoring", packet.error);
|
||||||
|
GB.toast("Error occurred during workout sync", Toast.LENGTH_LONG, GB.WARN);
|
||||||
|
supportProvider.nextWorkoutSync(remainder, GetWorkoutTotalsRequest.this.finalizeReq);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (packet.number != this.workoutNumbers.workoutNumber)
|
if (packet.number != this.workoutNumbers.workoutNumber)
|
||||||
throw new WorkoutParseException("Incorrect workout number!");
|
throw new WorkoutParseException("Incorrect workout number!");
|
||||||
|
|
||||||
|
|
||||||
LOG.info("Workout {} totals:", this.workoutNumbers.workoutNumber);
|
LOG.info("Workout {} totals:", this.workoutNumbers.workoutNumber);
|
||||||
LOG.info("Number : {}", packet.number);
|
LOG.info("Number : {}", packet.number);
|
||||||
LOG.info("Status : {}", packet.status);
|
LOG.info("Status : {}", packet.status);
|
||||||
@@ -136,27 +146,7 @@ public class GetWorkoutTotalsRequest extends Request {
|
|||||||
this.nextRequest(nextRequest);
|
this.nextRequest(nextRequest);
|
||||||
} else {
|
} else {
|
||||||
new HuaweiWorkoutGbParser(getDevice(), getContext()).parseWorkout(databaseId);
|
new HuaweiWorkoutGbParser(getDevice(), getContext()).parseWorkout(databaseId);
|
||||||
supportProvider.downloadWorkoutGpsFiles(this.workoutNumbers.workoutNumber, databaseId, new Runnable() {
|
supportProvider.downloadWorkoutGpsFiles(this.workoutNumbers.workoutNumber, databaseId, () -> supportProvider.nextWorkoutSync(remainder, GetWorkoutTotalsRequest.this.finalizeReq));
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if (!remainder.isEmpty()) {
|
|
||||||
GetWorkoutTotalsRequest nextRequest = new GetWorkoutTotalsRequest(
|
|
||||||
GetWorkoutTotalsRequest.this.supportProvider,
|
|
||||||
remainder.remove(0),
|
|
||||||
remainder
|
|
||||||
);
|
|
||||||
nextRequest.setFinalizeReq(GetWorkoutTotalsRequest.this.finalizeReq);
|
|
||||||
// Cannot do this with nextRequest because it's in a callback
|
|
||||||
try {
|
|
||||||
nextRequest.doPerform();
|
|
||||||
} catch (IOException e) {
|
|
||||||
finalizeReq.handleException(new ResponseParseException("Cannot send next request", e));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
supportProvider.endOfWorkoutSync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user