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

Commit 3268df1f authored by Daniel Zheng's avatar Daniel Zheng
Browse files

composer: surface screen part status

The overview of the architecture here looks like this. Our
TradeInMode service will make a call to surfaceComposer which will then
ask surfaceFlinger to return the displayIdentification info. We can
gather all the physical display ID's through DisplayControl

Flag: com.android.tradeinmode.flags.trade_in_mode_2025q4
Test: manual testing on pixel fold
Change-Id: I3234d45aa3f9c538a3ba3f01f55428a935267e30
parent 0b7e13d9
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -394,7 +394,8 @@ std::optional<PnpId> getPnpId(uint16_t manufacturerId) {
}

std::optional<DisplayIdentificationInfo> parseDisplayIdentificationData(
        uint8_t port, const DisplayIdentificationData& data) {
        uint8_t port, const DisplayIdentificationData& data,
        android::ScreenPartStatus screenPartStatus) {
    if (data.empty()) {
        ALOGI("Display identification data is empty.");
        return {};
@@ -417,6 +418,7 @@ std::optional<DisplayIdentificationInfo> parseDisplayIdentificationData(
            .port = port,
            .deviceProductInfo = buildDeviceProductInfo(*edid),
            .preferredDetailedTimingDescriptor = edid->preferredDetailedTimingDescriptor,
            .screenPartStatus = screenPartStatus,
    };
}

+1 −1
Original line number Diff line number Diff line
@@ -105,7 +105,7 @@ std::optional<Edid> parseEdid(const DisplayIdentificationData&);
std::optional<PnpId> getPnpId(uint16_t manufacturerId);

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

PhysicalDisplayId getVirtualDisplayId(uint32_t id);

+26 −9
Original line number Diff line number Diff line
@@ -361,13 +361,18 @@ TEST(DisplayIdentificationTest, getPnpId) {
}

TEST(DisplayIdentificationTest, parseDisplayIdentificationData) {
    const auto primaryInfo = parseDisplayIdentificationData(0, getInternalEdid());
    const auto primaryInfo = parseDisplayIdentificationData(0, getInternalEdid(),
                                                            android::ScreenPartStatus::UNSUPPORTED);
    ASSERT_TRUE(primaryInfo);

    const auto secondaryInfo = parseDisplayIdentificationData(1, getExternalEdid());
    const auto secondaryInfo =
            parseDisplayIdentificationData(1, getExternalEdid(),
                                           android::ScreenPartStatus::UNSUPPORTED);
    ASSERT_TRUE(secondaryInfo);

    const auto tertiaryInfo = parseDisplayIdentificationData(2, getExternalEedid());
    const auto tertiaryInfo =
            parseDisplayIdentificationData(2, getExternalEedid(),
                                           android::ScreenPartStatus::UNSUPPORTED);
    ASSERT_TRUE(tertiaryInfo);

    // Display IDs should be unique.
@@ -398,7 +403,9 @@ TEST(DisplayIdentificationTest, deviceProductInfo) {
    using ModelYear = DeviceProductInfo::ModelYear;

    {
        const auto displayIdInfo = parseDisplayIdentificationData(0, getInternalEdid());
        const auto displayIdInfo =
                parseDisplayIdentificationData(0, getInternalEdid(),
                                               android::ScreenPartStatus::UNSUPPORTED);
        ASSERT_TRUE(displayIdInfo);
        ASSERT_TRUE(displayIdInfo->deviceProductInfo);
        const auto& info = *displayIdInfo->deviceProductInfo;
@@ -410,7 +417,9 @@ TEST(DisplayIdentificationTest, deviceProductInfo) {
        EXPECT_TRUE(info.relativeAddress.empty());
    }
    {
        const auto displayIdInfo = parseDisplayIdentificationData(0, getExternalEdid());
        const auto displayIdInfo =
                parseDisplayIdentificationData(0, getExternalEdid(),
                                               android::ScreenPartStatus::UNSUPPORTED);
        ASSERT_TRUE(displayIdInfo);
        ASSERT_TRUE(displayIdInfo->deviceProductInfo);
        const auto& info = *displayIdInfo->deviceProductInfo;
@@ -424,7 +433,9 @@ TEST(DisplayIdentificationTest, deviceProductInfo) {
        EXPECT_TRUE(info.relativeAddress.empty());
    }
    {
        const auto displayIdInfo = parseDisplayIdentificationData(0, getExternalEedid());
        const auto displayIdInfo =
                parseDisplayIdentificationData(0, getExternalEedid(),
                                               android::ScreenPartStatus::UNSUPPORTED);
        ASSERT_TRUE(displayIdInfo);
        ASSERT_TRUE(displayIdInfo->deviceProductInfo);
        const auto& info = *displayIdInfo->deviceProductInfo;
@@ -438,7 +449,9 @@ TEST(DisplayIdentificationTest, deviceProductInfo) {
        EXPECT_THAT(info.relativeAddress, ElementsAre(2, 0, 0, 0));
    }
    {
        const auto displayIdInfo = parseDisplayIdentificationData(0, getPanasonicTvEdid());
        const auto displayIdInfo =
                parseDisplayIdentificationData(0, getPanasonicTvEdid(),
                                               android::ScreenPartStatus::UNSUPPORTED);
        ASSERT_TRUE(displayIdInfo);
        ASSERT_TRUE(displayIdInfo->deviceProductInfo);
        const auto& info = *displayIdInfo->deviceProductInfo;
@@ -451,7 +464,9 @@ TEST(DisplayIdentificationTest, deviceProductInfo) {
        EXPECT_THAT(info.relativeAddress, ElementsAre(2, 0, 0, 0));
    }
    {
        const auto displayIdInfo = parseDisplayIdentificationData(0, getHisenseTvEdid());
        const auto displayIdInfo =
                parseDisplayIdentificationData(0, getHisenseTvEdid(),
                                               android::ScreenPartStatus::UNSUPPORTED);
        ASSERT_TRUE(displayIdInfo);
        ASSERT_TRUE(displayIdInfo->deviceProductInfo);
        const auto& info = *displayIdInfo->deviceProductInfo;
@@ -465,7 +480,9 @@ TEST(DisplayIdentificationTest, deviceProductInfo) {
        EXPECT_THAT(info.relativeAddress, ElementsAre(1, 2, 3, 4));
    }
    {
        const auto displayIdInfo = parseDisplayIdentificationData(0, getCtlDisplayEdid());
        const auto displayIdInfo =
                parseDisplayIdentificationData(0, getCtlDisplayEdid(),
                                               android::ScreenPartStatus::UNSUPPORTED);
        ASSERT_TRUE(displayIdInfo);
        ASSERT_TRUE(displayIdInfo->deviceProductInfo);
        const auto& info = *displayIdInfo->deviceProductInfo;
+5 −1
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <common/trace.h>
#include <fmt/core.h>
#include <log/log.h>
#include <ui/DisplayIdentification.h>

#include <aidl/android/hardware/graphics/composer3/BnComposerCallback.h>

@@ -1271,7 +1272,8 @@ Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outM
}

Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
                                                 std::vector<uint8_t>* outData) {
                                                 std::vector<uint8_t>* outData,
                                                 android::ScreenPartStatus* outScreenPartStatus) {
    AidlDisplayIdentification displayIdentification;
    const auto status =
            mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
@@ -1283,6 +1285,8 @@ Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPo

    *outPort = static_cast<uint8_t>(displayIdentification.port);
    *outData = displayIdentification.data;
    *outScreenPartStatus =
            static_cast<android::ScreenPartStatus>(displayIdentification.screenPartStatus);

    return Error::NONE;
}
+3 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include "ComposerHal.h"

#include <ftl/shared_mutex.h>
#include <ui/DisplayIdentification.h>
#include <ui/DisplayMap.h>

#include <functional>
@@ -180,7 +181,8 @@ public:

    // Composer HAL 2.3
    Error getDisplayIdentificationData(Display display, uint8_t* outPort,
                                       std::vector<uint8_t>* outData) override;
                                       std::vector<uint8_t>* outData,
                                       android::ScreenPartStatus* outScreenPartStatus) override;
    Error setLayerColorTransform(Display display, Layer layer, const float* matrix) override;
    Error getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
                                                Dataspace* outDataspace,
Loading