diff --git a/android/src/main/java/io/grpc/android/AndroidChannelBuilder.java b/android/src/main/java/io/grpc/android/AndroidChannelBuilder.java index 25a047091b..f23a73fbad 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.ClientCall; 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 @@ public final class AndroidChannelBuilder extends ForwardingChannelBuilder 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 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 @@ public final class AndroidChannelBuilder extends ForwardingChannelBuilder delegateBuilder) { diff --git a/api/src/main/java/io/grpc/InternalManagedChannelProvider.java b/api/src/main/java/io/grpc/InternalManagedChannelProvider.java index 076b5464b7..2b22e6013e 100644 --- a/api/src/main/java/io/grpc/InternalManagedChannelProvider.java +++ b/api/src/main/java/io/grpc/InternalManagedChannelProvider.java @@ -25,6 +25,10 @@ public final class InternalManagedChannelProvider { 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);