Add support for secure overlay displays for development.
Change-Id: I426115ec5a3fbda52a481097731abc8b3d9013a4
This commit is contained in:
@@ -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] -->
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user