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 =