code: /**
   * Copyright (c) Meta Platforms, Inc. and affiliates.
   *
   * <p>This source code is licensed under the MIT license found in the LICENSE file in the root
   * directory of this source tree.
   */
  package com.porcupinetestapp;
  
  import android.content.Context;
  import com.facebook.flipper.android.AndroidFlipperClient;
  import com.facebook.flipper.android.utils.FlipperUtils;
  import com.facebook.flipper.core.FlipperClient;
  import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin;
  import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin;
  import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin;
  import com.facebook.flipper.plugins.inspector.DescriptorMapping;
  import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin;
  import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor;
  import com.facebook.flipper.plugins.network.NetworkFlipperPlugin;
  import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin;
  import com.facebook.react.ReactInstanceEventListener;
  import com.facebook.react.ReactInstanceManager;
  import com.facebook.react.bridge.ReactContext;
  import com.facebook.react.modules.network.NetworkingModule;
  import okhttp3.OkHttpClient;
  
  /**
   * Class responsible of loading Flipper inside your React Native application. This is the debug
   * flavor of it. Here you can add your own plugins and customize the Flipper setup.
   */
  public class ReactNativeFlipper {
    public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
      if (FlipperUtils.shouldEnableFlipper(context)) {
        final FlipperClient client = AndroidFlipperClient.getInstance(context);
  
        client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));
        client.addPlugin(new DatabasesFlipperPlugin(context));
        client.addPlugin(new SharedPreferencesFlipperPlugin(context));
        client.addPlugin(CrashReporterPlugin.getInstance());
  
        NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin();
        NetworkingModule.setCustomClientBuilder(
            new NetworkingModule.CustomClientBuilder() {
              @Override
              public void apply(OkHttpClient.Builder builder) {
                builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin));
              }
            });
        client.addPlugin(networkFlipperPlugin);
        client.start();
  
        // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized
        // Hence we run if after all native modules have been initialized
        ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
        if (reactContext == null) {
          reactInstanceManager.addReactInstanceEventListener(
              new ReactInstanceEventListener() {
                @Override
                public void onReactContextInitialized(ReactContext reactContext) {
                  reactInstanceManager.removeReactInstanceEventListener(this);
                  reactContext.runOnNativeModulesQueueThread(
                      new Runnable() {
                        @Override
                        public void run() {
                          client.addPlugin(new FrescoFlipperPlugin());
                        }
                      });
                }
              });
        } else {
          client.addPlugin(new FrescoFlipperPlugin());
        }
      }
    }
  }
  