return status;
}
+
+static int is_upgrade_completed(void)
+{
+ char boot_mode[128];
+ int upgrde_progress_status = 0;
+ int ret = 0;
+
+ ret = hal_device_board_get_upgrade_progress_status(&upgrde_progress_status);
+ if (ret < 0) {
+ _FLOGE("Failed to get upgrade progress status: %d", ret);
+ return -1;
+ }
+
+ ret = hal_device_board_get_boot_mode(boot_mode, sizeof(boot_mode));
+ if (ret < 0) {
+ _FLOGE("Failed to get boot mode: %d", ret);
+ return -1;
+ }
+
+ if (upgrde_progress_status != 100) {
+ _FLOGI("Upgrade not completed: upgrade progress status is not 100 but %d",
+ upgrde_progress_status);
+ return 0;
+ }
+
+ if (strncmp(boot_mode, "normal", sizeof(boot_mode)) != 0) {
+ _FLOGI("Boot mode is not normal: %s", boot_mode);
+ return 0;
+ }
+
+ return 1;
+}
+
+int fota_installer_check_and_set_upgrade_state_completed(void)
+{
+ char current_upgrade_state[128];
+ char *next_upgrade_state = "completed";
+ int ret = 0;
+
+ ret = is_upgrade_completed();
+ if (ret < 0) {
+ _FLOGE("Failed to check if upgrade completed.");
+ return -1;
+ }
+
+ if (ret == 0) {
+ _FLOGI("Upgrade is not completed.");
+ return -1;
+ }
+
+ ret = hal_device_board_get_upgrade_state(current_upgrade_state,
+ sizeof(current_upgrade_state));
+ if (ret < 0) {
+ _FLOGE("Failed to get upgrade state: %d", ret);
+ return -1;
+ }
+
+ if (strncmp(current_upgrade_state, next_upgrade_state,
+ sizeof(current_upgrade_state)) == 0) {
+ _FLOGI("Upgrade state is already %s.", next_upgrade_state);
+ return 0;
+ }
+
+ ret = hal_device_board_set_upgrade_state(current_upgrade_state,
+ next_upgrade_state);
+ if (ret < 0) {
+ _FLOGE("Failed to set upgrade state %s -> %s: %d",
+ current_upgrade_state, next_upgrade_state, ret);
+ return -1;
+ }
+
+ _FLOGI("Succeed to set upgrade state %s -> %s", current_upgrade_state,
+ next_upgrade_state);
+
+ return 0;
+}