android: Use InternalManagedChannelProvider instead of reflection
This fixes up cda0e9d to be compatible with Proguard without
configuration. Since the methods are now accessed directly there is no
need for manual -keep configuration.
diff --git a/android/src/main/java/io/grpc/android/AndroidChannelBuilder.java b/android/src/main/java/io/grpc/android/AndroidChannelBuilder.java
index 25a0470..f23a73f 100644
--- a/android/src/main/java/io/grpc/android/AndroidChannelBuilder.java
+++ b/android/src/main/java/io/grpc/android/AndroidChannelBuilder.java
@@ -33,8 +33,10 @@
import io.grpc.ConnectivityState;
import io.grpc.ExperimentalApi;
import io.grpc.ForwardingChannelBuilder;
+import io.grpc.InternalManagedChannelProvider;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
+import io.grpc.ManagedChannelProvider;
import io.grpc.MethodDescriptor;
import io.grpc.internal.GrpcUtil;
import java.util.concurrent.TimeUnit;
@@ -55,30 +57,32 @@
private static final String LOG_TAG = "AndroidChannelBuilder";
- @Nullable private static final Object OKHTTP_CHANNEL_PROVIDER = findOkHttp();
+ @Nullable private static final ManagedChannelProvider OKHTTP_CHANNEL_PROVIDER = findOkHttp();
- private static Object findOkHttp() {
- Class<?> klass;
+ private static ManagedChannelProvider findOkHttp() {
+ Class<?> klassRaw;
try {
- klass = Class.forName("io.grpc.okhttp.OkHttpChannelProvider");
+ klassRaw = Class.forName("io.grpc.okhttp.OkHttpChannelProvider");
} catch (ClassNotFoundException e) {
Log.w(LOG_TAG, "Failed to find OkHttpChannelProvider", e);
return null;
}
- Object provider;
+ Class<? extends ManagedChannelProvider> klass;
+ try {
+ klass = klassRaw.asSubclass(ManagedChannelProvider.class);
+ } catch (ClassCastException e) {
+ Log.w(LOG_TAG, "Couldn't cast OkHttpChannelProvider to ManagedChannelProvider", e);
+ return null;
+ }
+ ManagedChannelProvider provider;
try {
provider = klass.getConstructor().newInstance();
} catch (Exception e) {
Log.w(LOG_TAG, "Failed to construct OkHttpChannelProvider", e);
return null;
}
- try {
- if (!(Boolean) klass.getMethod("isAvailable").invoke(provider)) {
- Log.w(LOG_TAG, "OkHttpChannelProvider.isAvailable() returned false");
- return null;
- }
- } catch (Exception e) {
- Log.w(LOG_TAG, "Failed to check OkHttpChannelProvider.isAvailable()", e);
+ if (!InternalManagedChannelProvider.isAvailable(provider)) {
+ Log.w(LOG_TAG, "OkHttpChannelProvider.isAvailable() returned false");
return null;
}
return provider;
@@ -135,15 +139,8 @@
if (OKHTTP_CHANNEL_PROVIDER == null) {
throw new UnsupportedOperationException("Unable to load OkHttpChannelProvider");
}
- try {
- delegateBuilder =
- (ManagedChannelBuilder)
- OKHTTP_CHANNEL_PROVIDER.getClass()
- .getMethod("builderForTarget", String.class)
- .invoke(OKHTTP_CHANNEL_PROVIDER, target);
- } catch (Exception e) {
- throw new RuntimeException("Failed to create ManagedChannelBuilder", e);
- }
+ delegateBuilder =
+ InternalManagedChannelProvider.builderForTarget(OKHTTP_CHANNEL_PROVIDER, target);
}
private AndroidChannelBuilder(ManagedChannelBuilder<?> delegateBuilder) {
diff --git a/api/src/main/java/io/grpc/InternalManagedChannelProvider.java b/api/src/main/java/io/grpc/InternalManagedChannelProvider.java
index 076b546..2b22e60 100644
--- a/api/src/main/java/io/grpc/InternalManagedChannelProvider.java
+++ b/api/src/main/java/io/grpc/InternalManagedChannelProvider.java
@@ -25,6 +25,10 @@
private InternalManagedChannelProvider() {
}
+ public static boolean isAvailable(ManagedChannelProvider provider) {
+ return provider.isAvailable();
+ }
+
public static ManagedChannelBuilder<?> builderForAddress(ManagedChannelProvider provider,
String name, int port) {
return provider.builderForAddress(name, port);