diff options
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 Binary files differindex e25a15ab9..4e9751ba2 100644 --- a/nativeruntime/src/main/resources/icu/icudt.dat +++ b/nativeruntime/src/main/resources/icu/icudt.dat 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 } |