summaryrefslogtreecommitdiffstats
path: root/screen_ui.cpp
diff options
context:
space:
mode:
authorTao Bao <tbao@google.com>2018-05-01 22:46:04 +0200
committerandroid-build-merger <android-build-merger@google.com>2018-05-01 22:46:04 +0200
commitf0fd4f59836c4631c9d5736de384e8f014eccc25 (patch)
treea99cb49f0adcb714394660c444be49d3fe57e90f /screen_ui.cpp
parentMerge "updater_sample: add FileDownloader" am: 5c119482b3 (diff)
parentMerge "Add ScreenRecoveryUI::ShowMenu()." (diff)
downloadandroid_bootable_recovery-f0fd4f59836c4631c9d5736de384e8f014eccc25.tar
android_bootable_recovery-f0fd4f59836c4631c9d5736de384e8f014eccc25.tar.gz
android_bootable_recovery-f0fd4f59836c4631c9d5736de384e8f014eccc25.tar.bz2
android_bootable_recovery-f0fd4f59836c4631c9d5736de384e8f014eccc25.tar.lz
android_bootable_recovery-f0fd4f59836c4631c9d5736de384e8f014eccc25.tar.xz
android_bootable_recovery-f0fd4f59836c4631c9d5736de384e8f014eccc25.tar.zst
android_bootable_recovery-f0fd4f59836c4631c9d5736de384e8f014eccc25.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;