@react-native-ohos/react-native-safe-area-context 4.7.5-rc.2 → 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.2",
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,8 +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 <deviceinfo.h>
25
- #include <info/application_target_sdk_version.h>
24
+ #include <dlfcn.h>
26
25
  #include "SafeAreaViewComponentInstance.h"
27
26
  #include "TurboModuleRequest.h"
28
27
  #include "SafeAreaManagerMap.h"
@@ -52,54 +51,63 @@ SafeAreaStackNode &SafeAreaViewComponentInstance::getLocalRootArkUINode() { retu
52
51
 
53
52
  void SafeAreaViewComponentInstance::updateInsert(SharedConcreteProps p)
54
53
  {
55
- DLOG(INFO) << "SafeAreaViewComponentInstance OH_CURRENT_API_VERSION:" << OH_CURRENT_API_VERSION
56
- << ";ROM SDK:" << OH_GetSdkApiVersion();
57
-
58
- #if OH_CURRENT_API_VERSION >= 14
59
- if (OH_GetSdkApiVersion() < 14) {
60
- TurboModuleRequest request;
61
- safeArea::Event data = request.getTurboModuleData(this->m_deps);
62
- facebook::react::RNCSafeAreaViewEventEmitter::OnSafeAreaValueChange inset = {data.insets.top, data.insets.right,
63
- data.insets.bottom, data.insets.left};
64
- m_eventEmitter->onSafeAreaValueChange(inset);
65
- return;
66
- }
67
- auto parentNodeHandle = findParentNodeHandle(m_safeAreaViewStackNode.getArkUINodeHandle());
68
- DLOG(INFO) << "SafeAreaViewComponentInstance findParentNodeHandle " << parentNodeHandle.nodeHandle << " hasSafeAreaProvider " << parentNodeHandle.hasSafeAreaProvider;
69
- if (parentNodeHandle.hasSafeAreaProvider) {
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
- }
76
- else {
77
- facebook::react::RNCSafeAreaViewEventEmitter::OnSafeAreaValueChange inset = {0, 0, 0, 0};
78
- m_eventEmitter->onSafeAreaValueChange(inset);
79
- }
80
- #else
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";
81
57
  TurboModuleRequest request;
82
58
  safeArea::Event data = request.getTurboModuleData(this->m_deps);
83
59
  facebook::react::RNCSafeAreaViewEventEmitter::OnSafeAreaValueChange inset = {data.insets.top, data.insets.right,
84
60
  data.insets.bottom, data.insets.left};
85
61
  m_eventEmitter->onSafeAreaValueChange(inset);
86
- #endif
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
+ }
78
+ auto parentNodeHandle = findParentNodeHandle(m_safeAreaViewStackNode.getArkUINodeHandle());
79
+ DLOG(INFO) << "SafeAreaViewComponentInstance findParentNodeHandle " << parentNodeHandle.nodeHandle << " hasSafeAreaProvider " << parentNodeHandle.hasSafeAreaProvider;
80
+ if (parentNodeHandle.hasSafeAreaProvider) {
81
+ TurboModuleRequest request;
82
+ safeArea::Event data = request.getTurboModuleData(this->m_deps);
83
+ facebook::react::RNCSafeAreaViewEventEmitter::OnSafeAreaValueChange inset = {parentNodeHandle.providerTop, data.insets.right,
84
+ parentNodeHandle.providerBottom, data.insets.left};
85
+ m_eventEmitter->onSafeAreaValueChange(inset);
86
+ }
87
+ else {
88
+ facebook::react::RNCSafeAreaViewEventEmitter::OnSafeAreaValueChange inset = {0, 0, 0, 0};
89
+ m_eventEmitter->onSafeAreaValueChange(inset);
90
+ }
87
91
  }
88
92
 
89
93
  SafeAreaViewComponentInstance::ParentNodeInfo SafeAreaViewComponentInstance::findParentNodeHandle(
90
94
  ArkUI_NodeHandle nodehandle)
91
95
  {
92
96
  ParentNodeInfo parentNodeInfo;
93
- if (!nodehandle) {
97
+ if(!nodehandle) {
98
+ dlclose(high_lib_handle);
94
99
  return parentNodeInfo;
95
100
  }
96
- auto parentNode = OH_ArkUI_NodeUtils_GetParentInPageTree(nodehandle);
101
+ auto parentNode = getParentInPageTreeMethod(nodehandle);
97
102
  bool hasSafeAreaProvider = SafeAreaManagerMap::getInstance().GetHasSafeAreaProviderByNodeHandle(parentNode);
98
103
  parentNodeInfo.hasSafeAreaProvider = hasSafeAreaProvider;
99
104
  parentNodeInfo.nodeHandle = parentNode;
100
105
  if (!hasSafeAreaProvider && parentNode) {
101
106
  return findParentNodeHandle(parentNode);
102
107
  }
108
+ dlclose(high_lib_handle);
109
+ parentNodeInfo.providerTop = SafeAreaManagerMap::getInstance().GetProviderTopByNodeHandle(parentNode);
110
+ parentNodeInfo.providerBottom = SafeAreaManagerMap::getInstance().GetProviderBottomByNodeHandle(parentNode);
103
111
  return parentNodeInfo;
104
112
  }
105
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.2",
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",