From 2b74a24a52a8f685ea8e81ff7b4f55e724733267 Mon Sep 17 00:00:00 2001 From: Minoru Aoi Date: Thu, 13 Mar 2014 12:00:34 +0900 Subject: [PATCH] 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 --- .../android/server/wm/ScreenRotationAnimation.java | 12 +++++++++--- .../android/server/wm/WindowManagerService.java | 14 +++++++++++++- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/services/java/com/android/server/wm/ScreenRotationAnimation.java b/services/java/com/android/server/wm/ScreenRotationAnimation.java index e630737b40b7b..f79896b4c2560 100644 --- a/services/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/java/com/android/server/wm/ScreenRotationAnimation.java @@ -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(); diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 5da3e3e200735..2ab7e3641e876 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -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); } }