1 package versioned.host.exp.exponent.modules.universal
2 
3 import host.exp.exponent.ActivityResultListener
4 import host.exp.expoview.Exponent
5 import android.content.Intent
6 import com.facebook.react.bridge.ReactContext
7 import expo.modules.adapters.react.services.UIManagerModuleWrapper
8 import expo.modules.core.interfaces.ActivityEventListener
9 import java.util.concurrent.CopyOnWriteArraySet
10 
11 class ScopedUIManagerModuleWrapper(reactContext: ReactContext) :
12   UIManagerModuleWrapper(reactContext), ActivityResultListener {
13   // We use `CopyOnWriteArraySet` to make this container thread-safe,
14   // cause `onActivityResult` can be trigger on a different thread during the listener unregistering.
15   private val activityEventListeners = CopyOnWriteArraySet<ActivityEventListener>()
16 
registerActivityEventListenernull17   override fun registerActivityEventListener(activityEventListener: ActivityEventListener) {
18     if (activityEventListeners.isEmpty()) {
19       Exponent.instance.addActivityResultListener(this)
20     }
21     activityEventListeners.add(activityEventListener)
22   }
23 
unregisterActivityEventListenernull24   override fun unregisterActivityEventListener(activityEventListener: ActivityEventListener) {
25     activityEventListeners.remove(activityEventListener)
26     if (activityEventListeners.isEmpty()) {
27       Exponent.instance.removeActivityResultListener(this)
28     }
29   }
30 
onActivityResultnull31   override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
32     for (listener in activityEventListeners) {
33       listener.onActivityResult(Exponent.instance.currentActivity, requestCode, resultCode, data)
34     }
35   }
36 }
37