From 040f44d0ebdd3a50c59ba0cbc0b023fd2d71039d Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Fri, 2 Aug 2013 18:14:46 -0700 Subject: Add support for secure overlay displays for development. Change-Id: I426115ec5a3fbda52a481097731abc8b3d9013a4 --- .../server/display/OverlayDisplayAdapter.java | 26 +++++++++++++++------- .../server/display/OverlayDisplayWindow.java | 14 ++++++++++-- 2 files changed, 30 insertions(+), 10 deletions(-) (limited to 'services/java/com') diff --git a/services/java/com/android/server/display/OverlayDisplayAdapter.java b/services/java/com/android/server/display/OverlayDisplayAdapter.java index a18352c..3152897 100644 --- a/services/java/com/android/server/display/OverlayDisplayAdapter.java +++ b/services/java/com/android/server/display/OverlayDisplayAdapter.java @@ -59,7 +59,7 @@ final class OverlayDisplayAdapter extends DisplayAdapter { private static final int MAX_HEIGHT = 4096; private static final Pattern SETTING_PATTERN = - Pattern.compile("(\\d+)x(\\d+)/(\\d+)"); + Pattern.compile("(\\d+)x(\\d+)/(\\d+)(,[a-z]+)*"); private final Handler mUiHandler; private final ArrayList mOverlays = @@ -143,6 +143,7 @@ final class OverlayDisplayAdapter extends DisplayAdapter { int width = Integer.parseInt(matcher.group(1), 10); int height = Integer.parseInt(matcher.group(2), 10); int densityDpi = Integer.parseInt(matcher.group(3), 10); + String flagString = matcher.group(4); if (width >= MIN_WIDTH && width <= MAX_WIDTH && height >= MIN_HEIGHT && height <= MAX_HEIGHT && densityDpi >= DisplayMetrics.DENSITY_LOW @@ -152,13 +153,14 @@ final class OverlayDisplayAdapter extends DisplayAdapter { com.android.internal.R.string.display_manager_overlay_display_name, number); int gravity = chooseOverlayGravity(number); + boolean secure = flagString != null && flagString.contains(",secure"); Slog.i(TAG, "Showing overlay display device #" + number + ": name=" + name + ", width=" + width + ", height=" + height - + ", densityDpi=" + densityDpi); + + ", densityDpi=" + densityDpi + ", secure=" + secure); mOverlays.add(new OverlayDisplayHandle(name, - width, height, densityDpi, gravity)); + width, height, densityDpi, gravity, secure)); continue; } } catch (NumberFormatException ex) { @@ -190,13 +192,14 @@ final class OverlayDisplayAdapter extends DisplayAdapter { private final int mHeight; private final float mRefreshRate; private final int mDensityDpi; + private final boolean mSecure; private Surface mSurface; private SurfaceTexture mSurfaceTexture; private DisplayDeviceInfo mInfo; public OverlayDisplayDevice(IBinder displayToken, String name, - int width, int height, float refreshRate, int densityDpi, + int width, int height, float refreshRate, int densityDpi, boolean secure, SurfaceTexture surfaceTexture) { super(OverlayDisplayAdapter.this, displayToken); mName = name; @@ -204,6 +207,7 @@ final class OverlayDisplayAdapter extends DisplayAdapter { mHeight = height; mRefreshRate = refreshRate; mDensityDpi = densityDpi; + mSecure = secure; mSurfaceTexture = surfaceTexture; } @@ -242,6 +246,9 @@ final class OverlayDisplayAdapter extends DisplayAdapter { mInfo.xDpi = mDensityDpi; mInfo.yDpi = mDensityDpi; mInfo.flags = 0; + if (mSecure) { + mInfo.flags |= DisplayDeviceInfo.FLAG_SECURE; + } mInfo.type = Display.TYPE_OVERLAY; mInfo.touch = DisplayDeviceInfo.TOUCH_NONE; } @@ -261,17 +268,19 @@ final class OverlayDisplayAdapter extends DisplayAdapter { private final int mHeight; private final int mDensityDpi; private final int mGravity; + private final boolean mSecure; private OverlayDisplayWindow mWindow; private OverlayDisplayDevice mDevice; public OverlayDisplayHandle(String name, - int width, int height, int densityDpi, int gravity) { + int width, int height, int densityDpi, int gravity, boolean secure) { mName = name; mWidth = width; mHeight = height; mDensityDpi = densityDpi; mGravity = gravity; + mSecure = secure; mUiHandler.post(mShowRunnable); } @@ -285,9 +294,9 @@ final class OverlayDisplayAdapter extends DisplayAdapter { @Override public void onWindowCreated(SurfaceTexture surfaceTexture, float refreshRate) { synchronized (getSyncRoot()) { - IBinder displayToken = SurfaceControl.createDisplay(mName, false); + IBinder displayToken = SurfaceControl.createDisplay(mName, mSecure); mDevice = new OverlayDisplayDevice(displayToken, mName, - mWidth, mHeight, refreshRate, mDensityDpi, surfaceTexture); + mWidth, mHeight, refreshRate, mDensityDpi, mSecure, surfaceTexture); sendDisplayDeviceEventLocked(mDevice, DISPLAY_DEVICE_EVENT_ADDED); } @@ -310,6 +319,7 @@ final class OverlayDisplayAdapter extends DisplayAdapter { pw.println(" mHeight=" + mHeight); pw.println(" mDensityDpi=" + mDensityDpi); pw.println(" mGravity=" + mGravity); + pw.println(" mSecure=" + mSecure); // Try to dump the window state. if (mWindow != null) { @@ -324,7 +334,7 @@ final class OverlayDisplayAdapter extends DisplayAdapter { @Override public void run() { OverlayDisplayWindow window = new OverlayDisplayWindow(getContext(), - mName, mWidth, mHeight, mDensityDpi, mGravity, + mName, mWidth, mHeight, mDensityDpi, mGravity, mSecure, OverlayDisplayHandle.this); window.show(); diff --git a/services/java/com/android/server/display/OverlayDisplayWindow.java b/services/java/com/android/server/display/OverlayDisplayWindow.java index a0edced..f1dd60a 100644 --- a/services/java/com/android/server/display/OverlayDisplayWindow.java +++ b/services/java/com/android/server/display/OverlayDisplayWindow.java @@ -64,8 +64,9 @@ final class OverlayDisplayWindow implements DumpUtils.Dump { private final int mHeight; private final int mDensityDpi; private final int mGravity; + private final boolean mSecure; private final Listener mListener; - private final String mTitle; + private String mTitle; private final DisplayManager mDisplayManager; private final WindowManager mWindowManager; @@ -92,17 +93,23 @@ final class OverlayDisplayWindow implements DumpUtils.Dump { private float mLiveScale = 1.0f; public OverlayDisplayWindow(Context context, String name, - int width, int height, int densityDpi, int gravity, Listener listener) { + int width, int height, int densityDpi, int gravity, boolean secure, + Listener listener) { mContext = context; mName = name; mWidth = width; mHeight = height; mDensityDpi = densityDpi; mGravity = gravity; + mSecure = secure; mListener = listener; mTitle = context.getResources().getString( com.android.internal.R.string.display_manager_overlay_display_title, mName, mWidth, mHeight, mDensityDpi); + if (secure) { + mTitle += context.getResources().getString( + com.android.internal.R.string.display_manager_overlay_display_secure_suffix); + } mDisplayManager = (DisplayManager)context.getSystemService( Context.DISPLAY_SERVICE); @@ -197,6 +204,9 @@ final class OverlayDisplayWindow implements DumpUtils.Dump { | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; + if (mSecure) { + mWindowParams.flags |= WindowManager.LayoutParams.FLAG_SECURE; + } if (DISABLE_MOVE_AND_RESIZE) { mWindowParams.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; } -- cgit v1.1