aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp7
-rw-r--r--annotations/src/main/java/org/robolectric/versioning/AndroidVersions.java59
-rw-r--r--annotations/src/test/java/org/robolectric/versioning/AndroidVersionsEdgeCaseTest.java47
-rw-r--r--nativeruntime/src/main/resources/arsc/font_resources/values/public.xml2
-rw-r--r--nativeruntime/src/main/resources/icu/icudt.datbin28431792 -> 27956384 bytes
-rw-r--r--processor/src/main/java/org/robolectric/annotation/processing/validator/SdkStore.java7
-rw-r--r--robolectric/src/test/java/org/robolectric/shadows/ShadowBackdropFrameRendererTest.java37
-rw-r--r--shadows/framework/Android.bp4
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowBackdropFrameRenderer.java18
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowCameraManager.java2
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowMotionEvent.java3
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeColorSpace.java32
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeColorSpaceRgb.java20
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeFont.java2
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeFontsFontFamily.java2
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeLineBreaker.java2
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeMatrix.java17
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativePositionedGlyphs.java2
18 files changed, 191 insertions, 72 deletions
diff --git a/Android.bp b/Android.bp
index 4e5cb23b2..2f607a56d 100644
--- a/Android.bp
+++ b/Android.bp
@@ -67,7 +67,7 @@ java_genrule {
srcs: [":robolectric_build_props"],
out: ["robolectric_props.jar"],
cmd: "cp $(location :robolectric_build_props) . && $(location soong_zip) " +
- "-o $(location robolectric_props.jar) " +
+ "-o $(location robolectric_props.jar) " +
"-f ./build.prop ",
}
@@ -205,8 +205,8 @@ java_host_for_device {
"//frameworks/base/packages/CredentialManager:__subpackages__",
"//frameworks/base/packages/SettingsLib:__subpackages__",
"//frameworks/base/packages/SystemUI:__pkg__",
- "//frameworks/libs/systemui/animationlib:__pkg__",
- "//frameworks/libs/systemui/tracinglib:__pkg__",
+ "//frameworks/libs/systemui:__subpackages__",
+ "//packages/apps/Launcher3/tests:__pkg__",
"//frameworks/base/tests/InputScreenshotTest:__subpackages__",
"//frameworks/opt/car/setupwizard/library/main/tests/robotests:__pkg__",
"//frameworks/opt/localepicker/tests:__pkg__",
@@ -232,6 +232,7 @@ java_host_for_device {
"//packages/apps/Settings/tests/robotests:__pkg__",
"//packages/apps/ThemePicker/tests/robotests:__pkg__",
"//packages/apps/WallpaperPicker2/tests/robotests:__pkg__",
+ "//packages/apps/WallpaperPicker2/tests/robotests/common:__pkg__",
"//packages/apps/TvSettings/Settings/tests/robotests:__pkg__",
"//packages/apps/KeyChain/robotests:__pkg__",
"//packages/apps/CertInstaller/robotests:__pkg__",
diff --git a/annotations/src/main/java/org/robolectric/versioning/AndroidVersions.java b/annotations/src/main/java/org/robolectric/versioning/AndroidVersions.java
index 71cc48042..19ebef9a1 100644
--- a/annotations/src/main/java/org/robolectric/versioning/AndroidVersions.java
+++ b/annotations/src/main/java/org/robolectric/versioning/AndroidVersions.java
@@ -53,6 +53,8 @@ import javax.annotation.Nullable;
*/
public final class AndroidVersions {
+ private static boolean WARN_ONLY = true;
+
private AndroidVersions() {}
/** Representation of an android release, one that has occurred, or is expected. */
@@ -825,7 +827,7 @@ public final class AndroidVersions {
}
}
- private void throwStaticErrors() {
+ private void handleStaticErrors() {
StringBuilder errors = new StringBuilder();
if (!this.classesWithIllegalNames.isEmpty()) {
errors
@@ -858,14 +860,14 @@ public final class AndroidVersions {
}
}
if (errors.length() > 0) {
- throw new IllegalStateException(
+ errorMessage(
errors
.append("Please check the AndroidReleases defined ")
.append("in ")
.append(AndroidVersions.class.getName())
.append("and ensure they are aligned with the versions of")
.append(" Android.")
- .toString());
+ .toString(), null);
}
}
@@ -877,14 +879,14 @@ public final class AndroidVersions {
// the first letter of the code name equal to the release number.
current = sdkIntToAllReleases.get(reportedVersion);
if (current != null && !current.isReleased()) {
- throw new IllegalStateException(
+ errorMessage(
"The current sdk "
+ current.getShortCode()
+ " has been released. Please update the contents of "
+ AndroidVersions.class.getName()
+ " to mark sdk "
+ current.getShortCode()
- + " as released.");
+ + " as released.", null);
}
} else {
// Get known active code name letters
@@ -936,10 +938,30 @@ public final class AndroidVersions {
.append("contents of current sdk jar to the released version.\n");
}
if (detectedProblems.length() > 0) {
- throw new IllegalStateException(detectedProblems.toString());
+ errorMessage(detectedProblems.toString(), null);
+ }
+
+ if (current == null) { //only possible in warning mode
+ current = new AndroidUnreleased() {
+ @Override
+ public int getSdkInt() {
+ return 10000; // the super large unknown sdk value.
+ }
+
+ @Override
+ public String getShortCode() {
+ return codename.toUpperCase(Locale.getDefault()).substring(0, 1);
+ }
+
+ @Override
+ public String getVersion() {
+ return "";
+ }
+ };
}
}
}
+
return current;
}
}
@@ -971,7 +993,7 @@ public final class AndroidVersions {
| IllegalArgumentException
| IllegalAccessException
| InvocationTargetException ex) {
- throw new IllegalStateException(
+ errorMessage(
"Classes "
+ clazz.getName()
+ "should be accessible via "
@@ -984,7 +1006,7 @@ public final class AndroidVersions {
Collections.sort(allReleases, AndroidRelease::compareTo);
SdkInformation sdkInformation = new SdkInformation(allReleases, classesWithIllegalNames);
- sdkInformation.throwStaticErrors();
+ sdkInformation.handleStaticErrors();
return sdkInformation;
}
@@ -1007,13 +1029,32 @@ public final class AndroidVersions {
String codenames = buildProps.getProperty("ro.build.version.all_codenames");
String[] allCodeNames = codenames == null ? new String[0] : codenames.split(",");
String[] activeCodeNames =
- allCodeNames.length > 0 && allCodeNames[0].equals("REL") ? new String[0] : allCodeNames;
+ allCodeNames.length > 0 && allCodeNames[0].equals("REL") ? new String[0] : allCodeNames;
return information.computeCurrentSdk(sdk, release, codename, asList(activeCodeNames));
}
private static final SdkInformation information;
+ private static final void errorMessage(String errorMessage, @Nullable Exception ex){
+ if (WARN_ONLY) {
+ System.err.println(errorMessage);
+ } else {
+ throw new IllegalStateException(errorMessage, ex);
+ }
+ }
+
+
static {
+ // We shouldn't break in annotation processors, only test runs.
+ String cmd = System.getProperty("sun.java.command");
+ // We appear to be in an annotation processor, so only warn users.
+ if (cmd.indexOf("-Aorg.robolectric.annotation.processing.") != -1) {
+ System.err.println("Robolectric's AndroidVersions is running in warning mode,"
+ + " no errors will be thrown.");
+ WARN_ONLY = true;
+ } else {
+ WARN_ONLY = false;
+ }
AndroidRelease currentRelease = null;
information = gatherStaticSdkInformationFromThisClass();
try {
diff --git a/annotations/src/test/java/org/robolectric/versioning/AndroidVersionsEdgeCaseTest.java b/annotations/src/test/java/org/robolectric/versioning/AndroidVersionsEdgeCaseTest.java
index 95b2c4266..334ca05f3 100644
--- a/annotations/src/test/java/org/robolectric/versioning/AndroidVersionsEdgeCaseTest.java
+++ b/annotations/src/test/java/org/robolectric/versioning/AndroidVersionsEdgeCaseTest.java
@@ -3,6 +3,7 @@ package org.robolectric.versioning;
import static com.google.common.truth.Truth.assertThat;
import java.util.Arrays;
+import java.lang.reflect.Field;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -13,6 +14,16 @@ import org.robolectric.versioning.AndroidVersions.SdkInformation;
@RunWith(JUnit4.class)
public final class AndroidVersionsEdgeCaseTest {
+ private void forceWarningMode(boolean warnMode) {
+ try {
+ Field f = AndroidVersions.class.getDeclaredField("WARN_ONLY");
+ f.setAccessible(true);
+ f.set(null, warnMode);
+ } catch (NoSuchFieldException | IllegalAccessException ex) {
+ throw new RuntimeException("Could not update WARN_ONLY field", ex);
+ }
+ }
+
/**
* sdkInt higher than any known release, claims it's released. Expects an error message to update
* to update the AndroidVersions.class
@@ -21,6 +32,7 @@ public final class AndroidVersionsEdgeCaseTest {
public void sdkIntHigherThanKnownReleasesClaimsIsReleased_throwsException() {
AndroidRelease earliestUnrelease = null;
try {
+ forceWarningMode(false);
SdkInformation information = AndroidVersions.gatherStaticSdkInformationFromThisClass();
earliestUnrelease = information.earliestUnreleased;
information.computeCurrentSdk(
@@ -49,6 +61,7 @@ public final class AndroidVersionsEdgeCaseTest {
public void sdkIntReleasedButStillReportsCodeName_throwsException() {
AndroidRelease latestRelease = null;
try {
+ forceWarningMode(false);
SdkInformation information = AndroidVersions.gatherStaticSdkInformationFromThisClass();
latestRelease = information.latestRelease;
information.computeCurrentSdk(
@@ -68,4 +81,38 @@ public final class AndroidVersionsEdgeCaseTest {
assertThat(e).isInstanceOf(RuntimeException.class);
}
}
+
+ @Test
+ public void sdkIntReleasedButStillReportsCodeName_warningMode() {
+ AndroidRelease latestRelease = null;
+ try {
+ forceWarningMode(true);
+ SdkInformation information = AndroidVersions.gatherStaticSdkInformationFromThisClass();
+ latestRelease = information.latestRelease;
+ information.computeCurrentSdk(
+ latestRelease.getSdkInt(),
+ null,
+ information.latestRelease.getShortCode(),
+ Arrays.asList(latestRelease.getShortCode()));
+ } catch (Throwable t) {
+ assertThat(t).isNull();
+ }
+ }
+
+ @Test
+ public void unknownSdkInt_warningMode() {
+ AndroidRelease latestRelease = null;
+ try {
+ forceWarningMode(true);
+ SdkInformation information = AndroidVersions.gatherStaticSdkInformationFromThisClass();
+ latestRelease = information.latestRelease;
+ AndroidRelease found =
+ information.computeCurrentSdk(
+ 35, "zzzz", "Z", Arrays.asList("wwww", "xxxx", "yyyy", "zzzz"));
+ assertThat(found.getSdkInt()).isEqualTo(10000);
+ } catch (Throwable t) {
+ assertThat(t).isNull();
+ }
+ }
}
+
diff --git a/nativeruntime/src/main/resources/arsc/font_resources/values/public.xml b/nativeruntime/src/main/resources/arsc/font_resources/values/public.xml
index 7dd4ea2c4..c93e4e04b 100644
--- a/nativeruntime/src/main/resources/arsc/font_resources/values/public.xml
+++ b/nativeruntime/src/main/resources/arsc/font_resources/values/public.xml
@@ -2,5 +2,5 @@
<resources>
<!--TODO(b/332407470): We need a more stable method for the configuration.-->
<public type="string" name="config_bodyFontFamily" id="0x010401f9" />
- <public type="string" name="config_headlineFontFamily" id="0x0104026c" />
+ <public type="string" name="config_headlineFontFamily" id="0x0104026d" />
</resources>
diff --git a/nativeruntime/src/main/resources/icu/icudt.dat b/nativeruntime/src/main/resources/icu/icudt.dat
index e25a15ab9..4e9751ba2 100644
--- a/nativeruntime/src/main/resources/icu/icudt.dat
+++ b/nativeruntime/src/main/resources/icu/icudt.dat
Binary files differ
diff --git a/processor/src/main/java/org/robolectric/annotation/processing/validator/SdkStore.java b/processor/src/main/java/org/robolectric/annotation/processing/validator/SdkStore.java
index 06008a57b..feea4d062 100644
--- a/processor/src/main/java/org/robolectric/annotation/processing/validator/SdkStore.java
+++ b/processor/src/main/java/org/robolectric/annotation/processing/validator/SdkStore.java
@@ -157,7 +157,8 @@ public class SdkStore {
* Returns a list of sdks to process, either the compilation's classpaths sdk in a list of size
* one, or the list of sdks in a sdkFile.
*
- * @param localSdk validate sdk found in compile time classpath, takes precedence over sdkFile
+ * @param localSdk validate sdk found in compile time classpath, takes precedence over sdkFile,
+ * only applies to unreleased versions of Android.
* @param sdkFileName the sdkFile name, may be null, or empty
* @param overrideSdkLocation if provided overrides the default lookup of the localSdk, iff
* localSdk is on.
@@ -169,13 +170,15 @@ public class SdkStore {
Sdk sdk = null;
if (overrideSdkLocation != null) {
sdk = new Sdk(overrideSdkLocation, overrideSdkInt);
+ return sdk == null ? ImmutableList.of() : ImmutableList.of(sdk);
} else {
String target = compilationSdkTarget();
if (target != null) {
sdk = new Sdk(target);
+ return sdk == null || sdk.sdkRelease.isReleased()
+ ? ImmutableList.of() : ImmutableList.of(sdk);
}
}
- return sdk == null ? ImmutableList.of() : ImmutableList.of(sdk);
}
if (sdkFileName == null || Files.notExists(Paths.get(sdkFileName))) {
return ImmutableList.of();
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowBackdropFrameRendererTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowBackdropFrameRendererTest.java
index 83af4fac3..9236f76ca 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowBackdropFrameRendererTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowBackdropFrameRendererTest.java
@@ -1,14 +1,16 @@
package org.robolectric.shadows;
import static android.os.Build.VERSION_CODES.S;
+import static android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE;
+import static org.robolectric.util.ReflectionHelpers.ClassParameter.from;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.Insets;
import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
import android.view.ThreadedRenderer;
import androidx.test.ext.junit.runners.AndroidJUnit4;
-import com.android.internal.policy.BackdropFrameRenderer;
import com.android.internal.policy.DecorView;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -19,30 +21,35 @@ import org.robolectric.util.ReflectionHelpers;
/** Tests for {@link ShadowBackdropFrameRenderer} */
@RunWith(AndroidJUnit4.class)
-@Config(minSdk = S)
+@Config(minSdk = S, maxSdk = UPSIDE_DOWN_CAKE)
public class ShadowBackdropFrameRendererTest {
@Test
public void releaseRenderer_afterCreate_doesNotLeakThread() throws Exception {
Activity activity = Robolectric.setupActivity(Activity.class);
DecorView decorView = (DecorView) activity.getWindow().getDecorView();
+ Class<?> backdropFrameRendererClass =
+ Class.forName("com.android.internal.policy.BackdropFrameRenderer");
for (int i = 0; i < 100; i++) {
- BackdropFrameRenderer r =
- new BackdropFrameRenderer(
- decorView,
- ThreadedRenderer.create(RuntimeEnvironment.getApplication(), false, "renderer"),
- new Rect(0, 0, 0, 0),
- null,
- null,
- null,
- Color.BLUE,
- Color.BLUE,
- false,
- Insets.of(0, 0, 0, 0));
+ Object r =
+ ReflectionHelpers.callConstructor(
+ backdropFrameRendererClass,
+ from(DecorView.class, decorView),
+ from(
+ ThreadedRenderer.class,
+ ThreadedRenderer.create(RuntimeEnvironment.getApplication(), false, "renderer")),
+ from(Rect.class, new Rect(0, 0, 0, 0)),
+ from(Drawable.class, null),
+ from(Drawable.class, null),
+ from(Drawable.class, null),
+ from(Integer.TYPE, Color.BLUE),
+ from(Integer.TYPE, Color.BLUE),
+ from(Boolean.TYPE, false),
+ from(Insets.class, Insets.of(0, 0, 0, 0)));
ReflectionHelpers.callInstanceMethod(r, "releaseRenderer");
// Without the ShadowBackdropFrameRenderer.run override, the call to join would hang
// indefinitely.
- r.join();
+ ((Thread) r).join();
}
}
}
diff --git a/shadows/framework/Android.bp b/shadows/framework/Android.bp
index 3d487fbff..493b84870 100644
--- a/shadows/framework/Android.bp
+++ b/shadows/framework/Android.bp
@@ -22,8 +22,8 @@ java_library {
java_resource_dirs: ["src/main/resources"],
javacflags: [
"-Aorg.robolectric.annotation.processing.shadowPackage=org.robolectric",
- //"-Aorg.robolectric.annotation.processing.sdkCheckMode=ERROR",
- //"-Aorg.robolectric.annotation.processing.validateCompileSdk=true",
+ "-Aorg.robolectric.annotation.processing.sdkCheckMode=ERROR",
+ "-Aorg.robolectric.annotation.processing.validateCompileSdk=true",
// Uncomment the below to debug annotation processors not firing.
//"-verbose",
//"-XprintRounds",
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBackdropFrameRenderer.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBackdropFrameRenderer.java
index e97c85789..36f000ee5 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBackdropFrameRenderer.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBackdropFrameRenderer.java
@@ -1,12 +1,12 @@
package org.robolectric.shadows;
import static android.os.Build.VERSION_CODES.S;
+import static android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE;
import static org.robolectric.util.reflector.Reflector.reflector;
import android.os.Looper;
import android.view.Choreographer;
import android.view.ThreadedRenderer;
-import com.android.internal.policy.BackdropFrameRenderer;
import com.google.common.util.concurrent.Uninterruptibles;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -21,14 +21,18 @@ import org.robolectric.util.reflector.Accessor;
import org.robolectric.util.reflector.ForType;
/** Shadow for {@link BackdropFrameRenderer} */
-@Implements(value = BackdropFrameRenderer.class, minSdk = S, isInAndroidSdk = false)
+@Implements(
+ className = "com.android.internal.policy.BackdropFrameRenderer",
+ minSdk = S,
+ maxSdk = UPSIDE_DOWN_CAKE,
+ isInAndroidSdk = false)
public class ShadowBackdropFrameRenderer {
// Updated to the real value in the generated Shadow constructor
- @RealObject private final BackdropFrameRenderer realBackdropFrameRenderer = null;
+ @RealObject private final Object realBackdropFrameRenderer = null;
private Looper looper;
- private static final List<BackdropFrameRenderer> activeRenderers = new CopyOnWriteArrayList<>();
+ private static final List<Object> activeRenderers = new CopyOnWriteArrayList<>();
@Implementation
protected void run() {
@@ -60,19 +64,19 @@ public class ShadowBackdropFrameRenderer {
// called from ShadowChoreographer to ensure choreographer is unpaused before this is executed
static void reset() {
- for (BackdropFrameRenderer renderer : activeRenderers) {
+ for (Object renderer : activeRenderers) {
reflector(BackdropFrameRendererReflector.class, renderer).releaseRenderer();
// Explicitly quit the looper if in legacy looper mode - otherwise it will hang forever
if (ConfigurationRegistry.get(LooperMode.Mode.class) == Mode.LEGACY) {
ShadowBackdropFrameRenderer shadowBackdropFrameRenderer = Shadow.extract(renderer);
shadowBackdropFrameRenderer.looper.quit();
}
- Uninterruptibles.joinUninterruptibly(renderer);
+ Uninterruptibles.joinUninterruptibly((Thread) renderer);
activeRenderers.remove(renderer);
}
}
- @ForType(BackdropFrameRenderer.class)
+ @ForType(className = "com.android.internal.policy.BackdropFrameRenderer")
interface BackdropFrameRendererReflector {
void releaseRenderer();
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowCameraManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowCameraManager.java
index be1e29713..deea97e5a 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowCameraManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowCameraManager.java
@@ -26,6 +26,7 @@ import javax.annotation.Nullable;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.InDevelopment;
import org.robolectric.annotation.RealObject;
import org.robolectric.annotation.Resetter;
import org.robolectric.util.ReflectionHelpers;
@@ -84,6 +85,7 @@ public class ShadowCameraManager {
}
@Implementation(minSdk = U.SDK_INT)
+ @InDevelopment
protected CameraDevice openCameraDeviceUserAsync(
String cameraId,
CameraDevice.StateCallback callback,
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowMotionEvent.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowMotionEvent.java
index ba220ffe0..4c1ecd3c9 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowMotionEvent.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowMotionEvent.java
@@ -25,6 +25,7 @@ import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.List;
import org.robolectric.annotation.HiddenApi;
+import org.robolectric.annotation.InDevelopment;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.InDevelopment;
@@ -635,12 +636,14 @@ public class ShadowMotionEvent extends ShadowInputEvent {
@Implementation(minSdk = V.SDK_INT)
@HiddenApi
+ @InDevelopment
protected static float nativeGetRawXOffset(long nativePtr) {
return getNativeMotionEvent(nativePtr).getXOffset();
}
@Implementation(minSdk = V.SDK_INT)
@HiddenApi
+ @InDevelopment
protected static float nativeGetRawYOffset(long nativePtr) {
return getNativeMotionEvent(nativePtr).getYOffset();
}
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeColorSpace.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeColorSpace.java
deleted file mode 100644
index 98d04c5fe..000000000
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeColorSpace.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.robolectric.shadows;
-
-import android.graphics.ColorSpace;
-import org.robolectric.annotation.Implementation;
-import org.robolectric.annotation.Implements;
-import org.robolectric.shadows.ShadowNativeColorSpace.Picker;
-import org.robolectric.versioning.AndroidVersions.V;
-
-/** Shadow for {@link ColorSpace} that defers its static initializer. */
-@Implements(
- value = ColorSpace.class,
- minSdk = V.SDK_INT,
- isInAndroidSdk = false,
- shadowPicker = Picker.class)
-public class ShadowNativeColorSpace {
-
- /**
- * The {@link ColorSpace} static initializer invokes its own native methods in its constructor
- * when it initializes the named color spaces. This has to be deferred starting in Android V.
- */
- @Implementation(minSdk = V.SDK_INT)
- protected static void __staticInitializer__() {
- // deferred
- }
-
- /** Shadow picker for {@link ColorSpace}. */
- public static final class Picker extends GraphicsShadowPicker<Object> {
- public Picker() {
- super(null, ShadowNativeColorSpace.class);
- }
- }
-}
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeColorSpaceRgb.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeColorSpaceRgb.java
index 54c824fe2..aaaa3b39d 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeColorSpaceRgb.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeColorSpaceRgb.java
@@ -11,6 +11,7 @@ import org.robolectric.nativeruntime.ColorSpaceRgbNatives;
import org.robolectric.nativeruntime.DefaultNativeRuntimeLoader;
import org.robolectric.shadows.ShadowNativeColorSpaceRgb.Picker;
import org.robolectric.versioning.AndroidVersions.U;
+import org.robolectric.versioning.AndroidVersions.V;
/** Shadow for {@link ColorSpace.Rgb} that is backed by native code */
@Implements(
@@ -19,7 +20,7 @@ import org.robolectric.versioning.AndroidVersions.U;
shadowPicker = Picker.class,
isInAndroidSdk = false,
callNativeMethodsByDefault = true)
-public class ShadowNativeColorSpaceRgb extends ShadowNativeColorSpace {
+public class ShadowNativeColorSpaceRgb {
@RealObject ColorSpace.Rgb colorSpaceRgb;
@@ -41,4 +42,21 @@ public class ShadowNativeColorSpaceRgb extends ShadowNativeColorSpace {
super(ShadowColorSpaceRgb.class, ShadowNativeColorSpaceRgb.class);
}
}
+
+ /** Shadow for {@link ColorSpace$Rgb$Native} that contains native functions. */
+ @Implements(
+ className = "android.graphics.ColorSpace$Rgb$Native",
+ isInAndroidSdk = false,
+ callNativeMethodsByDefault = true,
+ shadowPicker = ShadowNativeColorSpaceRgb.ShadowNative.Picker.class,
+ minSdk = V.SDK_INT)
+ @SuppressWarnings("robolectric.internal.IgnoreMissingClass")
+ public static class ShadowNative {
+ /** Shadow picker for {@link ColorSpace.Native}. */
+ public static final class Picker extends GraphicsShadowPicker<Object> {
+ public Picker() {
+ super(null, ShadowNativeColorSpaceRgb.ShadowNative.class);
+ }
+ }
+ }
}
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeFont.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeFont.java
index 23f5b7f86..c643f6782 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeFont.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeFont.java
@@ -20,6 +20,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
+import org.robolectric.annotation.InDevelopment;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.RealObject;
@@ -46,6 +47,7 @@ public class ShadowNativeFont {
* This must be deferred starting in Android V.
*/
@Implementation(minSdk = V.SDK_INT)
+ @InDevelopment
protected static void __staticInitializer__() {}
@Implementation(minSdk = S, maxSdk = U.SDK_INT)
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeFontsFontFamily.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeFontsFontFamily.java
index d2174f977..b2548db47 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeFontsFontFamily.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeFontsFontFamily.java
@@ -5,6 +5,7 @@ import static android.os.Build.VERSION_CODES.S;
import static android.os.Build.VERSION_CODES.TIRAMISU;
import android.graphics.fonts.FontFamily;
+import org.robolectric.annotation.InDevelopment;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.nativeruntime.DefaultNativeRuntimeLoader;
@@ -53,6 +54,7 @@ public class ShadowNativeFontsFontFamily {
public static class ShadowNativeFontFamilyBuilder {
@Implementation(minSdk = V.SDK_INT)
+ @InDevelopment
protected static void __staticInitializer__() {}
@Implementation(maxSdk = U.SDK_INT)
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeLineBreaker.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeLineBreaker.java
index ce0b92f7e..365f694f7 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeLineBreaker.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeLineBreaker.java
@@ -5,6 +5,7 @@ import static android.os.Build.VERSION_CODES.Q;
import android.annotation.FloatRange;
import android.annotation.IntRange;
import android.graphics.text.LineBreaker;
+import org.robolectric.annotation.InDevelopment;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.nativeruntime.DefaultNativeRuntimeLoader;
@@ -22,6 +23,7 @@ import org.robolectric.versioning.AndroidVersions.V;
public class ShadowNativeLineBreaker {
@Implementation(minSdk = V.SDK_INT)
+ @InDevelopment
protected static void __staticInitializer__() {}
@Implementation(maxSdk = U.SDK_INT)
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeMatrix.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeMatrix.java
index de4fccdfe..c3a84f070 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeMatrix.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativeMatrix.java
@@ -275,4 +275,21 @@ public class ShadowNativeMatrix extends ShadowMatrix {
public String getDescription() {
throw new UnsupportedOperationException("Legacy ShadowMatrix APIs are not supported");
}
+
+ /** Shadow for {@link Matrix$ExtraNatives} that contains native functions. */
+ @Implements(
+ className = "android.graphics.Matrix$ExtraNatives",
+ isInAndroidSdk = false,
+ callNativeMethodsByDefault = true,
+ shadowPicker = ShadowNativeMatrix.ShadowExtraNatives.Picker.class,
+ minSdk = V.SDK_INT)
+ @SuppressWarnings("robolectric.internal.IgnoreMissingClass")
+ public static class ShadowExtraNatives {
+ /** Shadow picker for {@link Matrix.ExtraNatives}. */
+ public static final class Picker extends GraphicsShadowPicker<Object> {
+ public Picker() {
+ super(null, ShadowNativeMatrix.ShadowExtraNatives.class);
+ }
+ }
+ }
}
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativePositionedGlyphs.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativePositionedGlyphs.java
index 5b65023af..15a8c2a11 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativePositionedGlyphs.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowNativePositionedGlyphs.java
@@ -1,6 +1,7 @@
package org.robolectric.shadows;
import android.graphics.text.PositionedGlyphs;
+import org.robolectric.annotation.InDevelopment;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.nativeruntime.DefaultNativeRuntimeLoader;
@@ -22,6 +23,7 @@ public class ShadowNativePositionedGlyphs {
* deferred starting in Android V.
*/
@Implementation(minSdk = V.SDK_INT)
+ @InDevelopment
protected static void __staticInitializer__() {
// deferred
}