Huawei: Basic errors handling on workouts data sync

This commit is contained in:
Me7c7
2025-06-09 12:48:34 +02:00
committed by José Rebelo
parent 9ef92a9c1c
commit 67f8a2406e
8 changed files with 136 additions and 113 deletions
@@ -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);
@@ -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);
} }
@@ -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();
} }
} }
} }
@@ -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();
}
}
});
} }
} }
} }
@@ -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();
}
}
});
} }
} }
} }
@@ -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();
}
}
});
} }
} }
@@ -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();
}
}
});
} }
} }
@@ -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();
}
}
});
} }
} }
} }