blob: dce8121a977816169557191500ac1108e5f67d80 [file] [log] [blame] [edit]
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "rmad/utils/cros_config_properties.h"
#include <optional>
#include <string>
#include <base/files/file_enumerator.h>
#include <base/files/file_util.h>
#include <base/strings/stringprintf.h>
namespace rmad {
namespace {
std::optional<std::string> ReadProperty(const base::FilePath& property_path) {
std::optional<std::string> ret = std::nullopt;
if (std::string value; base::ReadFileToString(property_path, &value)) {
ret = value;
}
return ret;
}
std::string StringDescription(const std::optional<std::string>& value) {
return value.has_value() ? value.value() : "N/A";
}
std::string StringNotEmptyDescription(const std::optional<std::string>& value) {
return (value.has_value() && value.value() != "") ? "Yes" : "No";
}
std::string StringIsExpectedDescription(const std::optional<std::string>& value,
const std::string& expect) {
return (value.has_value() && value.value() == expect) ? "Yes" : "No";
}
// Specifically for stylus.
std::string StylusDescription(const std::optional<std::string>& value) {
return (value.has_value() && value.value() != "unknown") ? value.value()
: "N/A";
}
// Specifically for cellular. The Firmware variant name can be "<model>" or
// "<model>_<chip>".
std::string CellularDescription(const std::optional<std::string>& value) {
if (!value.has_value()) {
return "No";
}
// Firmware variant is <model>_<chip>. Only return the <chip> part.
if (auto pos = value.value().find('_'); pos != std::string::npos) {
return base::StringPrintf("Yes(%s)", value.value().substr(pos + 1).c_str());
}
// Firmware variant is <model>. Just return "Yes".
return "Yes";
}
bool Has1080pSupport(const base::FilePath& camera_devices_path) {
base::FileEnumerator e(camera_devices_path,
/*recursive=*/false,
base::FileEnumerator::FileType::DIRECTORIES);
for (base::FilePath device_path = e.Next(); !device_path.empty();
device_path = e.Next()) {
base::FilePath path = device_path.Append(kCrosCameraFlagsPath)
.Append(kCrosCameraSupport1080pKey);
std::optional<std::string> value = ReadProperty(path);
if (value.has_value() && value.value() == "true") {
return true;
}
}
return false;
}
std::string GetWifiType(const base::FilePath& wifi_path) {
if (base::PathExists(wifi_path.Append(kCrosWifiAth10kTabletModePath)) ||
base::PathExists(wifi_path.Append(kCrosWifiAth10kNonTabletModePath))) {
return "Qualcomm";
}
if (base::PathExists(wifi_path.Append(kCrosWifiRtwTabletModePath)) ||
base::PathExists(wifi_path.Append(kCrosWifiRtwNonTabletModePath))) {
return "Realtek";
}
if (base::PathExists(wifi_path.Append(kCrosWifiMtkTabletModePath)) ||
base::PathExists(wifi_path.Append(kCrosWifiMtkNonTabletModePath))) {
return "MediaTek";
}
if (base::PathExists(wifi_path.Append(kCrosWifiSarFilePath))) {
return "Intel";
}
return "N/A";
}
} // namespace
std::string GetHasTouchscreenDescription(const base::FilePath& root_path) {
base::FilePath path = root_path.Append(kCrosHardwarePropertiesPath)
.Append(kCrosHardwarePropertiesHasTouchscreenKey);
std::optional<std::string> value = ReadProperty(path);
return std::string("Touchscreen:") +
StringIsExpectedDescription(value, "true");
}
std::string GetHasPrivacyScreenDescription(const base::FilePath& root_path) {
base::FilePath path = root_path.Append(kCrosHardwarePropertiesPath)
.Append(kCrosHardwarePropertiesHasPrivacyScreenKey);
std::optional<std::string> value = ReadProperty(path);
return std::string("PrivacyScreen:") +
StringIsExpectedDescription(value, "true");
}
std::string GetHasHdmiDescription(const base::FilePath& root_path) {
base::FilePath path = root_path.Append(kCrosHardwarePropertiesPath)
.Append(kCrosHardwarePropertiesHasHdmiKey);
std::optional<std::string> value = ReadProperty(path);
return std::string("HDMI:") + StringIsExpectedDescription(value, "true");
}
std::string GetHasSdReaderDescription(const base::FilePath& root_path) {
base::FilePath path = root_path.Append(kCrosHardwarePropertiesPath)
.Append(kCrosHardwarePropertiesHasSdReaderKey);
std::optional<std::string> value = ReadProperty(path);
return std::string("SDReader:") + StringIsExpectedDescription(value, "true");
}
std::string GetStylusCategoryDescription(const base::FilePath& root_path) {
base::FilePath path = root_path.Append(kCrosHardwarePropertiesPath)
.Append(kCrosHardwarePropertiesStylusCategoryKey);
std::optional<std::string> value = ReadProperty(path);
return std::string("Stylus:") + StylusDescription(value);
}
std::string GetFormFactorDescription(const base::FilePath& root_path) {
base::FilePath path = root_path.Append(kCrosHardwarePropertiesPath)
.Append(kCrosHardwarePropertiesFormFactorKey);
std::optional<std::string> value = ReadProperty(path);
return std::string("FormFactor:") + StringDescription(value);
}
std::string GetStorageTypeDescription(const base::FilePath& root_path) {
base::FilePath path = root_path.Append(kCrosHardwarePropertiesPath)
.Append(kCrosHardwarePropertiesStorageTypeKey);
std::optional<std::string> value = ReadProperty(path);
return std::string("Storage:") + StringDescription(value);
}
std::string GetCellularDescription(const base::FilePath& root_path) {
base::FilePath path =
root_path.Append(kCrosModemPath).Append(kCrosModemFirmwareVariantKey);
std::optional<std::string> value = ReadProperty(path);
return std::string("Cellular:") + CellularDescription(value);
}
std::string GetHasFingerprintDescription(const base::FilePath& root_path) {
base::FilePath path = root_path.Append(kCrosFingerprintPath)
.Append(kCrosFingerprintSensorLocationKey);
std::optional<std::string> value = ReadProperty(path);
return std::string("Fingerprint:") + StringNotEmptyDescription(value);
}
std::string GetAudioUcmSuffixDescription(const base::FilePath& root_path) {
base::FilePath path = root_path.Append(kCrosAudioPath)
.Append(kCrosAudioMainPath)
.Append(kCrosAudioUcmSuffixKey);
std::optional<std::string> value = ReadProperty(path);
return std::string("Audio:") + StringDescription(value);
}
std::string GetAudioCrasConfigDirDescription(const base::FilePath& root_path) {
base::FilePath path = root_path.Append(kCrosAudioPath)
.Append(kCrosAudioMainPath)
.Append(kCrosAudioCrasConfigDirKey);
std::optional<std::string> value = ReadProperty(path);
return std::string("CrasConfig:") + StringDescription(value);
}
std::string GetHasKeyboardBacklightDescription(
const base::FilePath& root_path) {
base::FilePath path = root_path.Append(kCrosPowerPath)
.Append(kCrosPowerHasKeyboardBacklightKey);
std::optional<std::string> value = ReadProperty(path);
return std::string("KeyboardBacklight:") +
StringIsExpectedDescription(value, "1");
}
std::string GetCameraCountDescription(const base::FilePath& root_path) {
base::FilePath path =
root_path.Append(kCrosCameraPath).Append(kCrosCameraCountKey);
std::optional<std::string> value = ReadProperty(path);
return std::string("CameraCount:") + StringDescription(value);
}
std::string GetHas1080pCameraDescription(const base::FilePath& root_path) {
base::FilePath camera_devices_path =
root_path.Append(kCrosCameraPath).Append(kCrosCameraDevicesPath);
return std::string("Camera1080p:") +
(Has1080pSupport(camera_devices_path) ? "Yes" : "No");
}
std::string GetHasProximitySensorDescription(const base::FilePath& root_path) {
base::FilePath path = root_path.Append(kCrosProximitySensorPath);
std::optional<std::string> value = ReadProperty(path);
return std::string("ProximitySensor:") +
(base::PathExists(path) ? "Yes" : "No");
}
std::string GetWifiDescription(const base::FilePath& root_path) {
base::FilePath wifi_path = root_path.Append(kCrosWifiPath);
return std::string("Wifi:") + GetWifiType(wifi_path);
}
} // namespace rmad