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

Commit 59a6be3c authored by Vishnu Nair's avatar Vishnu Nair
Browse files

Introduce eCanOccludePresentation layer flag

Sets a property on a layer hierarchy indicating that its visible region
should be considered when computing TrustedPresentation
Thresholds. This property is set on a layer and inherited by all its
children. The property is then passed via windowinfos so the
TrustedPresentation controller can determine which windows to
use when computing the thresholds.

Test: presubmit
Bug: b/275574214
Change-Id: Ide384c64cb7b5a9b2b3ce293b20e2be64da8ad69
parent ca103c0a
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -199,7 +199,7 @@ status_t layer_state_t::write(Parcel& output) const
    SAFE_PARCEL(output.writeParcelable, trustedPresentationListener);
    SAFE_PARCEL(output.writeFloat, currentHdrSdrRatio);
    SAFE_PARCEL(output.writeFloat, desiredHdrSdrRatio);
    SAFE_PARCEL(output.writeInt32, static_cast<int32_t>(cachingHint))
    SAFE_PARCEL(output.writeInt32, static_cast<int32_t>(cachingHint));
    return NO_ERROR;
}

@@ -484,6 +484,12 @@ void layer_state_t::sanitize(int32_t permissions) {
            flags &= ~eLayerIsDisplayDecoration;
            ALOGE("Stripped attempt to set LayerIsDisplayDecoration in sanitize");
        }
        if ((mask & eCanOccludePresentation) &&
            !(permissions & Permission::ACCESS_SURFACE_FLINGER)) {
            flags &= ~eCanOccludePresentation;
            mask &= ~eCanOccludePresentation;
            ALOGE("Stripped attempt to set eCanOccludePresentation in sanitize");
        }
    }

    if (what & layer_state_t::eInputInfoChanged) {
+8 −4
Original line number Diff line number Diff line
@@ -109,7 +109,8 @@ bool WindowInfo::operator==(const WindowInfo& info) const {
            info.inputConfig == inputConfig && info.displayId == displayId &&
            info.replaceTouchableRegionWithCrop == replaceTouchableRegionWithCrop &&
            info.applicationInfo == applicationInfo && info.layoutParamsType == layoutParamsType &&
            info.layoutParamsFlags == layoutParamsFlags;
            info.layoutParamsFlags == layoutParamsFlags &&
            info.canOccludePresentation == canOccludePresentation;
}

status_t WindowInfo::writeToParcel(android::Parcel* parcel) const {
@@ -158,8 +159,9 @@ status_t WindowInfo::writeToParcel(android::Parcel* parcel) const {
        parcel->write(touchableRegion) ?:
        parcel->writeBool(replaceTouchableRegionWithCrop) ?:
        parcel->writeStrongBinder(touchableRegionCropHandle.promote()) ?:
        parcel->writeStrongBinder(windowToken);
        parcel->writeStrongBinder(focusTransferTarget);
        parcel->writeStrongBinder(windowToken) ?:
        parcel->writeStrongBinder(focusTransferTarget) ?:
        parcel->writeBool(canOccludePresentation);
    // clang-format on
    return status;
}
@@ -210,7 +212,8 @@ status_t WindowInfo::readFromParcel(const android::Parcel* parcel) {
        parcel->readBool(&replaceTouchableRegionWithCrop) ?:
        parcel->readNullableStrongBinder(&touchableRegionCropHandleSp) ?:
        parcel->readNullableStrongBinder(&windowToken) ?:
        parcel->readNullableStrongBinder(&focusTransferTarget);
        parcel->readNullableStrongBinder(&focusTransferTarget) ?:
        parcel->readBool(&canOccludePresentation);

    // clang-format on

@@ -273,6 +276,7 @@ std::ostream& operator<<(std::ostream& out, const WindowInfo& info) {
        << "ms, token=" << info.token.get()
        << ", touchOcclusionMode=" << ftl::enum_string(info.touchOcclusionMode) << "\n"
        << transform;
    if (info.canOccludePresentation) out << " canOccludePresentation";
    return out;
}

+3 −0
Original line number Diff line number Diff line
@@ -161,6 +161,9 @@ struct layer_state_t {
        // See SurfaceView scaling behavior for more details.
        eIgnoreDestinationFrame = 0x400,
        eLayerIsRefreshRateIndicator = 0x800, // REFRESH_RATE_INDICATOR
        // Sets a property on this layer indicating that its visible region should be considered
        // when computing TrustedPresentation Thresholds.
        eCanOccludePresentation = 0x1000,
    };

    enum {
+4 −0
Original line number Diff line number Diff line
@@ -246,6 +246,10 @@ struct WindowInfo : public Parcelable {
    // any other window.
    sp<IBinder> focusTransferTarget;

    // Sets a property on this window indicating that its visible region should be considered when
    // computing TrustedPresentation Thresholds.
    bool canOccludePresentation = false;

    void setInputConfig(ftl::Flags<InputConfig> config, bool value);

    void addTouchableRegion(const Rect& region);
+1 −0
Original line number Diff line number Diff line
@@ -315,6 +315,7 @@ std::ostream& operator<<(std::ostream& out, const LayerSnapshot& obj) {
    if (obj.hasInputInfo()) {
        out << "\n    input{"
            << "(" << obj.inputInfo.inputConfig.string() << ")";
        if (obj.inputInfo.canOccludePresentation) out << " canOccludePresentation";
        if (obj.touchCropId != UNASSIGNED_LAYER_ID) out << " touchCropId=" << obj.touchCropId;
        if (obj.inputInfo.replaceTouchableRegionWithCrop) out << " replaceTouchableRegionWithCrop";
        auto touchableRegion = obj.inputInfo.touchableRegion.getBounds();
Loading