diff options
author | Michael Hoisie <hoisie@google.com> | 2024-04-30 07:07:39 -0700 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2024-04-30 07:08:14 -0700 |
commit | da5e70d78756666f4dbdf3421e187b90a1adcd79 (patch) | |
tree | 2d6aa2c9630705ac51e2793625ca119343a0527c | |
parent | 2e55d3898ad5f5ad9da68349b849699851a81df2 (diff) | |
download | robolectric-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.java | 8 | ||||
-rw-r--r-- | shadows/framework/src/main/java/org/robolectric/shadows/ShadowCompatibility.java | 20 |
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 { |