Index: components/cronet/android/java/src/org/chromium/net/UrlRequestFactory.java |
diff --git a/components/cronet/android/java/src/org/chromium/net/UrlRequestFactory.java b/components/cronet/android/java/src/org/chromium/net/UrlRequestFactory.java |
index 2b08e7d99472e8a07a813d78446f6f608797ebb8..5052143e48e1aaa5ac3c5b1e614bd98821b65333 100644 |
--- a/components/cronet/android/java/src/org/chromium/net/UrlRequestFactory.java |
+++ b/components/cronet/android/java/src/org/chromium/net/UrlRequestFactory.java |
@@ -4,13 +4,21 @@ |
package org.chromium.net; |
+import android.content.Context; |
+import android.util.Log; |
+ |
+import java.lang.reflect.Constructor; |
import java.util.concurrent.Executor; |
/** |
* A factory for {@link UrlRequest}'s, which uses the best HTTP stack |
* available on the current platform. |
*/ |
-public interface UrlRequestFactory { |
+public abstract class UrlRequestFactory { |
+ 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 |
@@ -23,4 +31,66 @@ public interface UrlRequestFactory { |
*/ |
public abstract UrlRequest createRequest(String url, |
UrlRequestListener listener, Executor executor); |
+ |
+ /** |
+ * @return true if the factory is enabled. |
+ */ |
+ public abstract boolean isEnabled(); |
+ |
+ /** |
+ * @return a human-readable name of the factory. |
+ */ |
+ public abstract String getName(); |
+ |
+ /** |
+ * Create factory with given config. If config.legacyMode is true, or |
+ * native library is not available, then creates HttpUrlConnection-based |
+ * factory. |
+ * @param context application context. |
+ * @param config factory configuration. |
+ */ |
+ public static UrlRequestFactory createFactory(Context context, |
+ HttpUrlRequestFactoryConfig config) { |
+ UrlRequestFactory factory = null; |
+ if (config.userAgent().isEmpty()) { |
+ config.setUserAgent(UserAgent.from(context)); |
+ } |
+ if (!config.legacyMode()) { |
+ factory = createCronetFactory(context, config); |
+ } |
+ if (factory == null) { |
+ // TODO(mef): Fallback to stub implementation. Once stub |
+ // implementation is available merge with createCronetFactory. |
+ factory = createCronetFactory(context, config); |
+ } |
+ Log.i(TAG, "Using network stack: " + factory.getName()); |
+ return factory; |
+ } |
+ |
+ private static UrlRequestFactory createCronetFactory(Context context, |
+ HttpUrlRequestFactoryConfig config) { |
+ UrlRequestFactory factory = null; |
+ try { |
+ Class<? extends UrlRequestFactory> factoryClass = |
+ UrlRequestFactory.class.getClassLoader(). |
+ loadClass(CRONET_URL_REQUEST_CONTEXT). |
+ asSubclass(UrlRequestFactory.class); |
+ Constructor<? extends UrlRequestFactory> constructor = |
+ factoryClass.getConstructor( |
+ Context.class, HttpUrlRequestFactoryConfig.class); |
+ UrlRequestFactory cronetFactory = |
+ constructor.newInstance(context, config); |
+ if (cronetFactory.isEnabled()) { |
+ factory = cronetFactory; |
+ } |
+ } catch (ClassNotFoundException e) { |
+ // Leave as null |
+ } catch (Exception e) { |
+ throw new IllegalStateException( |
+ "Cannot instantiate: " + |
+ CRONET_URL_REQUEST_CONTEXT, |
+ e); |
+ } |
+ return factory; |
+ } |
} |