Set ScreenshotSurface secure if any secure content is shown.
The screenrecord command can record secure content during rotation. This is because the ScreenshotSurface surface for rotation animation is not set secure even though its screenshot contains secure content. Change-Id: I5a70be71ddfc26de4230e7d4fe547210c2154210
This commit is contained in:
@@ -199,7 +199,8 @@ class ScreenRotationAnimation {
|
||||
}
|
||||
|
||||
public ScreenRotationAnimation(Context context, DisplayContent displayContent,
|
||||
SurfaceSession session, boolean inTransaction, boolean forceDefaultOrientation) {
|
||||
SurfaceSession session, boolean inTransaction, boolean forceDefaultOrientation,
|
||||
boolean isSecure) {
|
||||
mContext = context;
|
||||
mDisplayContent = displayContent;
|
||||
displayContent.getLogicalDisplayRect(mOriginalDisplayRect);
|
||||
@@ -241,16 +242,21 @@ class ScreenRotationAnimation {
|
||||
|
||||
try {
|
||||
try {
|
||||
int flags = SurfaceControl.HIDDEN;
|
||||
if (isSecure) {
|
||||
flags |= SurfaceControl.SECURE;
|
||||
}
|
||||
|
||||
if (WindowManagerService.DEBUG_SURFACE_TRACE) {
|
||||
mSurfaceControl = new SurfaceTrace(session, "ScreenshotSurface",
|
||||
mWidth, mHeight,
|
||||
PixelFormat.OPAQUE, SurfaceControl.HIDDEN);
|
||||
PixelFormat.OPAQUE, flags);
|
||||
Slog.w(TAG, "ScreenRotationAnimation ctor: displayOffset="
|
||||
+ mOriginalDisplayRect.toShortString());
|
||||
} else {
|
||||
mSurfaceControl = new SurfaceControl(session, "ScreenshotSurface",
|
||||
mWidth, mHeight,
|
||||
PixelFormat.OPAQUE, SurfaceControl.HIDDEN);
|
||||
PixelFormat.OPAQUE, flags);
|
||||
}
|
||||
// capture a screenshot into the surface we just created
|
||||
Surface sur = new Surface();
|
||||
|
||||
@@ -9921,9 +9921,21 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
screenRotationAnimation.kill();
|
||||
}
|
||||
|
||||
// Check whether the current screen contains any secure content.
|
||||
boolean isSecure = false;
|
||||
final WindowList windows = getDefaultWindowListLocked();
|
||||
final int N = windows.size();
|
||||
for (int i = 0; i < N; i++) {
|
||||
WindowState ws = windows.get(i);
|
||||
if (ws.isOnScreen() && (ws.mAttrs.flags & FLAG_SECURE) != 0) {
|
||||
isSecure = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(multidisplay): rotation on main screen only.
|
||||
screenRotationAnimation = new ScreenRotationAnimation(mContext, displayContent,
|
||||
mFxSession, inTransaction, mPolicy.isDefaultOrientationForced());
|
||||
mFxSession, inTransaction, mPolicy.isDefaultOrientationForced(), isSecure);
|
||||
mAnimator.setScreenRotationAnimationLocked(displayId, screenRotationAnimation);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user