diff options
| author | Jeff Brown <jeffbrown@google.com> | 2012-10-23 17:35:57 -0700 |
|---|---|---|
| committer | Jeff Brown <jeffbrown@google.com> | 2012-10-23 20:37:40 -0700 |
| commit | f0681b34dffc1510cbd9c3da5c3a7e695553fa8d (patch) | |
| tree | 750cc9603cd0571c9a229117129b6c21ab61be24 /core/java/android/view | |
| parent | 56e75631bd737e5362309330d4839cc1dddb501c (diff) | |
| download | frameworks_base-f0681b34dffc1510cbd9c3da5c3a7e695553fa8d.zip frameworks_base-f0681b34dffc1510cbd9c3da5c3a7e695553fa8d.tar.gz frameworks_base-f0681b34dffc1510cbd9c3da5c3a7e695553fa8d.tar.bz2 | |
Secure windows, secure surface views and secure displays.
Add new API to determine whether a display is secure.
Add new API to make a SurfaceView secure.
Clarify documentation.
Bug: 7368436
Change-Id: I7068c34c910e43b4bc72e43fa0dded59a25f0fe2
Diffstat (limited to 'core/java/android/view')
| -rw-r--r-- | core/java/android/view/Display.java | 56 | ||||
| -rw-r--r-- | core/java/android/view/DisplayInfo.java | 3 | ||||
| -rw-r--r-- | core/java/android/view/SurfaceView.java | 22 | ||||
| -rw-r--r-- | core/java/android/view/WindowManager.java | 9 |
4 files changed, 81 insertions, 9 deletions
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java index 662dc45..1cd3e05 100644 --- a/core/java/android/view/Display.java +++ b/core/java/android/view/Display.java @@ -82,22 +82,65 @@ public final class Display { * Display flag: Indicates that the display supports compositing content * that is stored in protected graphics buffers. * <p> + * If this flag is set then the display device supports compositing protected buffers. + * </p><p> + * If this flag is not set then the display device may not support compositing + * protected buffers; the user may see a blank region on the screen instead of + * the protected content. + * </p><p> * Secure (DRM) video decoders may allocate protected graphics buffers to request that * a hardware-protected path be provided between the video decoder and the external * display sink. If a hardware-protected path is not available, then content stored * in protected graphics buffers may not be composited. * </p><p> - * If this flag is not set, then the display device does not support compositing - * protected buffers; the user may see a blank region on the screen instead of - * the protected content. An application can use this flag as a hint that it should - * select an alternate content stream or adopt a different strategy for decoding - * content that does not rely on protected buffers so as to ensure that the user - * can view the content on the display as expected. + * An application can use the absence of this flag as a hint that it should not use protected + * buffers for this display because the content may not be visible. For example, + * if the flag is not set then the application may choose not to show content on this + * display, show an informative error message, select an alternate content stream + * or adopt a different strategy for decoding content that does not rely on + * protected buffers. * </p> + * + * @see #getFlags */ public static final int FLAG_SUPPORTS_PROTECTED_BUFFERS = 1 << 0; /** + * Display flag: Indicates that the display has a secure video output and + * supports compositing secure surfaces. + * <p> + * If this flag is set then the display device has a secure video output + * and is capable of showing secure surfaces. It may also be capable of + * showing {@link #FLAG_SUPPORTS_PROTECTED_BUFFERS protected buffers}. + * </p><p> + * If this flag is not set then the display device may not have a secure video + * output; the user may see a blank region on the screen instead of + * the contents of secure surfaces or protected buffers. + * </p><p> + * Secure surfaces are used to prevent content rendered into those surfaces + * by applications from appearing in screenshots or from being viewed + * on non-secure displays. Protected buffers are used by secure video decoders + * for a similar purpose. + * </p><p> + * An application creates a window with a secure surface by specifying the + * {@link WindowManager.LayoutParams#FLAG_SECURE} window flag. + * Likewise, an application creates a {@link SurfaceView} with a secure surface + * by calling {@link SurfaceView#setSecure} before attaching the secure view to + * its containing window. + * </p><p> + * An application can use the absence of this flag as a hint that it should not create + * secure surfaces or protected buffers on this display because the content may + * not be visible. For example, if the flag is not set then the application may + * choose not to show content on this display, show an informative error message, + * select an alternate content stream or adopt a different strategy for decoding + * content that does not rely on secure surfaces or protected buffers. + * </p> + * + * @see #getFlags + */ + public static final int FLAG_SECURE = 1 << 1; + + /** * Internal method to create a display. * Applications should use {@link android.view.WindowManager#getDefaultDisplay()} * or {@link android.hardware.display.DisplayManager#getDisplay} @@ -182,6 +225,7 @@ public final class Display { * @return The display flags. * * @see #FLAG_SUPPORTS_PROTECTED_BUFFERS + * @see #FLAG_SECURE */ public int getFlags() { synchronized (this) { diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java index fb04150..ead5ff4 100644 --- a/core/java/android/view/DisplayInfo.java +++ b/core/java/android/view/DisplayInfo.java @@ -299,6 +299,9 @@ public final class DisplayInfo implements Parcelable { private static String flagsToString(int flags) { StringBuilder result = new StringBuilder(); + if ((flags & Display.FLAG_SECURE) != 0) { + result.append(", FLAG_SECURE"); + } if ((flags & Display.FLAG_SUPPORTS_PROTECTED_BUFFERS) != 0) { result.append(", FLAG_SUPPORTS_PROTECTED_BUFFERS"); } diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 0d16dd3..9008521 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -385,7 +385,27 @@ public class SurfaceView extends View { mLayout.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; } } - + + /** + * Control whether the surface view's content should be treated as secure, + * preventing it from appearing in screenshots or from being viewed on + * non-secure displays. + * + * <p>Note that this must be set before the surface view's containing + * window is attached to the window manager. + * + * <p>See {@link android.view.Display#FLAG_SECURE} for details. + * + * @param isSecure True if the surface view is secure. + */ + public void setSecure(boolean isSecure) { + if (isSecure) { + mLayout.flags |= WindowManager.LayoutParams.FLAG_SECURE; + } else { + mLayout.flags &= ~WindowManager.LayoutParams.FLAG_SECURE; + } + } + /** * Hack to allow special layering of windows. The type is one of the * types in WindowManager.LayoutParams. This is a hack so: diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index 01923e2..3b31ff6 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -628,8 +628,13 @@ public interface WindowManager extends ViewManager { @Deprecated public static final int FLAG_DITHER = 0x00001000; - /** Window flag: don't allow screen shots while this window is - * displayed. Maps to Surface.SECURE. */ + /** Window flag: Treat the content of the window as secure, preventing + * it from appearing in screenshots or from being viewed on non-secure + * displays. + * + * <p>See {@link android.view.Display#FLAG_SECURE} for more details about + * secure surfaces and secure displays. + */ public static final int FLAG_SECURE = 0x00002000; /** Window flag: a special mode where the layout parameters are used |
