/* Copyright (C) 2023-2024 José Rebelo This file is part of Gadgetbridge. Gadgetbridge is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gadgetbridge is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.operations; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLEOperation; import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetProgressAction; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.ZeppOsSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.services.ZeppOsFileTransferService; import nodomain.freeyourgadget.gadgetbridge.service.devices.miband.operations.OperationStatus; import nodomain.freeyourgadget.gadgetbridge.util.GB; public class ZeppOsGpxRouteUploadOperation extends AbstractBTLEOperation implements ZeppOsFileTransferService.Callback { private static final Logger LOG = LoggerFactory.getLogger(ZeppOsGpxRouteUploadOperation.class); private final ZeppOsGpxRouteFile file; private final byte[] fileBytes; private final ZeppOsFileTransferService fileTransferService; public ZeppOsGpxRouteUploadOperation(final ZeppOsSupport support, final ZeppOsGpxRouteFile file, final ZeppOsFileTransferService fileTransferService) { super(support); this.file = file; this.fileBytes = file.getEncodedBytes(); this.fileTransferService = fileTransferService; } @Override protected void doPerform() throws IOException { fileTransferService.sendFile( "sport://file_transfer?appId=7073283073¶ms={}", "track_" + file.getTimestamp() + ".dat", fileBytes, false, this ); } @Override protected void operationFinished() { operationStatus = OperationStatus.FINISHED; if (getDevice() != null && getDevice().isConnected()) { unsetBusy(); getDevice().sendDeviceUpdateIntent(getContext()); } } @Override public void onFileUploadFinish(final boolean success) { LOG.info("Finished gpx route upload operation, success={}", success); final String notificationMessage = success ? getContext().getString(R.string.gpx_route_upload_complete) : getContext().getString(R.string.gpx_route_upload_failed); GB.updateInstallNotification(notificationMessage, false, 100, getContext()); operationFinished(); } @Override public void onFileUploadProgress(final int progress) { LOG.trace("Gpx route upload operation progress: {}", progress); final int progressPercent = (int) ((((float) (progress)) / fileBytes.length) * 100); updateProgress(progressPercent); } @Override public void onFileDownloadFinish(final String url, final String filename, final byte[] data) { LOG.warn("Received unexpected file: url={} filename={} length={}", url, filename, data.length); } private void updateProgress(final int progressPercent) { try { final TransactionBuilder builder = performInitialized("send gpx route upload progress"); builder.add(new SetProgressAction(getContext().getString(R.string.gpx_route_upload_in_progress), true, progressPercent, getContext())); builder.queue(getQueue()); } catch (final Exception e) { LOG.error("Failed to update progress notification", e); } } }