@react-native-ohos/react-native-safe-area-context 4.7.5-rc.1 → 4.7.5-rc.3

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.
@@ -8,7 +8,7 @@
8
8
  "name": "@react-native-ohos/react-native-safe-area-context",
9
9
  "description": "Please describe the basic information.",
10
10
  "main": "index.ets",
11
- "version": "4.7.5-rc.1",
11
+ "version": "4.7.5-rc.3",
12
12
  "dependencies": {
13
13
  "@rnoh/react-native-openharmony": "file:../react_native_openharmony"
14
14
  }
@@ -27,6 +27,7 @@
27
27
  SafeAreaManagerMap::SafeAreaManagerMap()
28
28
  {
29
29
  }
30
+
30
31
  SafeAreaManagerMap &SafeAreaManagerMap::getInstance()
31
32
  {
32
33
  static SafeAreaManagerMap instance;
@@ -41,6 +42,22 @@ void SafeAreaManagerMap::SetHasSafeAreaProviderByNodeHandle(ArkUI_NodeHandle nod
41
42
  hasSafeAreaProviderMap_[nodeHandle] = isHasSafeAreaProvider;
42
43
  }
43
44
 
45
+ void SafeAreaManagerMap::SetProviderTopByNodeHandle(ArkUI_NodeHandle nodeHandle, float y)
46
+ {
47
+ if (!nodeHandle) {
48
+ return;
49
+ }
50
+ providerTopMap_[nodeHandle] = y;
51
+ }
52
+
53
+ void SafeAreaManagerMap::SetProviderBottomByNodeHandle(ArkUI_NodeHandle nodeHandle, float height)
54
+ {
55
+ if (!nodeHandle) {
56
+ return;
57
+ }
58
+ providerBottomMap_[nodeHandle] = height;
59
+ }
60
+
44
61
  bool SafeAreaManagerMap::GetHasSafeAreaProviderByNodeHandle(ArkUI_NodeHandle nodeHandle)
45
62
  {
46
63
  if (!nodeHandle) {
@@ -48,11 +65,35 @@ bool SafeAreaManagerMap::GetHasSafeAreaProviderByNodeHandle(ArkUI_NodeHandle nod
48
65
  }
49
66
  auto it = hasSafeAreaProviderMap_.find(nodeHandle);
50
67
  if (it != hasSafeAreaProviderMap_.end()) {
51
- return hasSafeAreaProviderMap_.at(nodeHandle);
68
+ return hasSafeAreaProviderMap_.at(nodeHandle);
52
69
  }
53
70
  return false;
54
71
  }
55
72
 
73
+ float SafeAreaManagerMap::GetProviderTopByNodeHandle(ArkUI_NodeHandle nodeHandle)
74
+ {
75
+ if (!nodeHandle) {
76
+ return 0;
77
+ }
78
+ auto it = providerTopMap_.find(nodeHandle);
79
+ if (it != providerTopMap_.end()) {
80
+ return providerTopMap_.at(nodeHandle);
81
+ }
82
+ return 0;
83
+ }
84
+
85
+ float SafeAreaManagerMap::GetProviderBottomByNodeHandle(ArkUI_NodeHandle nodeHandle)
86
+ {
87
+ if (!nodeHandle) {
88
+ return 0;
89
+ }
90
+ auto it = providerBottomMap_.find(nodeHandle);
91
+ if (it != providerBottomMap_.end()) {
92
+ return providerBottomMap_.at(nodeHandle);
93
+ }
94
+ return 0;
95
+ }
96
+
56
97
  void SafeAreaManagerMap::RemoveSafeAreaProviderByNodeHandle(ArkUI_NodeHandle nodeHandle)
57
98
  {
58
99
  if (!nodeHandle) {
@@ -60,6 +101,16 @@ void SafeAreaManagerMap::RemoveSafeAreaProviderByNodeHandle(ArkUI_NodeHandle nod
60
101
  }
61
102
  auto it = hasSafeAreaProviderMap_.find(nodeHandle);
62
103
  if (it != hasSafeAreaProviderMap_.end()) {
63
- hasSafeAreaProviderMap_.erase(nodeHandle);
104
+ hasSafeAreaProviderMap_.erase(nodeHandle);
105
+ }
106
+
107
+ auto it2 = providerTopMap_.find(nodeHandle);
108
+ if (it2 != providerTopMap_.end()) {
109
+ providerTopMap_.erase(nodeHandle);
110
+ }
111
+
112
+ auto it3 = providerBottomMap_.find(nodeHandle);
113
+ if (it3 != providerBottomMap_.end()) {
114
+ providerBottomMap_.erase(nodeHandle);
64
115
  }
65
116
  }
@@ -21,22 +21,49 @@
21
21
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
22
  * SOFTWARE.
23
23
  */
24
+
24
25
  #ifndef HARMONY_SAFEAREAMANAGERMAP_H
25
26
  #define HARMONY_SAFEAREAMANAGERMAP_H
27
+
26
28
  #include <arkui/native_type.h>
27
29
  #include <unordered_map>
30
+
28
31
  class SafeAreaManagerMap {
32
+
29
33
  private:
34
+
30
35
  SafeAreaManagerMap();
36
+
31
37
  SafeAreaManagerMap(const SafeAreaManagerMap &) = delete;
38
+
32
39
  SafeAreaManagerMap &operator=(const SafeAreaManagerMap &) = delete;
40
+
33
41
  SafeAreaManagerMap(SafeAreaManagerMap &&) = delete;
42
+
34
43
  SafeAreaManagerMap &operator=(SafeAreaManagerMap &&) = delete;
44
+
35
45
  std::unordered_map<ArkUI_NodeHandle, bool> hasSafeAreaProviderMap_;
46
+
47
+ std::unordered_map<ArkUI_NodeHandle, float> providerTopMap_;
48
+
49
+ std::unordered_map<ArkUI_NodeHandle, float> providerBottomMap_;
50
+
36
51
  public:
37
52
  static SafeAreaManagerMap &getInstance();
53
+
38
54
  void SetHasSafeAreaProviderByNodeHandle(ArkUI_NodeHandle nodeHandle, bool isHasSafeAreaProvider);
55
+
56
+ void SetProviderTopByNodeHandle(ArkUI_NodeHandle nodeHandle, float y);
57
+
58
+ float GetProviderTopByNodeHandle(ArkUI_NodeHandle nodeHandle);
59
+
60
+ void SetProviderBottomByNodeHandle(ArkUI_NodeHandle nodeHandle, float height);
61
+
62
+ float GetProviderBottomByNodeHandle(ArkUI_NodeHandle nodeHandle);
63
+
39
64
  bool GetHasSafeAreaProviderByNodeHandle(ArkUI_NodeHandle nodeHandle);
65
+
40
66
  void RemoveSafeAreaProviderByNodeHandle(ArkUI_NodeHandle nodeHandle);
41
67
  };
68
+
42
69
  #endif //HARMONY_SAFEAREAMANAGERMAP_H
@@ -72,6 +72,8 @@ namespace rnoh {
72
72
  double providerRight = MAX(MIN(x + width - data.frame.width, 0) + data.insets.right, 0);
73
73
  double providerBottom = MAX(MIN(y + height - data.frame.height, 0) + data.insets.bottom, 0);
74
74
  double providerLeft = MAX(data.insets.left - x, 0);
75
+ SafeAreaManagerMap::getInstance().SetProviderTopByNodeHandle(m_stackNode.getArkUINodeHandle(), providerTop);
76
+ SafeAreaManagerMap::getInstance().SetProviderBottomByNodeHandle(m_stackNode.getArkUINodeHandle(), providerBottom);
75
77
  facebook::react::RNCSafeAreaProviderEventEmitter::OnInsetsChangeInsets insets = {providerTop, providerRight,
76
78
  providerBottom, providerLeft};
77
79
  facebook::react::RNCSafeAreaProviderEventEmitter::OnInsetsChangeFrame frame = {x, y, width, height};
@@ -21,6 +21,7 @@
21
21
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
22
  * SOFTWARE.
23
23
  */
24
+ #include <dlfcn.h>
24
25
  #include "SafeAreaViewComponentInstance.h"
25
26
  #include "TurboModuleRequest.h"
26
27
  #include "SafeAreaManagerMap.h"
@@ -50,17 +51,40 @@ SafeAreaStackNode &SafeAreaViewComponentInstance::getLocalRootArkUINode() { retu
50
51
 
51
52
  void SafeAreaViewComponentInstance::updateInsert(SharedConcreteProps p)
52
53
  {
54
+ high_lib_handle = dlopen("libace_ndk.z.so", RTLD_LAZY);
55
+ if (high_lib_handle == NULL) {
56
+ DLOG(INFO) << "SafeAreaViewComponentInstance libace_ndk.z.so not existed";
57
+ TurboModuleRequest request;
58
+ safeArea::Event data = request.getTurboModuleData(this->m_deps);
59
+ facebook::react::RNCSafeAreaViewEventEmitter::OnSafeAreaValueChange inset = {data.insets.top, data.insets.right,
60
+ data.insets.bottom, data.insets.left};
61
+ m_eventEmitter->onSafeAreaValueChange(inset);
62
+ dlclose(high_lib_handle);
63
+ return;
64
+ }
65
+
66
+ getParentInPageTreeMethod = (ArkUI_NodeHandle(*)(ArkUI_NodeHandle))dlsym(high_lib_handle, "OH_ArkUI_NodeUtils_GetParentInPageTree");
67
+ bool isExisted = getParentInPageTreeMethod != NULL;
68
+ if (!isExisted) {
69
+ DLOG(INFO) << "SafeAreaViewComponentInstance OH_ArkUI_NodeUtils_GetParentInPageTree not existed";
70
+ TurboModuleRequest request;
71
+ safeArea::Event data = request.getTurboModuleData(this->m_deps);
72
+ facebook::react::RNCSafeAreaViewEventEmitter::OnSafeAreaValueChange inset = {data.insets.top, data.insets.right,
73
+ data.insets.bottom, data.insets.left};
74
+ m_eventEmitter->onSafeAreaValueChange(inset);
75
+ dlclose(high_lib_handle);
76
+ return;
77
+ }
53
78
  auto parentNodeHandle = findParentNodeHandle(m_safeAreaViewStackNode.getArkUINodeHandle());
54
- DLOG(INFO) << "SafeAreaViewComponentInstance findParentNodeHandle "
55
- << parentNodeHandle.nodeHandle << " hasSafeAreaProvider "
56
- << parentNodeHandle.hasSafeAreaProvider;
79
+ DLOG(INFO) << "SafeAreaViewComponentInstance findParentNodeHandle " << parentNodeHandle.nodeHandle << " hasSafeAreaProvider " << parentNodeHandle.hasSafeAreaProvider;
57
80
  if (parentNodeHandle.hasSafeAreaProvider) {
58
81
  TurboModuleRequest request;
59
82
  safeArea::Event data = request.getTurboModuleData(this->m_deps);
60
- facebook::react::RNCSafeAreaViewEventEmitter::OnSafeAreaValueChange inset = {data.insets.top, data.insets.right,
61
- data.insets.bottom, data.insets.left};
83
+ facebook::react::RNCSafeAreaViewEventEmitter::OnSafeAreaValueChange inset = {parentNodeHandle.providerTop, data.insets.right,
84
+ parentNodeHandle.providerBottom, data.insets.left};
62
85
  m_eventEmitter->onSafeAreaValueChange(inset);
63
- } else {
86
+ }
87
+ else {
64
88
  facebook::react::RNCSafeAreaViewEventEmitter::OnSafeAreaValueChange inset = {0, 0, 0, 0};
65
89
  m_eventEmitter->onSafeAreaValueChange(inset);
66
90
  }
@@ -70,16 +94,20 @@ SafeAreaViewComponentInstance::ParentNodeInfo SafeAreaViewComponentInstance::fin
70
94
  ArkUI_NodeHandle nodehandle)
71
95
  {
72
96
  ParentNodeInfo parentNodeInfo;
73
- if (!nodehandle) {
97
+ if(!nodehandle) {
98
+ dlclose(high_lib_handle);
74
99
  return parentNodeInfo;
75
100
  }
76
- auto parentNode = OH_ArkUI_NodeUtils_GetParentInPageTree(nodehandle);
101
+ auto parentNode = getParentInPageTreeMethod(nodehandle);
77
102
  bool hasSafeAreaProvider = SafeAreaManagerMap::getInstance().GetHasSafeAreaProviderByNodeHandle(parentNode);
78
103
  parentNodeInfo.hasSafeAreaProvider = hasSafeAreaProvider;
79
104
  parentNodeInfo.nodeHandle = parentNode;
80
105
  if (!hasSafeAreaProvider && parentNode) {
81
106
  return findParentNodeHandle(parentNode);
82
107
  }
108
+ dlclose(high_lib_handle);
109
+ parentNodeInfo.providerTop = SafeAreaManagerMap::getInstance().GetProviderTopByNodeHandle(parentNode);
110
+ parentNodeInfo.providerBottom = SafeAreaManagerMap::getInstance().GetProviderBottomByNodeHandle(parentNode);
83
111
  return parentNodeInfo;
84
112
  }
85
113
 
@@ -38,11 +38,18 @@ namespace rnoh {
38
38
  struct ParentNodeInfo {
39
39
  ArkUI_NodeHandle nodeHandle = nullptr;
40
40
  bool hasSafeAreaProvider = false;
41
+ float providerTop = 0;
42
+ float providerBottom = 0;
43
+
41
44
  };
42
45
  private:
43
46
  SafeAreaStackNode m_safeAreaViewStackNode;
44
47
  bool m_isFirstShow = true;
45
48
  SharedConcreteProps m_SharedConcreteProps;
49
+ void *high_lib_handle = NULL;
50
+ ArkUI_NodeHandle (*getParentInPageTreeMethod)(ArkUI_NodeHandle node);
51
+ float providerTop = 0;
52
+ float providerBottom = 0;
46
53
  public:
47
54
  explicit SafeAreaViewComponentInstance(Context context);
48
55
  void onChildInserted(ComponentInstance::Shared const &childComponentInstance,
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-native-ohos/react-native-safe-area-context",
3
- "version": "4.7.5-rc.1",
3
+ "version": "4.7.5-rc.3",
4
4
  "description": "A flexible way to handle safe area, also works on Android and web.",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",