Index: components/cronet/android/java/src/org/chromium/net/UrlRequestContext.java |
diff --git a/components/cronet/android/java/src/org/chromium/net/UrlRequestContext.java b/components/cronet/android/java/src/org/chromium/net/UrlRequestContext.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e98e67b36e554263d51f4400a1b0de85ef881385 |
--- /dev/null |
+++ b/components/cronet/android/java/src/org/chromium/net/UrlRequestContext.java |
@@ -0,0 +1,109 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.net; |
+ |
+import android.content.Context; |
+import android.util.Log; |
+ |
+import java.lang.reflect.Constructor; |
+import java.util.concurrent.Executor; |
+ |
+/** |
+ * A context for {@link UrlRequest}'s, which uses the best HTTP stack |
+ * available on the current platform. |
+ */ |
+public abstract class UrlRequestContext { |
+ private static final String TAG = "UrlRequestFactory"; |
+ private static final String CRONET_URL_REQUEST_CONTEXT = |
+ "org.chromium.net.CronetUrlRequestContext"; |
+ |
+ /** |
+ * Creates an UrlRequest object. All UrlRequest functions must |
+ * be called on the Executor's thread, and all callbacks will be called |
+ * on the Executor's thread as well. Executor must not run tasks on the |
+ * current thread to prevent network jank and exception during shutdown. |
+ * |
+ * createRequest itself may be called on any thread. |
+ * @param url URL for the request. |
+ * @param listener Callback interface that gets called on different events. |
+ * @param executor Executor on which all callbacks will be called. |
+ * @return new request. |
+ */ |
+ public abstract UrlRequest createRequest(String url, |
+ UrlRequestListener listener, Executor executor); |
+ |
+ /** |
+ * @return true if the context is enabled. |
+ */ |
+ public abstract boolean isEnabled(); |
+ |
+ /** |
+ * @return a human-readable version string of the context. |
+ */ |
+ public abstract String getVersionString(); |
+ |
+ /** |
+ * Shuts down the UrlRequestContext if there are no active requests, |
+ * otherwise throws an exception. |
+ * |
+ * Cannot be called on network thread - the thread Cronet calls into |
+ * Executor on (which is different from the thread the Executor invokes |
+ * callbacks on). May block until all the Context's resources have been |
+ * cleaned up. |
+ */ |
+ public abstract void shutdown(); |
+ |
+ /** |
+ * Create context with given config. If config.legacyMode is true, or |
+ * native library is not available, then creates HttpUrlConnection-based |
+ * context. |
+ * @param context application context. |
+ * @param config context configuration. |
+ */ |
+ public static UrlRequestContext createContext(Context context, |
+ UrlRequestContextConfig config) { |
+ UrlRequestContext urlRequestContext = null; |
+ if (config.userAgent().isEmpty()) { |
+ config.setUserAgent(UserAgent.from(context)); |
+ } |
+ if (!config.legacyMode()) { |
+ urlRequestContext = createCronetContext(context, config); |
+ } |
+ if (urlRequestContext == null) { |
+ // TODO(mef): Fallback to stub implementation. Once stub |
+ // implementation is available merge with createCronetFactory. |
+ urlRequestContext = createCronetContext(context, config); |
+ } |
+ Log.i(TAG, "Using network stack: " |
+ + urlRequestContext.getVersionString()); |
+ return urlRequestContext; |
+ } |
+ |
+ private static UrlRequestContext createCronetContext(Context context, |
+ UrlRequestContextConfig config) { |
+ UrlRequestContext urlRequestContext = null; |
+ try { |
+ Class<? extends UrlRequestContext> contextClass = |
+ UrlRequestContext.class.getClassLoader() |
+ .loadClass(CRONET_URL_REQUEST_CONTEXT) |
+ .asSubclass(UrlRequestContext.class); |
+ Constructor<? extends UrlRequestContext> constructor = |
+ contextClass.getConstructor( |
+ Context.class, UrlRequestContextConfig.class); |
+ UrlRequestContext cronetContext = |
+ constructor.newInstance(context, config); |
+ if (cronetContext.isEnabled()) { |
+ urlRequestContext = cronetContext; |
+ } |
+ } catch (ClassNotFoundException e) { |
+ // Leave as null. |
+ } catch (Exception e) { |
+ throw new IllegalStateException( |
+ "Cannot instantiate: " + CRONET_URL_REQUEST_CONTEXT, |
+ e); |
+ } |
+ return urlRequestContext; |
+ } |
+} |