Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 040f44d0 authored by Jeff Brown's avatar Jeff Brown
Browse files

Add support for secure overlay displays for development.

Change-Id: I426115ec5a3fbda52a481097731abc8b3d9013a4
parent 1e01943f
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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] -->
+1 −0
Original line number Diff line number Diff line
@@ -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" />
+18 −8
Original line number Diff line number Diff line
@@ -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();

+12 −2
Original line number Diff line number Diff line
@@ -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;
        }