vboot/ui: Always show page up/down buttons in log screen

Always show page up/down buttons in log screen.
Beep if users select the page up button on the first page or the page
down button on the last page.

BRANCH=puff, zork
BUG=b:146399181, b:163301076
TEST=emerge-puff depthcharge
TEST=emerge-zork depthcharge
TEST=navigate to the debug info screen by <TAB>

Cq-Depend: chromium:2361582
Signed-off-by: Hsuan Ting Chen <roccochen@chromium.org>
Change-Id: I29a567554f9283ea3fca0f58fb31c7056523c2a9
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/2361823
Commit-Queue: Hung-Te Lin <hungte@chromium.org>
Reviewed-by: Yu-Ping Wu <yupingso@chromium.org>
diff --git a/firmware/2lib/2ui_screens.c b/firmware/2lib/2ui_screens.c
index b8ff3a5..e0a6d59 100644
--- a/firmware/2lib/2ui_screens.c
+++ b/firmware/2lib/2ui_screens.c
@@ -53,60 +53,45 @@
 
 /******************************************************************************/
 /* Functions used for log screens */
+/*
+ * TODO(b/163301076): Reconsider the functionalities of page up/down buttons
+ * when reaching the start/end of the log.
+ */
 
 static vb2_error_t log_page_init(struct vb2_ui_context *ui,
-				 uint32_t page_up_item,
 				 uint32_t page_down_item,
 				 uint32_t alternate_item)
 {
 	ui->state->current_page = 0;
 
-	if (ui->state->page_count == 1) {
-		ui->state->disabled_item_mask |= 1 << page_up_item;
-		ui->state->disabled_item_mask |= 1 << page_down_item;
+	if (ui->state->page_count == 1)
 		ui->state->selected_item = alternate_item;
-	} else {
-		ui->state->disabled_item_mask |= 1 << page_up_item;
+	else
 		ui->state->selected_item = page_down_item;
-	}
 
 	return VB2_REQUEST_UI_CONTINUE;
 }
 
-static vb2_error_t log_page_prev(struct vb2_ui_context *ui,
-				 uint32_t page_up_item,
-				 uint32_t page_down_item)
+static vb2_error_t log_page_prev_action(struct vb2_ui_context *ui)
 {
-	if (ui->state->current_page == 0)
+	if (ui->state->current_page == 0) {
+		VB2_DEBUG("WARNING: Ignore page up on the first page\n");
+		ui->error_beep = 1;
 		return VB2_REQUEST_UI_CONTINUE;
+	}
 	ui->state->current_page--;
 
-	/* Clear bits of page down. */
-	ui->state->disabled_item_mask &= ~(1 << page_down_item);
-
-	if (ui->state->current_page == 0) {
-		ui->state->disabled_item_mask |= 1 << page_up_item;
-		ui->state->selected_item = page_down_item;
-	}
-
 	return VB2_REQUEST_UI_CONTINUE;
 }
 
-static vb2_error_t log_page_next(struct vb2_ui_context *ui,
-				 uint32_t page_up_item,
-				 uint32_t page_down_item)
+static vb2_error_t log_page_next_action(struct vb2_ui_context *ui)
 {
-	if (ui->state->current_page == ui->state->page_count - 1)
-		return VB2_REQUEST_UI_CONTINUE;
-	ui->state->current_page++;
-
-	/* Clear bits of page up. */
-	ui->state->disabled_item_mask &= ~(1 << page_up_item);
-
 	if (ui->state->current_page == ui->state->page_count - 1) {
-		ui->state->disabled_item_mask |= 1 << page_down_item;
-		ui->state->selected_item = page_up_item;
+		VB2_DEBUG("WARNING: Ignore page down on the last page\n");
+		ui->error_beep = 1;
+		return VB2_REQUEST_UI_CONTINUE;
 	}
+	ui->state->current_page++;
 
 	return VB2_REQUEST_UI_CONTINUE;
 }
@@ -258,7 +243,6 @@
 /******************************************************************************/
 /* VB2_SCREEN_DEBUG_INFO */
 
-#define DEBUG_INFO_ITEM_PAGE_UP 1
 #define DEBUG_INFO_ITEM_PAGE_DOWN 2
 #define DEBUG_INFO_ITEM_BACK 3
 
@@ -278,7 +262,6 @@
 	}
 
 	return log_page_init(ui,
-			     DEBUG_INFO_ITEM_PAGE_UP,
 			     DEBUG_INFO_ITEM_PAGE_DOWN,
 			     DEBUG_INFO_ITEM_BACK);
 }
@@ -301,29 +284,15 @@
 	return VB2_REQUEST_UI_CONTINUE;
 }
 
-static vb2_error_t debug_info_page_prev_action(struct vb2_ui_context *ui)
-{
-	return log_page_prev(ui,
-			     DEBUG_INFO_ITEM_PAGE_UP,
-			     DEBUG_INFO_ITEM_PAGE_DOWN);
-}
-
-static vb2_error_t debug_info_page_next_action(struct vb2_ui_context *ui)
-{
-	return log_page_next(ui,
-			     DEBUG_INFO_ITEM_PAGE_UP,
-			     DEBUG_INFO_ITEM_PAGE_DOWN);
-}
-
 static const struct vb2_menu_item debug_info_items[] = {
 	LANGUAGE_SELECT_ITEM,
-	[DEBUG_INFO_ITEM_PAGE_UP] = {
+	{
 		.text = "Page up",
-		.action = debug_info_page_prev_action,
+		.action = log_page_prev_action,
 	},
 	[DEBUG_INFO_ITEM_PAGE_DOWN] = {
 		.text = "Page down",
-		.action = debug_info_page_next_action,
+		.action = log_page_next_action,
 	},
 	[DEBUG_INFO_ITEM_BACK] = BACK_ITEM,
 	POWER_OFF_ITEM,
@@ -340,7 +309,6 @@
 /******************************************************************************/
 /* VB2_SCREEN_FIRMWARE_LOG */
 
-#define FIRMWARE_LOG_ITEM_PAGE_UP 1
 #define FIRMWARE_LOG_ITEM_PAGE_DOWN 2
 #define FIRMWARE_LOG_ITEM_BACK 3
 
@@ -360,7 +328,6 @@
 	}
 
 	return log_page_init(ui,
-			     FIRMWARE_LOG_ITEM_PAGE_UP,
 			     FIRMWARE_LOG_ITEM_PAGE_DOWN,
 			     FIRMWARE_LOG_ITEM_BACK);
 }
@@ -383,29 +350,15 @@
 	return VB2_REQUEST_UI_CONTINUE;
 }
 
-static vb2_error_t firmware_log_page_prev_action(struct vb2_ui_context *ui)
-{
-	return log_page_prev(ui,
-			     FIRMWARE_LOG_ITEM_PAGE_UP,
-			     FIRMWARE_LOG_ITEM_PAGE_DOWN);
-}
-
-static vb2_error_t firmware_log_page_next_action(struct vb2_ui_context *ui)
-{
-	return log_page_next(ui,
-			     FIRMWARE_LOG_ITEM_PAGE_UP,
-			     FIRMWARE_LOG_ITEM_PAGE_DOWN);
-}
-
 static const struct vb2_menu_item firmware_log_items[] = {
 	LANGUAGE_SELECT_ITEM,
-	[FIRMWARE_LOG_ITEM_PAGE_UP] = {
+	{
 		.text = "Page up",
-		.action = firmware_log_page_prev_action,
+		.action = log_page_prev_action,
 	},
 	[FIRMWARE_LOG_ITEM_PAGE_DOWN] = {
 		.text = "Page down",
-		.action = firmware_log_page_next_action,
+		.action = log_page_next_action,
 	},
 	[FIRMWARE_LOG_ITEM_BACK] = BACK_ITEM,
 	POWER_OFF_ITEM,
diff --git a/tests/vb2_ui_tests.c b/tests/vb2_ui_tests.c
index 00c6e93..d3b371c9 100644
--- a/tests/vb2_ui_tests.c
+++ b/tests/vb2_ui_tests.c
@@ -1095,7 +1095,7 @@
 		"get a one-page debug info");
 	DISPLAYED_PASS();
 	DISPLAYED_EQ("debug info", VB2_SCREEN_DEBUG_INFO,
-		     MOCK_IGNORE, 3, 0x6, 0);
+		     MOCK_IGNORE, 3, 0x0, 0);
 	DISPLAYED_EQ("back to root screen", VB2_SCREEN_RECOVERY_SELECT,
 		     MOCK_IGNORE, MOCK_IGNORE, MOCK_IGNORE, MOCK_IGNORE);
 	DISPLAYED_NO_EXTRA();
@@ -1106,24 +1106,31 @@
 	add_mock_keypress('\t');
 	add_mock_keypress(VB_KEY_ENTER);  /* page 0, select on page down */
 	add_mock_keypress(VB_KEY_ENTER);  /* page 1, select on page down */
+	add_mock_keypress(VB_KEY_UP);	  /* page 2, select on page down */
 	add_mock_keypress(VB_KEY_ENTER);  /* page 2, select on page up */
 	add_mock_keypress(VB_KEY_ENTER);  /* page 1, select on page up */
+	add_mock_keypress(VB_KEY_DOWN);	  /* page 0, select on page up */
 	add_mock_keypress(VB_KEY_ENTER);  /* page 0, select on page down */
-	add_mock_keypress(VB_KEY_DOWN);
+	add_mock_keypress(VB_KEY_DOWN);	  /* page 1, select on page down */
 	add_mock_keypress(VB_KEY_ENTER);  /* page 1, select on back */
+	extend_calls_until_shutdown();
 	TEST_EQ(vb2_manual_recovery_menu(ctx), VB2_REQUEST_SHUTDOWN,
 		"get a three-page debug info and navigate");
 	DISPLAYED_PASS();
 	DISPLAYED_EQ("debug info page #0", VB2_SCREEN_DEBUG_INFO,
-		     MOCK_IGNORE, 2, 0x2, 0);
+		     MOCK_IGNORE, 2, 0x0, 0);
 	DISPLAYED_EQ("debug info page #1", VB2_SCREEN_DEBUG_INFO,
 		     MOCK_IGNORE, 2, 0x0, 1);
 	DISPLAYED_EQ("debug info page #2", VB2_SCREEN_DEBUG_INFO,
-		     MOCK_IGNORE, 1, 0x4, 2);
+		     MOCK_IGNORE, 2, 0x0, 2);
+	DISPLAYED_EQ("debug info page #2", VB2_SCREEN_DEBUG_INFO,
+		     MOCK_IGNORE, 1, 0x0, 2);
 	DISPLAYED_EQ("debug info page #1", VB2_SCREEN_DEBUG_INFO,
 		     MOCK_IGNORE, 1, 0x0, 1);
 	DISPLAYED_EQ("debug info page #0", VB2_SCREEN_DEBUG_INFO,
-		     MOCK_IGNORE, 2, 0x2, 0);
+		     MOCK_IGNORE, 1, 0x0, 0);
+	DISPLAYED_EQ("debug info page #0", VB2_SCREEN_DEBUG_INFO,
+		     MOCK_IGNORE, 2, 0x0, 0);
 	DISPLAYED_EQ("debug info page #1", VB2_SCREEN_DEBUG_INFO,
 		     MOCK_IGNORE, 2, 0x0, 1);
 	DISPLAYED_EQ("debug info page #1", VB2_SCREEN_DEBUG_INFO,