diff options
author | Tao Bao <tbao@google.com> | 2018-05-01 22:32:37 +0200 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2018-05-01 22:32:37 +0200 |
commit | cac3ec3513050b3835e059dd540cfad74a60e1c8 (patch) | |
tree | 03eda9404b106cff6d8186940355c7b957ec0ea2 /screen_ui.cpp | |
parent | Merge "updater_sample: add FileDownloader" (diff) | |
parent | Add ScreenRecoveryUI::ShowMenu(). (diff) | |
download | android_bootable_recovery-cac3ec3513050b3835e059dd540cfad74a60e1c8.tar android_bootable_recovery-cac3ec3513050b3835e059dd540cfad74a60e1c8.tar.gz android_bootable_recovery-cac3ec3513050b3835e059dd540cfad74a60e1c8.tar.bz2 android_bootable_recovery-cac3ec3513050b3835e059dd540cfad74a60e1c8.tar.lz android_bootable_recovery-cac3ec3513050b3835e059dd540cfad74a60e1c8.tar.xz android_bootable_recovery-cac3ec3513050b3835e059dd540cfad74a60e1c8.tar.zst android_bootable_recovery-cac3ec3513050b3835e059dd540cfad74a60e1c8.zip |
Diffstat (limited to 'screen_ui.cpp')
-rw-r--r-- | screen_ui.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/screen_ui.cpp b/screen_ui.cpp index 317e5529c..aaeb18c7f 100644 --- a/screen_ui.cpp +++ b/screen_ui.cpp @@ -1009,6 +1009,53 @@ void ScreenRecoveryUI::EndMenu() { pthread_mutex_unlock(&updateMutex); } +int ScreenRecoveryUI::ShowMenu(const char* const* headers, const char* const* items, + int initial_selection, bool menu_only, + const std::function<int(int, bool)>& key_handler) { + // Throw away keys pressed previously, so user doesn't accidentally trigger menu items. + FlushKeys(); + + StartMenu(headers, items, initial_selection); + + int selected = initial_selection; + int chosen_item = -1; + while (chosen_item < 0) { + int key = WaitKey(); + if (key == -1) { // WaitKey() timed out. + if (WasTextEverVisible()) { + continue; + } else { + LOG(INFO) << "Timed out waiting for key input; rebooting."; + EndMenu(); + return -1; + } + } + + bool visible = IsTextVisible(); + int action = key_handler(key, visible); + if (action < 0) { + switch (action) { + case Device::kHighlightUp: + selected = SelectMenu(--selected); + break; + case Device::kHighlightDown: + selected = SelectMenu(++selected); + break; + case Device::kInvokeItem: + chosen_item = selected; + break; + case Device::kNoAction: + break; + } + } else if (!menu_only) { + chosen_item = action; + } + } + + EndMenu(); + return chosen_item; +} + bool ScreenRecoveryUI::IsTextVisible() { pthread_mutex_lock(&updateMutex); int visible = show_text; |