Merge "Support scaling with SurfaceControl when using WindowlessWindow APIs" into rvc-dev

This commit is contained in:
Tracy Zhou
2020-03-10 09:27:30 +00:00
committed by Android (Google) Code Review
2 changed files with 30 additions and 5 deletions

View File

@@ -20,6 +20,7 @@ import android.content.Context;
import android.graphics.PixelFormat; import android.graphics.PixelFormat;
import android.os.Bundle; import android.os.Bundle;
import android.os.IBinder; import android.os.IBinder;
import android.util.Size;
import android.view.SurfaceControl; import android.view.SurfaceControl;
import android.view.SurfaceControlViewHost; import android.view.SurfaceControlViewHost;
import android.view.View; import android.view.View;
@@ -43,13 +44,27 @@ public class SurfaceViewRequestReceiver {
mOpacity = opacity; 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) { 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) { if (mSurfaceControlViewHost != null) {
mSurfaceControlViewHost.die(); mSurfaceControlViewHost.die();
} }
SurfaceControl surfaceControl = SurfaceViewRequestUtils.getSurfaceControl(bundle); SurfaceControl surfaceControl = SurfaceViewRequestUtils.getSurfaceControl(bundle);
if (surfaceControl != null) { if (surfaceControl != null) {
if (viewSize == null) {
viewSize = new Size(surfaceControl.getWidth(), surfaceControl.getHeight());
}
IBinder hostToken = SurfaceViewRequestUtils.getHostToken(bundle); IBinder hostToken = SurfaceViewRequestUtils.getHostToken(bundle);
WindowlessWindowManager windowlessWindowManager = WindowlessWindowManager windowlessWindowManager =
@@ -59,12 +74,22 @@ public class SurfaceViewRequestReceiver {
context.getDisplayNoVerify(), windowlessWindowManager); context.getDisplayNoVerify(), windowlessWindowManager);
WindowManager.LayoutParams layoutParams = WindowManager.LayoutParams layoutParams =
new WindowManager.LayoutParams( new WindowManager.LayoutParams(
surfaceControl.getWidth(), viewSize.getWidth(),
surfaceControl.getHeight(), viewSize.getHeight(),
WindowManager.LayoutParams.TYPE_APPLICATION, WindowManager.LayoutParams.TYPE_APPLICATION,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
mOpacity); 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); mSurfaceControlViewHost.addView(view, layoutParams);
} }
} }

View File

@@ -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)}. * {@link #createSurfaceBundle(SurfaceView)}.
**/ **/
public static SurfaceControl getSurfaceControl(Bundle bundle) { 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)}. * {@link #createSurfaceBundle(SurfaceView)}.
**/ **/
public static @Nullable IBinder getHostToken(Bundle bundle) { public static @Nullable IBinder getHostToken(Bundle bundle) {