aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-05-26 07:24:58 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2024-05-26 07:24:58 +0000
commitfd7007fb5c5df8b3b88cd1662cc4918dda47b4a1 (patch)
tree0e7c69674483c9d63e21513e60fca4a397a71a63
parent0b441899940cf091c68891951b317475438e6152 (diff)
parentfb7def90d3846c911e337e62b13b6001501951ad (diff)
downloadrobolectric-busytown-mac-infra-release.tar.gz
Merge "Snap for 11878398 from 7f68f06545907590e2ff394f658782def4368e42 to busytown-mac-infra-release" into busytown-mac-infra-releasebusytown-mac-infra-release
-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.xml4
-rw-r--r--processor/src/main/java/org/robolectric/annotation/processing/validator/SdkStore.java7
-rw-r--r--shadows/framework/Android.bp4
-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/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/ShadowNativePositionedGlyphs.java2
12 files changed, 123 insertions, 18 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 1b0763909..c93e4e04b 100644
--- a/nativeruntime/src/main/resources/arsc/font_resources/values/public.xml
+++ b/nativeruntime/src/main/resources/arsc/font_resources/values/public.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--TODO(b/332407470): We need a more stable method for the configuration.-->
- <public type="string" name="config_bodyFontFamily" id="0x010401f7" />
- <public type="string" name="config_headlineFontFamily" id="0x0104026a" />
+ <public type="string" name="config_bodyFontFamily" id="0x010401f9" />
+ <public type="string" name="config_headlineFontFamily" id="0x0104026d" />
</resources>
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/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/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/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/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
}