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

public class org.chromium.net.ApiVersion {
  public static java.lang.String getCronetVersionWithLastChange();
  public static int getMaximumAvailableApiLevel();
  public static int getApiLevel();
  public static java.lang.String getCronetVersion();
  public static java.lang.String getLastChange();
}
public abstract class org.chromium.net.BidirectionalStream$Builder {
  public static final int STREAM_PRIORITY_IDLE;
  public static final int STREAM_PRIORITY_LOWEST;
  public static final int STREAM_PRIORITY_LOW;
  public static final int STREAM_PRIORITY_MEDIUM;
  public static final int STREAM_PRIORITY_HIGHEST;
  public org.chromium.net.BidirectionalStream$Builder();
  public abstract org.chromium.net.BidirectionalStream$Builder setHttpMethod(java.lang.String);
  public abstract org.chromium.net.BidirectionalStream$Builder addHeader(java.lang.String, java.lang.String);
  public abstract org.chromium.net.BidirectionalStream$Builder setPriority(int);
  public abstract org.chromium.net.BidirectionalStream$Builder delayRequestHeadersUntilFirstFlush(boolean);
  public abstract org.chromium.net.BidirectionalStream build();
}
public abstract class org.chromium.net.BidirectionalStream$Callback {
  public org.chromium.net.BidirectionalStream$Callback();
  public abstract void onStreamReady(org.chromium.net.BidirectionalStream);
  public abstract void onResponseHeadersReceived(org.chromium.net.BidirectionalStream, org.chromium.net.UrlResponseInfo);
  public abstract void onReadCompleted(org.chromium.net.BidirectionalStream, org.chromium.net.UrlResponseInfo, java.nio.ByteBuffer, boolean);
  public abstract void onWriteCompleted(org.chromium.net.BidirectionalStream, org.chromium.net.UrlResponseInfo, java.nio.ByteBuffer, boolean);
  public void onResponseTrailersReceived(org.chromium.net.BidirectionalStream, org.chromium.net.UrlResponseInfo, org.chromium.net.UrlResponseInfo$HeaderBlock);
  public abstract void onSucceeded(org.chromium.net.BidirectionalStream, org.chromium.net.UrlResponseInfo);
  public abstract void onFailed(org.chromium.net.BidirectionalStream, org.chromium.net.UrlResponseInfo, org.chromium.net.CronetException);
  public void onCanceled(org.chromium.net.BidirectionalStream, org.chromium.net.UrlResponseInfo);
}
public abstract class org.chromium.net.BidirectionalStream {
  public org.chromium.net.BidirectionalStream();
  public abstract void start();
  public abstract void read(java.nio.ByteBuffer);
  public abstract void write(java.nio.ByteBuffer, boolean);
  public abstract void flush();
  public abstract void cancel();
  public abstract boolean isDone();
}
public abstract class org.chromium.net.CallbackException extends org.chromium.net.CronetException {
  protected org.chromium.net.CallbackException(java.lang.String, java.lang.Throwable);
}
public abstract class org.chromium.net.CronetEngine$Builder$LibraryLoader {
  public org.chromium.net.CronetEngine$Builder$LibraryLoader();
  public abstract void loadLibrary(java.lang.String);
}
public class org.chromium.net.CronetEngine$Builder {
  protected final org.chromium.net.ICronetEngineBuilder mBuilderDelegate;
  public static final int HTTP_CACHE_DISABLED;
  public static final int HTTP_CACHE_IN_MEMORY;
  public static final int HTTP_CACHE_DISK_NO_HTTP;
  public static final int HTTP_CACHE_DISK;
  public org.chromium.net.CronetEngine$Builder(android.content.Context);
  public org.chromium.net.CronetEngine$Builder(org.chromium.net.ICronetEngineBuilder);
  public java.lang.String getDefaultUserAgent();
  public org.chromium.net.CronetEngine$Builder setUserAgent(java.lang.String);
  public org.chromium.net.CronetEngine$Builder setStoragePath(java.lang.String);
  public org.chromium.net.CronetEngine$Builder setLibraryLoader(org.chromium.net.CronetEngine$Builder$LibraryLoader);
  public org.chromium.net.CronetEngine$Builder enableQuic(boolean);
  public org.chromium.net.CronetEngine$Builder enableHttp2(boolean);
  public org.chromium.net.CronetEngine$Builder enableSdch(boolean);
  public org.chromium.net.CronetEngine$Builder enableBrotli(boolean);
  public org.chromium.net.CronetEngine$Builder enableHttpCache(int, long);
  public org.chromium.net.CronetEngine$Builder addQuicHint(java.lang.String, int, int);
  public org.chromium.net.CronetEngine$Builder addPublicKeyPins(java.lang.String, java.util.Set<byte[]>, boolean, java.util.Date);
  public org.chromium.net.CronetEngine$Builder enablePublicKeyPinningBypassForLocalTrustAnchors(boolean);
  public org.chromium.net.CronetEngine build();
}
public abstract class org.chromium.net.CronetEngine {
  public org.chromium.net.CronetEngine();
  public abstract java.lang.String getVersionString();
  public abstract void shutdown();
  public abstract void startNetLogToFile(java.lang.String, boolean);
  public abstract void stopNetLog();
  public abstract byte[] getGlobalMetricsDeltas();
  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 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 {
  public static final java.lang.String PROVIDER_NAME_APP_PACKAGED;
  public static final java.lang.String PROVIDER_NAME_FALLBACK;
  protected final android.content.Context mContext;
  protected org.chromium.net.CronetProvider(android.content.Context);
  public abstract org.chromium.net.CronetEngine$Builder createBuilder();
  public abstract java.lang.String getName();
  public abstract java.lang.String getVersion();
  public abstract boolean isEnabled();
  public java.lang.String toString();
  public static java.util.List<org.chromium.net.CronetProvider> getAllProviders(android.content.Context);
}
public abstract class org.chromium.net.ICronetEngineBuilder {
  public org.chromium.net.ICronetEngineBuilder();
  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 org.chromium.net.ICronetEngineBuilder enableBrotli(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 abstract java.lang.String getDefaultUserAgent();
  public abstract org.chromium.net.ExperimentalCronetEngine build();
  public org.chromium.net.ICronetEngineBuilder enableNetworkQualityEstimator(boolean);
  public org.chromium.net.ICronetEngineBuilder setThreadPriority(int);
}
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 {
  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_TIMED_OUT;
  public static final int ERROR_CONNECTION_CLOSED;
  public static final int ERROR_CONNECTION_TIMED_OUT;
  public static final int ERROR_CONNECTION_REFUSED;
  public static final int ERROR_CONNECTION_RESET;
  public static final int ERROR_ADDRESS_UNREACHABLE;
  public static final int ERROR_QUIC_PROTOCOL_FAILED;
  public static final int ERROR_OTHER;
  protected org.chromium.net.NetworkException(java.lang.String, java.lang.Throwable);
  public abstract int getErrorCode();
  public abstract int getCronetInternalErrorCode();
  public abstract boolean immediatelyRetryable();
}
public abstract class org.chromium.net.NetworkQualityRttListener {
  public org.chromium.net.NetworkQualityRttListener(java.util.concurrent.Executor);
  public java.util.concurrent.Executor getExecutor();
  public abstract void onRttObservation(int, long, int);
}
public abstract class org.chromium.net.NetworkQualityThroughputListener {
  public org.chromium.net.NetworkQualityThroughputListener(java.util.concurrent.Executor);
  public java.util.concurrent.Executor getExecutor();
  public abstract void onThroughputObservation(int, long, 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 abstract class org.chromium.net.RequestFinishedInfo$Listener {
  public org.chromium.net.RequestFinishedInfo$Listener(java.util.concurrent.Executor);
  public abstract void onRequestFinished(org.chromium.net.RequestFinishedInfo);
  public java.util.concurrent.Executor getExecutor();
}
public abstract class org.chromium.net.RequestFinishedInfo$Metrics {
  public org.chromium.net.RequestFinishedInfo$Metrics();
  public abstract java.util.Date getRequestStart();
  public abstract java.util.Date getDnsStart();
  public abstract java.util.Date getDnsEnd();
  public abstract java.util.Date getConnectStart();
  public abstract java.util.Date getConnectEnd();
  public abstract java.util.Date getSslStart();
  public abstract java.util.Date getSslEnd();
  public abstract java.util.Date getSendingStart();
  public abstract java.util.Date getSendingEnd();
  public abstract java.util.Date getPushStart();
  public abstract java.util.Date getPushEnd();
  public abstract java.util.Date getResponseStart();
  public abstract java.util.Date getRequestEnd();
  public abstract boolean getSocketReused();
  public abstract java.lang.Long getTtfbMs();
  public abstract java.lang.Long getTotalTimeMs();
  public abstract java.lang.Long getSentByteCount();
  public abstract java.lang.Long getReceivedByteCount();
}
public abstract class org.chromium.net.RequestFinishedInfo {
  public static final int SUCCEEDED;
  public static final int FAILED;
  public static final int CANCELED;
  public org.chromium.net.RequestFinishedInfo();
  public abstract java.lang.String getUrl();
  public abstract java.util.Collection<java.lang.Object> getAnnotations();
  public abstract org.chromium.net.RequestFinishedInfo$Metrics getMetrics();
  public abstract int getFinishedReason();
  public abstract org.chromium.net.UrlResponseInfo getResponseInfo();
  public abstract org.chromium.net.CronetException getException();
}
public abstract class org.chromium.net.UploadDataProvider implements java.io.Closeable {
  public org.chromium.net.UploadDataProvider();
  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 void close() throws java.io.IOException;
}
final class org.chromium.net.UploadDataProviders$ByteBufferUploadProvider extends org.chromium.net.UploadDataProvider {
  public long getLength();
  public void read(org.chromium.net.UploadDataSink, java.nio.ByteBuffer);
  public void rewind(org.chromium.net.UploadDataSink);
}
interface org.chromium.net.UploadDataProviders$FileChannelProvider {
  public abstract java.nio.channels.FileChannel getChannel() throws java.io.IOException;
}
final class org.chromium.net.UploadDataProviders$FileUploadProvider extends org.chromium.net.UploadDataProvider {
  public long getLength() throws java.io.IOException;
  public void read(org.chromium.net.UploadDataSink, java.nio.ByteBuffer) throws java.io.IOException;
  public void rewind(org.chromium.net.UploadDataSink) throws java.io.IOException;
  public void close() throws java.io.IOException;
}
public final class org.chromium.net.UploadDataProviders {
  public static org.chromium.net.UploadDataProvider create(java.io.File);
  public static org.chromium.net.UploadDataProvider create(android.os.ParcelFileDescriptor);
  public static org.chromium.net.UploadDataProvider create(java.nio.ByteBuffer);
  public static org.chromium.net.UploadDataProvider create(byte[], int, int);
  public static org.chromium.net.UploadDataProvider create(byte[]);
}
public abstract class org.chromium.net.UploadDataSink {
  public org.chromium.net.UploadDataSink();
  public abstract void onReadSucceeded(boolean);
  public abstract void onReadError(java.lang.Exception);
  public abstract void onRewindSucceeded();
  public abstract void onRewindError(java.lang.Exception);
}
public abstract class org.chromium.net.UrlRequest$Builder {
  public static final int REQUEST_PRIORITY_IDLE;
  public static final int REQUEST_PRIORITY_LOWEST;
  public static final int REQUEST_PRIORITY_LOW;
  public static final int REQUEST_PRIORITY_MEDIUM;
  public static final int REQUEST_PRIORITY_HIGHEST;
  public org.chromium.net.UrlRequest$Builder();
  public abstract org.chromium.net.UrlRequest$Builder setHttpMethod(java.lang.String);
  public abstract org.chromium.net.UrlRequest$Builder addHeader(java.lang.String, java.lang.String);
  public abstract org.chromium.net.UrlRequest$Builder disableCache();
  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 abstract org.chromium.net.UrlRequest$Builder allowDirectExecutor();
  public abstract org.chromium.net.UrlRequest build();
}
public abstract class org.chromium.net.UrlRequest$Callback {
  public org.chromium.net.UrlRequest$Callback();
  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 onReadCompleted(org.chromium.net.UrlRequest, org.chromium.net.UrlResponseInfo, java.nio.ByteBuffer) throws java.lang.Exception;
  public abstract void onSucceeded(org.chromium.net.UrlRequest, org.chromium.net.UrlResponseInfo);
  public abstract void onFailed(org.chromium.net.UrlRequest, org.chromium.net.UrlResponseInfo, org.chromium.net.CronetException);
  public void onCanceled(org.chromium.net.UrlRequest, org.chromium.net.UrlResponseInfo);
}
public class org.chromium.net.UrlRequest$Status {
  public static final int INVALID;
  public static final int IDLE;
  public static final int WAITING_FOR_STALLED_SOCKET_POOL;
  public static final int WAITING_FOR_AVAILABLE_SOCKET;
  public static final int WAITING_FOR_DELEGATE;
  public static final int WAITING_FOR_CACHE;
  public static final int DOWNLOADING_PAC_FILE;
  public static final int RESOLVING_PROXY_FOR_URL;
  public static final int RESOLVING_HOST_IN_PAC_FILE;
  public static final int ESTABLISHING_PROXY_TUNNEL;
  public static final int RESOLVING_HOST;
  public static final int CONNECTING;
  public static final int SSL_HANDSHAKE;
  public static final int SENDING_REQUEST;
  public static final int WAITING_FOR_RESPONSE;
  public static final int READING_RESPONSE;
}
public abstract class org.chromium.net.UrlRequest$StatusListener {
  public org.chromium.net.UrlRequest$StatusListener();
  public abstract void onStatus(int);
}
public abstract class org.chromium.net.UrlRequest {
  public org.chromium.net.UrlRequest();
  public abstract void start();
  public abstract void followRedirect();
  public abstract void read(java.nio.ByteBuffer);
  public abstract void cancel();
  public abstract boolean isDone();
  public abstract void getStatus(org.chromium.net.UrlRequest$StatusListener);
}
public abstract class org.chromium.net.UrlResponseInfo$HeaderBlock {
  public 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 abstract class org.chromium.net.UrlResponseInfo {
  public org.chromium.net.UrlResponseInfo();
  public abstract java.lang.String getUrl();
  public abstract java.util.List<java.lang.String> getUrlChain();
  public abstract int getHttpStatusCode();
  public abstract java.lang.String getHttpStatusText();
  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 boolean wasCached();
  public abstract java.lang.String getNegotiatedProtocol();
  public abstract java.lang.String getProxyServer();
  public abstract long getReceivedByteCount();
}
Stamp: fadacc3f49758e52a33a1ae7f032ec97
