Merge "ui: Check for bootreason=recovery_ui."
diff --git a/ui.cpp b/ui.cpp
index eadcdd4..e80d7ed 100644
--- a/ui.cpp
+++ b/ui.cpp
@@ -69,6 +69,7 @@
       has_down_key(false),
       has_touch_screen(false),
       touch_slot_(0),
+      is_bootreason_recovery_ui_(false),
       screensaver_state_(ScreensaverState::DISABLED) {
   pthread_mutex_init(&key_queue_mutex, nullptr);
   pthread_cond_init(&key_queue_cond, nullptr);
@@ -142,6 +143,19 @@
 
   if (touch_screen_allowed_) {
     ev_iterate_touch_inputs(std::bind(&RecoveryUI::OnKeyDetected, this, std::placeholders::_1));
+
+    // Parse /proc/cmdline to determine if it's booting into recovery with a bootreason of
+    // "recovery_ui". This specific reason is set by some (wear) bootloaders, to allow an easier way
+    // to turn on text mode. It will only be set if the recovery boot is triggered from fastboot, or
+    // with 'adb reboot recovery'. Note that this applies to all build variants. Otherwise the text
+    // mode will be turned on automatically on debuggable builds, even without a swipe.
+    std::string cmdline;
+    if (android::base::ReadFileToString("/proc/cmdline", &cmdline)) {
+      is_bootreason_recovery_ui_ = cmdline.find("bootreason=recovery_ui") != std::string::npos;
+    } else {
+      // Non-fatal, and won't affect Init() result.
+      PLOG(WARNING) << "Failed to read /proc/cmdline";
+    }
   }
 
   if (!InitScreensaver()) {
@@ -168,6 +182,12 @@
     return;
   }
 
+  // Allow turning on text mode with any swipe, if bootloader has set a bootreason of recovery_ui.
+  if (is_bootreason_recovery_ui_ && !IsTextVisible()) {
+    ShowText(true);
+    return;
+  }
+
   LOG(DEBUG) << "Swipe direction=" << direction;
   switch (direction) {
     case SwipeDirection::UP:
diff --git a/ui.h b/ui.h
index 5cda7af..3d9afec 100644
--- a/ui.h
+++ b/ui.h
@@ -170,6 +170,7 @@
   int touch_start_Y_;
   bool touch_finger_down_;
   bool touch_swiping_;
+  bool is_bootreason_recovery_ui_;
 
   struct key_timer_t {
     RecoveryUI* ui;