Fix ShadowPixelCopy for projects with compileSdk < 34

In Android U, a new PixelCopy.request method that takes a PixelCopy.Request as
a parameter. However, the PixelCopy.Request class was only added in SDK 34.

This will cause a NoClassDefFoundError if PixelCopy is used and the compileSdk is less than 34. Update ShadowPixelCopy to use looseSignatures for this method.

Fixes #8577

PiperOrigin-RevId: 577907854
diff --git a/integration_tests/compat-target28/src/test/java/org/robolectric/integration/compat/target28/NormalCompatibilityTest.kt b/integration_tests/compat-target28/src/test/java/org/robolectric/integration/compat/target28/NormalCompatibilityTest.kt
index 69bbf73..15e0479 100644
--- a/integration_tests/compat-target28/src/test/java/org/robolectric/integration/compat/target28/NormalCompatibilityTest.kt
+++ b/integration_tests/compat-target28/src/test/java/org/robolectric/integration/compat/target28/NormalCompatibilityTest.kt
@@ -2,9 +2,14 @@
 
 import android.content.Context
 import android.content.Context.VIBRATOR_SERVICE
+import android.graphics.Bitmap
+import android.graphics.Rect
 import android.os.Build
+import android.os.Handler
+import android.os.Looper
 import android.os.Vibrator
 import android.speech.SpeechRecognizer
+import android.view.PixelCopy
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -54,4 +59,19 @@
   fun `Get default Vibrator succeed`() {
     assertThat(application.getSystemService(VIBRATOR_SERVICE) as Vibrator).isNotNull()
   }
+
+  @Test
+  fun `PixelCopy request`() {
+    val testActivity = Robolectric.setupActivity(TestActivity::class.java)
+    val bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888)
+    val listener = PixelCopy.OnPixelCopyFinishedListener {}
+    val srcRect = Rect(0, 0, 100, 100)
+    PixelCopy.request(
+      testActivity.window,
+      srcRect,
+      bitmap,
+      listener,
+      Handler(Looper.getMainLooper())
+    )
+  }
 }
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 21a4e6f..89ded64 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPixelCopy.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPixelCopy.java
@@ -12,7 +12,6 @@
 import android.os.Looper;
 import android.view.PixelCopy;
 import android.view.PixelCopy.OnPixelCopyFinishedListener;
-import android.view.PixelCopy.Result;
 import android.view.Surface;
 import android.view.SurfaceView;
 import android.view.View;
@@ -21,7 +20,6 @@
 import android.view.WindowManagerGlobal;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import java.util.concurrent.Executor;
 import java.util.function.Consumer;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
@@ -40,7 +38,7 @@
  * <p>If listenerThread is backed by a paused looper, make sure to call ShadowLooper.idle() to
  * ensure the screenshot finishes.
  */
-@Implements(value = PixelCopy.class, minSdk = O)
+@Implements(value = PixelCopy.class, minSdk = O, looseSignatures = true)
 public class ShadowPixelCopy {
 
   @Implementation
@@ -124,15 +122,19 @@
 
   @Implementation(minSdk = U.SDK_INT)
   protected static void request(
-      PixelCopy.Request request, Executor callbackExecutor, Consumer<Result> listener) {
+      /* PixelCopy.Request */ Object requestObject, /* Executor */
+      Object callbackExecutor, /* Consumer<Result> */
+      Object listener) {
+    PixelCopy.Request request = (PixelCopy.Request) requestObject;
     RequestReflector requestReflector = reflector(RequestReflector.class, request);
     OnPixelCopyFinishedListener legacyListener =
         new OnPixelCopyFinishedListener() {
           @Override
           public void onPixelCopyFinished(int copyResult) {
-            listener.accept(
-                reflector(ResultReflector.class)
-                    .newResult(copyResult, request.getDestinationBitmap()));
+            ((Consumer<PixelCopy.Result>) listener)
+                .accept(
+                    reflector(ResultReflector.class)
+                        .newResult(copyResult, request.getDestinationBitmap()));
           }
         };
     Rect adjustedSrcRect =