mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-11-25 11:26:47 +01:00
Xiaomi: Fix secondary goal config
This commit is contained in:
parent
1028d2c0cd
commit
1c7289edfa
@ -412,6 +412,8 @@ public abstract class XiaomiCoordinator extends AbstractBLEDeviceCoordinator {
|
|||||||
}
|
}
|
||||||
if (supports(device, FEAT_GOAL_NOTIFICATION)) {
|
if (supports(device, FEAT_GOAL_NOTIFICATION)) {
|
||||||
settings.add(R.xml.devicesettings_goal_notification);
|
settings.add(R.xml.devicesettings_goal_notification);
|
||||||
|
}
|
||||||
|
if (supports(device, FEAT_GOAL_SECONDARY)) {
|
||||||
settings.add(R.xml.devicesettings_goal_secondary);
|
settings.add(R.xml.devicesettings_goal_secondary);
|
||||||
}
|
}
|
||||||
if (supports(device, FEAT_VITALITY_SCORE)) {
|
if (supports(device, FEAT_VITALITY_SCORE)) {
|
||||||
|
@ -50,6 +50,7 @@ public final class XiaomiPreferences {
|
|||||||
public static final String FEAT_INACTIVITY = "feat_inactivity";
|
public static final String FEAT_INACTIVITY = "feat_inactivity";
|
||||||
public static final String FEAT_SLEEP_MODE_SCHEDULE = "feat_sleep_mode_schedule";
|
public static final String FEAT_SLEEP_MODE_SCHEDULE = "feat_sleep_mode_schedule";
|
||||||
public static final String FEAT_GOAL_NOTIFICATION = "feat_goal_notification";
|
public static final String FEAT_GOAL_NOTIFICATION = "feat_goal_notification";
|
||||||
|
public static final String FEAT_GOAL_SECONDARY = "feat_goal_secondary";
|
||||||
public static final String FEAT_VITALITY_SCORE = "feat_vitality_score";
|
public static final String FEAT_VITALITY_SCORE = "feat_vitality_score";
|
||||||
public static final String FEAT_SCREEN_ON_ON_NOTIFICATIONS = "feat_screen_on_on_notifications";
|
public static final String FEAT_SCREEN_ON_ON_NOTIFICATIONS = "feat_screen_on_on_notifications";
|
||||||
public static final String FEAT_CAMERA_REMOTE = "feat_camera_remote";
|
public static final String FEAT_CAMERA_REMOTE = "feat_camera_remote";
|
||||||
|
@ -33,8 +33,10 @@ import java.util.ArrayList;
|
|||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.GregorianCalendar;
|
import java.util.GregorianCalendar;
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst;
|
import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst;
|
||||||
@ -79,13 +81,15 @@ public class XiaomiHealthService extends AbstractXiaomiService {
|
|||||||
private static final int CMD_CONFIG_STANDING_REMINDER_SET = 13;
|
private static final int CMD_CONFIG_STANDING_REMINDER_SET = 13;
|
||||||
private static final int CMD_CONFIG_STRESS_GET = 14;
|
private static final int CMD_CONFIG_STRESS_GET = 14;
|
||||||
private static final int CMD_CONFIG_STRESS_SET = 15;
|
private static final int CMD_CONFIG_STRESS_SET = 15;
|
||||||
private static final int CMD_CONFIG_GOAL_GET = 21;
|
private static final int CMD_CONFIG_GOAL_NOTIFICATION_GET = 21;
|
||||||
private static final int CMD_CONFIG_GOAL_SET = 22;
|
private static final int CMD_CONFIG_GOAL_NOTIFICATION_SET = 22;
|
||||||
private static final int CMD_WORKOUT_WATCH_STATUS = 26;
|
private static final int CMD_WORKOUT_WATCH_STATUS = 26;
|
||||||
private static final int CMD_WORKOUT_WATCH_OPEN = 30;
|
private static final int CMD_WORKOUT_WATCH_OPEN = 30;
|
||||||
private static final int CMD_CONFIG_VITALITY_SCORE_GET = 35;
|
private static final int CMD_CONFIG_VITALITY_SCORE_GET = 35;
|
||||||
private static final int CMD_CONFIG_VITALITY_SCORE_SET = 36;
|
private static final int CMD_CONFIG_VITALITY_SCORE_SET = 36;
|
||||||
private static final int CMD_WORKOUT_LOCATION = 48;
|
private static final int CMD_WORKOUT_LOCATION = 48;
|
||||||
|
private static final int CMD_CONFIG_GOALS_GET = 42;
|
||||||
|
private static final int CMD_CONFIG_GOALS_SET = 43;
|
||||||
private static final int CMD_REALTIME_STATS_START = 45;
|
private static final int CMD_REALTIME_STATS_START = 45;
|
||||||
private static final int CMD_REALTIME_STATS_STOP = 46;
|
private static final int CMD_REALTIME_STATS_STOP = 46;
|
||||||
private static final int CMD_REALTIME_STATS_EVENT = 47;
|
private static final int CMD_REALTIME_STATS_EVENT = 47;
|
||||||
@ -107,6 +111,14 @@ public class XiaomiHealthService extends AbstractXiaomiService {
|
|||||||
private boolean workoutStarted = false;
|
private boolean workoutStarted = false;
|
||||||
private final Handler gpsTimeoutHandler = new Handler();
|
private final Handler gpsTimeoutHandler = new Handler();
|
||||||
|
|
||||||
|
private final Set<Integer> currentGoals = new LinkedHashSet<>();
|
||||||
|
private final Set<Integer> supportedGoals = new LinkedHashSet<>();
|
||||||
|
|
||||||
|
private static final int GOAL_STEPS = 1; // TODO confirm
|
||||||
|
private static final int GOAL_CALORIES = 2; // TODO confirm
|
||||||
|
private static final int GOAL_MOVING_TIME = 3;
|
||||||
|
private static final int GOAL_STANDING_TIME = 4;
|
||||||
|
|
||||||
private final XiaomiActivityFileFetcher activityFetcher = new XiaomiActivityFileFetcher(this);
|
private final XiaomiActivityFileFetcher activityFetcher = new XiaomiActivityFileFetcher(this);
|
||||||
|
|
||||||
public XiaomiHealthService(final XiaomiSupport support) {
|
public XiaomiHealthService(final XiaomiSupport support) {
|
||||||
@ -147,11 +159,17 @@ public class XiaomiHealthService extends AbstractXiaomiService {
|
|||||||
case CMD_CONFIG_STRESS_SET:
|
case CMD_CONFIG_STRESS_SET:
|
||||||
LOG.debug("Got stress set ack, status={}", cmd.getStatus());
|
LOG.debug("Got stress set ack, status={}", cmd.getStatus());
|
||||||
return;
|
return;
|
||||||
case CMD_CONFIG_GOAL_GET:
|
case CMD_CONFIG_GOAL_NOTIFICATION_GET:
|
||||||
handleGoalConfig(cmd.getHealth().getAchievementReminders());
|
handleGoalNotificationConfig(cmd.getHealth().getGoalNotification());
|
||||||
return;
|
return;
|
||||||
case CMD_CONFIG_GOAL_SET:
|
case CMD_CONFIG_GOAL_NOTIFICATION_SET:
|
||||||
LOG.debug("Got goal set ack, status={}", cmd.getStatus());
|
LOG.debug("Got goal notification set ack, status={}", cmd.getStatus());
|
||||||
|
return;
|
||||||
|
case CMD_CONFIG_GOALS_GET:
|
||||||
|
handleGoalsConfig(cmd.getHealth().getGoalsConfig());
|
||||||
|
return;
|
||||||
|
case CMD_CONFIG_GOALS_SET:
|
||||||
|
LOG.debug("Got goals config set ack, status={}", cmd.getStatus());
|
||||||
return;
|
return;
|
||||||
case CMD_CONFIG_VITALITY_SCORE_GET:
|
case CMD_CONFIG_VITALITY_SCORE_GET:
|
||||||
handleVitalityScore(cmd.getHealth().getVitalityScore());
|
handleVitalityScore(cmd.getHealth().getVitalityScore());
|
||||||
@ -180,7 +198,8 @@ public class XiaomiHealthService extends AbstractXiaomiService {
|
|||||||
getSupport().sendCommand("get heart rate config", COMMAND_TYPE, CMD_CONFIG_HEART_RATE_GET);
|
getSupport().sendCommand("get heart rate config", COMMAND_TYPE, CMD_CONFIG_HEART_RATE_GET);
|
||||||
getSupport().sendCommand("get standing reminders config", COMMAND_TYPE, CMD_CONFIG_STANDING_REMINDER_GET);
|
getSupport().sendCommand("get standing reminders config", COMMAND_TYPE, CMD_CONFIG_STANDING_REMINDER_GET);
|
||||||
getSupport().sendCommand("get stress config", COMMAND_TYPE, CMD_CONFIG_STRESS_GET);
|
getSupport().sendCommand("get stress config", COMMAND_TYPE, CMD_CONFIG_STRESS_GET);
|
||||||
getSupport().sendCommand("get goal config", COMMAND_TYPE, CMD_CONFIG_GOAL_GET);
|
getSupport().sendCommand("get goal notification config", COMMAND_TYPE, CMD_CONFIG_GOAL_NOTIFICATION_GET);
|
||||||
|
getSupport().sendCommand("get goals config", COMMAND_TYPE, CMD_CONFIG_GOALS_GET);
|
||||||
getSupport().sendCommand("get vitality score config", COMMAND_TYPE, CMD_CONFIG_VITALITY_SCORE_GET);
|
getSupport().sendCommand("get vitality score config", COMMAND_TYPE, CMD_CONFIG_VITALITY_SCORE_GET);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -198,8 +217,10 @@ public class XiaomiHealthService extends AbstractXiaomiService {
|
|||||||
setUserInfo();
|
setUserInfo();
|
||||||
return true;
|
return true;
|
||||||
case DeviceSettingsPreferenceConst.PREF_USER_FITNESS_GOAL_NOTIFICATION:
|
case DeviceSettingsPreferenceConst.PREF_USER_FITNESS_GOAL_NOTIFICATION:
|
||||||
|
sendGoalNotificationConfig();
|
||||||
|
return true;
|
||||||
case DeviceSettingsPreferenceConst.PREF_USER_FITNESS_GOAL_SECONDARY:
|
case DeviceSettingsPreferenceConst.PREF_USER_FITNESS_GOAL_SECONDARY:
|
||||||
sendGoalConfig();
|
sendGoalsConfig();
|
||||||
return true;
|
return true;
|
||||||
case DeviceSettingsPreferenceConst.PREF_VITALITY_SCORE_7_DAY:
|
case DeviceSettingsPreferenceConst.PREF_VITALITY_SCORE_7_DAY:
|
||||||
case DeviceSettingsPreferenceConst.PREF_VITALITY_SCORE_DAILY:
|
case DeviceSettingsPreferenceConst.PREF_VITALITY_SCORE_DAILY:
|
||||||
@ -279,53 +300,94 @@ public class XiaomiHealthService extends AbstractXiaomiService {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleGoalConfig(final XiaomiProto.AchievementReminders achievementReminders) {
|
private void handleGoalNotificationConfig(final XiaomiProto.GoalNotification goalNotification) {
|
||||||
LOG.debug("Got goal config");
|
LOG.debug("Got goal notification config");
|
||||||
|
|
||||||
final String secondaryValue;
|
|
||||||
|
|
||||||
switch (achievementReminders.getSuggested()) {
|
|
||||||
case 0:
|
|
||||||
secondaryValue = "active_time";
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
default:
|
|
||||||
secondaryValue = "standing_time";
|
|
||||||
}
|
|
||||||
|
|
||||||
final GBDeviceEventUpdatePreferences eventUpdatePreferences = new GBDeviceEventUpdatePreferences()
|
final GBDeviceEventUpdatePreferences eventUpdatePreferences = new GBDeviceEventUpdatePreferences()
|
||||||
.withPreference(XiaomiPreferences.FEAT_GOAL_NOTIFICATION, true)
|
.withPreference(XiaomiPreferences.FEAT_GOAL_NOTIFICATION, true)
|
||||||
.withPreference(DeviceSettingsPreferenceConst.PREF_USER_FITNESS_GOAL_NOTIFICATION, achievementReminders.getEnabled())
|
.withPreference(DeviceSettingsPreferenceConst.PREF_USER_FITNESS_GOAL_NOTIFICATION, goalNotification.getEnabled());
|
||||||
|
|
||||||
|
getSupport().evaluateGBDeviceEvent(eventUpdatePreferences);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendGoalNotificationConfig() {
|
||||||
|
final boolean enabled = getDevicePrefs().getBoolean(DeviceSettingsPreferenceConst.PREF_USER_FITNESS_GOAL_NOTIFICATION, false);
|
||||||
|
|
||||||
|
LOG.debug("Setting goal notification enabled = {}", enabled);
|
||||||
|
|
||||||
|
final XiaomiProto.GoalNotification.Builder goalNotification = XiaomiProto.GoalNotification.newBuilder()
|
||||||
|
.setEnabled(enabled)
|
||||||
|
.setUnknown2(1);
|
||||||
|
|
||||||
|
final XiaomiProto.Health health = XiaomiProto.Health.newBuilder()
|
||||||
|
.setGoalNotification(goalNotification)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
getSupport().sendCommand(
|
||||||
|
"set goal notification config",
|
||||||
|
XiaomiProto.Command.newBuilder()
|
||||||
|
.setType(COMMAND_TYPE)
|
||||||
|
.setSubtype(CMD_CONFIG_GOAL_NOTIFICATION_SET)
|
||||||
|
.setHealth(health)
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleGoalsConfig(final XiaomiProto.GoalsConfig goalsConfig) {
|
||||||
|
LOG.debug("Got goals config");
|
||||||
|
|
||||||
|
currentGoals.clear();
|
||||||
|
supportedGoals.clear();
|
||||||
|
|
||||||
|
for (final XiaomiProto.Goal goal : goalsConfig.getCurrentGoalsList()) {
|
||||||
|
currentGoals.add(goal.getId());
|
||||||
|
}
|
||||||
|
for (final XiaomiProto.Goal goal : goalsConfig.getSupportedGoalsList()) {
|
||||||
|
supportedGoals.add(goal.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
final boolean secondaryGoalSupported = supportedGoals.contains(GOAL_STANDING_TIME) || supportedGoals.contains(GOAL_MOVING_TIME);
|
||||||
|
final String secondaryValue = currentGoals.contains(GOAL_MOVING_TIME) ? "active_time" : "standing_time";
|
||||||
|
|
||||||
|
final GBDeviceEventUpdatePreferences eventUpdatePreferences = new GBDeviceEventUpdatePreferences()
|
||||||
|
.withPreference(XiaomiPreferences.FEAT_GOAL_SECONDARY, secondaryGoalSupported)
|
||||||
.withPreference(DeviceSettingsPreferenceConst.PREF_USER_FITNESS_GOAL_SECONDARY, secondaryValue);
|
.withPreference(DeviceSettingsPreferenceConst.PREF_USER_FITNESS_GOAL_SECONDARY, secondaryValue);
|
||||||
|
|
||||||
getSupport().evaluateGBDeviceEvent(eventUpdatePreferences);
|
getSupport().evaluateGBDeviceEvent(eventUpdatePreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendGoalConfig() {
|
public void sendGoalsConfig() {
|
||||||
final boolean goalNotification = getDevicePrefs().getBoolean(DeviceSettingsPreferenceConst.PREF_USER_FITNESS_GOAL_NOTIFICATION, false);
|
|
||||||
final String goalSecondary = getDevicePrefs().getString(DeviceSettingsPreferenceConst.PREF_USER_FITNESS_GOAL_SECONDARY, "standing_time");
|
final String goalSecondary = getDevicePrefs().getString(DeviceSettingsPreferenceConst.PREF_USER_FITNESS_GOAL_SECONDARY, "standing_time");
|
||||||
|
|
||||||
LOG.debug("Setting goal config, notification={}, secondary={}", goalNotification, goalSecondary);
|
LOG.debug("Setting goals config = {}", goalSecondary);
|
||||||
|
|
||||||
final XiaomiProto.AchievementReminders.Builder achievementReminders = XiaomiProto.AchievementReminders.newBuilder()
|
final XiaomiProto.GoalsConfig.Builder goalsConfig = XiaomiProto.GoalsConfig.newBuilder();
|
||||||
.setEnabled(goalNotification)
|
|
||||||
.setSuggested(1);
|
for (final Integer currentGoal : currentGoals) {
|
||||||
|
if (!currentGoal.equals(GOAL_STANDING_TIME) && !currentGoal.equals(GOAL_MOVING_TIME)) {
|
||||||
|
goalsConfig.addCurrentGoals(XiaomiProto.Goal.newBuilder().setId(currentGoal));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (goalSecondary.equals("active_time")) {
|
if (goalSecondary.equals("active_time")) {
|
||||||
achievementReminders.setSuggested(0);
|
goalsConfig.addCurrentGoals(XiaomiProto.Goal.newBuilder().setId(GOAL_MOVING_TIME));
|
||||||
} else {
|
} else {
|
||||||
achievementReminders.setSuggested(1);
|
goalsConfig.addCurrentGoals(XiaomiProto.Goal.newBuilder().setId(GOAL_STANDING_TIME));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (final Integer supportedGoal : supportedGoals) {
|
||||||
|
goalsConfig.addSupportedGoals(XiaomiProto.Goal.newBuilder().setId(supportedGoal));
|
||||||
}
|
}
|
||||||
|
|
||||||
final XiaomiProto.Health health = XiaomiProto.Health.newBuilder()
|
final XiaomiProto.Health health = XiaomiProto.Health.newBuilder()
|
||||||
.setAchievementReminders(achievementReminders)
|
.setGoalsConfig(goalsConfig)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
getSupport().sendCommand(
|
getSupport().sendCommand(
|
||||||
"set goal config",
|
"set goals config",
|
||||||
XiaomiProto.Command.newBuilder()
|
XiaomiProto.Command.newBuilder()
|
||||||
.setType(COMMAND_TYPE)
|
.setType(COMMAND_TYPE)
|
||||||
.setSubtype(CMD_CONFIG_GOAL_SET)
|
.setSubtype(CMD_CONFIG_GOALS_SET)
|
||||||
.setHealth(health)
|
.setHealth(health)
|
||||||
.build()
|
.build()
|
||||||
);
|
);
|
||||||
|
@ -441,7 +441,7 @@ message Health {
|
|||||||
// 8, 12 get | 8, 13 set
|
// 8, 12 get | 8, 13 set
|
||||||
optional StandingReminder standingReminder = 9;
|
optional StandingReminder standingReminder = 9;
|
||||||
optional Stress stress = 10;
|
optional Stress stress = 10;
|
||||||
optional AchievementReminders achievementReminders = 13;
|
optional GoalNotification goalNotification = 13;
|
||||||
|
|
||||||
// 8, 35 get | 8, 36 set
|
// 8, 35 get | 8, 36 set
|
||||||
optional VitalityScore vitalityScore = 14;
|
optional VitalityScore vitalityScore = 14;
|
||||||
@ -453,6 +453,9 @@ message Health {
|
|||||||
optional WorkoutOpenWatch workoutOpenWatch = 25;
|
optional WorkoutOpenWatch workoutOpenWatch = 25;
|
||||||
optional WorkoutOpenReply workoutOpenReply = 26;
|
optional WorkoutOpenReply workoutOpenReply = 26;
|
||||||
|
|
||||||
|
// 7, 43
|
||||||
|
optional GoalsConfig goalsConfig = 38;
|
||||||
|
|
||||||
// 7, 48
|
// 7, 48
|
||||||
optional WorkoutLocation workoutLocation = 40;
|
optional WorkoutLocation workoutLocation = 40;
|
||||||
|
|
||||||
@ -521,9 +524,9 @@ message Stress {
|
|||||||
optional RelaxReminder relaxReminder = 2;
|
optional RelaxReminder relaxReminder = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
message AchievementReminders {
|
message GoalNotification {
|
||||||
optional bool enabled = 1;
|
optional bool enabled = 1;
|
||||||
optional uint32 suggested = 2; // 0 moving, 1 standing
|
optional uint32 unknown2 = 2; // 1
|
||||||
}
|
}
|
||||||
|
|
||||||
message RelaxReminder {
|
message RelaxReminder {
|
||||||
@ -564,6 +567,19 @@ message WorkoutOpenReply {
|
|||||||
optional uint32 unknown3 = 3;
|
optional uint32 unknown3 = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message GoalsConfig {
|
||||||
|
repeated Goal currentGoals = 1;
|
||||||
|
repeated Goal supportedGoals = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message Goal {
|
||||||
|
// 1 steps?
|
||||||
|
// 2 calories?
|
||||||
|
// 3 moving time
|
||||||
|
// 4 standing time
|
||||||
|
optional uint32 id = 1;
|
||||||
|
}
|
||||||
|
|
||||||
message WorkoutLocation {
|
message WorkoutLocation {
|
||||||
optional uint32 unknown1 = 1; // 10, sometimes 2?
|
optional uint32 unknown1 = 1; // 10, sometimes 2?
|
||||||
optional uint32 timestamp = 2; // seconds
|
optional uint32 timestamp = 2; // seconds
|
||||||
|
Loading…
Reference in New Issue
Block a user