Skip to content

Commit 3c3b4cf

Browse files
passyrickhanlonii
authored andcommitted
Fix RNTester integration with Flipper (#27482)
Summary: There was a reflective call to a non-existent class. It did, however, exist in the template, so I copied it over from there and updated the references accordingly. Pull Request resolved: #27482 Test Plan: Built it and ran it. Works again with the latest Flipper desktop app. ![Screenshot 2019-12-11 16 02 40](https://user-images.githubusercontent.com/9906/70637975-02405580-1c30-11ea-9fec-23860c59cdb6.png) Reviewed By: rickhanlonii Differential Revision: D18933530 Pulled By: passy fbshipit-source-id: 4515d7baaad9a9fff9a4b66e1cbf8a75889e6e45
1 parent 8f954b3 commit 3c3b4cf

File tree

3 files changed

+89
-5
lines changed

3 files changed

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

RNTester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111
import android.content.Context;
1212
import com.facebook.react.BuildConfig;
1313
import com.facebook.react.ReactApplication;
14+
import com.facebook.react.ReactInstanceManager;
1415
import com.facebook.react.ReactNativeHost;
1516
import com.facebook.react.ReactPackage;
1617
import com.facebook.react.shell.MainReactPackage;
1718
import com.facebook.react.views.text.ReactFontManager;
18-
import com.facebook.soloader.SoLoader;
1919
import java.lang.reflect.InvocationTargetException;
2020
import java.util.Arrays;
2121
import java.util.List;
@@ -48,23 +48,33 @@ public List<ReactPackage> getPackages() {
4848
public void onCreate() {
4949
ReactFontManager.getInstance().addCustomFont(this, "Rubik", R.font.rubik);
5050
super.onCreate();
51-
initializeFlipper(this);
51+
initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
5252
}
5353

5454
@Override
5555
public ReactNativeHost getReactNativeHost() {
5656
return mReactNativeHost;
5757
}
5858

59-
private static void initializeFlipper(Context context) {
59+
/**
60+
* Loads Flipper in React Native templates. Call this in the onCreate method with something like
61+
* initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
62+
*
63+
* @param context
64+
* @param reactInstanceManager
65+
*/
66+
private static void initializeFlipper(
67+
Context context, ReactInstanceManager reactInstanceManager) {
6068
if (BuildConfig.DEBUG) {
6169
try {
6270
/*
6371
We use reflection here to pick up the class that initializes Flipper,
6472
since Flipper library is not available in release mode
6573
*/
66-
Class<?> aClass = Class.forName("com.facebook.flipper.ReactNativeFlipper");
67-
aClass.getMethod("initializeFlipper", Context.class).invoke(null, context);
74+
Class<?> aClass = Class.forName("com.facebook.react.uiapp.ReactNativeFlipper");
75+
aClass
76+
.getMethod("initializeFlipper", Context.class, ReactInstanceManager.class)
77+
.invoke(null, context, reactInstanceManager);
6878
} catch (ClassNotFoundException e) {
6979
e.printStackTrace();
7080
} catch (NoSuchMethodException e) {

template/android/app/src/main/java/com/helloworld/MainApplication.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public void onCreate() {
5151
* initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
5252
*
5353
* @param context
54+
* @param reactInstanceManager
5455
*/
5556
private static void initializeFlipper(
5657
Context context, ReactInstanceManager reactInstanceManager) {

0 commit comments

Comments
 (0)