Permalink
Browse files

Android: Enable apps to provide a custom configuration to Fresco

Summary:
The `FrescoModule` supports providing a custom image pipeline configuration. This module is created by `MainReactPackage` but `MainReactPackage` doesn't expose any way to customize the Fresco configuration. This change adds a parameter to `MainReactPackage`'s constructor so that the `FrescoModule`'s configuration can be customized by the app. A couple of design choices were made in this change:
  - `MainReactPackage`'s new constructor parameter is a `MainPackageConfig`. Introducing `MainPackageConfig` enables `MainReactPackage` to nicely support new optional configuration options in the future. Imagine the alternative of each optional configuration being a separate parameter to the `MainReactPackage` constructor.
  - `FrescoModule` exposes its default configuration as a builder object through the `getDefaultConfigBuilder` method. This enables app's to start with `FrescoModule`'s default configuration and then modify it.

**Test plan (required)**

Verified that passing a custom config based on React Nati
Closes #10906

Differential Revision: D4237054

Pulled By: mkonicek

fbshipit-source-id: 8a62a6f0e77ca5f6d35238950094686756262196
  • Loading branch information...
1 parent fde4fb1 commit 8b199a7fd033f2a50edb60f0aaa0ad609f168d4b @rigdern rigdern committed with Facebook Github Bot Nov 28, 2016
@@ -111,14 +111,23 @@ public static boolean hasBeenInitialized() {
}
private static ImagePipelineConfig getDefaultConfig(Context context) {
+ return getDefaultConfigBuilder(context).build();
+ }
+
+ /**
+ * Get the default Fresco configuration builder.
+ * Allows adding of configuration options in addition to the default values.
+ *
+ * @return {@link ImagePipelineConfig.Builder} that has been initialized with default values
+ */
+ public static ImagePipelineConfig.Builder getDefaultConfigBuilder(Context context) {
HashSet<RequestListener> requestListeners = new HashSet<>();
requestListeners.add(new SystraceRequestListener());
return OkHttpImagePipelineConfigFactory
.newBuilder(context.getApplicationContext(), OkHttpClientProvider.getOkHttpClient())
.setDownsampleEnabled(false)
- .setRequestListeners(requestListeners)
- .build();
+ .setRequestListeners(requestListeners);
}
private static class FrescoHandler implements SoLoaderShim.Handler {
@@ -4,6 +4,7 @@ android_library(
name = 'shell',
srcs = glob(['**/*.java']),
deps = [
+ react_native_dep('libraries/fresco/fresco-react-native:imagepipeline'),
react_native_dep('libraries/soloader/java/com/facebook/soloader:soloader'),
react_native_dep('third-party/android/support/v4:lib-support-v4'),
react_native_dep('third-party/java/infer-annotations:infer-annotations'),
@@ -0,0 +1,42 @@
+/**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree. An additional grant
+ * of patent rights can be found in the PATENTS file in the same directory.
+ */
+
+package com.facebook.react.shell;
+
+import com.facebook.imagepipeline.core.ImagePipelineConfig;
+
+/**
+ * Configuration for {@link MainReactPackage}
+ */
+public class MainPackageConfig {
+
+ private ImagePipelineConfig mFrescoConfig;
+
+ private MainPackageConfig(Builder builder) {
+ mFrescoConfig = builder.mFrescoConfig;
+ }
+
+ public ImagePipelineConfig getFrescoConfig() {
+ return mFrescoConfig;
+ }
+
+ public static class Builder {
+
+ private ImagePipelineConfig mFrescoConfig;
+
+ public Builder setFrescoConfig(ImagePipelineConfig frescoConfig) {
+ mFrescoConfig = frescoConfig;
+ return this;
+ }
+
+ public MainPackageConfig build() {
+ return new MainPackageConfig(this);
+ }
+ }
+}
@@ -74,6 +74,18 @@
*/
public class MainReactPackage extends LazyReactPackage {
+ private MainPackageConfig mConfig;
+
+ public MainReactPackage() {
+ }
+
+ /**
+ * Create a new package with configuration
+ */
+ public MainReactPackage(MainPackageConfig config) {
+ mConfig = config;
+ }
+
@Override
public List<ModuleSpec> getNativeModules(final ReactApplicationContext context) {
return Arrays.asList(
@@ -116,7 +128,7 @@ public NativeModule get() {
new ModuleSpec(FrescoModule.class, new Provider<NativeModule>() {
@Override
public NativeModule get() {
- return new FrescoModule(context);
+ return new FrescoModule(context, mConfig != null ? mConfig.getFrescoConfig() : null);
}
}),
new ModuleSpec(I18nManagerModule.class, new Provider<NativeModule>() {

0 comments on commit 8b199a7

Please sign in to comment.