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