Merge "Move default implementations into Device."
diff --git a/Android.mk b/Android.mk
index dd1e96e..a567aa5 100644
--- a/Android.mk
+++ b/Android.mk
@@ -30,16 +30,17 @@
 include $(CLEAR_VARS)
 
 LOCAL_SRC_FILES := \
-    recovery.cpp \
-    bootloader.cpp \
-    install.cpp \
-    roots.cpp \
-    ui.cpp \
-    screen_ui.cpp \
-    asn1_decoder.cpp \
-    verifier.cpp \
     adb_install.cpp \
-    fuse_sdcard_provider.c
+    asn1_decoder.cpp \
+    bootloader.cpp \
+    device.cpp \
+    fuse_sdcard_provider.c \
+    install.cpp \
+    recovery.cpp \
+    roots.cpp \
+    screen_ui.cpp \
+    ui.cpp \
+    verifier.cpp \
 
 LOCAL_MODULE := recovery
 
diff --git a/default_device.cpp b/default_device.cpp
index ed601f6..d7dd452 100644
--- a/default_device.cpp
+++ b/default_device.cpp
@@ -14,80 +14,36 @@
  * limitations under the License.
  */
 
-#include <linux/input.h>
-
-#include "common.h"
 #include "device.h"
 #include "screen_ui.h"
 
-static const char* HEADERS[] = {
-    "Volume up/down to move highlight.",
-    "Power button to select.",
-    "",
-    NULL
-};
-
-static const char* ITEMS[] = {
-    "Reboot system now",
-    "Reboot to bootloader",
-    "Apply update from ADB",
-    "Apply update from SD card",
-    "Wipe data/factory reset",
-    "Wipe cache partition",
-    "View recovery logs",
-    "Power off",
-    NULL
-};
-
 class DefaultDevice : public Device {
-  public:
-    DefaultDevice() :
-        ui(new ScreenRecoveryUI) {
+ public:
+  DefaultDevice() : Device(new ScreenRecoveryUI) {
+  }
+
+  // TODO: make this handle more cases, and move the default implementation into Device too.
+  int HandleMenuKey(int key, int visible) {
+    if (visible) {
+      switch (key) {
+        case KEY_DOWN:
+        case KEY_VOLUMEDOWN:
+          return kHighlightDown;
+
+        case KEY_UP:
+        case KEY_VOLUMEUP:
+          return kHighlightUp;
+
+        case KEY_ENTER:
+        case KEY_POWER:
+          return kInvokeItem;
+      }
     }
 
-    RecoveryUI* GetUI() { return ui; }
-
-    int HandleMenuKey(int key, int visible) {
-        if (visible) {
-            switch (key) {
-              case KEY_DOWN:
-              case KEY_VOLUMEDOWN:
-                return kHighlightDown;
-
-              case KEY_UP:
-              case KEY_VOLUMEUP:
-                return kHighlightUp;
-
-              case KEY_ENTER:
-              case KEY_POWER:
-                return kInvokeItem;
-            }
-        }
-
-        return kNoAction;
-    }
-
-    BuiltinAction InvokeMenuItem(int menu_position) {
-        switch (menu_position) {
-          case 0: return REBOOT;
-          case 1: return REBOOT_BOOTLOADER;
-          case 2: return APPLY_ADB_SIDELOAD;
-          case 3: return APPLY_EXT;
-          case 4: return WIPE_DATA;
-          case 5: return WIPE_CACHE;
-          case 6: return READ_RECOVERY_LASTLOG;
-          case 7: return SHUTDOWN;
-          default: return NO_ACTION;
-        }
-    }
-
-    const char* const* GetMenuHeaders() { return HEADERS; }
-    const char* const* GetMenuItems() { return ITEMS; }
-
-  private:
-    RecoveryUI* ui;
+    return kNoAction;
+  }
 };
 
 Device* make_device() {
-    return new DefaultDevice();
+  return new DefaultDevice;
 }
diff --git a/device.cpp b/device.cpp
new file mode 100644
index 0000000..20a763f
--- /dev/null
+++ b/device.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "device.h"
+
+// TODO: this is a lie for, say, fugu.
+static const char* HEADERS[] = {
+    "Volume up/down to move highlight.",
+    "Power button to select.",
+    "",
+    NULL
+};
+
+static const char* ITEMS[] = {
+    "Reboot system now",
+    "Reboot to bootloader",
+    "Apply update from ADB",
+    "Apply update from SD card",
+    "Wipe data/factory reset",
+    "Wipe cache partition",
+    "View recovery logs",
+    "Power off",
+    NULL
+};
+
+const char* const* Device::GetMenuHeaders() { return HEADERS; }
+const char* const* Device::GetMenuItems() { return ITEMS; }
+
+Device::BuiltinAction Device::InvokeMenuItem(int menu_position) {
+  switch (menu_position) {
+    case 0: return REBOOT;
+    case 1: return REBOOT_BOOTLOADER;
+    case 2: return APPLY_ADB_SIDELOAD;
+    case 3: return APPLY_EXT;
+    case 4: return WIPE_DATA;
+    case 5: return WIPE_CACHE;
+    case 6: return READ_RECOVERY_LASTLOG;
+    case 7: return SHUTDOWN;
+    default: return NO_ACTION;
+  }
+}
diff --git a/device.h b/device.h
index 02f9564..97ec2fb 100644
--- a/device.h
+++ b/device.h
@@ -21,13 +21,14 @@
 
 class Device {
   public:
+    Device(RecoveryUI* ui) : ui_(ui) { }
     virtual ~Device() { }
 
     // Called to obtain the UI object that should be used to display
     // the recovery user interface for this device.  You should not
     // have called Init() on the UI object already, the caller will do
     // that after this method returns.
-    virtual RecoveryUI* GetUI() = 0;
+    virtual RecoveryUI* GetUI() { return ui_; }
 
     // Called when recovery starts up (after the UI has been obtained
     // and initialized and after the arguments have been parsed, but
@@ -60,6 +61,17 @@
                          APPLY_ADB_SIDELOAD, WIPE_DATA, WIPE_CACHE,
                          REBOOT_BOOTLOADER, SHUTDOWN, READ_RECOVERY_LASTLOG };
 
+    // Return the headers (an array of strings, one per line,
+    // NULL-terminated) for the main menu.  Typically these tell users
+    // what to push to move the selection and invoke the selected
+    // item.
+    virtual const char* const* GetMenuHeaders();
+
+    // Return the list of menu items (an array of strings,
+    // NULL-terminated).  The menu_position passed to InvokeMenuItem
+    // will correspond to the indexes into this array.
+    virtual const char* const* GetMenuItems();
+
     // Perform a recovery action selected from the menu.
     // 'menu_position' will be the item number of the selected menu
     // item, or a non-negative number returned from
@@ -69,7 +81,7 @@
     // builtin actions, you can just return the corresponding enum
     // value.  If it is an action specific to your device, you
     // actually perform it here and return NO_ACTION.
-    virtual BuiltinAction InvokeMenuItem(int menu_position) = 0;
+    virtual BuiltinAction InvokeMenuItem(int menu_position);
 
     static const int kNoAction = -1;
     static const int kHighlightUp = -2;
@@ -84,16 +96,8 @@
     // are erased AFTER this returns (whether it returns success or not).
     virtual int WipeData() { return 0; }
 
-    // Return the headers (an array of strings, one per line,
-    // NULL-terminated) for the main menu.  Typically these tell users
-    // what to push to move the selection and invoke the selected
-    // item.
-    virtual const char* const* GetMenuHeaders() = 0;
-
-    // Return the list of menu items (an array of strings,
-    // NULL-terminated).  The menu_position passed to InvokeMenuItem
-    // will correspond to the indexes into this array.
-    virtual const char* const* GetMenuItems() = 0;
+  private:
+    RecoveryUI* ui_;
 };
 
 // The device-specific library must define this function (or the