summaryrefslogtreecommitdiffstats
path: root/screen_ui.cpp
diff options
context:
space:
mode:
authorTao Bao <tbao@google.com>2018-05-01 22:32:37 +0200
committerGerrit Code Review <noreply-gerritcodereview@google.com>2018-05-01 22:32:37 +0200
commitcac3ec3513050b3835e059dd540cfad74a60e1c8 (patch)
tree03eda9404b106cff6d8186940355c7b957ec0ea2 /screen_ui.cpp
parentMerge "updater_sample: add FileDownloader" (diff)
parentAdd ScreenRecoveryUI::ShowMenu(). (diff)
downloadandroid_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.cpp47
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;