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

Commit 6ec03528 authored by Ramkumar Radhakrishnan's avatar Ramkumar Radhakrishnan Committed by Steve Kondik
Browse files

frameworks/native: Add support for Secure Display

- Add secure UI layers to primary and remove other layers from
  internal and external list for Secure Display usecase.
- Dont let secure UI layers to be captured on screen

Change-Id: Iebdad5c56247308604ee90928f6d6460a1f69279
parent ee9ae7b8
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -1292,6 +1292,18 @@ bool Layer::isIntOnly() const
    }
    return false;
}

bool Layer::isSecureDisplay() const
{
    const sp<GraphicBuffer>& activeBuffer(mActiveBuffer);
    if (activeBuffer != 0) {
        uint32_t usage = activeBuffer->getUsage();
        if(usage & GRALLOC_USAGE_PRIVATE_SECURE_DISPLAY)
            return true;
    }
    return false;
}

#endif
// ---------------------------------------------------------------------------
}; // namespace android
+1 −0
Original line number Diff line number Diff line
@@ -266,6 +266,7 @@ public:
#ifdef QCOM_BSP
    virtual bool isExtOnly() const;
    virtual bool isIntOnly() const;
    virtual bool isSecureDisplay() const;
#endif

    /*
+19 −4
Original line number Diff line number Diff line
@@ -1599,18 +1599,25 @@ void SurfaceFlinger::computeVisibleRegions(size_t dpy,

    outDirtyRegion.clear();
    bool bIgnoreLayers = false;
    int extOnlyLayerIndex = -1;
    int indexLOI = -1;
    size_t i = currentLayers.size();
#ifdef QCOM_BSP
    while (i--) {
        const sp<Layer>& layer = currentLayers[i];
        // iterate through the layer list to find ext_only layers and store
        // the index
        if ((dpy && layer->isExtOnly())) {
        if (layer->isSecureDisplay()) {
            bIgnoreLayers = true;
            extOnlyLayerIndex = i;
            indexLOI = -1;
            if(!dpy)
                indexLOI = i;
            break;
        }

        if (dpy && layer->isExtOnly()) {
            bIgnoreLayers = true;
            indexLOI = i;
        }
    }
    i = currentLayers.size();
#endif
@@ -1624,7 +1631,9 @@ void SurfaceFlinger::computeVisibleRegions(size_t dpy,
        // Only add the layer marked as "external_only" to external list and
        // only remove the layer marked as "external_only" from primary list
        // and do not add the layer marked as "internal_only" to external list
        if((bIgnoreLayers && extOnlyLayerIndex != (int)i) ||
        // Add secure UI layers to primary and remove other layers from internal
        //and external list
        if((bIgnoreLayers && indexLOI != (int)i) ||
           (!dpy && layer->isExtOnly()) ||
           (dpy && layer->isIntOnly())) {
            // Ignore all other layers except the layers marked as ext_only
@@ -3095,6 +3104,12 @@ void SurfaceFlinger::renderScreenImplLocked(
        const Layer::State& state(layer->getDrawingState());
        if (state.layerStack == hw->getLayerStack()) {
            if (state.z >= minLayerZ && state.z <= maxLayerZ) {
#ifdef QCOM_BSP
                // dont render the secure Display Layer
                if(layer->isSecureDisplay()) {
                    continue;
                }
#endif
                if (layer->isVisible()) {
                    if (filtering) layer->setFiltering(true);
                    layer->draw(hw);