From 6470c60273d855c5ccf9aedbae0b9183f2c06c00 Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Sun, 8 Mar 2020 17:21:38 -0700 Subject: [PATCH] Support scaling with SurfaceControl when using WindowlessWindow APIs Demo: https://drive.google.com/open?id=1wQ8dT5bfTxSh-NRQpNBwTCkKOtOOUMPj Bug: 150224413 Test: Manual test on both universal smartspace and wallpaper preview Change-Id: I604e5a43727035cbeb36f02681fc317fd356268a --- .../system/SurfaceViewRequestReceiver.java | 31 +++++++++++++++++-- .../system/SurfaceViewRequestUtils.java | 4 +-- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestReceiver.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestReceiver.java index 7cfa289595e3b..d33c653f2cb71 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestReceiver.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestReceiver.java @@ -20,6 +20,7 @@ import android.content.Context; import android.graphics.PixelFormat; import android.os.Bundle; import android.os.IBinder; +import android.util.Size; import android.view.SurfaceControl; import android.view.SurfaceControlViewHost; import android.view.View; @@ -43,13 +44,27 @@ public class SurfaceViewRequestReceiver { mOpacity = opacity; } - /** Called whenever a surface view request is received. */ + /** See {@link #onReceive(Context, Bundle, View, Size)}. */ public void onReceive(Context context, Bundle bundle, View view) { + onReceive(context, bundle, view, null); + } + + /** + * Called whenever a surface view request is received. + * @param view the view rendering content, on the receiver end of the surface request. + * @param viewSize when {@param viewSize} is not specified, we will use the surface control size + * to attach the view to the window. + */ + public void onReceive(Context context, Bundle bundle, View view, Size viewSize) { if (mSurfaceControlViewHost != null) { mSurfaceControlViewHost.die(); } SurfaceControl surfaceControl = SurfaceViewRequestUtils.getSurfaceControl(bundle); if (surfaceControl != null) { + if (viewSize == null) { + viewSize = new Size(surfaceControl.getWidth(), surfaceControl.getHeight()); + } + IBinder hostToken = SurfaceViewRequestUtils.getHostToken(bundle); WindowlessWindowManager windowlessWindowManager = @@ -59,12 +74,22 @@ public class SurfaceViewRequestReceiver { context.getDisplayNoVerify(), windowlessWindowManager); WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams( - surfaceControl.getWidth(), - surfaceControl.getHeight(), + viewSize.getWidth(), + viewSize.getHeight(), WindowManager.LayoutParams.TYPE_APPLICATION, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, mOpacity); + // This aspect scales the view to fit in the surface and centers it + final float scale = Math.min(surfaceControl.getWidth() / (float) viewSize.getWidth(), + surfaceControl.getHeight() / (float) viewSize.getHeight()); + view.setScaleX(scale); + view.setScaleY(scale); + view.setPivotX(0); + view.setPivotY(0); + view.setTranslationX((surfaceControl.getWidth() - scale * viewSize.getWidth()) / 2); + view.setTranslationY((surfaceControl.getHeight() - scale * viewSize.getHeight()) / 2); + mSurfaceControlViewHost.addView(view, layoutParams); } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestUtils.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestUtils.java index 0cbd541cbc8d3..4409276f8c277 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestUtils.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceViewRequestUtils.java @@ -36,7 +36,7 @@ public class SurfaceViewRequestUtils { } /** - * Retrieves the SurfaceControl from an Intent created by + * Retrieves the SurfaceControl from a bundle created by * {@link #createSurfaceBundle(SurfaceView)}. **/ public static SurfaceControl getSurfaceControl(Bundle bundle) { @@ -44,7 +44,7 @@ public class SurfaceViewRequestUtils { } /** - * Retrieves the input token from an Intent created by + * Retrieves the input token from a bundle created by * {@link #createSurfaceBundle(SurfaceView)}. **/ public static @Nullable IBinder getHostToken(Bundle bundle) {