From 5267ca2c8c9b65564c72b93736812ad89983c4dd Mon Sep 17 00:00:00 2001 From: Julia Sullivan Date: Fri, 26 Apr 2024 13:26:07 -0700 Subject: [PATCH] Set FLAG_HARDWARE_ACCELERATED in ShadowWindow constructor. This is needed for ShadowPixelCopy to work correctly on Android S. PiperOrigin-RevId: 628494031 --- .../HardwareAcceleratedActivityRenderTest.java | 7 ------- .../shadows/HardwareRenderingScreenshot.java | 7 ++++--- .../org/robolectric/shadows/ShadowPackageManager.java | 11 ++++++----- .../java/org/robolectric/shadows/ShadowPixelCopy.java | 2 +- .../org/robolectric/shadows/ShadowUiAutomation.java | 2 +- 5 files changed, 12 insertions(+), 17 deletions(-) diff --git a/integration_tests/nativegraphics/src/test/java/org/robolectric/integrationtests/nativegraphics/HardwareAcceleratedActivityRenderTest.java b/integration_tests/nativegraphics/src/test/java/org/robolectric/integrationtests/nativegraphics/HardwareAcceleratedActivityRenderTest.java index 7f8e265783..f7cf969301 100644 --- a/integration_tests/nativegraphics/src/test/java/org/robolectric/integrationtests/nativegraphics/HardwareAcceleratedActivityRenderTest.java +++ b/integration_tests/nativegraphics/src/test/java/org/robolectric/integrationtests/nativegraphics/HardwareAcceleratedActivityRenderTest.java @@ -13,7 +13,6 @@ import android.view.View; import android.view.ViewGroup.LayoutParams; import android.view.Window; -import android.view.WindowManager; import android.widget.FrameLayout; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -57,12 +56,6 @@ static class HardwareAcceleratedActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - // TODO(hoisie): manually setting these flags should not be required. Robolectric should - // set them automatically by default (they have been default since ICS). - getWindow() - .setFlags( - WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, - WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); FrameLayout frameLayout = new FrameLayout(this); frameLayout.setLayoutParams( new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/HardwareRenderingScreenshot.java b/shadows/framework/src/main/java/org/robolectric/shadows/HardwareRenderingScreenshot.java index 63e9d7bd86..0c157d74aa 100644 --- a/shadows/framework/src/main/java/org/robolectric/shadows/HardwareRenderingScreenshot.java +++ b/shadows/framework/src/main/java/org/robolectric/shadows/HardwareRenderingScreenshot.java @@ -34,10 +34,11 @@ private HardwareRenderingScreenshot() {} * the presence of the {@link #USE_HARDWARE_RENDERER_NATIVE_ENV} property, and the {@link * GraphicsMode}. */ - static boolean canTakeScreenshot() { + static boolean canTakeScreenshot(View view) { return VERSION.SDK_INT >= VERSION_CODES.S && "hardware".equalsIgnoreCase(System.getProperty(PIXEL_COPY_RENDER_MODE, "")) - && ShadowView.useRealGraphics(); + && ShadowView.useRealGraphics() + && view.canHaveDisplayList(); } /** @@ -68,7 +69,7 @@ static void takeScreenshot(View view, Bitmap destBitmap) { RenderNode node = getRenderNode(view); renderer.setContentRoot(node); - + renderer.createRenderRequest().syncAndDraw(); Plane[] planes = nativeImage.getPlanes(); destBitmap.copyPixelsFromBuffer(planes[0].getBuffer()); diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPackageManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPackageManager.java index f753496c70..f007a1a3c0 100644 --- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPackageManager.java +++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPackageManager.java @@ -204,12 +204,13 @@ public class ShadowPackageManager { * @return existing or newly created activity info. */ public ActivityInfo addActivityIfNotPresent(ComponentName componentName) { + ActivityInfo activityInfo = updateName(componentName, new ActivityInfo()); + // if (RuntimeEnvironment.getApiLevel() >= S + // && System.getProperty("robolectric.pixelCopyRenderMode", "").equals("hardware")) { + activityInfo.flags |= ActivityInfo.FLAG_HARDWARE_ACCELERATED; + // } return addComponent( - activityFilters, - p -> p.activities, - (p, a) -> p.activities = a, - updateName(componentName, new ActivityInfo()), - false); + activityFilters, p -> p.activities, (p, a) -> p.activities = a, activityInfo, false); } /** diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPixelCopy.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPixelCopy.java index 9039e885e9..600f8ea64f 100644 --- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPixelCopy.java +++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPixelCopy.java @@ -168,7 +168,7 @@ private static void takeScreenshot(View view, Bitmap screenshot, @Nullable Rect Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); - if (HardwareRenderingScreenshot.canTakeScreenshot()) { + if (HardwareRenderingScreenshot.canTakeScreenshot(view)) { PerfStatsCollector.getInstance() .measure( "ShadowPixelCopy-Hardware", diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUiAutomation.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUiAutomation.java index bfe39ea95b..932b052f08 100644 --- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUiAutomation.java +++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUiAutomation.java @@ -131,7 +131,7 @@ protected Bitmap takeScreenshot() throws Exception { Bitmap window = Bitmap.createBitmap( rootView.getWidth(), rootView.getHeight(), Bitmap.Config.ARGB_8888); - if (HardwareRenderingScreenshot.canTakeScreenshot()) { + if (HardwareRenderingScreenshot.canTakeScreenshot(rootView)) { HardwareRenderingScreenshot.takeScreenshot(rootView, window); } else { Canvas windowCanvas = new Canvas(window);