@@ -11,6 +11,7 @@ import androidx.recyclerview.widget.DividerItemDecoration
1111import androidx.recyclerview.widget.LinearLayoutManager
1212import androidx.recyclerview.widget.RecyclerView
1313import com.facebook.react.ReactActivity
14+ import com.facebook.react.bridge.ReactApplicationContext
1415import com.facebook.react.bridge.ReactContext
1516import com.facebook.react.modules.systeminfo.ReactNativeVersion
1617import com.facebook.react.packagerconnection.PackagerConnectionSettings
@@ -22,6 +23,7 @@ import com.microsoft.reacttestapp.component.ComponentBottomSheetDialogFragment
2223import com.microsoft.reacttestapp.component.ComponentListAdapter
2324import com.microsoft.reacttestapp.component.ComponentViewModel
2425import com.microsoft.reacttestapp.manifest.Component
26+ import com.microsoft.reacttestapp.react.AppRegistry
2527import com.microsoft.reacttestapp.react.BundleSource
2628
2729class MainActivity : ReactActivity () {
@@ -34,7 +36,8 @@ class MainActivity : ReactActivity() {
3436 HandlerCompat .createAsync(Looper .getMainLooper())
3537 }
3638
37- private var didInitialNavigation = false
39+ private lateinit var componentListAdapter: ComponentListAdapter
40+ private var isTopResumedActivity = false
3841
3942 private val newComponentViewModel = { component: Component ->
4043 ComponentViewModel (
@@ -49,21 +52,7 @@ class MainActivity : ReactActivity() {
4952 Session (applicationContext)
5053 }
5154
52- private val startComponent: (ComponentViewModel ) -> Unit = { component ->
53- didInitialNavigation = true
54- when (component.presentationStyle) {
55- " modal" -> {
56- ComponentBottomSheetDialogFragment
57- .newInstance(component)
58- .show(supportFragmentManager, ComponentBottomSheetDialogFragment .TAG )
59- }
60- else -> {
61- findActivityClass(component.name)?.let {
62- startActivity(Intent (this , it))
63- } ? : startActivity(ComponentActivity .newIntent(this , component))
64- }
65- }
66- }
55+ private var useAppRegistry: Boolean = false
6756
6857 private fun findActivityClass (name : String ): Class <* >? {
6958 return try {
@@ -87,16 +76,29 @@ class MainActivity : ReactActivity() {
8776 BuildConfig .ReactTestApp_singleApp == = null -> {
8877 setContentView(R .layout.activity_main)
8978
90- didInitialNavigation =
91- savedInstanceState?.getBoolean(" didInitialNavigation" , false ) == true
92-
93- if (components.isNotEmpty()) {
79+ useAppRegistry = components.isEmpty()
80+ if (useAppRegistry) {
81+ testApp.reactNativeHost.addReactInstanceEventListener {
82+ it.runOnJSQueueThread {
83+ val appKeys = AppRegistry .getAppKeys(it as ReactApplicationContext )
84+ val viewModels = appKeys.map { appKey ->
85+ ComponentViewModel (appKey, appKey, null , null )
86+ }
87+ mainThreadHandler.post {
88+ componentListAdapter.setComponents(viewModels)
89+ if (isTopResumedActivity && viewModels.count() == 1 ) {
90+ startComponent(viewModels[0 ])
91+ }
92+ }
93+ }
94+ }
95+ } else {
9496 val index =
9597 if (components.count() == 1 ) 0 else session.lastOpenedComponent(checksum)
9698 index?.let {
9799 val component = newComponentViewModel(components[it])
98100 val startInitialComponent = { _: ReactContext ->
99- if (! didInitialNavigation ) {
101+ if (isTopResumedActivity ) {
100102 startComponent(component)
101103 }
102104 }
@@ -125,6 +127,11 @@ class MainActivity : ReactActivity() {
125127 }
126128 }
127129
130+ override fun onTopResumedActivityChanged (isTopResumedActivity : Boolean ) {
131+ super .onTopResumedActivityChanged(isTopResumedActivity)
132+ this .isTopResumedActivity = isTopResumedActivity
133+ }
134+
128135 override fun onRequestPermissionsResult (
129136 requestCode : Int ,
130137 permissions : Array <out String >,
@@ -139,26 +146,30 @@ class MainActivity : ReactActivity() {
139146 }
140147 }
141148
142- override fun onSaveInstanceState ( outState : Bundle ) {
143- outState.putBoolean( " didInitialNavigation " , didInitialNavigation )
144- super .onSaveInstanceState(outState )
149+ internal fun reloadJSFromServer ( bundleURL : String ) {
150+ componentListAdapter.clear( )
151+ testApp.reloadJSFromServer( this , bundleURL )
145152 }
146153
147154 private fun reload (bundleSource : BundleSource ) {
155+ if (useAppRegistry) {
156+ componentListAdapter.clear()
157+ }
148158 testApp.reactNativeHost.reload(this , bundleSource)
149159 }
150160
151161 private fun setupRecyclerView (manifestComponents : List <Component >, manifestChecksum : String ) {
152- val components = manifestComponents.map(newComponentViewModel)
162+ componentListAdapter = ComponentListAdapter (
163+ LayoutInflater .from(applicationContext),
164+ manifestComponents.map(newComponentViewModel)
165+ ) { component, index ->
166+ startComponent(component)
167+ session.storeComponent(index, manifestChecksum)
168+ }
169+
153170 findViewById<RecyclerView >(R .id.recyclerview).apply {
154171 layoutManager = LinearLayoutManager (context)
155- adapter = ComponentListAdapter (
156- LayoutInflater .from(context),
157- components
158- ) { component, index ->
159- startComponent(component)
160- session.storeComponent(index, manifestChecksum)
161- }
172+ adapter = componentListAdapter
162173
163174 addItemDecoration(DividerItemDecoration (context, DividerItemDecoration .VERTICAL ))
164175 }
@@ -214,6 +225,21 @@ class MainActivity : ReactActivity() {
214225 }
215226 }
216227
228+ private fun startComponent (component : ComponentViewModel ) {
229+ when (component.presentationStyle) {
230+ " modal" -> {
231+ ComponentBottomSheetDialogFragment
232+ .newInstance(component)
233+ .show(supportFragmentManager, ComponentBottomSheetDialogFragment .TAG )
234+ }
235+ else -> {
236+ findActivityClass(component.name)?.let {
237+ startActivity(Intent (this , it))
238+ } ? : startActivity(ComponentActivity .newIntent(this , component))
239+ }
240+ }
241+ }
242+
217243 private fun updateMenuItemState (toolbar : MaterialToolbar , bundleSource : BundleSource ) {
218244 toolbar.menu.apply {
219245 findItem(R .id.load_embedded_js_bundle).isEnabled =
0 commit comments