mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-07-23 23:32:23 +02:00
Huawei: Set user info to device
* height * weight * age * year of birth * gender
This commit is contained in:
parent
9c68acce2e
commit
8946eff8fa
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 2024 Damien Gaignon, Martin.JM
|
/* Copyright (C) 2024 Damien Gaignon, Martin.JM, Vitalii Tomin
|
||||||
|
|
||||||
This file is part of Gadgetbridge.
|
This file is part of Gadgetbridge.
|
||||||
|
|
||||||
|
@ -71,6 +71,34 @@ public class FitnessData {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class UserInfo {
|
||||||
|
public static final byte id = 0x02;
|
||||||
|
public static class Request extends HuaweiPacket {
|
||||||
|
public Request(ParamsProvider paramsProvider,
|
||||||
|
int height,
|
||||||
|
int weight,
|
||||||
|
int age,
|
||||||
|
int birthdayEncoded,
|
||||||
|
byte gender) {
|
||||||
|
super(paramsProvider);
|
||||||
|
this.serviceId = FitnessData.id;
|
||||||
|
this.commandId = id;
|
||||||
|
|
||||||
|
byte bmi1 = (byte)Math.round(0.42f * height);
|
||||||
|
byte bmi2 = (byte)Math.round(0.83f * height);
|
||||||
|
|
||||||
|
this.tlv = new HuaweiTLV()
|
||||||
|
.put(0x01, (byte)height)
|
||||||
|
.put(0x02, (byte)weight)
|
||||||
|
.put(0x03, (byte)age)
|
||||||
|
.put(0x04, birthdayEncoded)
|
||||||
|
.put(0x05, gender)
|
||||||
|
.put(0x06, bmi1)
|
||||||
|
.put(0x07, bmi2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
public static class MessageCount {
|
public static class MessageCount {
|
||||||
public static final byte sleepId = 0x0C;
|
public static final byte sleepId = 0x0C;
|
||||||
public static final byte stepId = 0x0A;
|
public static final byte stepId = 0x0A;
|
||||||
|
|
|
@ -93,6 +93,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.GetS
|
||||||
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.SendCameraRemoteSetupEvent;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendCameraRemoteSetupEvent;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendExtendedAccountRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendExtendedAccountRequest;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendFitnessUserInfoRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendGpsAndTimeToDeviceRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendGpsAndTimeToDeviceRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendGpsDataRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendGpsDataRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendFileUploadInfo;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendFileUploadInfo;
|
||||||
|
@ -514,6 +515,7 @@ public class HuaweiSupportProvider {
|
||||||
}
|
}
|
||||||
onSetTime();
|
onSetTime();
|
||||||
getBatteryLevel();
|
getBatteryLevel();
|
||||||
|
sendUserInfo();
|
||||||
if (isBLE()) {
|
if (isBLE()) {
|
||||||
assert leBuilder != null;
|
assert leBuilder != null;
|
||||||
leBuilder.add(new nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateAction(gbDevice, GBDevice.State.INITIALIZED, context));
|
leBuilder.add(new nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateAction(gbDevice, GBDevice.State.INITIALIZED, context));
|
||||||
|
@ -986,6 +988,12 @@ public class HuaweiSupportProvider {
|
||||||
// But it will disappear after reconnection - until it is enabled again
|
// But it will disappear after reconnection - until it is enabled again
|
||||||
GB.toast(context, context.getString(R.string.toast_setting_requires_reconnect), Toast.LENGTH_SHORT, GB.INFO);
|
GB.toast(context, context.getString(R.string.toast_setting_requires_reconnect), Toast.LENGTH_SHORT, GB.INFO);
|
||||||
}
|
}
|
||||||
|
case ActivityUser.PREF_USER_WEIGHT_KG:
|
||||||
|
case ActivityUser.PREF_USER_HEIGHT_CM:
|
||||||
|
case ActivityUser.PREF_USER_GENDER:
|
||||||
|
case ActivityUser.PREF_USER_YEAR_OF_BIRTH:
|
||||||
|
sendUserInfo();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
// TODO: Use translatable string
|
// TODO: Use translatable string
|
||||||
|
@ -1598,6 +1606,17 @@ public class HuaweiSupportProvider {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void sendUserInfo() {
|
||||||
|
try {
|
||||||
|
SendFitnessUserInfoRequest sendFitnessUserInfoRequest = new SendFitnessUserInfoRequest(this);
|
||||||
|
sendFitnessUserInfoRequest.doPerform();
|
||||||
|
} catch (IOException e) {
|
||||||
|
GB.toast(context, "Failed to set user info", Toast.LENGTH_SHORT, GB.ERROR, e);
|
||||||
|
LOG.error("Failed to set user info", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void setActivateOnLift() {
|
public void setActivateOnLift() {
|
||||||
try {
|
try {
|
||||||
SetActivateOnLiftRequest setActivateOnLiftReq = new SetActivateOnLiftRequest(this);
|
SetActivateOnLiftRequest setActivateOnLiftReq = new SetActivateOnLiftRequest(this);
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
/* Copyright (C) 2024 Vitalii Tomin
|
||||||
|
|
||||||
|
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 <https://www.gnu.org/licenses/>. */
|
||||||
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.FitnessData;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.FitnessData.UserInfo;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.model.ActivityUser;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider;
|
||||||
|
|
||||||
|
public class SendFitnessUserInfoRequest extends Request {
|
||||||
|
private static final Logger LOG = LoggerFactory.getLogger(SendFitnessUserInfoRequest.class);
|
||||||
|
|
||||||
|
public SendFitnessUserInfoRequest(HuaweiSupportProvider support) {
|
||||||
|
super(support);
|
||||||
|
this.serviceId = FitnessData.id;
|
||||||
|
this.commandId = UserInfo.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<byte[]> createRequest() throws RequestCreationException {
|
||||||
|
try {
|
||||||
|
// Hardcoded values till interface for goal
|
||||||
|
ActivityUser activityUser = new ActivityUser();
|
||||||
|
byte gender = 3;
|
||||||
|
if (activityUser.getGender() == ActivityUser.GENDER_FEMALE) {
|
||||||
|
gender = 2;
|
||||||
|
} else if (activityUser.getGender() == ActivityUser.GENDER_MALE) {
|
||||||
|
gender = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Date birthday = activityUser.getUserBirthday();
|
||||||
|
Calendar cal = Calendar.getInstance();
|
||||||
|
cal.setTime(birthday);
|
||||||
|
int birthdayEncoded = cal.get(Calendar.YEAR) << 16;
|
||||||
|
birthdayEncoded += (cal.get(Calendar.MONTH)+1) << 8;
|
||||||
|
birthdayEncoded += cal.get(Calendar.DAY_OF_MONTH);
|
||||||
|
|
||||||
|
return new UserInfo.Request(paramsProvider,
|
||||||
|
activityUser.getHeightCm(),
|
||||||
|
activityUser.getWeightKg(),
|
||||||
|
activityUser.getAge(),
|
||||||
|
birthdayEncoded,
|
||||||
|
gender
|
||||||
|
).serialize();
|
||||||
|
} catch (HuaweiPacket.CryptoException e) {
|
||||||
|
throw new RequestCreationException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void processResponse() {
|
||||||
|
LOG.debug("handle Send Fitness UserInfo Request");
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user