@amazon-devices/react-native-safe-area-context 2.0.1759135970 → 8.0.9000000000-rn-83
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -302
- package/SystemBundles/920f0b3a0c43cc93db1621b4c3a47e06a0d4ed32175c793e9934ad9c764fbc25.bundle +7374 -0
- package/SystemBundles/920f0b3a0c43cc93db1621b4c3a47e06a0d4ed32175c793e9934ad9c764fbc25.map +2780 -0
- package/SystemModules/amzn__react-native-safe-area-context-8.modules.txt +7 -0
- package/SystemModules/amzn__react-native-safe-area-context-8.private.modules.txt +61 -0
- package/SystemModules/keplerscript-system-bundle-config.json +3 -3
- package/android/build.gradle +103 -25
- package/android/gradle.properties +1 -0
- package/android/spotless.gradle +24 -0
- package/android/src/fabric/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.kt +25 -0
- package/android/src/fabric/java/com/th3rdwave/safeareacontext/UIManagerHelperCompat.kt +14 -0
- package/android/src/main/AndroidManifest.xml +1 -2
- package/android/src/main/java/com/th3rdwave/safeareacontext/EdgeInsets.kt +3 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/Rect.kt +3 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaContextModule.kt +32 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaContextPackage.kt +41 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProvider.kt +47 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProviderManager.kt +41 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaUtils.kt +102 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaView.kt +155 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewEdges.kt +16 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewLocalData.kt +7 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewManager.kt +73 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewMode.kt +6 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewShadowNode.kt +170 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SerializationUtils.kt +39 -0
- package/android/src/main/jni/CMakeLists.txt +87 -0
- package/android/src/main/jni/safeareacontext.h +17 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNCSafeAreaProviderManagerDelegate.java +31 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNCSafeAreaProviderManagerInterface.java +16 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNCSafeAreaViewManagerDelegate.java +41 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNCSafeAreaViewManagerInterface.java +20 -0
- package/android/src/paper/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.kt +29 -0
- package/android/src/paper/java/com/th3rdwave/safeareacontext/NativeSafeAreaContextSpec.java +56 -0
- package/android/src/paper/java/com/th3rdwave/safeareacontext/UIManagerHelperCompat.kt +20 -0
- package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewComponentDescriptor.h +25 -0
- package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewShadowNode.cpp +131 -0
- package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewShadowNode.h +36 -0
- package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewState.cpp +23 -0
- package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewState.h +56 -0
- package/ios/Fabric/RNCSafeAreaProviderComponentView.h +13 -0
- package/ios/Fabric/RNCSafeAreaProviderComponentView.mm +129 -0
- package/ios/Fabric/RNCSafeAreaViewComponentView.h +11 -0
- package/ios/Fabric/RNCSafeAreaViewComponentView.mm +153 -0
- package/ios/RNCSafeAreaContext.h +9 -0
- package/ios/RNCSafeAreaContext.mm +85 -0
- package/ios/{SafeAreaView/RNCSafeAreaProvider.h → RNCSafeAreaProvider.h} +4 -0
- package/ios/RNCSafeAreaProvider.m +102 -0
- package/ios/RNCSafeAreaProviderManager.m +20 -0
- package/ios/{SafeAreaView/RNCSafeAreaShadowView.m → RNCSafeAreaShadowView.m} +50 -36
- package/ios/RNCSafeAreaUtils.h +22 -0
- package/ios/RNCSafeAreaUtils.m +41 -0
- package/ios/{SafeAreaView/RNCSafeAreaView.h → RNCSafeAreaView.h} +8 -4
- package/ios/RNCSafeAreaView.m +168 -0
- package/ios/RNCSafeAreaViewEdgeMode.h +12 -0
- package/ios/RNCSafeAreaViewEdgeMode.m +16 -0
- package/ios/RNCSafeAreaViewEdges.h +15 -0
- package/ios/RNCSafeAreaViewEdges.m +36 -0
- package/ios/{SafeAreaView/RNCSafeAreaViewLocalData.h → RNCSafeAreaViewLocalData.h} +12 -1
- package/ios/{SafeAreaView/RNCSafeAreaViewLocalData.m → RNCSafeAreaViewLocalData.m} +4 -0
- package/ios/{SafeAreaView/RNCSafeAreaViewManager.m → RNCSafeAreaViewManager.m} +5 -1
- package/ios/RNCSafeAreaViewMode.m +15 -0
- package/ios/{SafeAreaView.xcodeproj → RNSafeAreaContext.xcodeproj}/project.pbxproj +70 -56
- package/jest/mock.tsx +59 -0
- package/kepler-compatibility.json +2 -2
- package/lib/commonjs/CompatNativeSafeAreaProvider.js +7 -8
- package/lib/commonjs/CompatNativeSafeAreaProvider.js.map +1 -1
- package/lib/commonjs/InitialWindow.js.map +1 -1
- package/lib/commonjs/InitialWindow.kepler.js +1 -1
- package/lib/commonjs/InitialWindow.kepler.js.map +1 -1
- package/lib/commonjs/InitialWindow.native.js +4 -4
- package/lib/commonjs/InitialWindow.native.js.map +1 -1
- package/lib/commonjs/NativeSafeAreaProvider.js +7 -125
- package/lib/commonjs/NativeSafeAreaProvider.js.map +1 -1
- package/lib/commonjs/NativeSafeAreaProvider.kepler.js +6 -2
- package/lib/commonjs/NativeSafeAreaProvider.kepler.js.map +1 -1
- package/lib/commonjs/NativeSafeAreaProvider.web.js +135 -0
- package/lib/commonjs/NativeSafeAreaProvider.web.js.map +1 -0
- package/lib/commonjs/NativeSafeAreaProvider.windows.js +6 -2
- package/lib/commonjs/NativeSafeAreaProvider.windows.js.map +1 -1
- package/lib/commonjs/SafeArea.types.js.map +1 -1
- package/lib/commonjs/SafeAreaContext.js +56 -36
- package/lib/commonjs/SafeAreaContext.js.map +1 -1
- package/lib/commonjs/SafeAreaView.js +40 -73
- package/lib/commonjs/SafeAreaView.js.map +1 -1
- package/lib/commonjs/SafeAreaView.kepler.js.map +1 -1
- package/lib/commonjs/SafeAreaView.web.js +91 -0
- package/lib/commonjs/SafeAreaView.web.js.map +1 -0
- package/lib/commonjs/SafeAreaView.windows.js.map +1 -1
- package/lib/commonjs/index.js +1 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/specs/NativeSafeAreaContext.js +9 -0
- package/lib/commonjs/specs/NativeSafeAreaContext.js.map +1 -0
- package/lib/commonjs/specs/NativeSafeAreaProvider.js +10 -0
- package/lib/commonjs/specs/NativeSafeAreaProvider.js.map +1 -0
- package/lib/commonjs/specs/NativeSafeAreaView.js +12 -0
- package/lib/commonjs/specs/NativeSafeAreaView.js.map +1 -0
- package/lib/module/CompatNativeSafeAreaProvider.js +8 -5
- package/lib/module/CompatNativeSafeAreaProvider.js.map +1 -1
- package/lib/module/InitialWindow.js +2 -0
- package/lib/module/InitialWindow.js.map +1 -1
- package/lib/module/InitialWindow.kepler.js +3 -1
- package/lib/module/InitialWindow.kepler.js.map +1 -1
- package/lib/module/InitialWindow.native.js +5 -4
- package/lib/module/InitialWindow.native.js.map +1 -1
- package/lib/module/NativeSafeAreaProvider.js +3 -122
- package/lib/module/NativeSafeAreaProvider.js.map +1 -1
- package/lib/module/NativeSafeAreaProvider.kepler.js +3 -2
- package/lib/module/NativeSafeAreaProvider.kepler.js.map +1 -1
- package/lib/module/NativeSafeAreaProvider.web.js +130 -0
- package/lib/module/NativeSafeAreaProvider.web.js.map +1 -0
- package/lib/module/NativeSafeAreaProvider.windows.js +3 -2
- package/lib/module/NativeSafeAreaProvider.windows.js.map +1 -1
- package/lib/module/SafeArea.types.js +2 -0
- package/lib/module/SafeArea.types.js.map +1 -1
- package/lib/module/SafeAreaContext.js +57 -33
- package/lib/module/SafeAreaContext.js.map +1 -1
- package/lib/module/SafeAreaView.js +38 -69
- package/lib/module/SafeAreaView.js.map +1 -1
- package/lib/module/SafeAreaView.kepler.js +2 -0
- package/lib/module/SafeAreaView.kepler.js.map +1 -1
- package/lib/module/SafeAreaView.web.js +86 -0
- package/lib/module/SafeAreaView.web.js.map +1 -0
- package/lib/module/SafeAreaView.windows.js +2 -0
- package/lib/module/SafeAreaView.windows.js.map +1 -1
- package/lib/module/index.js +3 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/specs/NativeSafeAreaContext.js +5 -0
- package/lib/module/specs/NativeSafeAreaContext.js.map +1 -0
- package/lib/module/specs/NativeSafeAreaProvider.js +5 -0
- package/lib/module/specs/NativeSafeAreaProvider.js.map +1 -0
- package/lib/module/specs/NativeSafeAreaView.js +7 -0
- package/lib/module/specs/NativeSafeAreaView.js.map +1 -0
- package/lib/typescript/CompatNativeSafeAreaProvider.d.ts +4 -0
- package/lib/typescript/CompatNativeSafeAreaProvider.d.ts.map +1 -0
- package/lib/typescript/{src/InitialWindow.d.ts → InitialWindow.d.ts} +2 -1
- package/lib/typescript/InitialWindow.d.ts.map +1 -0
- package/lib/typescript/{src/InitialWindow.kepler.d.ts → InitialWindow.kepler.d.ts} +1 -0
- package/lib/typescript/InitialWindow.kepler.d.ts.map +1 -0
- package/lib/typescript/{src/InitialWindow.native.d.ts → InitialWindow.native.d.ts} +2 -1
- package/lib/typescript/InitialWindow.native.d.ts.map +1 -0
- package/lib/typescript/NativeSafeAreaProvider.d.ts +3 -0
- package/lib/typescript/NativeSafeAreaProvider.d.ts.map +1 -0
- package/lib/typescript/NativeSafeAreaProvider.kepler.d.ts +2 -0
- package/lib/typescript/NativeSafeAreaProvider.kepler.d.ts.map +1 -0
- package/lib/typescript/NativeSafeAreaProvider.web.d.ts +4 -0
- package/lib/typescript/NativeSafeAreaProvider.web.d.ts.map +1 -0
- package/lib/typescript/NativeSafeAreaProvider.windows.d.ts +2 -0
- package/lib/typescript/NativeSafeAreaProvider.windows.d.ts.map +1 -0
- package/lib/typescript/SafeArea.types.d.ts +36 -0
- package/lib/typescript/SafeArea.types.d.ts.map +1 -0
- package/lib/typescript/{src/SafeAreaContext.d.ts → SafeAreaContext.d.ts} +9 -6
- package/lib/typescript/SafeAreaContext.d.ts.map +1 -0
- package/lib/typescript/SafeAreaView.d.ts +5 -0
- package/lib/typescript/SafeAreaView.d.ts.map +1 -0
- package/lib/typescript/{src/SafeAreaView.kepler.d.ts → SafeAreaView.kepler.d.ts} +1 -0
- package/lib/typescript/SafeAreaView.kepler.d.ts.map +1 -0
- package/lib/typescript/SafeAreaView.web.d.ts +4 -0
- package/lib/typescript/SafeAreaView.web.d.ts.map +1 -0
- package/lib/typescript/SafeAreaView.windows.d.ts +3 -0
- package/lib/typescript/SafeAreaView.windows.d.ts.map +1 -0
- package/lib/typescript/{src/index.d.ts → index.d.ts} +1 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/specs/NativeSafeAreaContext.d.ts +23 -0
- package/lib/typescript/specs/NativeSafeAreaContext.d.ts.map +1 -0
- package/lib/typescript/specs/NativeSafeAreaProvider.d.ts +22 -0
- package/lib/typescript/specs/NativeSafeAreaProvider.d.ts.map +1 -0
- package/lib/typescript/specs/NativeSafeAreaView.d.ts +14 -0
- package/lib/typescript/specs/NativeSafeAreaView.d.ts.map +1 -0
- package/oss-attribution/attribution.txt +0 -0
- package/oss-attribution/licenseInfos.json +1 -0
- package/package.json +137 -1
- package/react-native-safe-area-context.podspec +26 -4
- package/react-native.config.js +8 -0
- package/src/CompatNativeSafeAreaProvider.tsx +2 -3
- package/src/InitialWindow.kepler.ts +1 -1
- package/src/InitialWindow.native.ts +5 -11
- package/src/InitialWindow.ts +1 -1
- package/src/NativeSafeAreaProvider.kepler.tsx +1 -3
- package/src/NativeSafeAreaProvider.tsx +2 -128
- package/src/NativeSafeAreaProvider.web.tsx +127 -0
- package/src/NativeSafeAreaProvider.windows.tsx +1 -3
- package/src/SafeArea.types.ts +15 -11
- package/src/SafeAreaContext.tsx +66 -43
- package/src/SafeAreaView.tsx +47 -82
- package/src/SafeAreaView.web.tsx +123 -0
- package/src/SafeAreaView.windows.tsx +2 -1
- package/src/index.tsx +2 -0
- package/src/specs/NativeSafeAreaContext.ts +23 -0
- package/src/specs/NativeSafeAreaProvider.ts +29 -0
- package/src/specs/NativeSafeAreaView.ts +17 -0
- package/SystemBundles/e3c0cdeab56b8b622d4f0fd5a80812eafe199fa2287d0e3a09c5e573a1035350.bundle +0 -11031
- package/SystemBundles/e3c0cdeab56b8b622d4f0fd5a80812eafe199fa2287d0e3a09c5e573a1035350.map +0 -1
- package/SystemModules/amzn__react-native-safe-area-context-2.modules.txt +0 -55
- package/SystemModules/amzn__react-native-safe-area-context-2.private.modules.txt +0 -91
- package/THIRD_PARTY_NOTICES.txt +0 -24
- package/android/src/main/java/com/th3rdwave/safeareacontext/EdgeInsets.java +0 -22
- package/android/src/main/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.java +0 -33
- package/android/src/main/java/com/th3rdwave/safeareacontext/Rect.java +0 -22
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaContextPackage.java +0 -31
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProvider.java +0 -66
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProviderManager.java +0 -94
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaUtils.java +0 -82
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaView.java +0 -159
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewEdges.java +0 -8
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewLocalData.java +0 -27
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewManager.java +0 -72
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewMode.java +0 -6
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewShadowNode.java +0 -201
- package/android/src/main/java/com/th3rdwave/safeareacontext/SerializationUtils.java +0 -52
- package/ios/SafeAreaView/RCTView+SafeAreaCompat.h +0 -16
- package/ios/SafeAreaView/RCTView+SafeAreaCompat.m +0 -57
- package/ios/SafeAreaView/RNCSafeAreaProvider.m +0 -65
- package/ios/SafeAreaView/RNCSafeAreaProviderManager.m +0 -61
- package/ios/SafeAreaView/RNCSafeAreaView.m +0 -118
- package/ios/SafeAreaView/RNCSafeAreaViewEdges.h +0 -9
- package/ios/SafeAreaView/RNCSafeAreaViewEdges.m +0 -13
- package/ios/SafeAreaView/RNCSafeAreaViewMode.m +0 -11
- package/lib/commonjs/NativeSafeAreaProvider.macos.js +0 -9
- package/lib/commonjs/NativeSafeAreaProvider.macos.js.map +0 -1
- package/lib/commonjs/NativeSafeAreaProvider.native.js +0 -9
- package/lib/commonjs/NativeSafeAreaProvider.native.js.map +0 -1
- package/lib/commonjs/SafeAreaView.macos.js +0 -9
- package/lib/commonjs/SafeAreaView.macos.js.map +0 -1
- package/lib/commonjs/SafeAreaView.native.js +0 -9
- package/lib/commonjs/SafeAreaView.native.js.map +0 -1
- package/lib/commonjs/useWindowDimensions.js +0 -32
- package/lib/commonjs/useWindowDimensions.js.map +0 -1
- package/lib/module/NativeSafeAreaProvider.macos.js +0 -3
- package/lib/module/NativeSafeAreaProvider.macos.js.map +0 -1
- package/lib/module/NativeSafeAreaProvider.native.js +0 -3
- package/lib/module/NativeSafeAreaProvider.native.js.map +0 -1
- package/lib/module/SafeAreaView.macos.js +0 -3
- package/lib/module/SafeAreaView.macos.js.map +0 -1
- package/lib/module/SafeAreaView.native.js +0 -3
- package/lib/module/SafeAreaView.native.js.map +0 -1
- package/lib/module/useWindowDimensions.js +0 -26
- package/lib/module/useWindowDimensions.js.map +0 -1
- package/lib/typescript/src/CompatNativeSafeAreaProvider.d.ts +0 -2
- package/lib/typescript/src/NativeSafeAreaProvider.d.ts +0 -2
- package/lib/typescript/src/NativeSafeAreaProvider.kepler.d.ts +0 -2
- package/lib/typescript/src/NativeSafeAreaProvider.macos.d.ts +0 -2
- package/lib/typescript/src/NativeSafeAreaProvider.native.d.ts +0 -3
- package/lib/typescript/src/NativeSafeAreaProvider.windows.d.ts +0 -2
- package/lib/typescript/src/SafeArea.types.d.ts +0 -31
- package/lib/typescript/src/SafeAreaView.d.ts +0 -2
- package/lib/typescript/src/SafeAreaView.macos.d.ts +0 -2
- package/lib/typescript/src/SafeAreaView.native.d.ts +0 -2
- package/lib/typescript/src/SafeAreaView.windows.d.ts +0 -2
- package/lib/typescript/src/useWindowDimensions.d.ts +0 -8
- package/src/NativeSafeAreaProvider.macos.tsx +0 -3
- package/src/NativeSafeAreaProvider.native.tsx +0 -6
- package/src/SafeAreaView.macos.tsx +0 -3
- package/src/SafeAreaView.native.tsx +0 -6
- package/src/useWindowDimensions.tsx +0 -35
- /package/ios/{SafeAreaView/RNCSafeAreaProviderManager.h → RNCSafeAreaProviderManager.h} +0 -0
- /package/ios/{SafeAreaView/RNCSafeAreaShadowView.h → RNCSafeAreaShadowView.h} +0 -0
- /package/ios/{SafeAreaView/RNCSafeAreaViewManager.h → RNCSafeAreaViewManager.h} +0 -0
- /package/ios/{SafeAreaView/RNCSafeAreaViewMode.h → RNCSafeAreaViewMode.h} +0 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
package com.th3rdwave.safeareacontext
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.util.Log
|
|
5
|
+
import android.view.View
|
|
6
|
+
import android.view.ViewTreeObserver
|
|
7
|
+
import com.facebook.react.bridge.Arguments
|
|
8
|
+
import com.facebook.react.uimanager.StateWrapper
|
|
9
|
+
import com.facebook.react.uimanager.UIManagerModule
|
|
10
|
+
import com.facebook.react.views.view.ReactViewGroup
|
|
11
|
+
import java.util.concurrent.locks.ReentrantLock
|
|
12
|
+
import kotlin.concurrent.withLock
|
|
13
|
+
|
|
14
|
+
private const val MAX_WAIT_TIME_NANO = 500000000L // 500ms
|
|
15
|
+
|
|
16
|
+
class SafeAreaView(context: Context?) :
|
|
17
|
+
ReactViewGroup(context), ViewTreeObserver.OnPreDrawListener {
|
|
18
|
+
private var mMode = SafeAreaViewMode.PADDING
|
|
19
|
+
private var mInsets: EdgeInsets? = null
|
|
20
|
+
private var mEdges: SafeAreaViewEdges? = null
|
|
21
|
+
private var mProviderView: View? = null
|
|
22
|
+
private var mStateWrapper: StateWrapper? = null
|
|
23
|
+
|
|
24
|
+
fun getStateWrapper(): StateWrapper? {
|
|
25
|
+
return mStateWrapper
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
fun setStateWrapper(stateWrapper: StateWrapper?) {
|
|
29
|
+
mStateWrapper = stateWrapper
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
private fun updateInsets() {
|
|
33
|
+
val insets = mInsets
|
|
34
|
+
if (insets != null) {
|
|
35
|
+
val edges =
|
|
36
|
+
mEdges
|
|
37
|
+
?: SafeAreaViewEdges(
|
|
38
|
+
SafeAreaViewEdgeModes.ADDITIVE,
|
|
39
|
+
SafeAreaViewEdgeModes.ADDITIVE,
|
|
40
|
+
SafeAreaViewEdgeModes.ADDITIVE,
|
|
41
|
+
SafeAreaViewEdgeModes.ADDITIVE)
|
|
42
|
+
val stateWrapper = getStateWrapper()
|
|
43
|
+
if (stateWrapper != null) {
|
|
44
|
+
val map = Arguments.createMap()
|
|
45
|
+
map.putMap("insets", edgeInsetsToJsMap(insets))
|
|
46
|
+
stateWrapper.updateState(map)
|
|
47
|
+
} else {
|
|
48
|
+
val localData = SafeAreaViewLocalData(insets = insets, mode = mMode, edges = edges)
|
|
49
|
+
val reactContext = getReactContext(this)
|
|
50
|
+
val uiManager = reactContext.getNativeModule(UIManagerModule::class.java)
|
|
51
|
+
if (uiManager != null) {
|
|
52
|
+
uiManager.setViewLocalData(id, localData)
|
|
53
|
+
// Sadly there doesn't seem to be a way to properly dirty a yoga node from java, so if we
|
|
54
|
+
// are in
|
|
55
|
+
// the middle of a layout, we need to recompute it. There is also no way to know whether
|
|
56
|
+
// we
|
|
57
|
+
// are in the middle of a layout so always do it.
|
|
58
|
+
reactContext.runOnNativeModulesQueueThread {
|
|
59
|
+
uiManager.uiImplementation.dispatchViewUpdates(-1)
|
|
60
|
+
}
|
|
61
|
+
waitForReactLayout()
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
private fun waitForReactLayout() {
|
|
68
|
+
// Block the main thread until the native module thread is finished with
|
|
69
|
+
// its current tasks. To do this we use the done boolean as a lock and enqueue
|
|
70
|
+
// a task on the native modules thread. When the task runs we can unblock the
|
|
71
|
+
// main thread. This should be safe as long as the native modules thread
|
|
72
|
+
// does not block waiting on the main thread.
|
|
73
|
+
var done = false
|
|
74
|
+
val lock = ReentrantLock()
|
|
75
|
+
val condition = lock.newCondition()
|
|
76
|
+
val startTime = System.nanoTime()
|
|
77
|
+
var waitTime = 0L
|
|
78
|
+
getReactContext(this).runOnNativeModulesQueueThread {
|
|
79
|
+
lock.withLock {
|
|
80
|
+
if (!done) {
|
|
81
|
+
done = true
|
|
82
|
+
condition.signal()
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
lock.withLock {
|
|
87
|
+
while (!done && waitTime < MAX_WAIT_TIME_NANO) {
|
|
88
|
+
try {
|
|
89
|
+
condition.awaitNanos(MAX_WAIT_TIME_NANO)
|
|
90
|
+
} catch (ex: InterruptedException) {
|
|
91
|
+
// In case of an interrupt just give up waiting.
|
|
92
|
+
done = true
|
|
93
|
+
}
|
|
94
|
+
waitTime += System.nanoTime() - startTime
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Timed out waiting.
|
|
98
|
+
if (waitTime >= MAX_WAIT_TIME_NANO) {
|
|
99
|
+
Log.w("SafeAreaView", "Timed out waiting for layout.")
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
fun setMode(mode: SafeAreaViewMode) {
|
|
104
|
+
mMode = mode
|
|
105
|
+
updateInsets()
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
fun setEdges(edges: SafeAreaViewEdges) {
|
|
109
|
+
mEdges = edges
|
|
110
|
+
updateInsets()
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
private fun maybeUpdateInsets(): Boolean {
|
|
114
|
+
val providerView = mProviderView ?: return false
|
|
115
|
+
val edgeInsets = getSafeAreaInsets(providerView) ?: return false
|
|
116
|
+
if (mInsets != edgeInsets) {
|
|
117
|
+
mInsets = edgeInsets
|
|
118
|
+
updateInsets()
|
|
119
|
+
return true
|
|
120
|
+
}
|
|
121
|
+
return false
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
private fun findProvider(): View {
|
|
125
|
+
var current = parent
|
|
126
|
+
while (current != null) {
|
|
127
|
+
if (current is SafeAreaProvider) {
|
|
128
|
+
return current
|
|
129
|
+
}
|
|
130
|
+
current = current.parent
|
|
131
|
+
}
|
|
132
|
+
return this
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
override fun onAttachedToWindow() {
|
|
136
|
+
super.onAttachedToWindow()
|
|
137
|
+
mProviderView = findProvider()
|
|
138
|
+
mProviderView?.viewTreeObserver?.addOnPreDrawListener(this)
|
|
139
|
+
maybeUpdateInsets()
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
override fun onDetachedFromWindow() {
|
|
143
|
+
super.onDetachedFromWindow()
|
|
144
|
+
mProviderView?.viewTreeObserver?.removeOnPreDrawListener(this)
|
|
145
|
+
mProviderView = null
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
override fun onPreDraw(): Boolean {
|
|
149
|
+
val didUpdate = maybeUpdateInsets()
|
|
150
|
+
if (didUpdate) {
|
|
151
|
+
requestLayout()
|
|
152
|
+
}
|
|
153
|
+
return !didUpdate
|
|
154
|
+
}
|
|
155
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
package com.th3rdwave.safeareacontext
|
|
2
|
+
|
|
3
|
+
enum class SafeAreaViewEdgeModes {
|
|
4
|
+
OFF,
|
|
5
|
+
ADDITIVE,
|
|
6
|
+
MAXIMUM
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
data class SafeAreaViewEdges(
|
|
10
|
+
val top: SafeAreaViewEdgeModes,
|
|
11
|
+
val right: SafeAreaViewEdgeModes,
|
|
12
|
+
val bottom: SafeAreaViewEdgeModes,
|
|
13
|
+
val left: SafeAreaViewEdgeModes
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
class Safe
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
package com.th3rdwave.safeareacontext
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableMap
|
|
4
|
+
import com.facebook.react.module.annotations.ReactModule
|
|
5
|
+
import com.facebook.react.uimanager.ReactStylesDiffMap
|
|
6
|
+
import com.facebook.react.uimanager.StateWrapper
|
|
7
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
8
|
+
import com.facebook.react.uimanager.ViewManagerDelegate
|
|
9
|
+
import com.facebook.react.uimanager.annotations.ReactProp
|
|
10
|
+
import com.facebook.react.viewmanagers.RNCSafeAreaViewManagerInterface
|
|
11
|
+
import com.facebook.react.views.view.ReactViewGroup
|
|
12
|
+
import com.facebook.react.views.view.ReactViewManager
|
|
13
|
+
|
|
14
|
+
@ReactModule(name = SafeAreaViewManager.REACT_CLASS)
|
|
15
|
+
class SafeAreaViewManager : ReactViewManager(), RNCSafeAreaViewManagerInterface<SafeAreaView> {
|
|
16
|
+
override fun getName() = REACT_CLASS
|
|
17
|
+
|
|
18
|
+
// Make sure we're not using delegates for now since ReactViewGroupManager doesn't use one. If it
|
|
19
|
+
// does in the future we will need a way to compose delegates together.
|
|
20
|
+
override fun getDelegate(): ViewManagerDelegate<ReactViewGroup>? = null
|
|
21
|
+
|
|
22
|
+
override fun createViewInstance(context: ThemedReactContext) = SafeAreaView(context)
|
|
23
|
+
|
|
24
|
+
override fun createShadowNodeInstance() = SafeAreaViewShadowNode()
|
|
25
|
+
|
|
26
|
+
override fun getShadowNodeClass() = SafeAreaViewShadowNode::class.java
|
|
27
|
+
|
|
28
|
+
@ReactProp(name = "mode")
|
|
29
|
+
override fun setMode(view: SafeAreaView, mode: String?) {
|
|
30
|
+
when (mode) {
|
|
31
|
+
"padding" -> {
|
|
32
|
+
view.setMode(SafeAreaViewMode.PADDING)
|
|
33
|
+
}
|
|
34
|
+
"margin" -> {
|
|
35
|
+
view.setMode(SafeAreaViewMode.MARGIN)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@ReactProp(name = "edges")
|
|
41
|
+
override fun setEdges(view: SafeAreaView, propList: ReadableMap?) {
|
|
42
|
+
if (propList != null) {
|
|
43
|
+
view.setEdges(
|
|
44
|
+
SafeAreaViewEdges(
|
|
45
|
+
top = propList.getString("top")?.let { SafeAreaViewEdgeModes.valueOf(it.uppercase()) }
|
|
46
|
+
?: SafeAreaViewEdgeModes.OFF,
|
|
47
|
+
right =
|
|
48
|
+
propList.getString("right")?.let { SafeAreaViewEdgeModes.valueOf(it.uppercase()) }
|
|
49
|
+
?: SafeAreaViewEdgeModes.OFF,
|
|
50
|
+
bottom =
|
|
51
|
+
propList.getString("bottom")?.let {
|
|
52
|
+
SafeAreaViewEdgeModes.valueOf(it.uppercase())
|
|
53
|
+
}
|
|
54
|
+
?: SafeAreaViewEdgeModes.OFF,
|
|
55
|
+
left =
|
|
56
|
+
propList.getString("left")?.let { SafeAreaViewEdgeModes.valueOf(it.uppercase()) }
|
|
57
|
+
?: SafeAreaViewEdgeModes.OFF))
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
override fun updateState(
|
|
62
|
+
view: ReactViewGroup,
|
|
63
|
+
props: ReactStylesDiffMap?,
|
|
64
|
+
stateWrapper: StateWrapper?
|
|
65
|
+
): Any? {
|
|
66
|
+
(view as SafeAreaView).setStateWrapper(stateWrapper)
|
|
67
|
+
return null
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
companion object {
|
|
71
|
+
const val REACT_CLASS = "RNCSafeAreaView"
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
package com.th3rdwave.safeareacontext
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.Dynamic
|
|
4
|
+
import com.facebook.react.bridge.ReadableType
|
|
5
|
+
import com.facebook.react.uimanager.*
|
|
6
|
+
import com.facebook.react.uimanager.annotations.ReactPropGroup
|
|
7
|
+
import kotlin.math.max
|
|
8
|
+
|
|
9
|
+
class SafeAreaViewShadowNode : LayoutShadowNode() {
|
|
10
|
+
private var mLocalData: SafeAreaViewLocalData? = null
|
|
11
|
+
private val mPaddings: FloatArray = FloatArray(ViewProps.PADDING_MARGIN_SPACING_TYPES.size)
|
|
12
|
+
private val mMargins: FloatArray = FloatArray(ViewProps.PADDING_MARGIN_SPACING_TYPES.size)
|
|
13
|
+
private var mNeedsUpdate = false
|
|
14
|
+
|
|
15
|
+
init {
|
|
16
|
+
for (i in ViewProps.PADDING_MARGIN_SPACING_TYPES.indices) {
|
|
17
|
+
mPaddings[i] = Float.NaN
|
|
18
|
+
mMargins[i] = Float.NaN
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
private fun updateInsets() {
|
|
23
|
+
val localData = mLocalData ?: return
|
|
24
|
+
var top = 0f
|
|
25
|
+
var right = 0f
|
|
26
|
+
var bottom = 0f
|
|
27
|
+
var left = 0f
|
|
28
|
+
val meta = if (localData.mode == SafeAreaViewMode.PADDING) mPaddings else mMargins
|
|
29
|
+
val allEdges = meta[Spacing.ALL]
|
|
30
|
+
if (!java.lang.Float.isNaN(allEdges)) {
|
|
31
|
+
top = allEdges
|
|
32
|
+
right = allEdges
|
|
33
|
+
bottom = allEdges
|
|
34
|
+
left = allEdges
|
|
35
|
+
}
|
|
36
|
+
val verticalEdges = meta[Spacing.VERTICAL]
|
|
37
|
+
if (!java.lang.Float.isNaN(verticalEdges)) {
|
|
38
|
+
top = verticalEdges
|
|
39
|
+
bottom = verticalEdges
|
|
40
|
+
}
|
|
41
|
+
val horizontalEdges = meta[Spacing.HORIZONTAL]
|
|
42
|
+
if (!java.lang.Float.isNaN(horizontalEdges)) {
|
|
43
|
+
right = horizontalEdges
|
|
44
|
+
left = horizontalEdges
|
|
45
|
+
}
|
|
46
|
+
val topEdge = meta[Spacing.TOP]
|
|
47
|
+
if (!java.lang.Float.isNaN(topEdge)) {
|
|
48
|
+
top = topEdge
|
|
49
|
+
}
|
|
50
|
+
val rightEdge = meta[Spacing.RIGHT]
|
|
51
|
+
if (!java.lang.Float.isNaN(rightEdge)) {
|
|
52
|
+
right = rightEdge
|
|
53
|
+
}
|
|
54
|
+
val bottomEdge = meta[Spacing.BOTTOM]
|
|
55
|
+
if (!java.lang.Float.isNaN(bottomEdge)) {
|
|
56
|
+
bottom = bottomEdge
|
|
57
|
+
}
|
|
58
|
+
val leftEdge = meta[Spacing.LEFT]
|
|
59
|
+
if (!java.lang.Float.isNaN(leftEdge)) {
|
|
60
|
+
left = leftEdge
|
|
61
|
+
}
|
|
62
|
+
top = PixelUtil.toPixelFromDIP(top)
|
|
63
|
+
right = PixelUtil.toPixelFromDIP(right)
|
|
64
|
+
bottom = PixelUtil.toPixelFromDIP(bottom)
|
|
65
|
+
left = PixelUtil.toPixelFromDIP(left)
|
|
66
|
+
val edges = localData.edges
|
|
67
|
+
val insets = localData.insets
|
|
68
|
+
if (localData.mode == SafeAreaViewMode.PADDING) {
|
|
69
|
+
super.setPadding(Spacing.TOP, getEdgeValue(edges.top, insets.top, top))
|
|
70
|
+
super.setPadding(Spacing.RIGHT, getEdgeValue(edges.right, insets.right, right))
|
|
71
|
+
super.setPadding(Spacing.BOTTOM, getEdgeValue(edges.bottom, insets.bottom, bottom))
|
|
72
|
+
super.setPadding(Spacing.LEFT, getEdgeValue(edges.left, insets.left, left))
|
|
73
|
+
} else {
|
|
74
|
+
super.setMargin(Spacing.TOP, getEdgeValue(edges.top, insets.top, top))
|
|
75
|
+
super.setMargin(Spacing.RIGHT, getEdgeValue(edges.right, insets.right, right))
|
|
76
|
+
super.setMargin(Spacing.BOTTOM, getEdgeValue(edges.bottom, insets.bottom, bottom))
|
|
77
|
+
super.setMargin(Spacing.LEFT, getEdgeValue(edges.left, insets.left, left))
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
private fun getEdgeValue(
|
|
82
|
+
edgeMode: SafeAreaViewEdgeModes,
|
|
83
|
+
insetValue: Float,
|
|
84
|
+
edgeValue: Float
|
|
85
|
+
): Float {
|
|
86
|
+
if (edgeMode == SafeAreaViewEdgeModes.OFF) {
|
|
87
|
+
return edgeValue
|
|
88
|
+
} else if (edgeMode == SafeAreaViewEdgeModes.MAXIMUM) {
|
|
89
|
+
return max(insetValue, edgeValue)
|
|
90
|
+
} else {
|
|
91
|
+
return insetValue + edgeValue
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private fun resetInsets(mode: SafeAreaViewMode) {
|
|
96
|
+
if (mode == SafeAreaViewMode.PADDING) {
|
|
97
|
+
super.setPadding(Spacing.TOP, mPaddings[Spacing.TOP])
|
|
98
|
+
super.setPadding(Spacing.RIGHT, mPaddings[Spacing.TOP])
|
|
99
|
+
super.setPadding(Spacing.BOTTOM, mPaddings[Spacing.BOTTOM])
|
|
100
|
+
super.setPadding(Spacing.LEFT, mPaddings[Spacing.LEFT])
|
|
101
|
+
} else {
|
|
102
|
+
super.setMargin(Spacing.TOP, mMargins[Spacing.TOP])
|
|
103
|
+
super.setMargin(Spacing.RIGHT, mMargins[Spacing.TOP])
|
|
104
|
+
super.setMargin(Spacing.BOTTOM, mMargins[Spacing.BOTTOM])
|
|
105
|
+
super.setMargin(Spacing.LEFT, mMargins[Spacing.LEFT])
|
|
106
|
+
}
|
|
107
|
+
markUpdated()
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
override fun onBeforeLayout(nativeViewHierarchyOptimizer: NativeViewHierarchyOptimizer) {
|
|
111
|
+
if (mNeedsUpdate) {
|
|
112
|
+
mNeedsUpdate = false
|
|
113
|
+
updateInsets()
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
override fun setLocalData(data: Any) {
|
|
118
|
+
if (data !is SafeAreaViewLocalData) {
|
|
119
|
+
return
|
|
120
|
+
}
|
|
121
|
+
val localData = mLocalData
|
|
122
|
+
if (localData != null && localData.mode != data.mode) {
|
|
123
|
+
resetInsets(localData.mode)
|
|
124
|
+
}
|
|
125
|
+
mLocalData = data
|
|
126
|
+
mNeedsUpdate = false
|
|
127
|
+
updateInsets()
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Names needs to reflect exact order in LayoutShadowNode.java
|
|
131
|
+
@ReactPropGroup(
|
|
132
|
+
names =
|
|
133
|
+
[
|
|
134
|
+
ViewProps.PADDING,
|
|
135
|
+
ViewProps.PADDING_VERTICAL,
|
|
136
|
+
ViewProps.PADDING_HORIZONTAL,
|
|
137
|
+
ViewProps.PADDING_START,
|
|
138
|
+
ViewProps.PADDING_END,
|
|
139
|
+
ViewProps.PADDING_TOP,
|
|
140
|
+
ViewProps.PADDING_BOTTOM,
|
|
141
|
+
ViewProps.PADDING_LEFT,
|
|
142
|
+
ViewProps.PADDING_RIGHT])
|
|
143
|
+
override fun setPaddings(index: Int, padding: Dynamic) {
|
|
144
|
+
val spacingType = ViewProps.PADDING_MARGIN_SPACING_TYPES[index]
|
|
145
|
+
mPaddings[spacingType] =
|
|
146
|
+
if (padding.type == ReadableType.Number) padding.asDouble().toFloat() else Float.NaN
|
|
147
|
+
super.setPaddings(index, padding)
|
|
148
|
+
mNeedsUpdate = true
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
@ReactPropGroup(
|
|
152
|
+
names =
|
|
153
|
+
[
|
|
154
|
+
ViewProps.MARGIN,
|
|
155
|
+
ViewProps.MARGIN_VERTICAL,
|
|
156
|
+
ViewProps.MARGIN_HORIZONTAL,
|
|
157
|
+
ViewProps.MARGIN_START,
|
|
158
|
+
ViewProps.MARGIN_END,
|
|
159
|
+
ViewProps.MARGIN_TOP,
|
|
160
|
+
ViewProps.MARGIN_BOTTOM,
|
|
161
|
+
ViewProps.MARGIN_LEFT,
|
|
162
|
+
ViewProps.MARGIN_RIGHT])
|
|
163
|
+
override fun setMargins(index: Int, margin: Dynamic) {
|
|
164
|
+
val spacingType = ViewProps.PADDING_MARGIN_SPACING_TYPES[index]
|
|
165
|
+
mMargins[spacingType] =
|
|
166
|
+
if (margin.type == ReadableType.Number) margin.asDouble().toFloat() else Float.NaN
|
|
167
|
+
super.setMargins(index, margin)
|
|
168
|
+
mNeedsUpdate = true
|
|
169
|
+
}
|
|
170
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
package com.th3rdwave.safeareacontext
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.Arguments
|
|
4
|
+
import com.facebook.react.bridge.WritableMap
|
|
5
|
+
import com.facebook.react.uimanager.PixelUtil
|
|
6
|
+
|
|
7
|
+
fun edgeInsetsToJsMap(insets: EdgeInsets): WritableMap {
|
|
8
|
+
val insetsMap = Arguments.createMap()
|
|
9
|
+
insetsMap.putDouble("top", PixelUtil.toDIPFromPixel(insets.top).toDouble())
|
|
10
|
+
insetsMap.putDouble("right", PixelUtil.toDIPFromPixel(insets.right).toDouble())
|
|
11
|
+
insetsMap.putDouble("bottom", PixelUtil.toDIPFromPixel(insets.bottom).toDouble())
|
|
12
|
+
insetsMap.putDouble("left", PixelUtil.toDIPFromPixel(insets.left).toDouble())
|
|
13
|
+
return insetsMap
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
fun edgeInsetsToJavaMap(insets: EdgeInsets): Map<String, Float> {
|
|
17
|
+
return mapOf(
|
|
18
|
+
"top" to PixelUtil.toDIPFromPixel(insets.top),
|
|
19
|
+
"right" to PixelUtil.toDIPFromPixel(insets.right),
|
|
20
|
+
"bottom" to PixelUtil.toDIPFromPixel(insets.bottom),
|
|
21
|
+
"left" to PixelUtil.toDIPFromPixel(insets.left))
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
fun rectToJsMap(rect: Rect): WritableMap {
|
|
25
|
+
val rectMap = Arguments.createMap()
|
|
26
|
+
rectMap.putDouble("x", PixelUtil.toDIPFromPixel(rect.x).toDouble())
|
|
27
|
+
rectMap.putDouble("y", PixelUtil.toDIPFromPixel(rect.y).toDouble())
|
|
28
|
+
rectMap.putDouble("width", PixelUtil.toDIPFromPixel(rect.width).toDouble())
|
|
29
|
+
rectMap.putDouble("height", PixelUtil.toDIPFromPixel(rect.height).toDouble())
|
|
30
|
+
return rectMap
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
fun rectToJavaMap(rect: Rect): Map<String, Float> {
|
|
34
|
+
return mapOf(
|
|
35
|
+
"x" to PixelUtil.toDIPFromPixel(rect.x),
|
|
36
|
+
"y" to PixelUtil.toDIPFromPixel(rect.y),
|
|
37
|
+
"width" to PixelUtil.toDIPFromPixel(rect.width),
|
|
38
|
+
"height" to PixelUtil.toDIPFromPixel(rect.height))
|
|
39
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
cmake_minimum_required(VERSION 3.13)
|
|
2
|
+
set(CMAKE_VERBOSE_MAKEFILE ON)
|
|
3
|
+
|
|
4
|
+
set(LIB_LITERAL safeareacontext)
|
|
5
|
+
set(LIB_TARGET_NAME react_codegen_${LIB_LITERAL})
|
|
6
|
+
|
|
7
|
+
set(LIB_ANDROID_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../..)
|
|
8
|
+
set(LIB_COMMON_DIR ${LIB_ANDROID_DIR}/../common/cpp)
|
|
9
|
+
set(LIB_ANDROID_GENERATED_JNI_DIR ${LIB_ANDROID_DIR}/build/generated/source/codegen/jni)
|
|
10
|
+
set(LIB_ANDROID_GENERATED_COMPONENTS_DIR ${LIB_ANDROID_GENERATED_JNI_DIR}/react/renderer/components/${LIB_LITERAL})
|
|
11
|
+
|
|
12
|
+
add_compile_options(
|
|
13
|
+
-fexceptions
|
|
14
|
+
-frtti
|
|
15
|
+
-std=c++20
|
|
16
|
+
-Wall
|
|
17
|
+
-Wpedantic
|
|
18
|
+
-Wno-gnu-zero-variadic-macro-arguments
|
|
19
|
+
-Wno-dollar-in-identifier-extension
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
file(GLOB LIB_CUSTOM_SRCS CONFIGURE_DEPENDS *.cpp ${LIB_COMMON_DIR}/react/renderer/components/${LIB_LITERAL}/*.cpp)
|
|
23
|
+
file(GLOB LIB_CODEGEN_SRCS CONFIGURE_DEPENDS ${LIB_ANDROID_GENERATED_JNI_DIR}/*.cpp ${LIB_ANDROID_GENERATED_COMPONENTS_DIR}/*.cpp)
|
|
24
|
+
|
|
25
|
+
add_library(
|
|
26
|
+
${LIB_TARGET_NAME}
|
|
27
|
+
SHARED
|
|
28
|
+
${LIB_CUSTOM_SRCS}
|
|
29
|
+
${LIB_CODEGEN_SRCS}
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
target_include_directories(
|
|
33
|
+
${LIB_TARGET_NAME}
|
|
34
|
+
PUBLIC
|
|
35
|
+
.
|
|
36
|
+
${LIB_COMMON_DIR}
|
|
37
|
+
${LIB_ANDROID_GENERATED_JNI_DIR}
|
|
38
|
+
${LIB_ANDROID_GENERATED_COMPONENTS_DIR}
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
# https://github.com/react-native-community/discussions-and-proposals/discussions/816
|
|
42
|
+
# This if-then-else can be removed once this library does not support version below 0.76
|
|
43
|
+
if (REACTNATIVE_MERGED_SO)
|
|
44
|
+
target_link_libraries(
|
|
45
|
+
${LIB_TARGET_NAME}
|
|
46
|
+
fbjni
|
|
47
|
+
jsi
|
|
48
|
+
reactnative
|
|
49
|
+
)
|
|
50
|
+
else()
|
|
51
|
+
target_link_libraries(
|
|
52
|
+
${LIB_TARGET_NAME}
|
|
53
|
+
fbjni
|
|
54
|
+
folly_runtime
|
|
55
|
+
glog
|
|
56
|
+
jsi
|
|
57
|
+
react_codegen_rncore
|
|
58
|
+
react_debug
|
|
59
|
+
react_nativemodule_core
|
|
60
|
+
react_render_core
|
|
61
|
+
react_render_debug
|
|
62
|
+
react_render_graphics
|
|
63
|
+
react_render_mapbuffer
|
|
64
|
+
react_render_componentregistry
|
|
65
|
+
react_utils
|
|
66
|
+
rrc_view
|
|
67
|
+
turbomodulejsijni
|
|
68
|
+
yoga
|
|
69
|
+
)
|
|
70
|
+
endif()
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
target_compile_options(
|
|
74
|
+
${LIB_TARGET_NAME}
|
|
75
|
+
PRIVATE
|
|
76
|
+
-DLOG_TAG=\"ReactNative\"
|
|
77
|
+
-fexceptions
|
|
78
|
+
-frtti
|
|
79
|
+
-std=c++20
|
|
80
|
+
-Wall
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
target_include_directories(
|
|
84
|
+
${CMAKE_PROJECT_NAME}
|
|
85
|
+
PUBLIC
|
|
86
|
+
${CMAKE_CURRENT_SOURCE_DIR}
|
|
87
|
+
)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <ReactCommon/JavaTurboModule.h>
|
|
4
|
+
#include <ReactCommon/TurboModule.h>
|
|
5
|
+
#include <jsi/jsi.h>
|
|
6
|
+
#include <react/renderer/components/safeareacontext/RNCSafeAreaViewComponentDescriptor.h>
|
|
7
|
+
|
|
8
|
+
namespace facebook {
|
|
9
|
+
namespace react {
|
|
10
|
+
|
|
11
|
+
JSI_EXPORT
|
|
12
|
+
std::shared_ptr<TurboModule> safeareacontext_ModuleProvider(
|
|
13
|
+
const std::string &moduleName,
|
|
14
|
+
const JavaTurboModule::InitParams ¶ms);
|
|
15
|
+
|
|
16
|
+
} // namespace react
|
|
17
|
+
} // namespace facebook
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code was generated by
|
|
3
|
+
* [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
4
|
+
*
|
|
5
|
+
* <p>Do not edit this file as changes may cause incorrect behavior and will be lost once the code
|
|
6
|
+
* is regenerated.
|
|
7
|
+
*
|
|
8
|
+
* @generated by codegen project: GeneratePropsJavaDelegate.js
|
|
9
|
+
*/
|
|
10
|
+
package com.facebook.react.viewmanagers;
|
|
11
|
+
|
|
12
|
+
import android.view.View;
|
|
13
|
+
import androidx.annotation.Nullable;
|
|
14
|
+
import com.facebook.react.uimanager.BaseViewManager;
|
|
15
|
+
import com.facebook.react.uimanager.BaseViewManagerDelegate;
|
|
16
|
+
import com.facebook.react.uimanager.LayoutShadowNode;
|
|
17
|
+
|
|
18
|
+
public class RNCSafeAreaProviderManagerDelegate<
|
|
19
|
+
T extends View,
|
|
20
|
+
U extends
|
|
21
|
+
BaseViewManager<T, ? extends LayoutShadowNode> & RNCSafeAreaProviderManagerInterface<T>>
|
|
22
|
+
extends BaseViewManagerDelegate<T, U> {
|
|
23
|
+
public RNCSafeAreaProviderManagerDelegate(U viewManager) {
|
|
24
|
+
super(viewManager);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@Override
|
|
28
|
+
public void setProperty(T view, String propName, @Nullable Object value) {
|
|
29
|
+
super.setProperty(view, propName, value);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code was generated by
|
|
3
|
+
* [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
4
|
+
*
|
|
5
|
+
* <p>Do not edit this file as changes may cause incorrect behavior and will be lost once the code
|
|
6
|
+
* is regenerated.
|
|
7
|
+
*
|
|
8
|
+
* @generated by codegen project: GeneratePropsJavaInterface.js
|
|
9
|
+
*/
|
|
10
|
+
package com.facebook.react.viewmanagers;
|
|
11
|
+
|
|
12
|
+
import android.view.View;
|
|
13
|
+
|
|
14
|
+
public interface RNCSafeAreaProviderManagerInterface<T extends View> {
|
|
15
|
+
// No props
|
|
16
|
+
}
|
package/android/src/paper/java/com/facebook/react/viewmanagers/RNCSafeAreaViewManagerDelegate.java
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code was generated by
|
|
3
|
+
* [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
4
|
+
*
|
|
5
|
+
* <p>Do not edit this file as changes may cause incorrect behavior and will be lost once the code
|
|
6
|
+
* is regenerated.
|
|
7
|
+
*
|
|
8
|
+
* @generated by codegen project: GeneratePropsJavaDelegate.js
|
|
9
|
+
*/
|
|
10
|
+
package com.facebook.react.viewmanagers;
|
|
11
|
+
|
|
12
|
+
import android.view.View;
|
|
13
|
+
import androidx.annotation.Nullable;
|
|
14
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
15
|
+
import com.facebook.react.uimanager.BaseViewManager;
|
|
16
|
+
import com.facebook.react.uimanager.BaseViewManagerDelegate;
|
|
17
|
+
import com.facebook.react.uimanager.LayoutShadowNode;
|
|
18
|
+
|
|
19
|
+
public class RNCSafeAreaViewManagerDelegate<
|
|
20
|
+
T extends View,
|
|
21
|
+
U extends
|
|
22
|
+
BaseViewManager<T, ? extends LayoutShadowNode> & RNCSafeAreaViewManagerInterface<T>>
|
|
23
|
+
extends BaseViewManagerDelegate<T, U> {
|
|
24
|
+
public RNCSafeAreaViewManagerDelegate(U viewManager) {
|
|
25
|
+
super(viewManager);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@Override
|
|
29
|
+
public void setProperty(T view, String propName, @Nullable Object value) {
|
|
30
|
+
switch (propName) {
|
|
31
|
+
case "mode":
|
|
32
|
+
mViewManager.setMode(view, (String) value);
|
|
33
|
+
break;
|
|
34
|
+
case "edges":
|
|
35
|
+
mViewManager.setEdges(view, (ReadableMap) value);
|
|
36
|
+
break;
|
|
37
|
+
default:
|
|
38
|
+
super.setProperty(view, propName, value);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
package/android/src/paper/java/com/facebook/react/viewmanagers/RNCSafeAreaViewManagerInterface.java
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code was generated by
|
|
3
|
+
* [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
4
|
+
*
|
|
5
|
+
* <p>Do not edit this file as changes may cause incorrect behavior and will be lost once the code
|
|
6
|
+
* is regenerated.
|
|
7
|
+
*
|
|
8
|
+
* @generated by codegen project: GeneratePropsJavaInterface.js
|
|
9
|
+
*/
|
|
10
|
+
package com.facebook.react.viewmanagers;
|
|
11
|
+
|
|
12
|
+
import android.view.View;
|
|
13
|
+
import androidx.annotation.Nullable;
|
|
14
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
15
|
+
|
|
16
|
+
public interface RNCSafeAreaViewManagerInterface<T extends View> {
|
|
17
|
+
void setMode(T view, @Nullable String value);
|
|
18
|
+
|
|
19
|
+
void setEdges(T view, @Nullable ReadableMap value);
|
|
20
|
+
}
|