2018-07-28 07:09:12 +02:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2018 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 "fastboot.h"
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
#include <android-base/logging.h>
|
|
|
|
#include <android-base/properties.h>
|
|
|
|
#include <bootloader_message/bootloader_message.h>
|
|
|
|
|
2018-08-20 22:40:47 +02:00
|
|
|
#include "recovery_ui/ui.h"
|
2018-07-28 07:09:12 +02:00
|
|
|
|
|
|
|
static const std::vector<std::pair<std::string, Device::BuiltinAction>> kFastbootMenuActions{
|
recovery: report compliant reboot reason (Part Deux)
shutdown and reboot should have a corresponding sub-reason.
Adding:
"reboot,userrequested,fastboot"
"reboot,userrequested,recovery"
"reboot,userrequested,recovery,ui"
"shutdown,userrequested,fastboot"
"shutdown,userrequested,recovery"
"reboot,unknown#" (Can't happen, debug)
Test: manual, multiple targets, enter recovery, be able to exit recovery
Bug: 133326470
Change-Id: Ibfcb2a23158e8e99922e8053edd815fb592150f2
2019-05-20 19:36:16 +02:00
|
|
|
{ "Reboot system now", Device::REBOOT_FROM_FASTBOOT },
|
2018-07-28 07:09:12 +02:00
|
|
|
{ "Enter recovery", Device::ENTER_RECOVERY },
|
|
|
|
{ "Reboot to bootloader", Device::REBOOT_BOOTLOADER },
|
recovery: report compliant reboot reason (Part Deux)
shutdown and reboot should have a corresponding sub-reason.
Adding:
"reboot,userrequested,fastboot"
"reboot,userrequested,recovery"
"reboot,userrequested,recovery,ui"
"shutdown,userrequested,fastboot"
"shutdown,userrequested,recovery"
"reboot,unknown#" (Can't happen, debug)
Test: manual, multiple targets, enter recovery, be able to exit recovery
Bug: 133326470
Change-Id: Ibfcb2a23158e8e99922e8053edd815fb592150f2
2019-05-20 19:36:16 +02:00
|
|
|
{ "Power off", Device::SHUTDOWN_FROM_FASTBOOT },
|
2018-07-28 07:09:12 +02:00
|
|
|
};
|
|
|
|
|
2023-06-14 00:28:43 +02:00
|
|
|
void FillDefaultFastbootLines(std::vector<std::string>& title_lines) {
|
|
|
|
title_lines.push_back("Android Fastboot");
|
2018-07-28 07:09:12 +02:00
|
|
|
title_lines.push_back("Product name - " + android::base::GetProperty("ro.product.device", ""));
|
|
|
|
title_lines.push_back("Bootloader version - " + android::base::GetProperty("ro.bootloader", ""));
|
|
|
|
title_lines.push_back("Baseband version - " +
|
|
|
|
android::base::GetProperty("ro.build.expect.baseband", ""));
|
|
|
|
title_lines.push_back("Serial number - " + android::base::GetProperty("ro.serialno", ""));
|
|
|
|
title_lines.push_back(std::string("Secure boot - ") +
|
|
|
|
((android::base::GetProperty("ro.secure", "") == "1") ? "yes" : "no"));
|
|
|
|
title_lines.push_back("HW version - " + android::base::GetProperty("ro.revision", ""));
|
2023-06-14 00:28:43 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void FillWearableFastbootLines(std::vector<std::string>& title_lines) {
|
|
|
|
title_lines.push_back("Android Fastboot");
|
|
|
|
title_lines.push_back(android::base::GetProperty("ro.product.device", "") + " - " +
|
|
|
|
android::base::GetProperty("ro.revision", ""));
|
|
|
|
title_lines.push_back(android::base::GetProperty("ro.bootloader", ""));
|
|
|
|
|
|
|
|
const size_t max_baseband_len = 24;
|
|
|
|
const std::string& baseband = android::base::GetProperty("ro.build.expect.baseband", "");
|
|
|
|
title_lines.push_back(baseband.length() > max_baseband_len
|
|
|
|
? baseband.substr(0, max_baseband_len - 3) + "..."
|
|
|
|
: baseband);
|
|
|
|
|
|
|
|
title_lines.push_back("Serial #: " + android::base::GetProperty("ro.serialno", ""));
|
|
|
|
}
|
|
|
|
|
|
|
|
Device::BuiltinAction StartFastboot(Device* device, const std::vector<std::string>& /* args */) {
|
|
|
|
RecoveryUI* ui = device->GetUI();
|
|
|
|
std::vector<std::string> title_lines;
|
|
|
|
|
|
|
|
if (ui->IsWearable()) {
|
|
|
|
FillWearableFastbootLines(title_lines);
|
|
|
|
} else {
|
2023-11-08 01:04:58 +01:00
|
|
|
ui->SetEnableFastbootdLogo(true);
|
2023-06-14 00:28:43 +02:00
|
|
|
FillDefaultFastbootLines(title_lines);
|
|
|
|
}
|
2018-07-28 07:09:12 +02:00
|
|
|
|
|
|
|
ui->ResetKeyInterruptStatus();
|
|
|
|
ui->SetTitle(title_lines);
|
|
|
|
ui->ShowText(true);
|
2020-04-22 05:58:04 +02:00
|
|
|
device->StartFastboot();
|
2018-07-28 07:09:12 +02:00
|
|
|
|
|
|
|
// Reset to normal system boot so recovery won't cycle indefinitely.
|
|
|
|
// TODO(b/112277594) Clear only if 'recovery' field of BCB is empty. If not,
|
|
|
|
// set the 'command' field of BCB to 'boot-recovery' so the next boot is into recovery
|
|
|
|
// to finish any interrupted tasks.
|
|
|
|
std::string err;
|
|
|
|
if (!clear_bootloader_message(&err)) {
|
|
|
|
LOG(ERROR) << "Failed to clear BCB message: " << err;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::vector<std::string> fastboot_menu_items;
|
|
|
|
std::transform(kFastbootMenuActions.cbegin(), kFastbootMenuActions.cend(),
|
|
|
|
std::back_inserter(fastboot_menu_items),
|
|
|
|
[](const auto& entry) { return entry.first; });
|
|
|
|
|
|
|
|
auto chosen_item = ui->ShowMenu(
|
|
|
|
{}, fastboot_menu_items, 0, false,
|
|
|
|
std::bind(&Device::HandleMenuKey, device, std::placeholders::_1, std::placeholders::_2));
|
|
|
|
|
|
|
|
if (chosen_item == static_cast<size_t>(RecoveryUI::KeyError::INTERRUPTED)) {
|
|
|
|
return Device::KEY_INTERRUPTED;
|
|
|
|
}
|
|
|
|
if (chosen_item == static_cast<size_t>(RecoveryUI::KeyError::TIMED_OUT)) {
|
|
|
|
return Device::BuiltinAction::NO_ACTION;
|
|
|
|
}
|
|
|
|
return kFastbootMenuActions[chosen_item].second;
|
|
|
|
}
|