Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2c6f4752 authored by Gil Dekel's avatar Gil Dekel
Browse files

SF: Decouple ID parsing from flags and sysprops

This change refactors parseDisplayIdentificationData to no longer
directly query the stable_edid_ids feature flag. Instead, it now accepts
a useStableEdidIds boolean parameter to control whether to generate a
stable ID from EDID or use the legacy port-based scheme.

This refactoring decouples the parsing logic from the global
FlagManager, making the function a more self-contained utility. It also
improves testability, as both code paths can now be tested by simply
passing true or false without needing to mock the feature flag state.

The call sites in HWComposer have been updated to read the flag and pass
the value down to the function, preserving the existing behavior.

Bug: 440590608
Flag: EXEMPT PURE_REFACTOR
Test: Presubmit
Change-Id: If2a4c4698de9884b9bcbec00cb8f4999023d0342
parent 8176452d
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -428,7 +428,7 @@ std::optional<PnpId> getPnpId(uint16_t manufacturerId) {


std::optional<DisplayIdentificationInfo> parseDisplayIdentificationData(
std::optional<DisplayIdentificationInfo> parseDisplayIdentificationData(
        uint8_t port, const DisplayIdentificationData& data,
        uint8_t port, const DisplayIdentificationData& data,
        android::ScreenPartStatus screenPartStatus) {
        android::ScreenPartStatus screenPartStatus, bool useStableEdidIds) {
    if (data.empty()) {
    if (data.empty()) {
        ALOGI("Display identification data is empty.");
        ALOGI("Display identification data is empty.");
        return {};
        return {};
@@ -444,7 +444,7 @@ std::optional<DisplayIdentificationInfo> parseDisplayIdentificationData(
        return {};
        return {};
    }
    }


    const auto displayId = FlagManager::getInstance().stable_edid_ids()
    const auto displayId = useStableEdidIds
            ? generateEdidDisplayId(*edid)
            ? generateEdidDisplayId(*edid)
            : PhysicalDisplayId::fromEdid(port, edid->manufacturerId, edid->modelHash);
            : PhysicalDisplayId::fromEdid(port, edid->manufacturerId, edid->modelHash);
    return DisplayIdentificationInfo{
    return DisplayIdentificationInfo{
+2 −1
Original line number Original line Diff line number Diff line
@@ -100,7 +100,8 @@ std::optional<Edid> parseEdid(const DisplayIdentificationData&);
std::optional<PnpId> getPnpId(uint16_t manufacturerId);
std::optional<PnpId> getPnpId(uint16_t manufacturerId);


std::optional<DisplayIdentificationInfo> parseDisplayIdentificationData(
std::optional<DisplayIdentificationInfo> parseDisplayIdentificationData(
        uint8_t port, const DisplayIdentificationData&, android::ScreenPartStatus screenPartStatus);
        uint8_t port, const DisplayIdentificationData&, android::ScreenPartStatus screenPartStatus,
        bool useStableEdidIds = true);


PhysicalDisplayId resolveDisplayIdCollision(PhysicalDisplayId id, uint8_t port);
PhysicalDisplayId resolveDisplayIdCollision(PhysicalDisplayId id, uint8_t port);


+7 −4
Original line number Original line Diff line number Diff line
@@ -1202,6 +1202,7 @@ bool HWComposer::shouldIgnoreHotplugConnect(hal::HWDisplayId hwcDisplayId, uint8


std::optional<display::DisplayIdentificationInfo> HWComposer::onHotplugConnect(
std::optional<display::DisplayIdentificationInfo> HWComposer::onHotplugConnect(
        hal::HWDisplayId hwcDisplayId) {
        hal::HWDisplayId hwcDisplayId) {
    const bool useStableEdidIds = FlagManager::getInstance().stable_edid_ids();
    std::optional<display::DisplayIdentificationInfo> info;
    std::optional<display::DisplayIdentificationInfo> info;
    if (const auto displayId = toPhysicalDisplayId(hwcDisplayId)) {
    if (const auto displayId = toPhysicalDisplayId(hwcDisplayId)) {
        info = display::DisplayIdentificationInfo{.id = *displayId,
        info = display::DisplayIdentificationInfo{.id = *displayId,
@@ -1214,8 +1215,8 @@ std::optional<display::DisplayIdentificationInfo> HWComposer::onHotplugConnect(
            display::DisplayIdentificationData data;
            display::DisplayIdentificationData data;
            android::ScreenPartStatus screenPartStatus;
            android::ScreenPartStatus screenPartStatus;
            getDisplayIdentificationData(hwcDisplayId, &port, &data, &screenPartStatus);
            getDisplayIdentificationData(hwcDisplayId, &port, &data, &screenPartStatus);
            if (auto newInfo =
            if (auto newInfo = display::parseDisplayIdentificationData(port, data, screenPartStatus,
                        display::parseDisplayIdentificationData(port, data, screenPartStatus)) {
                                                                       useStableEdidIds)) {
                info->deviceProductInfo = std::move(newInfo->deviceProductInfo);
                info->deviceProductInfo = std::move(newInfo->deviceProductInfo);
                info->preferredDetailedTimingDescriptor =
                info->preferredDetailedTimingDescriptor =
                        std::move(newInfo->preferredDetailedTimingDescriptor);
                        std::move(newInfo->preferredDetailedTimingDescriptor);
@@ -1239,11 +1240,13 @@ std::optional<display::DisplayIdentificationInfo> HWComposer::onHotplugConnect(
            return {};
            return {};
        }
        }


        info = [this, hwcDisplayId, &port, &data, &screenPartStatus, hasDisplayIdentificationData] {
        info = [this, hwcDisplayId, useStableEdidIds, &port, &data, &screenPartStatus,
                hasDisplayIdentificationData] {
            const bool isPrimary = !mPrimaryHwcDisplayId;
            const bool isPrimary = !mPrimaryHwcDisplayId;
            if (mHasMultiDisplaySupport) {
            if (mHasMultiDisplaySupport) {
                if (auto info =
                if (auto info =
                            display::parseDisplayIdentificationData(port, data, screenPartStatus)) {
                            display::parseDisplayIdentificationData(port, data, screenPartStatus,
                                                                    useStableEdidIds)) {
                    if (FlagManager::getInstance().stable_edid_ids() &&
                    if (FlagManager::getInstance().stable_edid_ids() &&
                        hasDisplayWithId(info->id)) {
                        hasDisplayWithId(info->id)) {
                        info->id = display::resolveDisplayIdCollision(info->id, info->port);
                        info->id = display::resolveDisplayIdCollision(info->id, info->port);