From e5d2c25ecf8aeaa1f1dee9215cb70b82a9f74d45 Mon Sep 17 00:00:00 2001 From: Tao Bao Date: Wed, 9 May 2018 11:05:44 -0700 Subject: recovery: Configure device menu based on runtime info. Drop the dependency on build time flag of AB_OTA_UPDATER when compiling device.cpp. Note that AB_OTA_UPDATER still guards the package install behavior (install.cpp). This can be extended to cover the entry of "Apply update from SD card". Test: Build and boot into recovery on angler and walleye respectively. Check the recovery menu. Change-Id: I36a6a6b4101ba61d4d374e32353c36cc5716f9ce --- Android.mk | 4 --- device.cpp | 80 +++++++++++++++++++++++++++++------------------------------- device.h | 6 ++++- recovery.cpp | 4 +++ 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 +#include +#include +#include + #include -#include #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> 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 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 kMenuItems(kItems, kItems + arraysize(kItems)); + // Re-populate the menu items. + PopulateMenuItems(); +} const std::vector& 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); -- cgit v1.2.3