Expose compression on ClientCall and Server Call
diff --git a/core/src/main/java/io/grpc/internal/AbstractManagedChannelImplBuilder.java b/core/src/main/java/io/grpc/internal/AbstractManagedChannelImplBuilder.java
index ea79c4e..a610d6c 100644
--- a/core/src/main/java/io/grpc/internal/AbstractManagedChannelImplBuilder.java
+++ b/core/src/main/java/io/grpc/internal/AbstractManagedChannelImplBuilder.java
@@ -31,11 +31,16 @@
 
 package io.grpc.internal;
 
+import static com.google.common.base.MoreObjects.firstNonNull;
+
 import com.google.common.base.Preconditions;
 import com.google.common.util.concurrent.MoreExecutors;
 
 import io.grpc.Attributes;
 import io.grpc.ClientInterceptor;
+import io.grpc.CompressorRegistry;
+import io.grpc.DecompressorRegistry;
+import io.grpc.ExperimentalApi;
 import io.grpc.LoadBalancer;
 import io.grpc.ManagedChannelBuilder;
 import io.grpc.NameResolver;
@@ -82,6 +87,12 @@
   @Nullable
   private LoadBalancer.Factory loadBalancerFactory;
 
+  @Nullable
+  private DecompressorRegistry decompressorRegistry;
+
+  @Nullable
+  private CompressorRegistry compressorRegistry;
+
   protected AbstractManagedChannelImplBuilder(String target) {
     this.target = Preconditions.checkNotNull(target);
     this.directServerAddress = null;
@@ -133,6 +144,20 @@
     return thisT();
   }
 
+  @Override
+  @ExperimentalApi
+  public final T decompressorRegistry(DecompressorRegistry registry) {
+    this.decompressorRegistry = registry;
+    return thisT();
+  }
+
+  @Override
+  @ExperimentalApi
+  public final T compressorRegistry(CompressorRegistry registry) {
+    this.compressorRegistry = registry;
+    return thisT();
+  }
+
   private T thisT() {
     @SuppressWarnings("unchecked")
     T thisT = (T) this;
@@ -168,12 +193,13 @@
         target,
         // TODO(carl-mastrangelo): Allow clients to pass this in
         new ExponentialBackoffPolicy.Provider(),
-        nameResolverFactory == null ? NameResolverRegistry.getDefaultRegistry()
-            : nameResolverFactory,
+        firstNonNull(nameResolverFactory, NameResolverRegistry.getDefaultRegistry()),
         getNameResolverParams(),
-        loadBalancerFactory == null ? SimpleLoadBalancerFactory.getInstance()
-            : loadBalancerFactory,
-        transportFactory, executor, userAgent, interceptors);
+        firstNonNull(loadBalancerFactory, SimpleLoadBalancerFactory.getInstance()),
+        transportFactory,
+        firstNonNull(decompressorRegistry, DecompressorRegistry.getDefaultInstance()),
+        firstNonNull(compressorRegistry, CompressorRegistry.getDefaultInstance()),
+        executor, userAgent, interceptors);
   }
 
   /**
@@ -186,7 +212,7 @@
   /**
    * Subclasses can override this method to provide additional parameters to {@link
    * NameResolver.Factory#newNameResolver}. The default implementation returns {@link
-   * Attributes.EMPTY}.
+   * Attributes#EMPTY}.
    */
   protected Attributes getNameResolverParams() {
     return Attributes.EMPTY;