Add support for secure overlay displays for development.

Change-Id: I426115ec5a3fbda52a481097731abc8b3d9013a4
This commit is contained in:
Jeff Brown
2013-08-02 18:14:46 -07:00
parent 1e01943fe1
commit 040f44d0eb
4 changed files with 34 additions and 10 deletions

View File

@@ -4036,6 +4036,9 @@
<!-- Title text to show within the overlay. [CHAR LIMIT=50] -->
<string name="display_manager_overlay_display_title"><xliff:g id="name">%1$s</xliff:g>: <xliff:g id="width">%2$d</xliff:g>x<xliff:g id="height">%3$d</xliff:g>, <xliff:g id="dpi">%4$d</xliff:g> dpi</string>
<!-- Title text to append when the display is secure. [CHAR LIMIT=30] -->
<string name="display_manager_overlay_display_secure_suffix">, secure</string>
<!-- Title of the notification to indicate an active wifi display connection. [CHAR LIMIT=50] -->
<string name="wifi_display_notification_title">Wireless display is connected</string>
<!-- Message of the notification to indicate an active wifi display connection. [CHAR LIMIT=80] -->

View File

@@ -484,6 +484,7 @@
<java-symbol type="string" name="display_manager_built_in_display_name" />
<java-symbol type="string" name="display_manager_hdmi_display_name" />
<java-symbol type="string" name="display_manager_overlay_display_name" />
<java-symbol type="string" name="display_manager_overlay_display_secure_suffix" />
<java-symbol type="string" name="display_manager_overlay_display_title" />
<java-symbol type="string" name="double_tap_toast" />
<java-symbol type="string" name="elapsed_time_short_format_h_mm_ss" />

View File

@@ -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<OverlayDisplayHandle> 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();

View File

@@ -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;
}