Skip to content

Commit 7de39d1

Browse files
authored
New arch support (#3)
1 parent 57d6a0d commit 7de39d1

32 files changed

+2977
-2474
lines changed

.gitignore

+14-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ DerivedData
2020
*.hmap
2121
*.ipa
2222
*.xcuserstate
23-
.xcode.env.local
23+
**/.xcode.env.local
2424

2525
# Android/IntelliJ
2626
#
@@ -48,11 +48,22 @@ yarn-error.log
4848
*.jsbundle
4949

5050
# Ruby / CocoaPods
51-
example/ios/Pods/
52-
example/vendor/bundle/
51+
**/Pods/
52+
**/vendor/bundle/
5353

5454
# Bob
5555
dist/
5656

5757
# Temporary files created by Metro to check the health of the file watcher
5858
.metro-health-check*
59+
60+
# testing
61+
/coverage
62+
63+
# Yarn
64+
.yarn/*
65+
!.yarn/patches
66+
!.yarn/plugins
67+
!.yarn/releases
68+
!.yarn/sdks
69+
!.yarn/versions

RNSwanBrowser.podspec

+8-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ package = JSON.parse(File.read(File.join(__dir__, "package.json")))
44

55
Pod::Spec.new do |s|
66
s.name = "RNSwanBrowser"
7-
s.dependency "React-Core"
87

98
s.version = package["version"]
109
s.license = package["license"]
@@ -16,5 +15,12 @@ Pod::Spec.new do |s|
1615
s.requires_arc = true
1716

1817
s.source = { :git => package["repository"]["url"], :tag => s.version }
19-
s.source_files = "ios/*.{h,m}"
18+
s.source_files = "ios/**/*.{h,m,mm}"
19+
s.frameworks = "SafariServices"
20+
21+
if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then
22+
install_modules_dependencies(s)
23+
else
24+
s.dependency "React-Core"
25+
end
2026
end

android/build.gradle

+18
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,16 @@ buildscript {
1111
}
1212
}
1313

14+
def isNewArchitectureEnabled() {
15+
return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
16+
}
17+
1418
apply plugin: "com.android.library"
1519

20+
if (isNewArchitectureEnabled()) {
21+
apply plugin: "com.facebook.react"
22+
}
23+
1624
android {
1725
buildToolsVersion safeExtGet("buildToolsVersion", "33.0.0")
1826
compileSdkVersion safeExtGet("compileSdkVersion", 33)
@@ -30,12 +38,22 @@ android {
3038
}
3139
}
3240
defaultConfig {
41+
buildConfigField("boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString())
3342
minSdkVersion safeExtGet("minSdkVersion", 21)
3443
targetSdkVersion safeExtGet("targetSdkVersion", 33)
3544
}
3645
lintOptions {
3746
abortOnError false
3847
}
48+
sourceSets {
49+
main {
50+
if (isNewArchitectureEnabled()) {
51+
java.srcDirs += ["src/newarch"]
52+
} else {
53+
java.srcDirs += ["src/oldarch"]
54+
}
55+
}
56+
}
3957
}
4058

4159
repositories {

android/src/main/java/io/swan/rnbrowser/RNSwanBrowserModule.java renamed to android/src/main/java/io/swan/rnbrowser/RNSwanBrowserModuleImpl.java

+12-70
Original file line numberDiff line numberDiff line change
@@ -5,75 +5,32 @@
55
import android.net.Uri;
66

77
import androidx.annotation.ColorInt;
8-
import androidx.annotation.NonNull;
98
import androidx.browser.customtabs.CustomTabColorSchemeParams;
109
import androidx.browser.customtabs.CustomTabsIntent;
1110
import androidx.core.graphics.ColorUtils;
1211

13-
import com.facebook.react.bridge.LifecycleEventListener;
1412
import com.facebook.react.bridge.Promise;
1513
import com.facebook.react.bridge.ReactApplicationContext;
16-
import com.facebook.react.bridge.ReactContextBaseJavaModule;
17-
import com.facebook.react.bridge.ReactMethod;
18-
import com.facebook.react.bridge.ReadableMap;
19-
import com.facebook.react.module.annotations.ReactModule;
2014
import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter;
2115

2216
import io.swan.rnbrowser.helpers.CustomTabActivityHelper;
2317

24-
@ReactModule(name = RNSwanBrowserModule.NAME)
25-
public class RNSwanBrowserModule extends ReactContextBaseJavaModule implements LifecycleEventListener {
18+
public class RNSwanBrowserModuleImpl {
2619

2720
static final String NAME = "RNSwanBrowser";
28-
private boolean mBrowserVisible = false;
2921

30-
public RNSwanBrowserModule(ReactApplicationContext reactContext) {
31-
super(reactContext);
32-
reactContext.addLifecycleEventListener(this);
33-
}
34-
35-
@NonNull
36-
@Override
37-
public String getName() {
38-
return NAME;
39-
}
40-
41-
@Override
42-
public void onHostResume() {
43-
ReactApplicationContext reactContext = getReactApplicationContext();
44-
45-
if (mBrowserVisible && reactContext.hasActiveReactInstance()) {
22+
protected static void onHostResume(final ReactApplicationContext reactContext) {
23+
if (reactContext.hasActiveReactInstance()) {
4624
reactContext
4725
.getJSModule(RCTDeviceEventEmitter.class)
4826
.emit("swanBrowserDidClose", null);
4927
}
50-
51-
mBrowserVisible = false;
5228
}
5329

54-
@Override
55-
public void onHostPause() {}
56-
57-
@Override
58-
public void onHostDestroy() {}
59-
60-
@ReactMethod
61-
public void open(final String url, final ReadableMap options, final Promise promise) {
62-
if (mBrowserVisible) {
63-
promise.reject("swan_browser_visible",
64-
"An instance of the swan browser is already visible");
65-
}
66-
67-
final Activity activity = getCurrentActivity();
68-
69-
if (activity == null) {
70-
promise.reject("no_current_activity",
71-
"Couldn't call open() when the app is in background");
72-
return;
73-
}
74-
75-
mBrowserVisible = true;
76-
30+
protected static void open(final Activity activity,
31+
final String url,
32+
final Double barTintColor,
33+
final Promise promise) {
7734
CustomTabsIntent.Builder intentBuilder = new CustomTabsIntent.Builder();
7835
intentBuilder.setShowTitle(false);
7936
intentBuilder.setInstantAppsEnabled(false);
@@ -87,13 +44,13 @@ public void open(final String url, final ReadableMap options, final Promise prom
8744
CustomTabColorSchemeParams.Builder paramsBuilder = new CustomTabColorSchemeParams.Builder();
8845
paramsBuilder.setNavigationBarColor(blackColor);
8946

90-
if (options.hasKey("barTintColor")) {
91-
@ColorInt int barTintColor = options.getInt("barTintColor");
47+
if (barTintColor != null) {
48+
@ColorInt int intValue = barTintColor.intValue();
9249

93-
paramsBuilder.setToolbarColor(barTintColor);
94-
paramsBuilder.setSecondaryToolbarColor(barTintColor);
50+
paramsBuilder.setToolbarColor(intValue);
51+
paramsBuilder.setSecondaryToolbarColor(intValue);
9552

96-
intentBuilder.setColorScheme(ColorUtils.calculateLuminance(barTintColor) > 0.5
53+
intentBuilder.setColorScheme(ColorUtils.calculateLuminance(intValue) > 0.5
9754
? CustomTabsIntent.COLOR_SCHEME_LIGHT
9855
: CustomTabsIntent.COLOR_SCHEME_DARK);
9956
}
@@ -114,19 +71,4 @@ public void openUri(Activity activity, Uri uri) {
11471

11572
promise.resolve(null);
11673
}
117-
118-
@ReactMethod
119-
public void close() {
120-
// noop on Android since the modal is closed by deep-link
121-
}
122-
123-
@ReactMethod
124-
public void addListener(String eventName) {
125-
// Set up any upstream listeners or background tasks as necessary
126-
}
127-
128-
@ReactMethod
129-
public void removeListeners(Integer count) {
130-
// Remove upstream listeners, stop unnecessary background tasks
131-
}
13274
}
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,45 @@
11
package io.swan.rnbrowser;
22

33
import androidx.annotation.NonNull;
4+
import androidx.annotation.Nullable;
45

5-
import com.facebook.react.ReactPackage;
6+
import com.facebook.react.TurboReactPackage;
67
import com.facebook.react.bridge.NativeModule;
78
import com.facebook.react.bridge.ReactApplicationContext;
8-
import com.facebook.react.uimanager.ViewManager;
9+
import com.facebook.react.module.model.ReactModuleInfo;
10+
import com.facebook.react.module.model.ReactModuleInfoProvider;
911

10-
import java.util.Collections;
11-
import java.util.List;
12+
import java.util.HashMap;
13+
import java.util.Map;
1214

13-
public class RNSwanBrowserPackage implements ReactPackage {
15+
public class RNSwanBrowserPackage extends TurboReactPackage {
1416

15-
@NonNull
17+
@Nullable
1618
@Override
17-
public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) {
18-
return Collections.singletonList(new RNSwanBrowserModule(reactContext));
19+
public NativeModule getModule(String name, @NonNull ReactApplicationContext reactContext) {
20+
if (name.equals(RNSwanBrowserModuleImpl.NAME)) {
21+
return new RNSwanBrowserModule(reactContext);
22+
} else {
23+
return null;
24+
}
1925
}
2026

21-
@NonNull
2227
@Override
23-
public List<ViewManager> createViewManagers(@NonNull ReactApplicationContext reactContext) {
24-
return Collections.emptyList();
28+
public ReactModuleInfoProvider getReactModuleInfoProvider() {
29+
return () -> {
30+
final Map<String, ReactModuleInfo> moduleInfos = new HashMap<>();
31+
32+
ReactModuleInfo moduleInfo = new ReactModuleInfo(
33+
RNSwanBrowserModuleImpl.NAME,
34+
RNSwanBrowserModuleImpl.NAME,
35+
false,
36+
false,
37+
false,
38+
BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
39+
);
40+
41+
moduleInfos.put(RNSwanBrowserModuleImpl.NAME, moduleInfo);
42+
return moduleInfos;
43+
};
2544
}
2645
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package io.swan.rnbrowser;
2+
3+
import android.app.Activity;
4+
5+
import androidx.annotation.NonNull;
6+
import androidx.annotation.Nullable;
7+
8+
import com.facebook.react.bridge.LifecycleEventListener;
9+
import com.facebook.react.bridge.Promise;
10+
import com.facebook.react.bridge.ReactApplicationContext;
11+
import com.facebook.react.module.annotations.ReactModule;
12+
13+
@ReactModule(name = RNSwanBrowserModuleImpl.NAME)
14+
public class RNSwanBrowserModule extends NativeRNSwanBrowserSpec implements LifecycleEventListener {
15+
16+
private boolean mBrowserVisible = false;
17+
18+
public RNSwanBrowserModule(ReactApplicationContext reactContext) {
19+
super(reactContext);
20+
reactContext.addLifecycleEventListener(this);
21+
}
22+
23+
@Override
24+
@NonNull
25+
public String getName() {
26+
return NAME;
27+
}
28+
29+
@Override
30+
public void onHostResume() {
31+
if (mBrowserVisible) {
32+
RNSwanBrowserModuleImpl.onHostResume(getReactApplicationContext());
33+
mBrowserVisible = false;
34+
}
35+
}
36+
37+
@Override
38+
public void onHostPause() {}
39+
40+
@Override
41+
public void onHostDestroy() {}
42+
43+
@Override
44+
public void open(String url,
45+
@Nullable String dismissButtonStyle,
46+
@Nullable Double barTintColor,
47+
@Nullable Double controlTintColor,
48+
Promise promise) {
49+
if (mBrowserVisible) {
50+
promise.reject("swan_browser_visible",
51+
"An instance of the swan browser is already visible");
52+
return;
53+
}
54+
55+
final Activity activity = getReactApplicationContext().getCurrentActivity();
56+
57+
if (activity == null) {
58+
promise.reject("no_current_activity",
59+
"Couldn't call open() when the app is in background");
60+
return;
61+
}
62+
63+
mBrowserVisible = true;
64+
RNSwanBrowserModuleImpl.open(activity, url, barTintColor, promise);
65+
}
66+
67+
@Override
68+
public void close() {
69+
// noop on Android since the modal is closed by deep-link
70+
}
71+
72+
@Override
73+
public void addListener(String eventName) {
74+
// iOS only
75+
}
76+
77+
@Override
78+
public void removeListeners(double count) {
79+
// iOS only
80+
}
81+
82+
@Override
83+
public void invalidate() {
84+
super.invalidate();
85+
getReactApplicationContext().removeLifecycleEventListener(this);
86+
}
87+
}

0 commit comments

Comments
 (0)