DO NOT EDIT THIS FILE, USE update_api.py TO UPDATE IT

public class org.chromium.net.ApiVersion {
  public static int getApiLevel();
  public static int getMaximumAvailableApiLevel();
  public static java.lang.String getCronetVersion();
  public static java.lang.String getCronetVersionWithLastChange();
  public static java.lang.String getLastChange();
}
public abstract class org.chromium.net.BidirectionalStream$Builder {
  public abstract org.chromium.net.BidirectionalStream build();
  public abstract org.chromium.net.BidirectionalStream$Builder addHeader(java.lang.String, java.lang.String);
  public abstract org.chromium.net.BidirectionalStream$Builder delayRequestHeadersUntilFirstFlush(boolean);
  public abstract org.chromium.net.BidirectionalStream$Builder setHttpMethod(java.lang.String);
  public abstract org.chromium.net.BidirectionalStream$Builder setPriority(int);
  public org.chromium.net.BidirectionalStream$Builder addRequestAnnotation(java.lang.Object);
  public org.chromium.net.BidirectionalStream$Builder bindToNetwork(long);
  public org.chromium.net.BidirectionalStream$Builder setTrafficStatsTag(int);
  public org.chromium.net.BidirectionalStream$Builder setTrafficStatsUid(int);
  public org.chromium.net.BidirectionalStream$Builder();
  public static final int STREAM_PRIORITY_HIGHEST;
  public static final int STREAM_PRIORITY_IDLE;
  public static final int STREAM_PRIORITY_LOW;
  public static final int STREAM_PRIORITY_LOWEST;
  public static final int STREAM_PRIORITY_MEDIUM;
}
public abstract class org.chromium.net.BidirectionalStream$Callback {
  public abstract void onFailed(org.chromium.net.BidirectionalStream, org.chromium.net.UrlResponseInfo, org.chromium.net.CronetException);
  public abstract void onReadCompleted(org.chromium.net.BidirectionalStream, org.chromium.net.UrlResponseInfo, java.nio.ByteBuffer, boolean);
  public abstract void onResponseHeadersReceived(org.chromium.net.BidirectionalStream, org.chromium.net.UrlResponseInfo);
  public abstract void onStreamReady(org.chromium.net.BidirectionalStream);
  public abstract void onSucceeded(org.chromium.net.BidirectionalStream, org.chromium.net.UrlResponseInfo);
  public abstract void onWriteCompleted(org.chromium.net.BidirectionalStream, org.chromium.net.UrlResponseInfo, java.nio.ByteBuffer, boolean);
  public org.chromium.net.BidirectionalStream$Callback();
  public void onCanceled(org.chromium.net.BidirectionalStream, org.chromium.net.UrlResponseInfo);
  public void onResponseTrailersReceived(org.chromium.net.BidirectionalStream, org.chromium.net.UrlResponseInfo, org.chromium.net.UrlResponseInfo$HeaderBlock);
}
public abstract class org.chromium.net.BidirectionalStream {
  public abstract boolean isDone();
  public abstract void cancel();
  public abstract void flush();
  public abstract void read(java.nio.ByteBuffer);
  public abstract void start();
  public abstract void write(java.nio.ByteBuffer, boolean);
  public org.chromium.net.BidirectionalStream();
}
public abstract class org.chromium.net.CallbackException extends org.chromium.net.CronetException {
  protected org.chromium.net.CallbackException(java.lang.String, java.lang.Throwable);
}
public class org.chromium.net.ConnectionMigrationOptions$Builder {
  public org.chromium.net.ConnectionMigrationOptions build();
  public org.chromium.net.ConnectionMigrationOptions$Builder allowNonDefaultNetworkUsage(boolean);
  public org.chromium.net.ConnectionMigrationOptions$Builder allowServerMigration(boolean);
  public org.chromium.net.ConnectionMigrationOptions$Builder enableDefaultNetworkMigration(boolean);
  public org.chromium.net.ConnectionMigrationOptions$Builder enablePathDegradationMigration(boolean);
  public org.chromium.net.ConnectionMigrationOptions$Builder migrateIdleConnections(boolean);
  public org.chromium.net.ConnectionMigrationOptions$Builder retryPreHandshakeErrorsOnNonDefaultNetwork(boolean);
  public org.chromium.net.ConnectionMigrationOptions$Builder setIdleConnectionMigrationPeriodSeconds(long);
  public org.chromium.net.ConnectionMigrationOptions$Builder setMaxPathDegradingNonDefaultNetworkMigrationsCount(int);
  public org.chromium.net.ConnectionMigrationOptions$Builder setMaxTimeOnNonDefaultNetworkSeconds(long);
  public org.chromium.net.ConnectionMigrationOptions$Builder setMaxWriteErrorNonDefaultNetworkMigrationsCount(int);
}
public interface org.chromium.net.ConnectionMigrationOptions$Experimental extends java.lang.annotation.Annotation {
}
public final class org.chromium.net.ConnectionMigrationOptions {
  public java.lang.Boolean getAllowNonDefaultNetworkUsage();
  public java.lang.Boolean getAllowServerMigration();
  public java.lang.Boolean getEnableDefaultNetworkMigration();
  public java.lang.Boolean getEnablePathDegradationMigration();
  public java.lang.Boolean getMigrateIdleConnections();
  public java.lang.Boolean getRetryPreHandshakeErrorsOnAlternateNetwork();
  public java.lang.Integer getMaxPathDegradingEagerMigrationsCount();
  public java.lang.Integer getMaxWriteErrorEagerMigrationsCount();
  public java.lang.Long getIdleMigrationPeriodSeconds();
  public java.lang.Long getMaxTimeOnNonDefaultNetworkSeconds();
  public static org.chromium.net.ConnectionMigrationOptions$Builder builder();
}
public abstract class org.chromium.net.CronetEngine$Builder$LibraryLoader {
  public abstract void loadLibrary(java.lang.String);
  public org.chromium.net.CronetEngine$Builder$LibraryLoader();
}
public class org.chromium.net.CronetEngine$Builder {
  protected final org.chromium.net.ICronetEngineBuilder mBuilderDelegate;
  protected org.chromium.net.ExperimentalCronetEngine buildExperimental();
  protected org.json.JSONObject mParsedExperimentalOptions;
  public java.lang.String getDefaultUserAgent();
  public org.chromium.net.CronetEngine build();
  public org.chromium.net.CronetEngine$Builder addPublicKeyPins(java.lang.String, java.util.Set<byte[]>, boolean, java.util.Date);
  public org.chromium.net.CronetEngine$Builder addQuicHint(java.lang.String, int, int);
  public org.chromium.net.CronetEngine$Builder enableBrotli(boolean);
  public org.chromium.net.CronetEngine$Builder enableHttp2(boolean);
  public org.chromium.net.CronetEngine$Builder enableHttpCache(int, long);
  public org.chromium.net.CronetEngine$Builder enableNetworkQualityEstimator(boolean);
  public org.chromium.net.CronetEngine$Builder enablePublicKeyPinningBypassForLocalTrustAnchors(boolean);
  public org.chromium.net.CronetEngine$Builder enableQuic(boolean);
  public org.chromium.net.CronetEngine$Builder enableSdch(boolean);
  public org.chromium.net.CronetEngine$Builder setConnectionMigrationOptions(org.chromium.net.ConnectionMigrationOptions$Builder);
  public org.chromium.net.CronetEngine$Builder setConnectionMigrationOptions(org.chromium.net.ConnectionMigrationOptions);
  public org.chromium.net.CronetEngine$Builder setDnsOptions(org.chromium.net.DnsOptions$Builder);
  public org.chromium.net.CronetEngine$Builder setDnsOptions(org.chromium.net.DnsOptions);
  public org.chromium.net.CronetEngine$Builder setLibraryLoader(org.chromium.net.CronetEngine$Builder$LibraryLoader);
  public org.chromium.net.CronetEngine$Builder setProxyOptions(org.chromium.net.ProxyOptions);
  public org.chromium.net.CronetEngine$Builder setQuicOptions(org.chromium.net.QuicOptions$Builder);
  public org.chromium.net.CronetEngine$Builder setQuicOptions(org.chromium.net.QuicOptions);
  public org.chromium.net.CronetEngine$Builder setStoragePath(java.lang.String);
  public org.chromium.net.CronetEngine$Builder setThreadPriority(int);
  public org.chromium.net.CronetEngine$Builder setUserAgent(java.lang.String);
  public org.chromium.net.CronetEngine$Builder(android.content.Context);
  public org.chromium.net.CronetEngine$Builder(org.chromium.net.ICronetEngineBuilder);
  public static final int HTTP_CACHE_DISABLED;
  public static final int HTTP_CACHE_DISK;
  public static final int HTTP_CACHE_DISK_NO_HTTP;
  public static final int HTTP_CACHE_IN_MEMORY;
}
public abstract class org.chromium.net.CronetEngine {
  public abstract byte[] getGlobalMetricsDeltas();
  public abstract java.lang.String getVersionString();
  public abstract java.net.URLConnection openConnection(java.net.URL) throws java.io.IOException;
  public abstract java.net.URLStreamHandlerFactory createURLStreamHandlerFactory();
  public abstract org.chromium.net.UrlRequest$Builder newUrlRequestBuilder(java.lang.String, org.chromium.net.UrlRequest$Callback, java.util.concurrent.Executor);
  public abstract void shutdown();
  public abstract void startNetLogToFile(java.lang.String, boolean);
  public abstract void stopNetLog();
  public int getActiveRequestCount();
  public int getDownstreamThroughputKbps();
  public int getEffectiveConnectionType();
  public int getHttpRttMs();
  public int getTransportRttMs();
  public org.chromium.net.BidirectionalStream$Builder newBidirectionalStreamBuilder(java.lang.String, org.chromium.net.BidirectionalStream$Callback, java.util.concurrent.Executor);
  public org.chromium.net.CronetEngine();
  public static final int ACTIVE_REQUEST_COUNT_UNKNOWN;
  public static final int CONNECTION_METRIC_UNKNOWN;
  public static final int EFFECTIVE_CONNECTION_TYPE_2G;
  public static final int EFFECTIVE_CONNECTION_TYPE_3G;
  public static final int EFFECTIVE_CONNECTION_TYPE_4G;
  public static final int EFFECTIVE_CONNECTION_TYPE_OFFLINE;
  public static final int EFFECTIVE_CONNECTION_TYPE_SLOW_2G;
  public static final int EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
  public static final long UNBIND_NETWORK_HANDLE;
  public void addRequestFinishedListener(org.chromium.net.RequestFinishedInfo$Listener);
  public void addRttListener(org.chromium.net.NetworkQualityRttListener);
  public void addThroughputListener(org.chromium.net.NetworkQualityThroughputListener);
  public void bindToNetwork(long);
  public void configureNetworkQualityEstimatorForTesting(boolean, boolean, boolean);
  public void removeRequestFinishedListener(org.chromium.net.RequestFinishedInfo$Listener);
  public void removeRttListener(org.chromium.net.NetworkQualityRttListener);
  public void removeThroughputListener(org.chromium.net.NetworkQualityThroughputListener);
  public void startNetLogToDisk(java.lang.String, boolean, int);
}
public abstract class org.chromium.net.CronetException extends java.io.IOException {
  protected org.chromium.net.CronetException(java.lang.String, java.lang.Throwable);
}
public abstract class org.chromium.net.CronetProvider {
  protected final android.content.Context mContext;
  protected org.chromium.net.CronetProvider(android.content.Context);
  public abstract boolean isEnabled();
  public abstract java.lang.String getName();
  public abstract java.lang.String getVersion();
  public abstract org.chromium.net.CronetEngine$Builder createBuilder();
  public java.lang.String toString();
  public static final java.lang.String PROVIDER_NAME_APP_PACKAGED;
  public static final java.lang.String PROVIDER_NAME_FALLBACK;
  public static final java.lang.String PROVIDER_NAME_HTTPENGINE_NATIVE;
  public static java.util.List<org.chromium.net.CronetProvider> getAllProviders(android.content.Context);
}
public final class org.chromium.net.DnsOptions$Builder {
  public org.chromium.net.DnsOptions build();
  public org.chromium.net.DnsOptions$Builder enableStaleDns(boolean);
  public org.chromium.net.DnsOptions$Builder persistHostCache(boolean);
  public org.chromium.net.DnsOptions$Builder preestablishConnectionsToStaleDnsResults(boolean);
  public org.chromium.net.DnsOptions$Builder setPersistDelay(java.time.Duration);
  public org.chromium.net.DnsOptions$Builder setPersistHostCachePeriodMillis(long);
  public org.chromium.net.DnsOptions$Builder setStaleDnsOptions(org.chromium.net.DnsOptions$StaleDnsOptions$Builder);
  public org.chromium.net.DnsOptions$Builder setStaleDnsOptions(org.chromium.net.DnsOptions$StaleDnsOptions);
  public org.chromium.net.DnsOptions$Builder useBuiltInDnsResolver(boolean);
}
public interface org.chromium.net.DnsOptions$Experimental extends java.lang.annotation.Annotation {
}
public final class org.chromium.net.DnsOptions$StaleDnsOptions$Builder {
  public org.chromium.net.DnsOptions$StaleDnsOptions build();
  public org.chromium.net.DnsOptions$StaleDnsOptions$Builder allowCrossNetworkUsage(boolean);
  public org.chromium.net.DnsOptions$StaleDnsOptions$Builder setFreshLookupTimeout(java.time.Duration);
  public org.chromium.net.DnsOptions$StaleDnsOptions$Builder setFreshLookupTimeoutMillis(long);
  public org.chromium.net.DnsOptions$StaleDnsOptions$Builder setMaxExpiredDelay(java.time.Duration);
  public org.chromium.net.DnsOptions$StaleDnsOptions$Builder setMaxExpiredDelayMillis(long);
  public org.chromium.net.DnsOptions$StaleDnsOptions$Builder useStaleOnNameNotResolved(boolean);
}
public class org.chromium.net.DnsOptions$StaleDnsOptions {
  public java.lang.Boolean getAllowCrossNetworkUsage();
  public java.lang.Boolean getUseStaleOnNameNotResolved();
  public java.lang.Long getFreshLookupTimeoutMillis();
  public java.lang.Long getMaxExpiredDelayMillis();
  public static org.chromium.net.DnsOptions$StaleDnsOptions$Builder builder();
}
public final class org.chromium.net.DnsOptions {
  public java.lang.Boolean getEnableStaleDns();
  public java.lang.Boolean getPersistHostCache();
  public java.lang.Boolean getPreestablishConnectionsToStaleDnsResults();
  public java.lang.Boolean getUseBuiltInDnsResolver();
  public java.lang.Long getPersistHostCachePeriodMillis();
  public org.chromium.net.DnsOptions$StaleDnsOptions getStaleDnsOptions();
  public static org.chromium.net.DnsOptions$Builder builder();
}
public abstract class org.chromium.net.ExperimentalBidirectionalStream$Builder extends org.chromium.net.BidirectionalStream$Builder {
  public abstract org.chromium.net.ExperimentalBidirectionalStream build();
  public abstract org.chromium.net.ExperimentalBidirectionalStream$Builder addHeader(java.lang.String, java.lang.String);
  public abstract org.chromium.net.ExperimentalBidirectionalStream$Builder delayRequestHeadersUntilFirstFlush(boolean);
  public abstract org.chromium.net.ExperimentalBidirectionalStream$Builder setHttpMethod(java.lang.String);
  public abstract org.chromium.net.ExperimentalBidirectionalStream$Builder setPriority(int);
  public org.chromium.net.BidirectionalStream build();
  public org.chromium.net.BidirectionalStream$Builder addHeader(java.lang.String, java.lang.String);
  public org.chromium.net.BidirectionalStream$Builder addRequestAnnotation(java.lang.Object);
  public org.chromium.net.BidirectionalStream$Builder delayRequestHeadersUntilFirstFlush(boolean);
  public org.chromium.net.BidirectionalStream$Builder setHttpMethod(java.lang.String);
  public org.chromium.net.BidirectionalStream$Builder setPriority(int);
  public org.chromium.net.BidirectionalStream$Builder setTrafficStatsTag(int);
  public org.chromium.net.BidirectionalStream$Builder setTrafficStatsUid(int);
  public org.chromium.net.ExperimentalBidirectionalStream$Builder addRequestAnnotation(java.lang.Object);
  public org.chromium.net.ExperimentalBidirectionalStream$Builder setTrafficStatsTag(int);
  public org.chromium.net.ExperimentalBidirectionalStream$Builder setTrafficStatsUid(int);
  public org.chromium.net.ExperimentalBidirectionalStream$Builder();
}
public abstract class org.chromium.net.ExperimentalBidirectionalStream extends org.chromium.net.BidirectionalStream {
  public org.chromium.net.ExperimentalBidirectionalStream();
}
public class org.chromium.net.ExperimentalCronetEngine$Builder extends org.chromium.net.CronetEngine$Builder {
  public org.chromium.net.CronetEngine build();
  public org.chromium.net.CronetEngine$Builder addPublicKeyPins(java.lang.String, java.util.Set, boolean, java.util.Date);
  public org.chromium.net.CronetEngine$Builder addQuicHint(java.lang.String, int, int);
  public org.chromium.net.CronetEngine$Builder enableHttp2(boolean);
  public org.chromium.net.CronetEngine$Builder enableHttpCache(int, long);
  public org.chromium.net.CronetEngine$Builder enableNetworkQualityEstimator(boolean);
  public org.chromium.net.CronetEngine$Builder enablePublicKeyPinningBypassForLocalTrustAnchors(boolean);
  public org.chromium.net.CronetEngine$Builder enableQuic(boolean);
  public org.chromium.net.CronetEngine$Builder enableSdch(boolean);
  public org.chromium.net.CronetEngine$Builder setConnectionMigrationOptions(org.chromium.net.ConnectionMigrationOptions);
  public org.chromium.net.CronetEngine$Builder setDnsOptions(org.chromium.net.DnsOptions);
  public org.chromium.net.CronetEngine$Builder setLibraryLoader(org.chromium.net.CronetEngine$Builder$LibraryLoader);
  public org.chromium.net.CronetEngine$Builder setQuicOptions(org.chromium.net.QuicOptions);
  public org.chromium.net.CronetEngine$Builder setStoragePath(java.lang.String);
  public org.chromium.net.CronetEngine$Builder setThreadPriority(int);
  public org.chromium.net.CronetEngine$Builder setUserAgent(java.lang.String);
  public org.chromium.net.ExperimentalCronetEngine build();
  public org.chromium.net.ExperimentalCronetEngine$Builder addPublicKeyPins(java.lang.String, java.util.Set<byte[]>, boolean, java.util.Date);
  public org.chromium.net.ExperimentalCronetEngine$Builder addQuicHint(java.lang.String, int, int);
  public org.chromium.net.ExperimentalCronetEngine$Builder enableHttp2(boolean);
  public org.chromium.net.ExperimentalCronetEngine$Builder enableHttpCache(int, long);
  public org.chromium.net.ExperimentalCronetEngine$Builder enableNetworkQualityEstimator(boolean);
  public org.chromium.net.ExperimentalCronetEngine$Builder enablePublicKeyPinningBypassForLocalTrustAnchors(boolean);
  public org.chromium.net.ExperimentalCronetEngine$Builder enableQuic(boolean);
  public org.chromium.net.ExperimentalCronetEngine$Builder enableSdch(boolean);
  public org.chromium.net.ExperimentalCronetEngine$Builder setConnectionMigrationOptions(org.chromium.net.ConnectionMigrationOptions);
  public org.chromium.net.ExperimentalCronetEngine$Builder setDnsOptions(org.chromium.net.DnsOptions);
  public org.chromium.net.ExperimentalCronetEngine$Builder setExperimentalOptions(java.lang.String);
  public org.chromium.net.ExperimentalCronetEngine$Builder setLibraryLoader(org.chromium.net.CronetEngine$Builder$LibraryLoader);
  public org.chromium.net.ExperimentalCronetEngine$Builder setQuicOptions(org.chromium.net.QuicOptions);
  public org.chromium.net.ExperimentalCronetEngine$Builder setStoragePath(java.lang.String);
  public org.chromium.net.ExperimentalCronetEngine$Builder setThreadPriority(int);
  public org.chromium.net.ExperimentalCronetEngine$Builder setUserAgent(java.lang.String);
  public org.chromium.net.ExperimentalCronetEngine$Builder(android.content.Context);
  public org.chromium.net.ExperimentalCronetEngine$Builder(org.chromium.net.ICronetEngineBuilder);
  public org.chromium.net.ICronetEngineBuilder getBuilderDelegate();
}
public abstract class org.chromium.net.ExperimentalCronetEngine extends org.chromium.net.CronetEngine {
  public abstract org.chromium.net.ExperimentalBidirectionalStream$Builder newBidirectionalStreamBuilder(java.lang.String, org.chromium.net.BidirectionalStream$Callback, java.util.concurrent.Executor);
  public abstract org.chromium.net.ExperimentalUrlRequest$Builder newUrlRequestBuilder(java.lang.String, org.chromium.net.UrlRequest$Callback, java.util.concurrent.Executor);
  public java.net.URLConnection openConnection(java.net.URL, java.net.Proxy) throws java.io.IOException;
  public org.chromium.net.BidirectionalStream$Builder newBidirectionalStreamBuilder(java.lang.String, org.chromium.net.BidirectionalStream$Callback, java.util.concurrent.Executor);
  public org.chromium.net.ExperimentalCronetEngine();
  public org.chromium.net.UrlRequest$Builder newUrlRequestBuilder(java.lang.String, org.chromium.net.UrlRequest$Callback, java.util.concurrent.Executor);
  public static boolean shouldOverrideWithHttpEngine(android.content.Context);
  public static final int CONNECTION_METRIC_UNKNOWN;
  public static final int EFFECTIVE_CONNECTION_TYPE_2G;
  public static final int EFFECTIVE_CONNECTION_TYPE_3G;
  public static final int EFFECTIVE_CONNECTION_TYPE_4G;
  public static final int EFFECTIVE_CONNECTION_TYPE_OFFLINE;
  public static final int EFFECTIVE_CONNECTION_TYPE_SLOW_2G;
  public static final int EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
  public static final long UNBIND_NETWORK_HANDLE;
}
public abstract class org.chromium.net.ExperimentalUrlRequest$Builder extends org.chromium.net.UrlRequest$Builder {
  public abstract org.chromium.net.ExperimentalUrlRequest build();
  public abstract org.chromium.net.ExperimentalUrlRequest$Builder addHeader(java.lang.String, java.lang.String);
  public abstract org.chromium.net.ExperimentalUrlRequest$Builder allowDirectExecutor();
  public abstract org.chromium.net.ExperimentalUrlRequest$Builder disableCache();
  public abstract org.chromium.net.ExperimentalUrlRequest$Builder setHttpMethod(java.lang.String);
  public abstract org.chromium.net.ExperimentalUrlRequest$Builder setPriority(int);
  public abstract org.chromium.net.ExperimentalUrlRequest$Builder setUploadDataProvider(org.chromium.net.UploadDataProvider, java.util.concurrent.Executor);
  public org.chromium.net.ExperimentalUrlRequest$Builder addRequestAnnotation(java.lang.Object);
  public org.chromium.net.ExperimentalUrlRequest$Builder disableConnectionMigration();
  public org.chromium.net.ExperimentalUrlRequest$Builder setIdempotency(int);
  public org.chromium.net.ExperimentalUrlRequest$Builder setRequestFinishedListener(org.chromium.net.RequestFinishedInfo$Listener);
  public org.chromium.net.ExperimentalUrlRequest$Builder setTrafficStatsTag(int);
  public org.chromium.net.ExperimentalUrlRequest$Builder setTrafficStatsUid(int);
  public org.chromium.net.ExperimentalUrlRequest$Builder();
  public org.chromium.net.UrlRequest build();
  public org.chromium.net.UrlRequest$Builder addHeader(java.lang.String, java.lang.String);
  public org.chromium.net.UrlRequest$Builder addRequestAnnotation(java.lang.Object);
  public org.chromium.net.UrlRequest$Builder allowDirectExecutor();
  public org.chromium.net.UrlRequest$Builder disableCache();
  public org.chromium.net.UrlRequest$Builder setHttpMethod(java.lang.String);
  public org.chromium.net.UrlRequest$Builder setPriority(int);
  public org.chromium.net.UrlRequest$Builder setRequestFinishedListener(org.chromium.net.RequestFinishedInfo$Listener);
  public org.chromium.net.UrlRequest$Builder setTrafficStatsTag(int);
  public org.chromium.net.UrlRequest$Builder setTrafficStatsUid(int);
  public org.chromium.net.UrlRequest$Builder setUploadDataProvider(org.chromium.net.UploadDataProvider, java.util.concurrent.Executor);
  public static final int DEFAULT_IDEMPOTENCY;
  public static final int IDEMPOTENT;
  public static final int NOT_IDEMPOTENT;
}
public abstract class org.chromium.net.ExperimentalUrlRequest extends org.chromium.net.UrlRequest {
  public org.chromium.net.ExperimentalUrlRequest();
}
public abstract class org.chromium.net.ICronetEngineBuilder {
  protected java.util.Set<java.lang.Integer> getSupportedConfigOptions();
  protected long getLogCronetInitializationRef();
  public abstract java.lang.String getDefaultUserAgent();
  public abstract org.chromium.net.ExperimentalCronetEngine build();
  public abstract org.chromium.net.ICronetEngineBuilder addPublicKeyPins(java.lang.String, java.util.Set<byte[]>, boolean, java.util.Date);
  public abstract org.chromium.net.ICronetEngineBuilder addQuicHint(java.lang.String, int, int);
  public abstract org.chromium.net.ICronetEngineBuilder enableHttp2(boolean);
  public abstract org.chromium.net.ICronetEngineBuilder enableHttpCache(int, long);
  public abstract org.chromium.net.ICronetEngineBuilder enablePublicKeyPinningBypassForLocalTrustAnchors(boolean);
  public abstract org.chromium.net.ICronetEngineBuilder enableQuic(boolean);
  public abstract org.chromium.net.ICronetEngineBuilder enableSdch(boolean);
  public abstract org.chromium.net.ICronetEngineBuilder setExperimentalOptions(java.lang.String);
  public abstract org.chromium.net.ICronetEngineBuilder setLibraryLoader(org.chromium.net.CronetEngine$Builder$LibraryLoader);
  public abstract org.chromium.net.ICronetEngineBuilder setStoragePath(java.lang.String);
  public abstract org.chromium.net.ICronetEngineBuilder setUserAgent(java.lang.String);
  public org.chromium.net.ICronetEngineBuilder enableBrotli(boolean);
  public org.chromium.net.ICronetEngineBuilder enableNetworkQualityEstimator(boolean);
  public org.chromium.net.ICronetEngineBuilder setConnectionMigrationOptions(org.chromium.net.ConnectionMigrationOptions);
  public org.chromium.net.ICronetEngineBuilder setDnsOptions(org.chromium.net.DnsOptions);
  public org.chromium.net.ICronetEngineBuilder setProxyOptionsV2(org.chromium.net.ProxyOptions);
  public org.chromium.net.ICronetEngineBuilder setQuicOptions(org.chromium.net.QuicOptions);
  public org.chromium.net.ICronetEngineBuilder setThreadPriority(int);
  public org.chromium.net.ICronetEngineBuilder();
  public static final int CONNECTION_MIGRATION_OPTIONS;
  public static final int DNS_OPTIONS;
  public static final int PROXY_OPTIONS;
  public static final int QUIC_OPTIONS;
}
public final class org.chromium.net.InlineExecutionProhibitedException extends java.util.concurrent.RejectedExecutionException {
  public org.chromium.net.InlineExecutionProhibitedException();
}
public abstract class org.chromium.net.NetworkException extends org.chromium.net.CronetException {
  protected org.chromium.net.NetworkException(java.lang.String, java.lang.Throwable);
  public abstract boolean immediatelyRetryable();
  public abstract int getCronetInternalErrorCode();
  public abstract int getErrorCode();
  public static final int ERROR_ADDRESS_UNREACHABLE;
  public static final int ERROR_CONNECTION_CLOSED;
  public static final int ERROR_CONNECTION_REFUSED;
  public static final int ERROR_CONNECTION_RESET;
  public static final int ERROR_CONNECTION_TIMED_OUT;
  public static final int ERROR_HOSTNAME_NOT_RESOLVED;
  public static final int ERROR_INTERNET_DISCONNECTED;
  public static final int ERROR_NETWORK_CHANGED;
  public static final int ERROR_OTHER;
  public static final int ERROR_QUIC_PROTOCOL_FAILED;
  public static final int ERROR_TIMED_OUT;
}
public abstract class org.chromium.net.NetworkQualityRttListener {
  public abstract void onRttObservation(int, long, int);
  public java.util.concurrent.Executor getExecutor();
  public org.chromium.net.NetworkQualityRttListener(java.util.concurrent.Executor);
}
public abstract class org.chromium.net.NetworkQualityThroughputListener {
  public abstract void onThroughputObservation(int, long, int);
  public java.util.concurrent.Executor getExecutor();
  public org.chromium.net.NetworkQualityThroughputListener(java.util.concurrent.Executor);
}
public interface org.chromium.net.Proxy$HttpConnectCallback$OnResponseReceivedAction extends java.lang.annotation.Annotation {
}
public abstract class org.chromium.net.Proxy$HttpConnectCallback$Request implements java.lang.AutoCloseable {
  public abstract void close();
  public abstract void proceed(java.util.List<android.util.Pair<java.lang.String, java.lang.String>>);
  public org.chromium.net.Proxy$HttpConnectCallback$Request();
}
public abstract class org.chromium.net.Proxy$HttpConnectCallback {
  public abstract int onResponseReceived(java.util.List<android.util.Pair<java.lang.String, java.lang.String>>, int);
  public abstract void onBeforeRequest(org.chromium.net.Proxy$HttpConnectCallback$Request);
  public org.chromium.net.Proxy$HttpConnectCallback();
  public static final int RESPONSE_ACTION_CLOSE;
  public static final int RESPONSE_ACTION_PROCEED;
}
public interface org.chromium.net.Proxy$Scheme extends java.lang.annotation.Annotation {
}
public final class org.chromium.net.Proxy {
  public static final int SCHEME_HTTP;
  public static final int SCHEME_HTTPS;
  public static org.chromium.net.Proxy createHttpProxy(int, java.lang.String, int, java.util.concurrent.Executor, org.chromium.net.Proxy$HttpConnectCallback);
}
public interface org.chromium.net.ProxyOptions$AllProxiesFailedBehavior extends java.lang.annotation.Annotation {
}
public final class org.chromium.net.ProxyOptions {
  public static final int ALL_PROXIES_FAILED_BEHAVIOR_ALLOW_DIRECT;
  public static final int ALL_PROXIES_FAILED_BEHAVIOR_DISALLOW_DIRECT;
  public static org.chromium.net.ProxyOptions fromProxyList(java.util.List<org.chromium.net.Proxy>, int);
}
public abstract class org.chromium.net.QuicException extends org.chromium.net.NetworkException {
  protected org.chromium.net.QuicException(java.lang.String, java.lang.Throwable);
  public abstract int getQuicDetailedErrorCode();
  public int getConnectionCloseSource();
}
public class org.chromium.net.QuicOptions$Builder {
  public org.chromium.net.QuicOptions build();
  public org.chromium.net.QuicOptions$Builder addAllowedQuicHost(java.lang.String);
  public org.chromium.net.QuicOptions$Builder addClientConnectionOption(java.lang.String);
  public org.chromium.net.QuicOptions$Builder addConnectionOption(java.lang.String);
  public org.chromium.net.QuicOptions$Builder addEnabledQuicVersion(java.lang.String);
  public org.chromium.net.QuicOptions$Builder addExtraQuicheFlag(java.lang.String);
  public org.chromium.net.QuicOptions$Builder closeSessionsOnIpChange(boolean);
  public org.chromium.net.QuicOptions$Builder delayJobsWithAvailableSpdySession(boolean);
  public org.chromium.net.QuicOptions$Builder enableTlsZeroRtt(boolean);
  public org.chromium.net.QuicOptions$Builder goawaySessionsOnIpChange(boolean);
  public org.chromium.net.QuicOptions$Builder increaseBrokenServicePeriodExponentially(boolean);
  public org.chromium.net.QuicOptions$Builder retryWithoutAltSvcOnQuicErrors(boolean);
  public org.chromium.net.QuicOptions$Builder setCryptoHandshakeTimeoutSeconds(long);
  public org.chromium.net.QuicOptions$Builder setHandshakeUserAgent(java.lang.String);
  public org.chromium.net.QuicOptions$Builder setIdleConnectionTimeout(java.time.Duration);
  public org.chromium.net.QuicOptions$Builder setIdleConnectionTimeoutSeconds(long);
  public org.chromium.net.QuicOptions$Builder setInMemoryServerConfigsCacheSize(int);
  public org.chromium.net.QuicOptions$Builder setInitialBrokenServicePeriodSeconds(long);
  public org.chromium.net.QuicOptions$Builder setPreCryptoHandshakeIdleTimeoutSeconds(long);
  public org.chromium.net.QuicOptions$Builder setRetransmittableOnWireTimeoutMillis(long);
}
public interface org.chromium.net.QuicOptions$Experimental extends java.lang.annotation.Annotation {
}
public interface org.chromium.net.QuicOptions$QuichePassthroughOption extends java.lang.annotation.Annotation {
}
public final class org.chromium.net.QuicOptions {
  public java.lang.Boolean getCloseSessionsOnIpChange();
  public java.lang.Boolean getDelayJobsWithAvailableSpdySession();
  public java.lang.Boolean getEnableTlsZeroRtt();
  public java.lang.Boolean getGoawaySessionsOnIpChange();
  public java.lang.Boolean getIncreaseBrokenServicePeriodExponentially();
  public java.lang.Boolean getRetryWithoutAltSvcOnQuicErrors();
  public java.lang.Integer getInMemoryServerConfigsCacheSize();
  public java.lang.Long getCryptoHandshakeTimeoutSeconds();
  public java.lang.Long getIdleConnectionTimeoutSeconds();
  public java.lang.Long getInitialBrokenServicePeriodSeconds();
  public java.lang.Long getPreCryptoHandshakeIdleTimeoutSeconds();
  public java.lang.Long getRetransmittableOnWireTimeoutMillis();
  public java.lang.String getHandshakeUserAgent();
  public java.util.Set<java.lang.String> getClientConnectionOptions();
  public java.util.Set<java.lang.String> getConnectionOptions();
  public java.util.Set<java.lang.String> getEnabledQuicVersions();
  public java.util.Set<java.lang.String> getExtraQuicheFlags();
  public java.util.Set<java.lang.String> getQuicHostAllowlist();
  public static org.chromium.net.QuicOptions$Builder builder();
}
public abstract class org.chromium.net.RequestFinishedInfo$Listener {
  public abstract void onRequestFinished(org.chromium.net.RequestFinishedInfo);
  public java.util.concurrent.Executor getExecutor();
  public org.chromium.net.RequestFinishedInfo$Listener(java.util.concurrent.Executor);
}
public abstract class org.chromium.net.RequestFinishedInfo$Metrics {
  public abstract boolean getSocketReused();
  public abstract java.lang.Long getReceivedByteCount();
  public abstract java.lang.Long getSentByteCount();
  public abstract java.lang.Long getTotalTimeMs();
  public abstract java.lang.Long getTtfbMs();
  public abstract java.util.Date getConnectEnd();
  public abstract java.util.Date getConnectStart();
  public abstract java.util.Date getDnsEnd();
  public abstract java.util.Date getDnsStart();
  public abstract java.util.Date getPushEnd();
  public abstract java.util.Date getPushStart();
  public abstract java.util.Date getRequestEnd();
  public abstract java.util.Date getRequestStart();
  public abstract java.util.Date getResponseStart();
  public abstract java.util.Date getSendingEnd();
  public abstract java.util.Date getSendingStart();
  public abstract java.util.Date getSslEnd();
  public abstract java.util.Date getSslStart();
  public org.chromium.net.RequestFinishedInfo$Metrics();
}
public abstract class org.chromium.net.RequestFinishedInfo {
  public abstract int getFinishedReason();
  public abstract java.lang.String getUrl();
  public abstract java.util.Collection<java.lang.Object> getAnnotations();
  public abstract org.chromium.net.CronetException getException();
  public abstract org.chromium.net.RequestFinishedInfo$Metrics getMetrics();
  public abstract org.chromium.net.UrlResponseInfo getResponseInfo();
  public org.chromium.net.RequestFinishedInfo();
  public static final int CANCELED;
  public static final int FAILED;
  public static final int SUCCEEDED;
}
public abstract class org.chromium.net.UploadDataProvider implements java.io.Closeable {
  public abstract long getLength() throws java.io.IOException;
  public abstract void read(org.chromium.net.UploadDataSink, java.nio.ByteBuffer) throws java.io.IOException;
  public abstract void rewind(org.chromium.net.UploadDataSink) throws java.io.IOException;
  public org.chromium.net.UploadDataProvider();
  public void close() throws java.io.IOException;
}
public final class org.chromium.net.UploadDataProviders {
  public static org.chromium.net.UploadDataProvider create(android.os.ParcelFileDescriptor);
  public static org.chromium.net.UploadDataProvider create(byte[]);
  public static org.chromium.net.UploadDataProvider create(byte[], int, int);
  public static org.chromium.net.UploadDataProvider create(java.io.File);
  public static org.chromium.net.UploadDataProvider create(java.nio.ByteBuffer);
}
public abstract class org.chromium.net.UploadDataSink {
  public abstract void onReadError(java.lang.Exception);
  public abstract void onReadSucceeded(boolean);
  public abstract void onRewindError(java.lang.Exception);
  public abstract void onRewindSucceeded();
  public org.chromium.net.UploadDataSink();
}
public abstract class org.chromium.net.UrlRequest$Builder {
  public abstract org.chromium.net.UrlRequest build();
  public abstract org.chromium.net.UrlRequest$Builder addHeader(java.lang.String, java.lang.String);
  public abstract org.chromium.net.UrlRequest$Builder allowDirectExecutor();
  public abstract org.chromium.net.UrlRequest$Builder disableCache();
  public abstract org.chromium.net.UrlRequest$Builder setHttpMethod(java.lang.String);
  public abstract org.chromium.net.UrlRequest$Builder setPriority(int);
  public abstract org.chromium.net.UrlRequest$Builder setUploadDataProvider(org.chromium.net.UploadDataProvider, java.util.concurrent.Executor);
  public org.chromium.net.UrlRequest$Builder addRequestAnnotation(java.lang.Object);
  public org.chromium.net.UrlRequest$Builder bindToNetwork(long);
  public org.chromium.net.UrlRequest$Builder setRawCompressionDictionary(byte[], java.nio.ByteBuffer, java.lang.String);
  public org.chromium.net.UrlRequest$Builder setRequestFinishedListener(org.chromium.net.RequestFinishedInfo$Listener);
  public org.chromium.net.UrlRequest$Builder setTrafficStatsTag(int);
  public org.chromium.net.UrlRequest$Builder setTrafficStatsUid(int);
  public org.chromium.net.UrlRequest$Builder();
  public static final int REQUEST_PRIORITY_HIGHEST;
  public static final int REQUEST_PRIORITY_IDLE;
  public static final int REQUEST_PRIORITY_LOW;
  public static final int REQUEST_PRIORITY_LOWEST;
  public static final int REQUEST_PRIORITY_MEDIUM;
}
public abstract class org.chromium.net.UrlRequest$Callback {
  public abstract void onFailed(org.chromium.net.UrlRequest, org.chromium.net.UrlResponseInfo, org.chromium.net.CronetException);
  public abstract void onReadCompleted(org.chromium.net.UrlRequest, org.chromium.net.UrlResponseInfo, java.nio.ByteBuffer) throws java.lang.Exception;
  public abstract void onRedirectReceived(org.chromium.net.UrlRequest, org.chromium.net.UrlResponseInfo, java.lang.String) throws java.lang.Exception;
  public abstract void onResponseStarted(org.chromium.net.UrlRequest, org.chromium.net.UrlResponseInfo) throws java.lang.Exception;
  public abstract void onSucceeded(org.chromium.net.UrlRequest, org.chromium.net.UrlResponseInfo);
  public org.chromium.net.UrlRequest$Callback();
  public void onCanceled(org.chromium.net.UrlRequest, org.chromium.net.UrlResponseInfo);
}
public interface org.chromium.net.UrlRequest$Experimental extends java.lang.annotation.Annotation {
}
public class org.chromium.net.UrlRequest$Status {
  public static final int CONNECTING;
  public static final int DOWNLOADING_PAC_FILE;
  public static final int ESTABLISHING_PROXY_TUNNEL;
  public static final int IDLE;
  public static final int INVALID;
  public static final int READING_RESPONSE;
  public static final int RESOLVING_HOST;
  public static final int RESOLVING_HOST_IN_PAC_FILE;
  public static final int RESOLVING_PROXY_FOR_URL;
  public static final int SENDING_REQUEST;
  public static final int SSL_HANDSHAKE;
  public static final int WAITING_FOR_AVAILABLE_SOCKET;
  public static final int WAITING_FOR_CACHE;
  public static final int WAITING_FOR_DELEGATE;
  public static final int WAITING_FOR_RESPONSE;
  public static final int WAITING_FOR_STALLED_SOCKET_POOL;
}
public abstract class org.chromium.net.UrlRequest$StatusListener {
  public abstract void onStatus(int);
  public org.chromium.net.UrlRequest$StatusListener();
}
public abstract class org.chromium.net.UrlRequest {
  public abstract boolean isDone();
  public abstract void cancel();
  public abstract void followRedirect();
  public abstract void getStatus(org.chromium.net.UrlRequest$StatusListener);
  public abstract void read(java.nio.ByteBuffer);
  public abstract void start();
  public org.chromium.net.UrlRequest();
}
public abstract class org.chromium.net.UrlResponseInfo$HeaderBlock {
  public abstract java.util.List<java.util.Map$Entry<java.lang.String, java.lang.String>> getAsList();
  public abstract java.util.Map<java.lang.String, java.util.List<java.lang.String>> getAsMap();
  public org.chromium.net.UrlResponseInfo$HeaderBlock();
}
public abstract class org.chromium.net.UrlResponseInfo {
  public abstract boolean wasCached();
  public abstract int getHttpStatusCode();
  public abstract java.lang.String getHttpStatusText();
  public abstract java.lang.String getNegotiatedProtocol();
  public abstract java.lang.String getProxyServer();
  public abstract java.lang.String getUrl();
  public abstract java.util.List<java.lang.String> getUrlChain();
  public abstract java.util.List<java.util.Map$Entry<java.lang.String, java.lang.String>> getAllHeadersAsList();
  public abstract java.util.Map<java.lang.String, java.util.List<java.lang.String>> getAllHeaders();
  public abstract long getReceivedByteCount();
  public org.chromium.net.UrlResponseInfo();
}
public abstract class org.chromium.net.apihelpers.ByteArrayCronetCallback extends org.chromium.net.apihelpers.InMemoryTransformCronetCallback<byte[]> {
  protected final byte[] transformBodyBytes(org.chromium.net.UrlResponseInfo, byte[]);
  protected java.lang.Object transformBodyBytes(org.chromium.net.UrlResponseInfo, byte[]);
  public org.chromium.net.apihelpers.ByteArrayCronetCallback addCompletionListener(org.chromium.net.apihelpers.CronetRequestCompletionListener<? super byte[]>);
  public org.chromium.net.apihelpers.ByteArrayCronetCallback();
  public org.chromium.net.apihelpers.ImplicitFlowControlCallback addCompletionListener(org.chromium.net.apihelpers.CronetRequestCompletionListener);
}
public interface org.chromium.net.apihelpers.CronetRequestCompletionListener<T> {
  public abstract void onCanceled(org.chromium.net.UrlResponseInfo);
  public abstract void onFailed(org.chromium.net.UrlResponseInfo, org.chromium.net.CronetException);
  public abstract void onSucceeded(org.chromium.net.UrlResponseInfo, T);
}
public class org.chromium.net.apihelpers.CronetResponse<T> {
  public T getResponseBody();
  public boolean equals(java.lang.Object);
  public int hashCode();
  public org.chromium.net.UrlResponseInfo getUrlResponseInfo();
}
public abstract class org.chromium.net.apihelpers.ImplicitFlowControlCallback extends org.chromium.net.UrlRequest$Callback {
  protected abstract boolean shouldFollowRedirect(org.chromium.net.UrlResponseInfo, java.lang.String) throws java.lang.Exception;
  protected abstract void onBodyChunkRead(org.chromium.net.UrlResponseInfo, java.nio.ByteBuffer) throws java.lang.Exception;
  protected abstract void onCanceled(org.chromium.net.UrlResponseInfo);
  protected abstract void onFailed(org.chromium.net.UrlResponseInfo, org.chromium.net.CronetException);
  protected abstract void onResponseStarted(org.chromium.net.UrlResponseInfo) throws java.lang.Exception;
  protected abstract void onSucceeded(org.chromium.net.UrlResponseInfo);
  public final void onCanceled(org.chromium.net.UrlRequest, org.chromium.net.UrlResponseInfo);
  public final void onFailed(org.chromium.net.UrlRequest, org.chromium.net.UrlResponseInfo, org.chromium.net.CronetException);
  public final void onReadCompleted(org.chromium.net.UrlRequest, org.chromium.net.UrlResponseInfo, java.nio.ByteBuffer) throws java.lang.Exception;
  public final void onRedirectReceived(org.chromium.net.UrlRequest, org.chromium.net.UrlResponseInfo, java.lang.String) throws java.lang.Exception;
  public final void onResponseStarted(org.chromium.net.UrlRequest, org.chromium.net.UrlResponseInfo) throws java.lang.Exception;
  public final void onSucceeded(org.chromium.net.UrlRequest, org.chromium.net.UrlResponseInfo);
  public org.chromium.net.apihelpers.ImplicitFlowControlCallback();
}
public abstract class org.chromium.net.apihelpers.InMemoryTransformCronetCallback<T> extends org.chromium.net.apihelpers.ImplicitFlowControlCallback {
  protected abstract T transformBodyBytes(org.chromium.net.UrlResponseInfo, byte[]);
  protected final void onBodyChunkRead(org.chromium.net.UrlResponseInfo, java.nio.ByteBuffer) throws java.lang.Exception;
  protected final void onCanceled(org.chromium.net.UrlResponseInfo);
  protected final void onFailed(org.chromium.net.UrlResponseInfo, org.chromium.net.CronetException);
  protected final void onResponseStarted(org.chromium.net.UrlResponseInfo);
  protected final void onSucceeded(org.chromium.net.UrlResponseInfo);
  public org.chromium.net.apihelpers.ImplicitFlowControlCallback addCompletionListener(org.chromium.net.apihelpers.CronetRequestCompletionListener<? super T>);
  public org.chromium.net.apihelpers.InMemoryTransformCronetCallback();
}
public abstract class org.chromium.net.apihelpers.JsonCronetCallback extends org.chromium.net.apihelpers.InMemoryTransformCronetCallback<org.json.JSONObject> {
  protected java.lang.Object transformBodyBytes(org.chromium.net.UrlResponseInfo, byte[]);
  protected org.json.JSONObject transformBodyBytes(org.chromium.net.UrlResponseInfo, byte[]);
  public org.chromium.net.apihelpers.ImplicitFlowControlCallback addCompletionListener(org.chromium.net.apihelpers.CronetRequestCompletionListener);
  public org.chromium.net.apihelpers.JsonCronetCallback addCompletionListener(org.chromium.net.apihelpers.CronetRequestCompletionListener<? super org.json.JSONObject>);
  public org.chromium.net.apihelpers.JsonCronetCallback();
}
public interface org.chromium.net.apihelpers.RedirectHandler {
  public abstract boolean shouldFollowRedirect(org.chromium.net.UrlResponseInfo, java.lang.String) throws java.lang.Exception;
}
public class org.chromium.net.apihelpers.RedirectHandlers {
  public static org.chromium.net.apihelpers.RedirectHandler alwaysFollow();
  public static org.chromium.net.apihelpers.RedirectHandler neverFollow();
}
public abstract class org.chromium.net.apihelpers.StringCronetCallback extends org.chromium.net.apihelpers.InMemoryTransformCronetCallback<java.lang.String> {
  protected java.lang.Object transformBodyBytes(org.chromium.net.UrlResponseInfo, byte[]);
  protected java.lang.String transformBodyBytes(org.chromium.net.UrlResponseInfo, byte[]);
  public org.chromium.net.apihelpers.ImplicitFlowControlCallback addCompletionListener(org.chromium.net.apihelpers.CronetRequestCompletionListener);
  public org.chromium.net.apihelpers.StringCronetCallback addCompletionListener(org.chromium.net.apihelpers.CronetRequestCompletionListener<? super java.lang.String>);
}
public final class org.chromium.net.apihelpers.UploadDataProviders {
  public static org.chromium.net.UploadDataProvider create(android.os.ParcelFileDescriptor);
  public static org.chromium.net.UploadDataProvider create(byte[]);
  public static org.chromium.net.UploadDataProvider create(byte[], int, int);
  public static org.chromium.net.UploadDataProvider create(java.io.File);
  public static org.chromium.net.UploadDataProvider create(java.nio.ByteBuffer);
}
public class org.chromium.net.apihelpers.UrlRequestCallbacks$CallbackAndResponseFuturePair<ResponseBodyT, CallbackT extends org.chromium.net.apihelpers.InMemoryTransformCronetCallback<ResponseBodyT>> {
  public CallbackT getCallback();
  public java.util.concurrent.Future<org.chromium.net.apihelpers.CronetResponse<ResponseBodyT>> getFuture();
}
public class org.chromium.net.apihelpers.UrlRequestCallbacks {
  public static org.chromium.net.apihelpers.ByteArrayCronetCallback forByteArrayBody(org.chromium.net.apihelpers.RedirectHandler, org.chromium.net.apihelpers.CronetRequestCompletionListener<byte[]>);
  public static org.chromium.net.apihelpers.JsonCronetCallback forJsonBody(org.chromium.net.apihelpers.RedirectHandler, org.chromium.net.apihelpers.CronetRequestCompletionListener<org.json.JSONObject>);
  public static org.chromium.net.apihelpers.StringCronetCallback forStringBody(org.chromium.net.apihelpers.RedirectHandler, org.chromium.net.apihelpers.CronetRequestCompletionListener<java.lang.String>);
  public static org.chromium.net.apihelpers.UrlRequestCallbacks$CallbackAndResponseFuturePair<byte[], org.chromium.net.apihelpers.ByteArrayCronetCallback> forByteArrayBody(org.chromium.net.apihelpers.RedirectHandler);
  public static org.chromium.net.apihelpers.UrlRequestCallbacks$CallbackAndResponseFuturePair<java.lang.String, org.chromium.net.apihelpers.StringCronetCallback> forStringBody(org.chromium.net.apihelpers.RedirectHandler);
  public static org.chromium.net.apihelpers.UrlRequestCallbacks$CallbackAndResponseFuturePair<org.json.JSONObject, org.chromium.net.apihelpers.JsonCronetCallback> forJsonBody(org.chromium.net.apihelpers.RedirectHandler);
}
Stamp: 09fc51d2346b8254cf33a0e0a8cc750c
