aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Hoisie <hoisie@google.com>2024-04-30 07:07:39 -0700
committerCopybara-Service <copybara-worker@google.com>2024-04-30 07:08:14 -0700
commitda5e70d78756666f4dbdf3421e187b90a1adcd79 (patch)
tree2d6aa2c9630705ac51e2793625ca119343a0527c
parent2e55d3898ad5f5ad9da68349b849699851a81df2 (diff)
downloadrobolectric-upstream-google.tar.gz
Fix edge-to-edge enforcement check in ShadowCompatibilityupstream-google
Apps that target Android V and above will be required to support edge-to-edge content, where apps will be responsible for drawing content under the status and navigation bars: https://developer.android.com/about/versions/15/behavior-changes-15#edge-to-edge In framework code, this is primarily detected using CompatChanges.isChangeEnabled(ENFORCE_EDGE_TO_EDGE). However, this previously always returned true because CompatChanges.isChangeEnabled returns true by default in Robolectric. In real Android, CompatChanges.isChangeEnabled(ENFORCE_EDGE_TO_EDGE) only returns true when the target SDK is V or above. PiperOrigin-RevId: 629401576
-rw-r--r--robolectric/src/test/java/org/robolectric/shadows/CompatibilityTest.java8
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowCompatibility.java20
2 files changed, 24 insertions, 4 deletions
diff --git a/robolectric/src/test/java/org/robolectric/shadows/CompatibilityTest.java b/robolectric/src/test/java/org/robolectric/shadows/CompatibilityTest.java
index 85621c7eb..d532dd7b7 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/CompatibilityTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/CompatibilityTest.java
@@ -10,6 +10,8 @@ import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.annotation.experimental.LazyApplication;
import org.robolectric.annotation.experimental.LazyApplication.LazyLoad;
+import org.robolectric.versioning.AndroidVersions.U;
+import org.robolectric.versioning.AndroidVersions.V;
/** Tests to make sure {@link android.compat.Compatibility} is instrumented correctly */
@RunWith(RobolectricTestRunner.class)
@@ -33,4 +35,10 @@ public class CompatibilityTest {
// verify there are no CompatibilityChangeReporter spam logs
assertThat(ShadowLog.getLogsForTag("CompatibilityChangeReporter")).isEmpty();
}
+
+ @Test
+ public void edgeToEdgeEncorcement_minSdk() {
+ assertThat(ShadowCompatibility.isEdgeToEdgeEnabled(U.SDK_INT)).isFalse();
+ assertThat(ShadowCompatibility.isEdgeToEdgeEnabled(V.SDK_INT)).isTrue();
+ }
}
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowCompatibility.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowCompatibility.java
index 1dd630828..1826bcb65 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowCompatibility.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowCompatibility.java
@@ -5,32 +5,44 @@ import static org.robolectric.util.reflector.Reflector.reflector;
import android.compat.Compatibility;
import android.compat.annotation.ChangeId;
import android.os.Build.VERSION_CODES;
+import com.google.common.annotations.VisibleForTesting;
+import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.RealObject;
import org.robolectric.util.reflector.Direct;
import org.robolectric.util.reflector.ForType;
import org.robolectric.util.reflector.Static;
+import org.robolectric.versioning.AndroidVersions.U;
-/**
- * Robolectric shadow to disable CALL_ACTIVITY_RESULT_BEFORE_RESUME using Compatibility's
- * isChangeEnabled.
- */
+/** Shadow for {@link Compatability}. */
@Implements(value = Compatibility.class, isInAndroidSdk = false)
public class ShadowCompatibility {
private static final long CALL_ACTIVITY_RESULT_BEFORE_RESUME = 78294732L;
+ private static final long ENFORCE_EDGE_TO_EDGE = 309578419L;
+
@RealObject protected static Compatibility realCompatibility;
@Implementation(minSdk = VERSION_CODES.S_V2)
protected static boolean isChangeEnabled(@ChangeId long changeId) {
if (changeId == CALL_ACTIVITY_RESULT_BEFORE_RESUME) {
return false;
+ } else if (changeId == ENFORCE_EDGE_TO_EDGE) {
+ int targetSdkVersion =
+ RuntimeEnvironment.getApplication().getApplicationInfo().targetSdkVersion;
+ return isEdgeToEdgeEnabled(targetSdkVersion);
}
return reflector(CompatibilityReflector.class).isChangeEnabled(changeId);
}
+ @VisibleForTesting
+ static boolean isEdgeToEdgeEnabled(int targetSdkVersion) {
+ // Edge-to-edge is enforced for apps that target Android V and above.
+ return targetSdkVersion > U.SDK_INT;
+ }
+
/** Reflector interface for {@link Compatibility}'s isChangeEnabled function. */
@ForType(Compatibility.class)
private interface CompatibilityReflector {