Skip to content

Commit b3fe351

Browse files
authored
fix: Allow users to enable Flipper (#121)
1 parent 602334a commit b3fe351

File tree

13 files changed

+254
-40
lines changed

13 files changed

+254
-40
lines changed

.rubocop.yml

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,33 @@
11
AllCops:
22
Exclude:
33
- "**/node_modules/**/*"
4-
TargetRubyVersion: 2.3
4+
TargetRubyVersion: 2.6
55

66
Layout/LineLength:
77
Max: 100
88

9+
Lint/UnusedMethodArgument:
10+
AllowUnusedKeywordArguments: true
11+
912
Metrics/AbcSize:
1013
Enabled: false
1114

1215
Metrics/MethodLength:
1316
Enabled: false
1417

18+
Metrics/CyclomaticComplexity:
19+
IgnoredMethods: [
20+
make_project!,
21+
use_react_native!,
22+
use_test_app_internal!
23+
]
24+
25+
Metrics/PerceivedComplexity:
26+
IgnoredMethods: [
27+
use_react_native!,
28+
use_test_app_internal!
29+
]
30+
1531
Naming/FileName:
1632
Exclude:
1733
- !ruby/regexp /-\d+\.\d+\.rb$/
@@ -34,3 +50,9 @@ Style/HashTransformKeys:
3450

3551
Style/HashTransformValues:
3652
Enabled: true
53+
54+
Style/TrailingCommaInArrayLiteral:
55+
EnforcedStyleForMultiline: comma
56+
57+
Style/TrailingCommaInHashLiteral:
58+
EnforcedStyleForMultiline: comma

Gemfile.lock

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
GEM
22
remote: https://rubygems.org/
33
specs:
4-
ast (2.4.0)
5-
jaro_winkler (1.5.4)
6-
minitest (5.14.0)
4+
ast (2.4.1)
5+
minitest (5.14.1)
76
parallel (1.19.1)
8-
parser (2.7.0.5)
7+
parser (2.7.1.3)
98
ast (~> 2.4.0)
109
rainbow (3.0.0)
10+
regexp_parser (1.7.1)
1111
rexml (3.2.4)
12-
rubocop (0.80.1)
13-
jaro_winkler (~> 1.5.1)
12+
rubocop (0.85.1)
1413
parallel (~> 1.10)
1514
parser (>= 2.7.0.1)
1615
rainbow (>= 2.2.2, < 4.0)
16+
regexp_parser (>= 1.7)
1717
rexml
18+
rubocop-ast (>= 0.0.3)
1819
ruby-progressbar (~> 1.7)
19-
unicode-display_width (>= 1.4.0, < 1.7)
20+
unicode-display_width (>= 1.4.0, < 2.0)
21+
rubocop-ast (0.0.3)
22+
parser (>= 2.7.0.1)
2023
ruby-progressbar (1.10.1)
21-
unicode-display_width (1.6.1)
24+
unicode-display_width (1.7.0)
2225

2326
PLATFORMS
2427
ruby

android/app/build.gradle

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
buildscript {
2-
ext.kotlinVersion = "1.3.70"
2+
ext.kotlinVersion = "1.3.72"
33

44
def buildscriptDir = buildscript.sourceFile.getParent()
55
apply from: "$buildscriptDir/../test-app-util.gradle"
@@ -34,12 +34,22 @@ def testAppDir = file("$projectDir/../../")
3434
apply from: file("${testAppDir}/test-app.gradle")
3535
applyTestAppModule(project, "com.sample")
3636

37-
project.ext.react = [enableHermes: true]
37+
project.ext.react = [
38+
enableFlipper: hasProperty('FLIPPER_VERSION'),
39+
enableHermes: true,
40+
]
3841

3942
android {
4043
compileSdkVersion 29
4144
buildToolsVersion "29.0.3"
4245

46+
// TODO: Remove this block when minSdkVersion >= 24. See
47+
// https://stackoverflow.com/q/53402639 for details.
48+
compileOptions {
49+
sourceCompatibility JavaVersion.VERSION_1_8
50+
targetCompatibility JavaVersion.VERSION_1_8
51+
}
52+
4353
defaultConfig {
4454
applicationId "com.sample"
4555
minSdkVersion 21
@@ -55,6 +65,12 @@ android {
5565
pickFirst "lib/x86_64/libc++_shared.so"
5666
pickFirst "lib/x86/libc++_shared.so"
5767
}
68+
69+
sourceSets {
70+
if (project.ext.react.enableFlipper) {
71+
debug.java.srcDirs += 'src/flipper/java'
72+
}
73+
}
5874
}
5975

6076
def hermesEnginePath = findNodeModulesPath(projectDir, "hermes-engine") ?: findNodeModulesPath(projectDir, "hermesvm")
@@ -86,4 +102,16 @@ dependencies {
86102
testImplementation "junit:junit:4.13"
87103
androidTestImplementation "androidx.test.ext:junit:1.1.1"
88104
androidTestImplementation "androidx.test.espresso:espresso-core:3.2.0"
105+
106+
if (project.ext.react.enableFlipper) {
107+
debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
108+
exclude group:'com.facebook.fbjni'
109+
}
110+
debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
111+
exclude group:'com.facebook.flipper'
112+
}
113+
debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
114+
exclude group:'com.facebook.flipper'
115+
}
116+
}
89117
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.sample.react
2+
3+
import android.content.Context
4+
import com.facebook.flipper.android.AndroidFlipperClient
5+
import com.facebook.flipper.android.utils.FlipperUtils
6+
import com.facebook.flipper.core.FlipperClient
7+
import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin
8+
import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin
9+
import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin
10+
import com.facebook.flipper.plugins.inspector.DescriptorMapping
11+
import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin
12+
import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor
13+
import com.facebook.flipper.plugins.network.NetworkFlipperPlugin
14+
import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin
15+
import com.facebook.react.ReactInstanceManager
16+
import com.facebook.react.ReactInstanceManager.ReactInstanceEventListener
17+
import com.facebook.react.bridge.ReactContext
18+
import com.facebook.react.modules.network.NetworkingModule
19+
20+
@Suppress("unused")
21+
object ReactNativeFlipper {
22+
@JvmStatic
23+
fun initialize(context: Context?, reactInstanceManager: ReactInstanceManager) {
24+
if (!FlipperUtils.shouldEnableFlipper(context)) {
25+
return
26+
}
27+
28+
val client: FlipperClient = AndroidFlipperClient.getInstance(context)
29+
client.addPlugin(InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()))
30+
client.addPlugin(DatabasesFlipperPlugin(context))
31+
client.addPlugin(SharedPreferencesFlipperPlugin(context))
32+
client.addPlugin(CrashReporterPlugin.getInstance())
33+
34+
val networkFlipperPlugin = NetworkFlipperPlugin()
35+
NetworkingModule.setCustomClientBuilder { builder ->
36+
builder.addNetworkInterceptor(FlipperOkhttpInterceptor(networkFlipperPlugin))
37+
}
38+
client.addPlugin(networkFlipperPlugin)
39+
40+
client.start()
41+
42+
// FrescoFlipperPlugin needs to ensure that ImagePipelineFactory is
43+
// initialized and must therefore be run after all native modules have
44+
// been initialized.
45+
val reactContext = reactInstanceManager.currentReactContext
46+
if (reactContext == null) {
47+
reactInstanceManager.addReactInstanceEventListener(
48+
object : ReactInstanceEventListener {
49+
override fun onReactContextInitialized(reactContext: ReactContext) {
50+
reactInstanceManager.removeReactInstanceEventListener(this)
51+
reactContext.runOnNativeModulesQueueThread { client.addPlugin(FrescoFlipperPlugin()) }
52+
}
53+
})
54+
} else {
55+
client.addPlugin(FrescoFlipperPlugin())
56+
}
57+
}
58+
}

android/app/src/main/java/com/sample/react/TestAppReactNativeHost.kt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.sample.react
33
import android.app.Activity
44
import android.app.Application
55
import android.content.Context
6+
import android.util.Log
67
import com.facebook.react.PackageList
78
import com.facebook.react.ReactInstanceManager
89
import com.facebook.react.ReactNativeHost
@@ -83,6 +84,20 @@ class TestAppReactNativeHost @Inject constructor(
8384

8485
SoLoader.init(application, false)
8586
reactInstanceManager.createReactContextInBackground()
87+
88+
if (BuildConfig.DEBUG) {
89+
try {
90+
Class.forName("com.sample.react.ReactNativeFlipper")
91+
.getMethod("initialize", Context::class.java, ReactInstanceManager::class.java)
92+
.invoke(null, application, reactInstanceManager)
93+
} catch (e: ClassNotFoundException) {
94+
Log.i(
95+
"ReactTestApp",
96+
"To use Flipper, define `FLIPPER_VERSION` in your `gradle.properties`. "
97+
+ "If you're using React Native 0.62, you should use `FLIPPER_VERSION=0.33.1`."
98+
)
99+
}
100+
}
86101
}
87102

88103
override fun createReactInstanceManager(): ReactInstanceManager {
@@ -116,7 +131,7 @@ class TestAppReactNativeHost @Inject constructor(
116131
val latch = CountDownLatch(1)
117132
var packagerIsRunning = false
118133
DevServerHelper(
119-
DevInternalSettings.withoutNativeDeltaClient(context) {},
134+
DevInternalSettings(context) {},
120135
context.packageName,
121136
BundleStatusProvider { BundleStatus() }
122137
).isPackagerRunning {

ios/ReactTestApp.xcodeproj/project.pbxproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
archiveVersion = 1;
44
classes = {
55
};
6-
objectVersion = 51;
6+
objectVersion = 52;
77
objects = {
88

99
/* Begin PBXBuildFile section */
@@ -277,7 +277,7 @@
277277
};
278278
};
279279
buildConfigurationList = 19ECD0CD232ED425003D8557 /* Build configuration list for PBXProject "ReactTestApp" */;
280-
compatibilityVersion = "Xcode 9.3";
280+
compatibilityVersion = "Xcode 11.0";
281281
developmentRegion = en;
282282
hasScannedForEncodings = 0;
283283
knownRegions = (

ios/ReactTestApp/ReactInstance.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,19 @@ final class ReactInstance: NSObject, RCTBridgeDelegate, RCTTurboModuleLookupDele
7171
object: nil
7272
)
7373
#endif
74+
75+
#if USE_FLIPPER
76+
if let flipper = FlipperClient.shared() {
77+
flipper.add(FlipperKitLayoutPlugin(
78+
rootNode: application,
79+
with: SKDescriptorMapper()
80+
))
81+
flipper.add(FKUserDefaultsPlugin(suiteName: nil))
82+
flipper.add(FlipperKitReactPlugin())
83+
flipper.add(FlipperKitNetworkPlugin(networkAdapter: SKIOSNetworkAdapter()))
84+
flipper.start()
85+
}
86+
#endif
7487
}
7588

7689
init(forTestingPurposesOnly: Bool) {

ios/ReactTestApp/ReactTestApp-Bridging-Header.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,14 @@
1717
#import <React/RCTVersion.h>
1818
#import <ReactTestApp-DevSupport/ReactTestApp-DevSupport.h>
1919

20+
#if USE_FLIPPER
21+
#import <FlipperKit/FlipperClient.h>
22+
#import <FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.h>
23+
#import <FlipperKitNetworkPlugin/FlipperKitNetworkPlugin.h>
24+
#import <FlipperKitReactPlugin/FlipperKitReactPlugin.h>
25+
#import <FlipperKitUserDefaultsPlugin/FKUserDefaultsPlugin.h>
26+
#import <SKIOSNetworkPlugin/SKIOSNetworkAdapter.h>
27+
#endif
28+
2029
#import "React+Compatibility.h"
2130
#import "UIViewController+ReactTestApp.h"

0 commit comments

Comments
 (0)