Merge "Support scaling with SurfaceControl when using WindowlessWindow APIs" into rvc-dev am: 705e25deb1 am: 6c5dedade5
Change-Id: I38d764c80a651b05d107df1e9fd98691a360e8dc
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user