diff options
Diffstat (limited to 'firmware/2lib/2ui_screens.c')
-rw-r--r-- | firmware/2lib/2ui_screens.c | 185 |
1 files changed, 106 insertions, 79 deletions
diff --git a/firmware/2lib/2ui_screens.c b/firmware/2lib/2ui_screens.c index aaf7daf7..29a10625 100644 --- a/firmware/2lib/2ui_screens.c +++ b/firmware/2lib/2ui_screens.c @@ -52,50 +52,92 @@ static vb2_error_t power_off_action(struct vb2_ui_context *ui) }) /******************************************************************************/ -/* Functions used for log screens */ /* - * TODO(b/163301076): Reconsider the functionalities of page up/down buttons - * when reaching the start/end of the log. + * Functions used for log screens + * + * Expects that the page_count is valid and page_up_item and page_down_item are + * assigned to correct menu item indices in all three functions, the + * current_page is valid in prev and next actions, and the back_item is assigned + * to a correct menu item index. */ -static vb2_error_t log_page_init(struct vb2_ui_context *ui, - uint32_t page_down_item, - uint32_t alternate_item) +static vb2_error_t log_page_init(struct vb2_ui_context *ui) { + const struct vb2_screen_info *screen = ui->state->screen; + ui->state->current_page = 0; - if (ui->state->page_count == 1) - ui->state->selected_item = alternate_item; - else - ui->state->selected_item = page_down_item; + if (ui->state->page_count == 1) { + VB2_SET_BIT(ui->state->disabled_item_mask, + screen->page_up_item); + VB2_SET_BIT(ui->state->disabled_item_mask, + screen->page_down_item); + ui->state->selected_item = screen->back_item; + } else { + VB2_SET_BIT(ui->state->disabled_item_mask, + screen->page_up_item); + ui->state->selected_item = screen->page_down_item; + } return VB2_REQUEST_UI_CONTINUE; } static vb2_error_t log_page_prev_action(struct vb2_ui_context *ui) { - if (ui->state->current_page == 0) { - VB2_DEBUG("WARNING: Ignore page up on the first page\n"); - ui->error_beep = 1; + const struct vb2_screen_info *screen = ui->state->screen; + + /* Validity check. */ + if (ui->state->current_page == 0) return VB2_REQUEST_UI_CONTINUE; - } + ui->state->current_page--; + /* Clear bits of page down. */ + if (ui->state->current_page != ui->state->page_count - 1) + VB2_CLR_BIT(ui->state->disabled_item_mask, + screen->page_down_item); + + /* Disable page up at the first page. */ + if (ui->state->current_page == 0) + VB2_SET_BIT(ui->state->disabled_item_mask, + screen->page_up_item); + return VB2_REQUEST_UI_CONTINUE; } static vb2_error_t log_page_next_action(struct vb2_ui_context *ui) { - if (ui->state->current_page == ui->state->page_count - 1) { - VB2_DEBUG("WARNING: Ignore page down on the last page\n"); - ui->error_beep = 1; + const struct vb2_screen_info *screen = ui->state->screen; + + /* Validity check. */ + if (ui->state->current_page == ui->state->page_count - 1) return VB2_REQUEST_UI_CONTINUE; - } + ui->state->current_page++; + /* Clear bits of page up. */ + if (ui->state->current_page != 0) + VB2_CLR_BIT(ui->state->disabled_item_mask, + screen->page_up_item); + + /* Disable page down at the last page. */ + if (ui->state->current_page == ui->state->page_count - 1) + VB2_SET_BIT(ui->state->disabled_item_mask, + screen->page_down_item); + return VB2_REQUEST_UI_CONTINUE; } +#define PAGE_UP_ITEM ((struct vb2_menu_item){ \ + .text = "Page up", \ + .action = log_page_prev_action, \ +}) + +#define PAGE_DOWN_ITEM ((struct vb2_menu_item){ \ + .text = "Page down", \ + .action = log_page_next_action, \ +}) + /******************************************************************************/ /* VB2_SCREEN_BLANK */ @@ -207,8 +249,8 @@ vb2_error_t advanced_options_init(struct vb2_ui_context *ui) ui->state->selected_item = ADVANCED_OPTIONS_ITEM_DEVELOPER_MODE; if (vb2_get_sd(ui->ctx)->flags & VB2_SD_FLAG_DEV_MODE_ENABLED || !vb2_allow_recovery(ui->ctx)) { - ui->state->disabled_item_mask |= - 1 << ADVANCED_OPTIONS_ITEM_DEVELOPER_MODE; + VB2_SET_BIT(ui->state->hidden_item_mask, + ADVANCED_OPTIONS_ITEM_DEVELOPER_MODE); ui->state->selected_item = ADVANCED_OPTIONS_ITEM_DEBUG_INFO; } @@ -243,6 +285,7 @@ static const struct vb2_screen_info advanced_options_screen = { /******************************************************************************/ /* VB2_SCREEN_DEBUG_INFO */ +#define DEBUG_INFO_ITEM_PAGE_UP 1 #define DEBUG_INFO_ITEM_PAGE_DOWN 2 #define DEBUG_INFO_ITEM_BACK 3 @@ -261,9 +304,7 @@ static vb2_error_t debug_info_init(struct vb2_ui_context *ui) return vb2_ui_screen_back(ui); } - return log_page_init(ui, - DEBUG_INFO_ITEM_PAGE_DOWN, - DEBUG_INFO_ITEM_BACK); + return log_page_init(ui); } static vb2_error_t debug_info_reinit(struct vb2_ui_context *ui) @@ -286,14 +327,8 @@ static vb2_error_t debug_info_reinit(struct vb2_ui_context *ui) static const struct vb2_menu_item debug_info_items[] = { LANGUAGE_SELECT_ITEM, - { - .text = "Page up", - .action = log_page_prev_action, - }, - [DEBUG_INFO_ITEM_PAGE_DOWN] = { - .text = "Page down", - .action = log_page_next_action, - }, + [DEBUG_INFO_ITEM_PAGE_UP] = PAGE_UP_ITEM, + [DEBUG_INFO_ITEM_PAGE_DOWN] = PAGE_DOWN_ITEM, [DEBUG_INFO_ITEM_BACK] = BACK_ITEM, POWER_OFF_ITEM, }; @@ -304,11 +339,15 @@ static const struct vb2_screen_info debug_info_screen = { .init = debug_info_init, .reinit = debug_info_reinit, .menu = MENU_ITEMS(debug_info_items), + .page_up_item = DEBUG_INFO_ITEM_PAGE_UP, + .page_down_item = DEBUG_INFO_ITEM_PAGE_DOWN, + .back_item = DEBUG_INFO_ITEM_BACK, }; /******************************************************************************/ /* VB2_SCREEN_FIRMWARE_LOG */ +#define FIRMWARE_LOG_ITEM_PAGE_UP 1 #define FIRMWARE_LOG_ITEM_PAGE_DOWN 2 #define FIRMWARE_LOG_ITEM_BACK 3 @@ -327,9 +366,7 @@ static vb2_error_t firmware_log_init(struct vb2_ui_context *ui) return vb2_ui_screen_back(ui); } - return log_page_init(ui, - FIRMWARE_LOG_ITEM_PAGE_DOWN, - FIRMWARE_LOG_ITEM_BACK); + return log_page_init(ui); } static vb2_error_t firmware_log_reinit(struct vb2_ui_context *ui) @@ -352,14 +389,8 @@ static vb2_error_t firmware_log_reinit(struct vb2_ui_context *ui) static const struct vb2_menu_item firmware_log_items[] = { LANGUAGE_SELECT_ITEM, - { - .text = "Page up", - .action = log_page_prev_action, - }, - [FIRMWARE_LOG_ITEM_PAGE_DOWN] = { - .text = "Page down", - .action = log_page_next_action, - }, + [FIRMWARE_LOG_ITEM_PAGE_UP] = PAGE_UP_ITEM, + [FIRMWARE_LOG_ITEM_PAGE_DOWN] = PAGE_DOWN_ITEM, [FIRMWARE_LOG_ITEM_BACK] = BACK_ITEM, POWER_OFF_ITEM, }; @@ -370,6 +401,9 @@ static const struct vb2_screen_info firmware_log_screen = { .init = firmware_log_init, .reinit = firmware_log_reinit, .menu = MENU_ITEMS(firmware_log_items), + .page_up_item = FIRMWARE_LOG_ITEM_PAGE_UP, + .page_down_item = FIRMWARE_LOG_ITEM_PAGE_DOWN, + .back_item = FIRMWARE_LOG_ITEM_BACK, }; /******************************************************************************/ @@ -392,14 +426,14 @@ vb2_error_t recovery_select_init(struct vb2_ui_context *ui) ui->state->selected_item = RECOVERY_SELECT_ITEM_PHONE; if (!vb2api_phone_recovery_ui_enabled(ui->ctx)) { VB2_DEBUG("WARNING: Phone recovery not available\n"); - ui->state->disabled_item_mask |= - 1 << RECOVERY_SELECT_ITEM_PHONE; + VB2_SET_BIT(ui->state->hidden_item_mask, + RECOVERY_SELECT_ITEM_PHONE); ui->state->selected_item = RECOVERY_SELECT_ITEM_EXTERNAL_DISK; } - if (!DIAGNOSTIC_UI || !vb2api_diagnostic_ui_enabled(ui->ctx)) - ui->state->disabled_item_mask |= - 1 << RECOVERY_SELECT_ITEM_DIAGNOSTICS; + if (!DIAGNOSTIC_UI || !vb2api_diagnostic_ui_enabled(ui->ctx)) + VB2_SET_BIT(ui->state->hidden_item_mask, + RECOVERY_SELECT_ITEM_DIAGNOSTICS); return VB2_REQUEST_UI_CONTINUE; } @@ -466,8 +500,8 @@ vb2_error_t recovery_to_dev_init(struct vb2_ui_context *ui) /* Disable "Confirm" button for other physical presence types. */ if (!PHYSICAL_PRESENCE_KEYBOARD) { - ui->state->disabled_item_mask |= - 1 << RECOVERY_TO_DEV_ITEM_CONFIRM; + VB2_SET_BIT(ui->state->hidden_item_mask, + RECOVERY_TO_DEV_ITEM_CONFIRM); ui->state->selected_item = RECOVERY_TO_DEV_ITEM_CANCEL; } @@ -655,18 +689,18 @@ vb2_error_t developer_mode_init(struct vb2_ui_context *ui) /* Don't show "Return to secure mode" button if GBB forces dev mode. */ if (vb2_get_gbb(ui->ctx)->flags & VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON) - ui->state->disabled_item_mask |= - 1 << DEVELOPER_MODE_ITEM_RETURN_TO_SECURE; + VB2_SET_BIT(ui->state->hidden_item_mask, + DEVELOPER_MODE_ITEM_RETURN_TO_SECURE); /* Don't show "Boot from external disk" button if not allowed. */ if (!vb2_dev_boot_external_allowed(ui->ctx)) - ui->state->disabled_item_mask |= - 1 << DEVELOPER_MODE_ITEM_BOOT_EXTERNAL; + VB2_SET_BIT(ui->state->hidden_item_mask, + DEVELOPER_MODE_ITEM_BOOT_EXTERNAL); /* Don't show "Select alternate bootloader" button if not allowed. */ if (!vb2_dev_boot_legacy_allowed(ui->ctx)) - ui->state->disabled_item_mask |= - 1 << DEVELOPER_MODE_ITEM_SELECT_BOOTLOADER; + VB2_SET_BIT(ui->state->hidden_item_mask, + DEVELOPER_MODE_ITEM_SELECT_BOOTLOADER); /* Choose the default selection. */ switch (default_boot) { @@ -1035,6 +1069,7 @@ static const struct vb2_screen_info diagnostics_screen = { /******************************************************************************/ /* VB2_SCREEN_DIAGNOSTICS_STORAGE */ +#define DIAGNOSTICS_STORAGE_ITEM_PAGE_UP 0 #define DIAGNOSTICS_STORAGE_ITEM_PAGE_DOWN 1 #define DIAGNOSTICS_STORAGE_ITEM_BACK 2 @@ -1053,19 +1088,12 @@ static vb2_error_t diagnostics_storage_init(struct vb2_ui_context *ui) ui->error_code = VB2_UI_ERROR_DIAGNOSTICS; return vb2_ui_screen_back(ui); } - return log_page_init(ui, DIAGNOSTICS_STORAGE_ITEM_PAGE_DOWN, - DIAGNOSTICS_STORAGE_ITEM_BACK); + return log_page_init(ui); } static const struct vb2_menu_item diagnostics_storage_items[] = { - { - .text = "Page up", - .action = log_page_prev_action, - }, - [DIAGNOSTICS_STORAGE_ITEM_PAGE_DOWN] = { - .text = "Page down", - .action = log_page_next_action, - }, + [DIAGNOSTICS_STORAGE_ITEM_PAGE_UP] = PAGE_UP_ITEM, + [DIAGNOSTICS_STORAGE_ITEM_PAGE_DOWN] = PAGE_DOWN_ITEM, [DIAGNOSTICS_STORAGE_ITEM_BACK] = BACK_ITEM, POWER_OFF_ITEM, }; @@ -1075,12 +1103,16 @@ static const struct vb2_screen_info diagnostics_storage_screen = { .name = "Storage", .init = diagnostics_storage_init, .menu = MENU_ITEMS(diagnostics_storage_items), + .page_up_item = DIAGNOSTICS_STORAGE_ITEM_PAGE_UP, + .page_down_item = DIAGNOSTICS_STORAGE_ITEM_PAGE_DOWN, + .back_item = DIAGNOSTICS_STORAGE_ITEM_BACK, }; /******************************************************************************/ /* VB2_SCREEN_DIAGNOSTICS_MEMORY_QUICK VB2_SCREEN_DIAGNOSTICS_MEMORY_FULL */ +#define DIAGNOSTICS_MEMORY_ITEM_PAGE_UP 0 #define DIAGNOSTICS_MEMORY_ITEM_PAGE_DOWN 1 #define DIAGNOSTICS_MEMORY_ITEM_CANCEL 2 #define DIAGNOSTICS_MEMORY_ITEM_BACK 3 @@ -1112,17 +1144,18 @@ static vb2_error_t diagnostics_memory_update_screen(struct vb2_ui_context *ui, /* Show cancel button when the test is running, otherwise show the back * button. VB2_SUCCESS indicates the test is finished. */ - ui->state->disabled_item_mask &= ~(1 << DIAGNOSTICS_MEMORY_ITEM_CANCEL); - ui->state->disabled_item_mask &= ~(1 << DIAGNOSTICS_MEMORY_ITEM_BACK); + VB2_CLR_BIT(ui->state->hidden_item_mask, + DIAGNOSTICS_MEMORY_ITEM_CANCEL); + VB2_CLR_BIT(ui->state->hidden_item_mask, DIAGNOSTICS_MEMORY_ITEM_BACK); if (rv == VB2_ERROR_EX_DIAG_TEST_RUNNING) { - ui->state->disabled_item_mask |= - 1 << DIAGNOSTICS_MEMORY_ITEM_BACK; + VB2_SET_BIT(ui->state->hidden_item_mask, + DIAGNOSTICS_MEMORY_ITEM_BACK); if (ui->state->selected_item == DIAGNOSTICS_MEMORY_ITEM_BACK) ui->state->selected_item = DIAGNOSTICS_MEMORY_ITEM_CANCEL; } else { - ui->state->disabled_item_mask |= - 1 << DIAGNOSTICS_MEMORY_ITEM_CANCEL; + VB2_SET_BIT(ui->state->hidden_item_mask, + DIAGNOSTICS_MEMORY_ITEM_CANCEL); if (ui->state->selected_item == DIAGNOSTICS_MEMORY_ITEM_CANCEL) ui->state->selected_item = DIAGNOSTICS_MEMORY_ITEM_BACK; } @@ -1155,14 +1188,8 @@ static vb2_error_t diagnostics_memory_update_full(struct vb2_ui_context *ui) } static const struct vb2_menu_item diagnostics_memory_items[] = { - { - .text = "Page up", - .action = log_page_prev_action, - }, - [DIAGNOSTICS_MEMORY_ITEM_PAGE_DOWN] = { - .text = "Page down", - .action = log_page_next_action, - }, + [DIAGNOSTICS_MEMORY_ITEM_PAGE_UP] = PAGE_UP_ITEM, + [DIAGNOSTICS_MEMORY_ITEM_PAGE_DOWN] = PAGE_DOWN_ITEM, [DIAGNOSTICS_MEMORY_ITEM_CANCEL] = { .text = "Cancel and go back", .action = vb2_ui_screen_back, |