summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTao Bao <tbao@google.com>2018-05-09 20:05:44 +0200
committerTao Bao <tbao@google.com>2018-05-11 05:46:46 +0200
commite5d2c25ecf8aeaa1f1dee9215cb70b82a9f74d45 (patch)
treecf03b5a184d097fc8a2169c3c6cd2e7b5db5ab56
parentMerge "Document the clang-format usage." (diff)
downloadandroid_bootable_recovery-e5d2c25ecf8aeaa1f1dee9215cb70b82a9f74d45.tar
android_bootable_recovery-e5d2c25ecf8aeaa1f1dee9215cb70b82a9f74d45.tar.gz
android_bootable_recovery-e5d2c25ecf8aeaa1f1dee9215cb70b82a9f74d45.tar.bz2
android_bootable_recovery-e5d2c25ecf8aeaa1f1dee9215cb70b82a9f74d45.tar.lz
android_bootable_recovery-e5d2c25ecf8aeaa1f1dee9215cb70b82a9f74d45.tar.xz
android_bootable_recovery-e5d2c25ecf8aeaa1f1dee9215cb70b82a9f74d45.tar.zst
android_bootable_recovery-e5d2c25ecf8aeaa1f1dee9215cb70b82a9f74d45.zip
-rw-r--r--Android.mk4
-rw-r--r--device.cpp80
-rw-r--r--device.h6
-rw-r--r--recovery.cpp4
4 files changed, 48 insertions, 46 deletions
diff --git a/Android.mk b/Android.mk
index afbc950fe..9dfb5f62c 100644
--- a/Android.mk
+++ b/Android.mk
@@ -185,10 +185,6 @@ LOCAL_STATIC_LIBRARIES := \
LOCAL_HAL_STATIC_LIBRARIES := libhealthd
-ifeq ($(AB_OTA_UPDATER),true)
- LOCAL_CFLAGS += -DAB_OTA_UPDATER=1
-endif
-
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
ifeq ($(BOARD_CACHEIMAGE_PARTITION_SIZE),)
diff --git a/device.cpp b/device.cpp
index 5cf9cc242..3c6334e5c 100644
--- a/device.cpp
+++ b/device.cpp
@@ -16,59 +16,57 @@
#include "device.h"
+#include <algorithm>
+#include <string>
+#include <utility>
+#include <vector>
+
#include <android-base/logging.h>
-#include <android-base/macros.h>
#include "ui.h"
-// clang-format off
-static constexpr const char* kItems[]{
- "Reboot system now",
- "Reboot to bootloader",
- "Apply update from ADB",
- "Apply update from SD card",
- "Wipe data/factory reset",
-#ifndef AB_OTA_UPDATER
- "Wipe cache partition",
-#endif // !AB_OTA_UPDATER
- "Mount /system",
- "View recovery logs",
- "Run graphics test",
- "Run locale test",
- "Power off",
-};
-// clang-format on
-
-// clang-format off
-static constexpr Device::BuiltinAction kMenuActions[] {
- Device::REBOOT,
- Device::REBOOT_BOOTLOADER,
- Device::APPLY_ADB_SIDELOAD,
- Device::APPLY_SDCARD,
- Device::WIPE_DATA,
-#ifndef AB_OTA_UPDATER
- Device::WIPE_CACHE,
-#endif // !AB_OTA_UPDATER
- Device::MOUNT_SYSTEM,
- Device::VIEW_RECOVERY_LOGS,
- Device::RUN_GRAPHICS_TEST,
- Device::RUN_LOCALE_TEST,
- Device::SHUTDOWN,
+static std::vector<std::pair<std::string, Device::BuiltinAction>> g_menu_actions{
+ { "Reboot system now", Device::REBOOT },
+ { "Reboot to bootloader", Device::REBOOT_BOOTLOADER },
+ { "Apply update from ADB", Device::APPLY_ADB_SIDELOAD },
+ { "Apply update from SD card", Device::APPLY_SDCARD },
+ { "Wipe data/factory reset", Device::WIPE_DATA },
+ { "Wipe cache partition", Device::WIPE_CACHE },
+ { "Mount /system", Device::MOUNT_SYSTEM },
+ { "View recovery logs", Device::VIEW_RECOVERY_LOGS },
+ { "Run graphics test", Device::RUN_GRAPHICS_TEST },
+ { "Run locale test", Device::RUN_LOCALE_TEST },
+ { "Power off", Device::SHUTDOWN },
};
-// clang-format on
-static_assert(arraysize(kItems) == arraysize(kMenuActions),
- "kItems and kMenuActions should have the same length.");
+static std::vector<std::string> g_menu_items;
+
+static void PopulateMenuItems() {
+ g_menu_items.clear();
+ std::transform(g_menu_actions.cbegin(), g_menu_actions.cend(), std::back_inserter(g_menu_items),
+ [](const auto& entry) { return entry.first; });
+}
+
+Device::Device(RecoveryUI* ui) : ui_(ui) {
+ PopulateMenuItems();
+}
+
+void Device::RemoveMenuItemForAction(Device::BuiltinAction action) {
+ g_menu_actions.erase(
+ std::remove_if(g_menu_actions.begin(), g_menu_actions.end(),
+ [action](const auto& entry) { return entry.second == action; }));
+ CHECK(!g_menu_actions.empty());
-static const std::vector<std::string> kMenuItems(kItems, kItems + arraysize(kItems));
+ // Re-populate the menu items.
+ PopulateMenuItems();
+}
const std::vector<std::string>& Device::GetMenuItems() {
- return kMenuItems;
+ return g_menu_items;
}
Device::BuiltinAction Device::InvokeMenuItem(size_t menu_position) {
- // CHECK_LT(menu_position, );
- return kMenuActions[menu_position];
+ return g_menu_actions[menu_position].second;
}
int Device::HandleMenuKey(int key, bool visible) {
diff --git a/device.h b/device.h
index bf148f576..9c433715b 100644
--- a/device.h
+++ b/device.h
@@ -49,7 +49,7 @@ class Device {
RUN_LOCALE_TEST = 12,
};
- explicit Device(RecoveryUI* ui) : ui_(ui) {}
+ explicit Device(RecoveryUI* ui);
virtual ~Device() {}
// Returns a raw pointer to the RecoveryUI object.
@@ -96,6 +96,10 @@ class Device {
// here and return NO_ACTION.
virtual BuiltinAction InvokeMenuItem(size_t menu_position);
+ // Removes the menu item for the given action. This allows tailoring the menu based on the
+ // runtime info, such as the availability of /cache or /sdcard.
+ virtual void RemoveMenuItemForAction(Device::BuiltinAction action);
+
// Called before and after we do a wipe data/factory reset operation, either via a reboot from the
// main system with the --wipe_data flag, or when the user boots into recovery image manually and
// selects the option from the menu, to perform whatever device-specific wiping actions as needed.
diff --git a/recovery.cpp b/recovery.cpp
index b11298fb4..e427998a8 100644
--- a/recovery.cpp
+++ b/recovery.cpp
@@ -1182,6 +1182,10 @@ int start_recovery(int argc, char** argv) {
}
ui = device->GetUI();
+ if (!has_cache) {
+ device->RemoveMenuItemForAction(Device::WIPE_CACHE);
+ }
+
// Set background string to "installing security update" for security update,
// otherwise set it to "installing system update".
ui->SetSystemUpdateText(security_update);