vboot/ui: hide phone recovery flow when disabled

If phone recovery flow is disabled according to
vb2api_phone_recovery_enabled(), then hide the "Recovery
using phone" menu item from the RECOVERY_SELECT screen.

BUG=b:146399181, b:147744345
TEST=make clean && make runtests
TEST=Upgrade secdata_kernel to v1, boot to recovery mode, check menu
BRANCH=none

Change-Id: Id2d23b5a1cc31dec12befa60a9a52790b129495c
Signed-off-by: Joel Kitching <kitching@google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/2201056
Reviewed-by: Joel Kitching <kitching@chromium.org>
Reviewed-by: Yu-Ping Wu <yupingso@chromium.org>
Tested-by: Joel Kitching <kitching@chromium.org>
Commit-Queue: Joel Kitching <kitching@chromium.org>
diff --git a/firmware/2lib/2ui_screens.c b/firmware/2lib/2ui_screens.c
index 356b3bf..c4465a4 100644
--- a/firmware/2lib/2ui_screens.c
+++ b/firmware/2lib/2ui_screens.c
@@ -81,12 +81,26 @@
 /******************************************************************************/
 /* VB2_SCREEN_RECOVERY_SELECT */
 
+#define RECOVERY_SELECT_ITEM_PHONE 0
+#define RECOVERY_SELECT_ITEM_EXTERNAL_DISK 1
+
+vb2_error_t recovery_select_init(struct vb2_ui_context *ui)
+{
+	if (!vb2api_phone_recovery_enabled(ui->ctx)) {
+		VB2_DEBUG("WARNING: Phone recovery not available\n");
+		ui->state.disabled_item_mask |=
+			1 << RECOVERY_SELECT_ITEM_PHONE;
+		ui->state.selected_item = RECOVERY_SELECT_ITEM_EXTERNAL_DISK;
+	}
+	return VB2_REQUEST_UI_CONTINUE;
+}
+
 static const struct vb2_menu_item recovery_select_items[] = {
-	{
+	[RECOVERY_SELECT_ITEM_PHONE] = {
 		.text = "Recovery using phone",
 		.target = VB2_SCREEN_RECOVERY_PHONE_STEP1,
 	},
-	{
+	[RECOVERY_SELECT_ITEM_EXTERNAL_DISK] = {
 		.text = "Recovery using external disk",
 		.target = VB2_SCREEN_RECOVERY_DISK_STEP1,
 	},
@@ -96,6 +110,7 @@
 static const struct vb2_screen_info recovery_select_screen = {
 	.id = VB2_SCREEN_RECOVERY_SELECT,
 	.name = "Recovery method selection",
+	.init = recovery_select_init,
 	MENU_ITEMS(recovery_select_items),
 };
 
diff --git a/firmware/2lib/include/2ui_private.h b/firmware/2lib/include/2ui_private.h
index bfc0dd0..2496555 100644
--- a/firmware/2lib/include/2ui_private.h
+++ b/firmware/2lib/include/2ui_private.h
@@ -38,6 +38,7 @@
 
 /* From 2ui_screens.c */
 vb2_error_t advanced_options_init(struct vb2_ui_context *ui);
+vb2_error_t recovery_select_init(struct vb2_ui_context *ui);
 vb2_error_t recovery_to_dev_init(struct vb2_ui_context *ui);
 vb2_error_t developer_mode_init(struct vb2_ui_context *ui);
 vb2_error_t developer_mode_action(struct vb2_ui_context *ui);
diff --git a/tests/vb2_ui_tests.c b/tests/vb2_ui_tests.c
index 1bd9e8b..a45fba8 100644
--- a/tests/vb2_ui_tests.c
+++ b/tests/vb2_ui_tests.c
@@ -9,6 +9,7 @@
 #include "2common.h"
 #include "2misc.h"
 #include "2nvstorage.h"
+#include "2struct.h"
 #include "2ui.h"
 #include "2ui_private.h"
 #include "test_common.h"
@@ -161,6 +162,7 @@
 		ctx->flags |= VB2_CONTEXT_DEVELOPER_MODE;
 
 	sd = vb2_get_sd(ctx);
+	sd->status |= VB2_SD_STATUS_SECDATA_KERNEL_INIT;
 
 	/* For try_recovery_action */
 	invalid_disk_last = -1;