1 /**
2  * Copyright (c) Meta Platforms, Inc. and affiliates.
3  *
4  * <p>This source code is licensed under the MIT license found in the LICENSE file in the root
5  * directory of this source tree.
6  */
7 package com.community.fabrictester;
8 
9 import android.content.Context;
10 import com.facebook.flipper.android.AndroidFlipperClient;
11 import com.facebook.flipper.android.utils.FlipperUtils;
12 import com.facebook.flipper.core.FlipperClient;
13 import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin;
14 import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin;
15 import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin;
16 import com.facebook.flipper.plugins.inspector.DescriptorMapping;
17 import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin;
18 import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor;
19 import com.facebook.flipper.plugins.network.NetworkFlipperPlugin;
20 import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin;
21 import com.facebook.react.ReactInstanceEventListener;
22 import com.facebook.react.ReactInstanceManager;
23 import com.facebook.react.bridge.ReactContext;
24 import com.facebook.react.modules.network.NetworkingModule;
25 import okhttp3.OkHttpClient;
26 
27 /**
28  * Class responsible of loading Flipper inside your React Native application. This is the debug
29  * flavor of it. Here you can add your own plugins and customize the Flipper setup.
30  */
31 public class ReactNativeFlipper {
initializeFlipper(Context context, ReactInstanceManager reactInstanceManager)32   public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
33     if (FlipperUtils.shouldEnableFlipper(context)) {
34       final FlipperClient client = AndroidFlipperClient.getInstance(context);
35 
36       client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));
37       client.addPlugin(new DatabasesFlipperPlugin(context));
38       client.addPlugin(new SharedPreferencesFlipperPlugin(context));
39       client.addPlugin(CrashReporterPlugin.getInstance());
40 
41       NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin();
42       NetworkingModule.setCustomClientBuilder(
43           new NetworkingModule.CustomClientBuilder() {
44             @Override
45             public void apply(OkHttpClient.Builder builder) {
46               builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin));
47             }
48           });
49       client.addPlugin(networkFlipperPlugin);
50       client.start();
51 
52       // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized
53       // Hence we run if after all native modules have been initialized
54       ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
55       if (reactContext == null) {
56         reactInstanceManager.addReactInstanceEventListener(
57             new ReactInstanceEventListener() {
58               @Override
59               public void onReactContextInitialized(ReactContext reactContext) {
60                 reactInstanceManager.removeReactInstanceEventListener(this);
61                 reactContext.runOnNativeModulesQueueThread(
62                     new Runnable() {
63                       @Override
64                       public void run() {
65                         client.addPlugin(new FrescoFlipperPlugin());
66                       }
67                     });
68               }
69             });
70       } else {
71         client.addPlugin(new FrescoFlipperPlugin());
72       }
73     }
74   }
75 }
76