Skip to content

Commit

Permalink
Add react-versioned files
Browse files Browse the repository at this point in the history
  • Loading branch information
kkafar committed Jan 8, 2024
1 parent c3abf7c commit 20a7ae6
Show file tree
Hide file tree
Showing 2 changed files with 199 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
import android.annotation.SuppressLint
import android.view.MotionEvent
import android.view.View
import com.facebook.react.bridge.ReactContext
import com.facebook.react.config.ReactFeatureFlags
import com.facebook.react.uimanager.JSPointerDispatcher
import com.facebook.react.uimanager.JSTouchDispatcher
import com.facebook.react.uimanager.RootView
import com.facebook.react.uimanager.events.EventDispatcher
import com.facebook.react.views.view.ReactViewGroup

@SuppressLint("ViewConstructor")
class RNSModalRootView(
val reactContext: ReactContext?,
private val eventDispatcher: EventDispatcher
) : ReactViewGroup(reactContext), RootView {
private val jsTouchDispatcher: JSTouchDispatcher = JSTouchDispatcher(this)
private var jsPointerDispatcher: JSPointerDispatcher? = null

init {
// Can we safely use ReactFeatureFlags?
if (ReactFeatureFlags.dispatchPointerEvents) {
jsPointerDispatcher = JSPointerDispatcher(this)
}
}

override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
if (changed) {
// This view is used right now only in ScreenModalFragment, where it is injected
// to view hierarchy as a parent of a Screen.
if (childCount > 1) {
val grabberWidthSpec = MeasureSpec.makeMeasureSpec(measuredWidth, MeasureSpec.EXACTLY)
val grabberHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)

val grabber = getChildAt(0)
grabber.measure(grabberWidthSpec, grabberHeightSpec)
grabber.layout(l, t, r, grabber.measuredHeight)
getChildAt(childCount - 1).layout(l, t + grabber.measuredHeight, r, b)
} else {
getChildAt(childCount - 1).layout(l, t, r, b)
}
}
}

override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
jsTouchDispatcher.handleTouchEvent(event, eventDispatcher)
jsPointerDispatcher?.handleMotionEvent(event, eventDispatcher, true)
return super.onInterceptTouchEvent(event)
}

override fun onTouchEvent(event: MotionEvent): Boolean {
jsTouchDispatcher.handleTouchEvent(event, eventDispatcher)
jsPointerDispatcher?.handleMotionEvent(event, eventDispatcher, false)
super.onTouchEvent(event)
return true
}

override fun onInterceptHoverEvent(event: MotionEvent): Boolean {
jsPointerDispatcher?.handleMotionEvent(event, eventDispatcher, true)
// This is how DialogRootViewGroup implements this, it might be a copy-paste mistake
// on their side.
return super.onHoverEvent(event)
}

override fun onHoverEvent(event: MotionEvent): Boolean {
jsPointerDispatcher?.handleMotionEvent(event, eventDispatcher, false)
return super.onHoverEvent(event)
}

override fun onChildStartedNativeGesture(view: View, event: MotionEvent) {
jsTouchDispatcher.onChildStartedNativeGesture(event, eventDispatcher)
jsPointerDispatcher?.onChildStartedNativeGesture(view, event, eventDispatcher)
}

@Deprecated("Deprecated by React Native")
override fun onChildStartedNativeGesture(event: MotionEvent) {
throw IllegalStateException("Deprecated onChildStartedNativeGesture was called")
}

override fun onChildEndedNativeGesture(view: View, event: MotionEvent) {
jsTouchDispatcher.onChildEndedNativeGesture(event, eventDispatcher)
jsPointerDispatcher?.onChildEndedNativeGesture()
}

override fun requestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
// We do not pass through request of our child up the view hierarchy, as we
// need to keep receiving events.
}

override fun handleException(throwable: Throwable?) {
// TODO: I need ThemedReactContext here.
// TODO: Determine where it is initially created & verify its lifecycle
// reactContext?.reactApplicationContext?.handleException(RuntimeException(throwable))
}

companion object {
val TAG = RNSModalRootView::class.simpleName
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
import android.annotation.SuppressLint
import android.view.MotionEvent
import android.view.View
import com.facebook.react.bridge.ReactContext
import com.facebook.react.config.ReactFeatureFlags
import com.facebook.react.uimanager.JSPointerDispatcher
import com.facebook.react.uimanager.JSTouchDispatcher
import com.facebook.react.uimanager.RootView
import com.facebook.react.uimanager.events.EventDispatcher
import com.facebook.react.views.view.ReactViewGroup

@SuppressLint("ViewConstructor")
class RNSModalRootView(
val reactContext: ReactContext?,
private val eventDispatcher: EventDispatcher
) : ReactViewGroup(reactContext), RootView {
private val jsTouchDispatcher: JSTouchDispatcher = JSTouchDispatcher(this)
private var jsPointerDispatcher: JSPointerDispatcher? = null

init {
// Can we safely use ReactFeatureFlags?
if (ReactFeatureFlags.dispatchPointerEvents) {
jsPointerDispatcher = JSPointerDispatcher(this)
}
}

override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
if (changed) {
// This view is used right now only in ScreenModalFragment, where it is injected
// to view hierarchy as a parent of a Screen.
if (childCount > 1) {
val grabberWidthSpec = MeasureSpec.makeMeasureSpec(measuredWidth, MeasureSpec.EXACTLY)
val grabberHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)

val grabber = getChildAt(0)
grabber.measure(grabberWidthSpec, grabberHeightSpec)
grabber.layout(l, t, r, grabber.measuredHeight)
getChildAt(childCount - 1).layout(l, t + grabber.measuredHeight, r, b)
} else {
getChildAt(childCount - 1).layout(l, t, r, b)
}
}
}

override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
jsTouchDispatcher.handleTouchEvent(event, eventDispatcher)
jsPointerDispatcher?.handleMotionEvent(event, eventDispatcher)
return super.onInterceptTouchEvent(event)
}

override fun onTouchEvent(event: MotionEvent): Boolean {
jsTouchDispatcher.handleTouchEvent(event, eventDispatcher)
jsPointerDispatcher?.handleMotionEvent(event, eventDispatcher)
super.onTouchEvent(event)
return true;
}

override fun onInterceptHoverEvent(event: MotionEvent): Boolean {
jsPointerDispatcher?.handleMotionEvent(event, eventDispatcher)
// This is how DialogRootViewGroup implements this, it might be a copy-paste mistake
// on their side.
return super.onHoverEvent(event)
}

override fun onHoverEvent(event: MotionEvent): Boolean {
jsPointerDispatcher?.handleMotionEvent(event, eventDispatcher)
return super.onHoverEvent(event)
}


override fun onChildStartedNativeGesture(view: View, event: MotionEvent) {
jsTouchDispatcher.onChildStartedNativeGesture(event, eventDispatcher)
jsPointerDispatcher?.onChildStartedNativeGesture(view, event, eventDispatcher)
}

@Deprecated("Deprecated by React Native")
override fun onChildStartedNativeGesture(event: MotionEvent) {
throw IllegalStateException("Deprecated onChildStartedNativeGesture was called")
}

override fun onChildEndedNativeGesture(view: View, event: MotionEvent) {
jsTouchDispatcher.onChildEndedNativeGesture(event, eventDispatcher)
jsPointerDispatcher?.onChildEndedNativeGesture()
}

override fun requestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
// We do not pass through request of our child up the view hierarchy, as we
// need to keep receiving events.
}

override fun handleException(throwable: Throwable?) {
// TODO: I need ThemedReactContext here.
// TODO: Determine where it is initially created & verify its lifecycle
// reactContext?.reactApplicationContext?.handleException(RuntimeException(throwable))
}

companion object {
val TAG = RNSModalRootView::class.simpleName
}
}

0 comments on commit 20a7ae6

Please sign in to comment.