Skip to content

Commit 75e9cb5

Browse files
authored
Merge pull request #3 from callstack-internal/initial-props
Add support for initial props + remove Java Proxy.
2 parents e6deab9 + 1496e0f commit 75e9cb5

File tree

7 files changed

+110
-76
lines changed

7 files changed

+110
-76
lines changed

android/src/main/java/com/callstack/reactnativebrownfield/BridgeManager.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,27 @@ import com.facebook.react.ReactPackage
66
import com.facebook.soloader.SoLoader
77
import java.util.concurrent.atomic.AtomicBoolean
88

9+
interface InitializedCallback {
10+
operator fun invoke(initialized: Boolean)
11+
}
12+
913
class BridgeManager private constructor(val reactNativeHost: ReactNativeHost) {
1014
companion object {
1115
private lateinit var instance: BridgeManager
1216
private val initialized = AtomicBoolean()
1317

18+
@JvmStatic
1419
val shared: BridgeManager get() = instance
1520

21+
@JvmStatic
1622
fun initialize(rnHost: ReactNativeHost, application: Application) {
1723
if(!initialized.getAndSet(true)) {
1824
instance = BridgeManager(rnHost)
1925
SoLoader.init(application.applicationContext,false)
2026
}
2127
}
2228

29+
@JvmStatic
2330
fun initialize(options: HashMap<String, Any>, application: Application) {
2431
val rnHost = object : ReactNativeHost(application) {
2532
override fun getUseDeveloperSupport(): Boolean {
@@ -39,17 +46,22 @@ class BridgeManager private constructor(val reactNativeHost: ReactNativeHost) {
3946
initialize(rnHost, application)
4047
}
4148

49+
@JvmStatic
4250
fun initialize(packages: List<ReactPackage>, application: Application) {
4351
val options = hashMapOf("packages" to packages, "mainModuleName" to "index")
4452

4553
initialize(options, application)
4654
}
4755
}
4856

57+
fun startReactNative(callback: InitializedCallback?) {
58+
startReactNative { callback?.invoke(it) }
59+
}
4960

50-
fun startReactNative(listener: ((initialized: Boolean) -> Unit)?) {
51-
if (listener != null) {
52-
reactNativeHost.reactInstanceManager?.addReactInstanceEventListener { listener(true) }
61+
@JvmName("startReactNativeKotlin")
62+
fun startReactNative(callback: ((initialized: Boolean) -> Unit)?) {
63+
if (callback != null) {
64+
reactNativeHost.reactInstanceManager?.addReactInstanceEventListener { callback(true) }
5365
}
5466

5567
reactNativeHost.reactInstanceManager?.createReactContextInBackground()

android/src/main/java/com/callstack/reactnativebrownfield/BridgeManagerJava.java

Lines changed: 0 additions & 48 deletions
This file was deleted.

android/src/main/java/com/callstack/reactnativebrownfield/CallbackInterface.java

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.callstack.reactnativebrownfield
2+
3+
import android.os.Bundle
4+
import com.facebook.react.bridge.ReadableArray
5+
import com.facebook.react.bridge.ReadableMap
6+
import java.util.ArrayList
7+
8+
object PropsBundle {
9+
fun fromHashMap(map: HashMap<String, *>): Bundle {
10+
val bundle = Bundle()
11+
map.forEach {
12+
when (it.value) {
13+
is ArrayList<*> -> {
14+
bundle.putSerializable(it.key, it.value as ArrayList<*>)
15+
}
16+
is ReadableArray -> {
17+
bundle.putSerializable(it.key, (it.value as ReadableArray).toArrayList())
18+
}
19+
is HashMap<*, *> -> {
20+
bundle.putBundle(it.key, fromHashMap(it.value as HashMap<String, *>))
21+
}
22+
is ReadableMap -> {
23+
bundle.putBundle(it.key, fromHashMap((it.value as ReadableMap).toHashMap()))
24+
}
25+
is Boolean -> {
26+
bundle.putBoolean(it.key, it.value as Boolean)
27+
}
28+
is Int -> {
29+
bundle.putInt(it.key, it.value as Int)
30+
}
31+
is String -> {
32+
bundle.putString(it.key, it.value as String)
33+
}
34+
is Double -> {
35+
bundle.putDouble(it.key, it.value as Double)
36+
}
37+
else -> {
38+
bundle.putSerializable(it.key, null)
39+
}
40+
}
41+
}
42+
43+
return bundle
44+
}
45+
}

android/src/main/java/com/callstack/reactnativebrownfield/ReactNativeActivity.kt

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,30 @@ import com.facebook.react.ReactRootView
1212
import com.facebook.react.devsupport.DoubleTapReloadRecognizer
1313
import com.facebook.react.modules.core.PermissionListener
1414
import com.facebook.react.bridge.Callback
15+
import com.facebook.react.bridge.ReadableMap
1516
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler
1617
import com.facebook.react.modules.core.PermissionAwareActivity
1718

1819
private const val MODULE_NAME = "com.callstack.reactnativebrownfield.ACTIVITY_MODULE_NAME"
20+
private const val INITIAL_PROPS = "com.callstack.reactnativebrownfield.ACTIVITY_INITIAL_PROPS"
1921

2022
class ReactNativeActivity : ReactActivity(), DefaultHardwareBackBtnHandler, PermissionAwareActivity {
2123
private var reactRootView: ReactRootView? = null
22-
private lateinit var moduleName: String
2324
private lateinit var doubleTapReloadRecognizer: DoubleTapReloadRecognizer
2425
private lateinit var permissionsCallback: Callback
2526
private var permissionListener: PermissionListener? = null
2627

2728
override fun onCreate(savedInstanceState: Bundle?) {
2829
super.onCreate(savedInstanceState)
2930

30-
moduleName = intent.getStringExtra(MODULE_NAME)
31+
val moduleName = intent.getStringExtra(MODULE_NAME)
32+
val initialProps = intent.getBundleExtra(INITIAL_PROPS)
3133

3234
reactRootView = ReactRootView(this)
3335
reactRootView?.startReactApplication(
3436
BridgeManager.shared.reactNativeHost.reactInstanceManager,
3537
moduleName,
36-
null
38+
initialProps
3739
)
3840

3941
supportActionBar?.hide()
@@ -146,10 +148,24 @@ class ReactNativeActivity : ReactActivity(), DefaultHardwareBackBtnHandler, Perm
146148

147149
companion object {
148150
@JvmStatic
149-
fun createReactActivityIntent(context: Context, moduleName: String): Intent {
151+
@JvmOverloads
152+
fun createReactActivityIntent(context: Context, moduleName: String, initialProps: Bundle? = null): Intent {
150153
val intent = Intent(context, ReactNativeActivity::class.java)
151154
intent.putExtra(MODULE_NAME, moduleName)
155+
if (initialProps != null) {
156+
intent.putExtra(INITIAL_PROPS, initialProps)
157+
}
152158
return intent
153159
}
160+
161+
@JvmStatic
162+
fun createReactActivityIntent(context: Context, moduleName: String, initialProps: HashMap<String, *>): Intent {
163+
return createReactActivityIntent(context, moduleName, PropsBundle.fromHashMap(initialProps))
164+
}
165+
166+
@JvmStatic
167+
fun createReactActivityIntent(context: Context, moduleName: String, initialProps: ReadableMap): Intent {
168+
return createReactActivityIntent(context, moduleName, initialProps.toHashMap())
169+
}
154170
}
155171
}

android/src/main/java/com/callstack/reactnativebrownfield/ReactNativeFragment.kt

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,36 @@ import android.view.ViewGroup
1111
import com.facebook.infer.annotation.Assertions
1212
import com.facebook.react.ReactRootView
1313
import com.facebook.react.bridge.Callback
14+
import com.facebook.react.bridge.WritableMap
1415
import com.facebook.react.common.LifecycleState
1516
import com.facebook.react.devsupport.DoubleTapReloadRecognizer
1617
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler
1718
import com.facebook.react.modules.core.PermissionAwareActivity
1819
import com.facebook.react.modules.core.PermissionListener
1920

2021
private const val MODULE_NAME = "com.callstack.reactnativebrownfield.FRAGMENT_MODULE_NAME"
22+
private const val INITIAL_PROPS = "com.callstack.reactnativebrownfield.FRAGMENT_INITIAL_PROPS"
2123

2224
class ReactNativeFragment : Fragment(), PermissionAwareActivity {
2325

2426
private var reactRootView: ReactRootView? = null
25-
private lateinit var moduleName: String
2627
private lateinit var doubleTapReloadRecognizer: DoubleTapReloadRecognizer
2728
private lateinit var permissionsCallback: Callback
2829
private var permissionListener: PermissionListener? = null
2930

3031
override fun onCreate(savedInstanceState: Bundle?) {
3132
super.onCreate(savedInstanceState)
32-
moduleName = arguments!!.getString(MODULE_NAME)!!
33+
val moduleName = arguments?.getString(MODULE_NAME)!!
34+
val initialProps = arguments?.getBundle(INITIAL_PROPS)
3335

3436
doubleTapReloadRecognizer = DoubleTapReloadRecognizer()
37+
38+
reactRootView = ReactRootView(context)
39+
reactRootView?.startReactApplication(
40+
BridgeManager.shared.reactNativeHost.reactInstanceManager,
41+
moduleName,
42+
initialProps
43+
)
3544
}
3645

3746

@@ -40,14 +49,6 @@ class ReactNativeFragment : Fragment(), PermissionAwareActivity {
4049
container: ViewGroup?,
4150
savedInstanceState: Bundle?
4251
): View {
43-
44-
reactRootView = ReactRootView(context)
45-
reactRootView?.startReactApplication(
46-
BridgeManager.shared.reactNativeHost.reactInstanceManager,
47-
moduleName,
48-
null
49-
)
50-
5152
return reactRootView!!
5253
}
5354

@@ -148,13 +149,27 @@ class ReactNativeFragment : Fragment(), PermissionAwareActivity {
148149

149150
companion object {
150151
@JvmStatic
151-
fun createReactNativeFragment(moduleName: String): ReactNativeFragment {
152+
@JvmOverloads
153+
fun createReactNativeFragment(moduleName: String, initialProps: Bundle? = null): ReactNativeFragment {
152154
val fragment = ReactNativeFragment()
153155
val args = Bundle()
154156
args.putString(MODULE_NAME, moduleName)
157+
if (initialProps != null) {
158+
args.putBundle(INITIAL_PROPS, initialProps)
159+
}
155160
fragment.arguments = args
156161
return fragment
157162
}
163+
164+
@JvmStatic
165+
fun createReactNativeFragment(moduleName: String, initialProps: HashMap<String, *>): ReactNativeFragment {
166+
return createReactNativeFragment(moduleName, PropsBundle.fromHashMap(initialProps))
167+
}
168+
169+
@JvmStatic
170+
fun createReactNativeFragment(moduleName: String, initialProps: WritableMap): ReactNativeFragment {
171+
return createReactNativeFragment(moduleName, initialProps.toHashMap())
172+
}
158173
}
159174

160175
}

example/native/android/app/src/main/java/com/callstack/nativeexample/MainApplication.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
import android.app.Application;
44
import android.util.Log;
5+
import com.callstack.reactnativebrownfield.BridgeManager;
56
import com.facebook.react.PackageList;
67
import com.facebook.react.ReactApplication;
78
import com.facebook.react.ReactNativeHost;
89
import com.facebook.react.ReactPackage;
9-
import com.callstack.reactnativebrownfield.BridgeManagerJava;
1010

1111
import java.util.HashMap;
1212
import java.util.List;
@@ -20,15 +20,14 @@ public void onCreate() {
2020
options.put("packages", packages);
2121
options.put("mainModuleName", "example/native/index");
2222

23-
BridgeManagerJava.initialize(options, this);
24-
BridgeManagerJava.getShared().startReactNative(init -> {
23+
BridgeManager.initialize(options, this);
24+
BridgeManager.getShared().startReactNative(init -> {
2525
Log.d("test", "test");
2626
});
27-
2827
}
2928

3029
@Override
3130
public ReactNativeHost getReactNativeHost() {
32-
return BridgeManagerJava.getShared().getReactNativeHost();
31+
return BridgeManager.getShared().getReactNativeHost();
3332
}
3433
}

0 commit comments

Comments
 (0)