libgui/SF: Propagate SECURE Layer flag changes

This allows changes to the SECURE flag to propagate down to
Layers in SurfaceFlinger so that WindowManager can change it on the fly
in response to device policy updates.

Bug: 20934462
Change-Id: I558f6d22c6273be373f1f480365e42536af18a33
This commit is contained in:
Dan Stoza 2015-06-18 14:58:39 -07:00
parent 8f37aa5011
commit 2311608667
5 changed files with 16 additions and 14 deletions

View File

@ -39,6 +39,7 @@ struct layer_state_t {
enum {
eLayerHidden = 0x01, // SURFACE_HIDDEN in SurfaceControl.java
eLayerOpaque = 0x02, // SURFACE_OPAQUE
eLayerSecure = 0x80, // SECURE
};
enum {
@ -48,10 +49,9 @@ struct layer_state_t {
eAlphaChanged = 0x00000008,
eMatrixChanged = 0x00000010,
eTransparentRegionChanged = 0x00000020,
eVisibilityChanged = 0x00000040,
eFlagsChanged = 0x00000040,
eLayerStackChanged = 0x00000080,
eCropChanged = 0x00000100,
eOpacityChanged = 0x00000200,
};
layer_state_t()

View File

@ -310,11 +310,10 @@ status_t Composer::setFlags(const sp<SurfaceComposerClient>& client,
layer_state_t* s = getLayerStateLocked(client, id);
if (!s)
return BAD_INDEX;
if (mask & layer_state_t::eLayerOpaque) {
s->what |= layer_state_t::eOpacityChanged;
}
if (mask & layer_state_t::eLayerHidden) {
s->what |= layer_state_t::eVisibilityChanged;
if (mask & layer_state_t::eLayerOpaque ||
mask & layer_state_t::eLayerHidden ||
mask & layer_state_t::eLayerSecure) {
s->what |= layer_state_t::eFlagsChanged;
}
s->flags &= ~mask;
s->flags |= (flags & mask);

View File

@ -76,7 +76,6 @@ Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client,
mFiltering(false),
mNeedsFiltering(false),
mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2),
mSecure(false),
mProtectedByApp(false),
mHasSurface(false),
mClientRef(client),
@ -96,6 +95,8 @@ Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client,
layerFlags |= layer_state_t::eLayerHidden;
if (flags & ISurfaceComposerClient::eOpaque)
layerFlags |= layer_state_t::eLayerOpaque;
if (flags & ISurfaceComposerClient::eSecure)
layerFlags |= layer_state_t::eLayerSecure;
if (flags & ISurfaceComposerClient::eNonPremultiplied)
mPremultipliedAlpha = false;
@ -256,7 +257,6 @@ status_t Layer::setBuffers( uint32_t w, uint32_t h,
mFormat = format;
mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false;
mSecure = (flags & ISurfaceComposerClient::eSecure) ? true : false;
mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false;
mCurrentOpacity = getOpacityForFormat(format);
@ -858,6 +858,12 @@ bool Layer::isOpaque(const Layer::State& s) const
return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity;
}
bool Layer::isSecure() const
{
const Layer::State& s(mDrawingState);
return (s.flags & layer_state_t::eLayerSecure);
}
bool Layer::isProtected() const
{
const sp<GraphicBuffer>& activeBuffer(mActiveBuffer);

View File

@ -174,7 +174,7 @@ public:
* isSecure - true if this surface is secure, that is if it prevents
* screenshots or VNC servers.
*/
virtual bool isSecure() const { return mSecure; }
virtual bool isSecure() const;
/*
* isProtected - true if the layer may contain protected content in the
@ -402,7 +402,6 @@ private:
mutable Texture mTexture;
// page-flip thread (currently main thread)
bool mSecure; // no screenshots
bool mProtectedByApp; // application requires protected path to external sink
// protected by mLock

View File

@ -2235,9 +2235,7 @@ uint32_t SurfaceFlinger::setClientStateLocked(
if (layer->setTransparentRegionHint(s.transparentRegion))
flags |= eTraversalNeeded;
}
if ((what & layer_state_t::eVisibilityChanged) ||
(what & layer_state_t::eOpacityChanged)) {
// TODO: should we just use an eFlagsChanged for this?
if (what & layer_state_t::eFlagsChanged) {
if (layer->setFlags(s.flags, s.mask))
flags |= eTraversalNeeded;
}