Add a logo to the fastbootd screen.

fastbootd looks too much like recovery, even if you're carefully reading
the menu. It's not obvious the device is in a flashing mode, and it's
too tempting to reboot or unplug the device in this state.

As a first step, this patch adds a big red "fastbootd" logo so it's less
obviously in recovery mode.

Bug: 120429730
Test: manual test
Change-Id: I73359f1fdfdc0b1694993f760fe7f35c5713b24e
diff --git a/recovery_main.cpp b/recovery_main.cpp
index 6f50802..7fb4616 100644
--- a/recovery_main.cpp
+++ b/recovery_main.cpp
@@ -458,6 +458,8 @@
       }
     }
 
+    ui->SetEnableFastbootdLogo(fastboot);
+
     auto ret = fastboot ? StartFastboot(device, args) : start_recovery(device, args);
 
     if (ret == Device::KEY_INTERRUPTED) {
diff --git a/res-hdpi/images/fastbootd.png b/res-hdpi/images/fastbootd.png
new file mode 100644
index 0000000..5127b3b
--- /dev/null
+++ b/res-hdpi/images/fastbootd.png
Binary files differ
diff --git a/res-mdpi/images/fastbootd.png b/res-mdpi/images/fastbootd.png
new file mode 100644
index 0000000..c1b7bc2
--- /dev/null
+++ b/res-mdpi/images/fastbootd.png
Binary files differ
diff --git a/res-xhdpi/images/fastbootd.png b/res-xhdpi/images/fastbootd.png
new file mode 100644
index 0000000..e3da85a
--- /dev/null
+++ b/res-xhdpi/images/fastbootd.png
Binary files differ
diff --git a/res-xxhdpi/images/fastbootd.png b/res-xxhdpi/images/fastbootd.png
new file mode 100644
index 0000000..482dbb2
--- /dev/null
+++ b/res-xxhdpi/images/fastbootd.png
Binary files differ
diff --git a/res-xxxhdpi/images/fastbootd.png b/res-xxxhdpi/images/fastbootd.png
new file mode 100644
index 0000000..a878b1f
--- /dev/null
+++ b/res-xxxhdpi/images/fastbootd.png
Binary files differ
diff --git a/screen_ui.cpp b/screen_ui.cpp
index 6c00a22..6f2b68b 100644
--- a/screen_ui.cpp
+++ b/screen_ui.cpp
@@ -701,6 +701,16 @@
 void ScreenRecoveryUI::draw_menu_and_text_buffer_locked(
     const std::vector<std::string>& help_message) {
   int y = margin_height_;
+
+  if (fastbootd_logo_ && fastbootd_logo_enabled_) {
+    // Try to get this centered on screen.
+    auto width = gr_get_width(fastbootd_logo_.get());
+    auto height = gr_get_height(fastbootd_logo_.get());
+    auto centered_x = ScreenWidth() / 2 - width / 2;
+    DrawSurface(fastbootd_logo_.get(), 0, 0, width, height, centered_x, y);
+    y += height;
+  }
+
   if (menu_) {
     int x = margin_width_ + kMenuIndent;
 
@@ -890,6 +900,10 @@
   no_command_text_ = LoadLocalizedBitmap("no_command_text");
   error_text_ = LoadLocalizedBitmap("error_text");
 
+  if (android::base::GetBoolProperty("ro.boot.dynamic_partitions", false)) {
+    fastbootd_logo_ = LoadBitmap("fastbootd");
+  }
+
   // Background text for "installing_update" could be "installing update" or
   // "installing security update". It will be set after Init() according to the commands in BCB.
   installing_text_.reset();
diff --git a/screen_ui.h b/screen_ui.h
index acd44c8..5cda2a2 100644
--- a/screen_ui.h
+++ b/screen_ui.h
@@ -345,6 +345,8 @@
   std::unique_ptr<GRSurface> wipe_data_confirmation_text_;
   std::unique_ptr<GRSurface> wipe_data_menu_header_text_;
 
+  std::unique_ptr<GRSurface> fastbootd_logo_;
+
   // current_icon_ points to one of the frames in intro_frames_ or loop_frames_, indexed by
   // current_frame_, or error_icon_.
   Icon current_icon_;
diff --git a/ui.cpp b/ui.cpp
index 14b5b09..c12a11b 100644
--- a/ui.cpp
+++ b/ui.cpp
@@ -59,6 +59,7 @@
       brightness_file_(BRIGHTNESS_FILE),
       max_brightness_file_(MAX_BRIGHTNESS_FILE),
       touch_screen_allowed_(false),
+      fastbootd_logo_enabled_(false),
       touch_low_threshold_(android::base::GetIntProperty("ro.recovery.ui.touch_low_threshold",
                                                          kDefaultTouchLowThreshold)),
       touch_high_threshold_(android::base::GetIntProperty("ro.recovery.ui.touch_high_threshold",
diff --git a/ui.h b/ui.h
index 4924fec..b387ae3 100644
--- a/ui.h
+++ b/ui.h
@@ -168,7 +168,6 @@
   virtual size_t ShowPromptWipeDataMenu(const std::vector<std::string>& backup_headers,
                                         const std::vector<std::string>& backup_items,
                                         const std::function<int(int, bool)>& key_handler) = 0;
-
   // Displays the localized wipe data confirmation menu with pre-generated images. Falls back to
   // the text strings upon failures. The initial selection is the 0th item, which returns to the
   // upper level menu.
@@ -176,6 +175,11 @@
       const std::vector<std::string>& backup_headers, const std::vector<std::string>& backup_items,
       const std::function<int(int, bool)>& key_handler) = 0;
 
+  // Set whether or not the fastbootd logo is displayed.
+  void SetEnableFastbootdLogo(bool enable) {
+    fastbootd_logo_enabled_ = enable;
+  }
+
   // Resets the key interrupt status.
   void ResetKeyInterruptStatus() {
     key_interrupted_ = false;
@@ -200,6 +204,8 @@
   // Whether we should listen for touch inputs (default: false).
   bool touch_screen_allowed_;
 
+  bool fastbootd_logo_enabled_;
+
  private:
   enum class ScreensaverState {
     DISABLED,