From fba4ae496a03271dac0a6f8dc95fced98f7bf773 Mon Sep 17 00:00:00 2001 From: John Cormie Date: Wed, 6 Apr 2022 07:37:00 -0700 Subject: [PATCH] binder: Work around an Android Intent bug (#9061) Where filterEquals() can be inconsistent with filterHashCode(). Fixes #9045 --- .../grpc/binder/AndroidComponentAddress.java | 9 +++++- .../binder/AndroidComponentAddressTest.java | 32 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/binder/src/main/java/io/grpc/binder/AndroidComponentAddress.java b/binder/src/main/java/io/grpc/binder/AndroidComponentAddress.java index 4809a2db43..abcabea4f2 100644 --- a/binder/src/main/java/io/grpc/binder/AndroidComponentAddress.java +++ b/binder/src/main/java/io/grpc/binder/AndroidComponentAddress.java @@ -128,7 +128,14 @@ public class AndroidComponentAddress extends SocketAddress { // NOTE: Only tempo @Override public int hashCode() { - return bindIntent.filterHashCode(); + Intent intentForHashCode = bindIntent; + // Clear a (usually redundant) package filter to work around an Android >= 31 bug where certain + // Intents compare filterEquals() but have different filterHashCode() values. It's always safe + // to include fewer fields in the hashCode() computation. + if (intentForHashCode.getPackage() != null) { + intentForHashCode = intentForHashCode.cloneFilter().setPackage(null); + } + return intentForHashCode.filterHashCode(); } @Override diff --git a/binder/src/test/java/io/grpc/binder/AndroidComponentAddressTest.java b/binder/src/test/java/io/grpc/binder/AndroidComponentAddressTest.java index 722af081bb..5824c953d1 100644 --- a/binder/src/test/java/io/grpc/binder/AndroidComponentAddressTest.java +++ b/binder/src/test/java/io/grpc/binder/AndroidComponentAddressTest.java @@ -27,6 +27,7 @@ import com.google.common.testing.EqualsTester; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) public final class AndroidComponentAddressTest { @@ -85,4 +86,35 @@ public final class AndroidComponentAddressTest { .setComponent(hostComponent))) .testEquals(); } + + @Test + @Config(sdk = 30) + public void testPackageFilterEquality30AndUp() { + new EqualsTester() + .addEqualityGroup( + AndroidComponentAddress.forBindIntent( + new Intent().setAction("action").setComponent(new ComponentName("pkg", "cls"))), + AndroidComponentAddress.forBindIntent( + new Intent() + .setAction("action") + .setPackage("pkg") + .setComponent(new ComponentName("pkg", "cls")))) + .testEquals(); + } + + @Test + @Config(sdk = 29) + public void testPackageFilterEqualityPre30() { + new EqualsTester() + .addEqualityGroup( + AndroidComponentAddress.forBindIntent( + new Intent().setAction("action").setComponent(new ComponentName("pkg", "cls")))) + .addEqualityGroup( + AndroidComponentAddress.forBindIntent( + new Intent() + .setAction("action") + .setPackage("pkg") + .setComponent(new ComponentName("pkg", "cls")))) + .testEquals(); + } }