@react-native-ohos/react-native-reanimated 3.18.2 → 3.18.3-beta.2
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/LICENSE +21 -21
- package/README.OpenSource +10 -10
- package/README.md +10 -10
- package/harmony/reanimated/BuildProfile.ets +1 -1
- package/harmony/reanimated/build-profile.json5 +11 -11
- package/harmony/reanimated/oh-package-lock.json5 +29 -0
- package/harmony/reanimated/oh-package.json5 +11 -11
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/AnimatedSensor/AnimatedSensorModule.cpp +86 -86
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/AnimatedSensor/AnimatedSensorModule.h +47 -47
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/Fabric/PropsRegistry.cpp +68 -68
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/Fabric/PropsRegistry.h +73 -68
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/Fabric/ReanimatedCommitHook.cpp +101 -101
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/Fabric/ReanimatedCommitHook.h +51 -51
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/Fabric/ReanimatedCommitShadowNode.h +49 -49
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/Fabric/ReanimatedMountHook.cpp +96 -96
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/Fabric/ReanimatedMountHook.h +33 -33
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/Fabric/ShadowTreeCloner.cpp +95 -95
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/Fabric/ShadowTreeCloner.h +29 -29
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationType.h +9 -9
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsManager.cpp +232 -232
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsManager.h +90 -90
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxy.cpp +870 -870
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxy.h +147 -147
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsUtils.cpp +91 -91
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsUtils.h +176 -176
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxy.cpp +971 -971
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxy.h +252 -254
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxySpec.cpp +231 -231
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxySpec.h +109 -109
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/RuntimeDecorators/RNRuntimeDecorator.cpp +56 -56
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/RuntimeDecorators/RNRuntimeDecorator.h +20 -20
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/RuntimeDecorators/UIRuntimeDecorator.cpp +70 -70
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/RuntimeDecorators/UIRuntimeDecorator.h +35 -35
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/Tools/CollectionUtils.h +14 -14
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/Tools/FeaturesConfig.cpp +5 -5
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/Tools/FeaturesConfig.h +19 -19
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/Tools/PlatformDepMethodsHolder.h +98 -98
- package/harmony/reanimated/src/main/cpp/Common/cpp/reanimated/Tools/ReanimatedSystraceSection.h +135 -135
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp +47 -47
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h +59 -59
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.cpp +27 -27
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.h +25 -25
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Registries/EventHandlerRegistry.cpp +94 -94
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Registries/EventHandlerRegistry.h +49 -49
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Registries/WorkletRuntimeRegistry.cpp +8 -8
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Registries/WorkletRuntimeRegistry.h +39 -39
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/SharedItems/Shareables.cpp +326 -326
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/SharedItems/Shareables.h +345 -345
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/AsyncQueue.cpp +52 -52
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/AsyncQueue.h +35 -35
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/Defs.h +10 -10
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/JSISerializer.cpp +342 -342
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/JSISerializer.h +47 -47
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/JSLogger.cpp +16 -16
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/JSLogger.h +20 -20
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/JSScheduler.cpp +20 -20
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/JSScheduler.h +29 -29
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/PlatformLogger.h +16 -16
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/ReanimatedJSIUtils.cpp +26 -26
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/ReanimatedJSIUtils.h +199 -199
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/ReanimatedVersion.cpp +95 -95
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/ReanimatedVersion.h +19 -19
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/SingleInstanceChecker.h +72 -72
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/ThreadSafeQueue.h +49 -49
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/UIScheduler.cpp +20 -20
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/UIScheduler.h +22 -22
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/WorkletEventHandler.cpp +29 -29
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/Tools/WorkletEventHandler.h +41 -41
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.cpp +16 -16
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.h +19 -19
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/WorkletRuntime/ReanimatedHermesRuntime.cpp +112 -112
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/WorkletRuntime/ReanimatedHermesRuntime.h +127 -127
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/WorkletRuntime/ReanimatedRuntime.cpp +53 -53
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/WorkletRuntime/ReanimatedRuntime.h +22 -22
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/WorkletRuntime/RuntimeInitialization.md +191 -191
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp +173 -173
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.h +90 -90
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeCollector.h +36 -36
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.cpp +189 -189
- package/harmony/reanimated/src/main/cpp/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.h +22 -22
- package/harmony/reanimated/src/main/cpp/ReanimatedModule.cpp +4 -6
- package/harmony/reanimated/src/main/cpp/WorkletsModule.cpp +60 -60
- package/harmony/reanimated/src/main/cpp/patches/AnimatedSensor/AnimatedSensorModule.cpp +89 -89
- package/harmony/reanimated/src/main/cpp/patches/NativeModules/ReanimatedModuleProxy.cpp +22 -4
- package/harmony/reanimated/src/main/ets/ReanimatedModule.ts +88 -13
- package/harmony/reanimated/src/main/module.json5 +12 -12
- package/harmony/reanimated/src/main/resources/base/element/color.json +7 -7
- package/harmony/reanimated/src/main/resources/base/element/string.json +15 -15
- package/harmony/reanimated/src/main/resources/base/profile/main_pages.json +5 -5
- package/harmony/reanimated/src/main/resources/en_US/element/string.json +15 -15
- package/harmony/reanimated/src/main/resources/zh_CN/element/string.json +15 -15
- package/harmony/reanimated/ts.ts +6 -6
- package/harmony/reanimated.har +0 -0
- package/package.json +51 -50
|
@@ -1,89 +1,89 @@
|
|
|
1
|
-
#include <reanimated/AnimatedSensor/AnimatedSensorModule.h>
|
|
2
|
-
|
|
3
|
-
#include <utility>
|
|
4
|
-
|
|
5
|
-
namespace reanimated {
|
|
6
|
-
|
|
7
|
-
AnimatedSensorModule::AnimatedSensorModule(
|
|
8
|
-
const PlatformDepMethodsHolder &platformDepMethodsHolder)
|
|
9
|
-
: platformRegisterSensorFunction_(platformDepMethodsHolder.registerSensor),
|
|
10
|
-
platformUnregisterSensorFunction_(
|
|
11
|
-
platformDepMethodsHolder.unregisterSensor) {}
|
|
12
|
-
|
|
13
|
-
AnimatedSensorModule::~AnimatedSensorModule() {
|
|
14
|
-
assert(sensorsIds_.empty());
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
jsi::Value AnimatedSensorModule::registerSensor(
|
|
18
|
-
jsi::Runtime &rt,
|
|
19
|
-
const std::shared_ptr<WorkletRuntime> &uiWorkletRuntime,
|
|
20
|
-
const jsi::Value &sensorTypeValue,
|
|
21
|
-
const jsi::Value &interval,
|
|
22
|
-
const jsi::Value &iosReferenceFrame,
|
|
23
|
-
const jsi::Value &sensorDataHandler) {
|
|
24
|
-
SensorType sensorType = static_cast<SensorType>(sensorTypeValue.asNumber());
|
|
25
|
-
|
|
26
|
-
auto shareableHandler = extractShareableOrThrow<ShareableWorklet>(
|
|
27
|
-
rt,
|
|
28
|
-
sensorDataHandler,
|
|
29
|
-
"[Reanimated] Sensor event handler must be a worklet.");
|
|
30
|
-
|
|
31
|
-
int sensorId = platformRegisterSensorFunction_(
|
|
32
|
-
sensorType,
|
|
33
|
-
interval.asNumber(),
|
|
34
|
-
iosReferenceFrame.asNumber(),
|
|
35
|
-
[sensorType,
|
|
36
|
-
shareableHandler,
|
|
37
|
-
weakUiWorkletRuntime = std::weak_ptr<WorkletRuntime>(uiWorkletRuntime)](
|
|
38
|
-
double newValues[], int orientationDegrees) {
|
|
39
|
-
auto uiWorkletRuntime = weakUiWorkletRuntime.lock();
|
|
40
|
-
if (uiWorkletRuntime == nullptr) {
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
jsi::Runtime &uiRuntime = uiWorkletRuntime->getJSIRuntime();
|
|
45
|
-
jsi::Object value(uiRuntime);
|
|
46
|
-
if (sensorType == SensorType::ROTATION_VECTOR) {
|
|
47
|
-
// TODO: timestamp should be provided by the platform implementation
|
|
48
|
-
// such that the native side has a chance of providing a true event
|
|
49
|
-
// timestamp
|
|
50
|
-
value.setProperty(uiRuntime, "qx", newValues[0]);
|
|
51
|
-
value.setProperty(uiRuntime, "qy", newValues[1]);
|
|
52
|
-
value.setProperty(uiRuntime, "qz", newValues[2]);
|
|
53
|
-
value.setProperty(uiRuntime, "qw", newValues[3]);
|
|
54
|
-
value.setProperty(uiRuntime, "yaw", newValues[4]);
|
|
55
|
-
value.setProperty(uiRuntime, "pitch", newValues[5]);
|
|
56
|
-
value.setProperty(uiRuntime, "roll", newValues[6]);
|
|
57
|
-
} else {
|
|
58
|
-
value.setProperty(uiRuntime, "x", newValues[0]);
|
|
59
|
-
value.setProperty(uiRuntime, "y", newValues[1]);
|
|
60
|
-
value.setProperty(uiRuntime, "z", newValues[2]);
|
|
61
|
-
}
|
|
62
|
-
value.setProperty(
|
|
63
|
-
uiRuntime, "interfaceOrientation", orientationDegrees);
|
|
64
|
-
|
|
65
|
-
uiWorkletRuntime->runGuarded(shareableHandler, value);
|
|
66
|
-
});
|
|
67
|
-
if (sensorId != -1) {
|
|
68
|
-
sensorsIds_.insert(sensorId);
|
|
69
|
-
}
|
|
70
|
-
return jsi::Value(sensorId);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
void AnimatedSensorModule::unregisterSensor(const jsi::Value &sensorId) {
|
|
74
|
-
// It is called during sensor hook unmounting
|
|
75
|
-
if (!sensorId.isNumber()) {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
sensorsIds_.erase(sensorId.getNumber());
|
|
79
|
-
platformUnregisterSensorFunction_(sensorId.asNumber());
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
void AnimatedSensorModule::unregisterAllSensors() {
|
|
83
|
-
for (auto sensorId : sensorsIds_) {
|
|
84
|
-
platformUnregisterSensorFunction_(sensorId);
|
|
85
|
-
}
|
|
86
|
-
sensorsIds_.clear();
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
} // namespace reanimated
|
|
1
|
+
#include <reanimated/AnimatedSensor/AnimatedSensorModule.h>
|
|
2
|
+
|
|
3
|
+
#include <utility>
|
|
4
|
+
|
|
5
|
+
namespace reanimated {
|
|
6
|
+
|
|
7
|
+
AnimatedSensorModule::AnimatedSensorModule(
|
|
8
|
+
const PlatformDepMethodsHolder &platformDepMethodsHolder)
|
|
9
|
+
: platformRegisterSensorFunction_(platformDepMethodsHolder.registerSensor),
|
|
10
|
+
platformUnregisterSensorFunction_(
|
|
11
|
+
platformDepMethodsHolder.unregisterSensor) {}
|
|
12
|
+
|
|
13
|
+
AnimatedSensorModule::~AnimatedSensorModule() {
|
|
14
|
+
assert(sensorsIds_.empty());
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
jsi::Value AnimatedSensorModule::registerSensor(
|
|
18
|
+
jsi::Runtime &rt,
|
|
19
|
+
const std::shared_ptr<WorkletRuntime> &uiWorkletRuntime,
|
|
20
|
+
const jsi::Value &sensorTypeValue,
|
|
21
|
+
const jsi::Value &interval,
|
|
22
|
+
const jsi::Value &iosReferenceFrame,
|
|
23
|
+
const jsi::Value &sensorDataHandler) {
|
|
24
|
+
SensorType sensorType = static_cast<SensorType>(sensorTypeValue.asNumber());
|
|
25
|
+
|
|
26
|
+
auto shareableHandler = extractShareableOrThrow<ShareableWorklet>(
|
|
27
|
+
rt,
|
|
28
|
+
sensorDataHandler,
|
|
29
|
+
"[Reanimated] Sensor event handler must be a worklet.");
|
|
30
|
+
|
|
31
|
+
int sensorId = platformRegisterSensorFunction_(
|
|
32
|
+
sensorType,
|
|
33
|
+
interval.asNumber(),
|
|
34
|
+
iosReferenceFrame.asNumber(),
|
|
35
|
+
[sensorType,
|
|
36
|
+
shareableHandler,
|
|
37
|
+
weakUiWorkletRuntime = std::weak_ptr<WorkletRuntime>(uiWorkletRuntime)](
|
|
38
|
+
double newValues[], int orientationDegrees) {
|
|
39
|
+
auto uiWorkletRuntime = weakUiWorkletRuntime.lock();
|
|
40
|
+
if (uiWorkletRuntime == nullptr) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
jsi::Runtime &uiRuntime = uiWorkletRuntime->getJSIRuntime();
|
|
45
|
+
jsi::Object value(uiRuntime);
|
|
46
|
+
if (sensorType == SensorType::ROTATION_VECTOR) {
|
|
47
|
+
// TODO: timestamp should be provided by the platform implementation
|
|
48
|
+
// such that the native side has a chance of providing a true event
|
|
49
|
+
// timestamp
|
|
50
|
+
value.setProperty(uiRuntime, "qx", newValues[0]);
|
|
51
|
+
value.setProperty(uiRuntime, "qy", newValues[1]);
|
|
52
|
+
value.setProperty(uiRuntime, "qz", newValues[2]);
|
|
53
|
+
value.setProperty(uiRuntime, "qw", newValues[3]);
|
|
54
|
+
value.setProperty(uiRuntime, "yaw", newValues[4]);
|
|
55
|
+
value.setProperty(uiRuntime, "pitch", newValues[5]);
|
|
56
|
+
value.setProperty(uiRuntime, "roll", newValues[6]);
|
|
57
|
+
} else {
|
|
58
|
+
value.setProperty(uiRuntime, "x", newValues[0]);
|
|
59
|
+
value.setProperty(uiRuntime, "y", newValues[1]);
|
|
60
|
+
value.setProperty(uiRuntime, "z", newValues[2]);
|
|
61
|
+
}
|
|
62
|
+
value.setProperty(
|
|
63
|
+
uiRuntime, "interfaceOrientation", orientationDegrees);
|
|
64
|
+
|
|
65
|
+
uiWorkletRuntime->runGuarded(shareableHandler, value);
|
|
66
|
+
});
|
|
67
|
+
if (sensorId != -1) {
|
|
68
|
+
sensorsIds_.insert(sensorId);
|
|
69
|
+
}
|
|
70
|
+
return jsi::Value(sensorId);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
void AnimatedSensorModule::unregisterSensor(const jsi::Value &sensorId) {
|
|
74
|
+
// It is called during sensor hook unmounting
|
|
75
|
+
if (!sensorId.isNumber()) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
sensorsIds_.erase(sensorId.getNumber());
|
|
79
|
+
platformUnregisterSensorFunction_(sensorId.asNumber());
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
void AnimatedSensorModule::unregisterAllSensors() {
|
|
83
|
+
for (auto sensorId : sensorsIds_) {
|
|
84
|
+
platformUnregisterSensorFunction_(sensorId);
|
|
85
|
+
}
|
|
86
|
+
sensorsIds_.clear();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
} // namespace reanimated
|
|
@@ -228,16 +228,34 @@ void ReanimatedModuleProxy::init(
|
|
|
228
228
|
}
|
|
229
229
|
|
|
230
230
|
ReanimatedModuleProxy::~ReanimatedModuleProxy() {
|
|
231
|
-
invalidate();
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
void ReanimatedModuleProxy::invalidate() {
|
|
235
231
|
// event handler registry and frame callbacks store some JSI values from UI
|
|
236
232
|
// runtime, so they have to go away before we tear down the runtime
|
|
237
233
|
eventHandlerRegistry_.reset();
|
|
238
234
|
frameCallbacks_.clear();
|
|
239
235
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
240
236
|
operationsInBatch_.clear();
|
|
237
|
+
// 清空 PropsRegistry 中持有的 ShadowNode 引用,避免析构时级联释放已被框架回收的 ShadowNodeFamily
|
|
238
|
+
if (propsRegistry_) {
|
|
239
|
+
auto lock = propsRegistry_->createLock();
|
|
240
|
+
// 清空内部 map,释放所有 ShadowNode::Shared
|
|
241
|
+
propsRegistry_->clear();
|
|
242
|
+
}
|
|
243
|
+
propsRegistry_.reset();
|
|
244
|
+
|
|
245
|
+
// LayoutAnimationsProxy 持有 ShadowView/MutationNode 引用(内部包含
|
|
246
|
+
// ShadowNode::Shared),需要在 runtime 销毁前清空,避免 runtime 析构时
|
|
247
|
+
// GC 级联触发 ShadowNodeFamily::~ShadowNodeFamily() 崩溃
|
|
248
|
+
if (layoutAnimationsProxy_) {
|
|
249
|
+
auto lock = std::unique_lock<std::recursive_mutex>(
|
|
250
|
+
layoutAnimationsProxy_->mutex);
|
|
251
|
+
layoutAnimationsProxy_->layoutAnimations_.clear();
|
|
252
|
+
layoutAnimationsProxy_->nodeForTag_.clear();
|
|
253
|
+
layoutAnimationsProxy_->deadNodes.clear();
|
|
254
|
+
layoutAnimationsProxy_->leastRemoved.clear();
|
|
255
|
+
layoutAnimationsProxy_->surfaceManager.props_.clear();
|
|
256
|
+
}
|
|
257
|
+
layoutAnimationsProxy_.reset();
|
|
258
|
+
|
|
241
259
|
#endif // RCT_NEW_ARCH_ENABLED
|
|
242
260
|
uiWorkletRuntime_.reset();
|
|
243
261
|
}
|
|
@@ -3,40 +3,104 @@
|
|
|
3
3
|
// found in the LICENSE file.
|
|
4
4
|
|
|
5
5
|
import { RNOHLogger, Tag, UITurboModule, UITurboModuleContext } from "@rnoh/react-native-openharmony/ts";
|
|
6
|
-
import { window } from '@kit.ArkUI';
|
|
7
|
-
import {
|
|
6
|
+
import { Animator, AnimatorResult, window } from '@kit.ArkUI';
|
|
7
|
+
import { KeyboardState } from "./AnimationManager";
|
|
8
8
|
|
|
9
9
|
export class ReanimatedModule extends UITurboModule {
|
|
10
10
|
static NAME = "ReanimatedModule"
|
|
11
11
|
private logger: RNOHLogger
|
|
12
12
|
private keyBordHeight = 0;
|
|
13
|
+
private currentAnimator: AnimatorResult ;
|
|
14
|
+
private currentAnimatedHeight = 0;
|
|
13
15
|
|
|
14
|
-
constructor(ctx:
|
|
16
|
+
constructor(ctx: UITurboModuleContext) {
|
|
15
17
|
super(ctx);
|
|
16
18
|
this.logger = ctx.logger.clone("Reanimated");
|
|
17
19
|
}
|
|
20
|
+
|
|
18
21
|
public setViewProps(tag: Tag, props: Object) {
|
|
19
22
|
this.ctx.descriptorRegistry.setAnimatedRawProps(tag, props);
|
|
20
23
|
}
|
|
21
24
|
|
|
22
|
-
public async subscribeKeyBordListeners() {
|
|
25
|
+
public async subscribeKeyBordListeners(isStatusBarTranslucent: boolean, isNavigationBarTranslucent: boolean) {
|
|
26
|
+
//ignore isStatusBarTranslucent - those are Android only
|
|
23
27
|
const windowInstance = await window.getLastWindow(this.ctx.uiAbilityContext);
|
|
28
|
+
const navIndicatorArea = windowInstance.getWindowAvoidArea(
|
|
29
|
+
window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR
|
|
30
|
+
);
|
|
31
|
+
const navIndicatorHeight = this.ctx.getUIContext().px2vp(
|
|
32
|
+
navIndicatorArea.bottomRect.height
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
const isEdgeToEdge = this.isEdgeToEdgeMode(windowInstance);
|
|
36
|
+
const effectiveNavBarTranslucent = isEdgeToEdge && isNavigationBarTranslucent;
|
|
37
|
+
|
|
24
38
|
windowInstance.on('keyboardHeightChange', async (height) => {
|
|
25
|
-
let
|
|
26
|
-
|
|
27
|
-
|
|
39
|
+
let rawKeyboardHeight = this.ctx.getUIContext().px2vp(height);
|
|
40
|
+
//If the immersive mode is not enabled, then the area around the bottom navigation bar that needs to be avoided needs to be removed.
|
|
41
|
+
//If the immersive mode is enabled, the returned value will be the height of the current keyboard.
|
|
42
|
+
let keyBordHeight = effectiveNavBarTranslucent
|
|
43
|
+
? rawKeyboardHeight
|
|
44
|
+
: Math.max(0, rawKeyboardHeight - navIndicatorHeight);
|
|
45
|
+
|
|
46
|
+
//Unchanged height, skip handle
|
|
47
|
+
if (Math.abs(keyBordHeight - this.currentAnimatedHeight) < 0.01) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const isOpening = keyBordHeight > this.keyBordHeight;
|
|
52
|
+
|
|
53
|
+
if (this.currentAnimator) {
|
|
54
|
+
this.currentAnimator.onFrame = null;
|
|
55
|
+
this.currentAnimator.onFinish = null;
|
|
56
|
+
this.currentAnimator.cancel();
|
|
57
|
+
this.currentAnimator = null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
this.currentAnimator = Animator.create({
|
|
61
|
+
duration: isOpening ? 480 : 350,
|
|
62
|
+
delay: 0,
|
|
63
|
+
//simulate the keyboard pop-up and retraction animations in harmony
|
|
64
|
+
easing: isOpening ? "cubic-bezier(0.2, 0.0, 0.1, 1.0)"
|
|
65
|
+
: "cubic-bezier(0.0, 0.0, 0.1, 1.0)",
|
|
66
|
+
fill: "forwards",
|
|
67
|
+
direction: "normal",
|
|
68
|
+
iterations: 1,
|
|
69
|
+
begin: this.currentAnimatedHeight,
|
|
70
|
+
end: keyBordHeight
|
|
71
|
+
}
|
|
72
|
+
)
|
|
73
|
+
this.currentAnimator.onFrame = (progress: number) => {
|
|
74
|
+
this.currentAnimatedHeight = progress;
|
|
75
|
+
if (Math.abs(progress - keyBordHeight) < 0.01) { //The final instruction is sent by "onFinish".
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
let status = keyBordHeight > this.keyBordHeight ? KeyboardState.OPENING : KeyboardState.CLOSING;
|
|
28
79
|
this.ctx.rnInstance.postMessageToCpp("REANIMATED_KEY_BOARD_CHANGE",
|
|
29
|
-
{ keyboardHeight:
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
80
|
+
{ keyboardHeight: progress, status: status.valueOf() });
|
|
81
|
+
}
|
|
82
|
+
this.currentAnimator.onFinish = () => {
|
|
83
|
+
this.currentAnimatedHeight = keyBordHeight;
|
|
84
|
+
let status = keyBordHeight > this.keyBordHeight ? KeyboardState.OPEN : KeyboardState.CLOSED;
|
|
85
|
+
this.keyBordHeight = keyBordHeight;
|
|
86
|
+
this.ctx.rnInstance.postMessageToCpp("REANIMATED_KEY_BOARD_CHANGE",
|
|
87
|
+
{ keyboardHeight: keyBordHeight, status: status.valueOf() });
|
|
88
|
+
}
|
|
89
|
+
this.currentAnimator.play();
|
|
33
90
|
})
|
|
34
91
|
}
|
|
35
92
|
|
|
36
93
|
public async unsubscribeKeyBordListeners() {
|
|
37
94
|
const windowInstance = await window.getLastWindow(this.ctx.uiAbilityContext);
|
|
38
|
-
windowInstance.off('keyboardHeightChange'
|
|
39
|
-
|
|
95
|
+
windowInstance.off('keyboardHeightChange')
|
|
96
|
+
if (this.currentAnimator) {
|
|
97
|
+
this.currentAnimator.onFrame = null;
|
|
98
|
+
this.currentAnimator.onFinish = null;
|
|
99
|
+
this.currentAnimator.cancel();
|
|
100
|
+
this.currentAnimator = null;
|
|
101
|
+
}
|
|
102
|
+
this.keyBordHeight = 0;
|
|
103
|
+
this.currentAnimatedHeight = 0;
|
|
40
104
|
}
|
|
41
105
|
|
|
42
106
|
public setGestureHandlerState(handlerTag: Tag, newState: number) {
|
|
@@ -45,4 +109,15 @@ export class ReanimatedModule extends UITurboModule {
|
|
|
45
109
|
module.setGestureHandlerState(handlerTag, newState);
|
|
46
110
|
}
|
|
47
111
|
}
|
|
112
|
+
|
|
113
|
+
private isEdgeToEdgeMode(windowInstance: window.Window) {
|
|
114
|
+
let isLayoutFullScreen = false;
|
|
115
|
+
try {
|
|
116
|
+
const windowProperties = windowInstance.getWindowProperties();
|
|
117
|
+
isLayoutFullScreen = windowProperties.isLayoutFullScreen;
|
|
118
|
+
} catch (e: ESObject) {
|
|
119
|
+
isLayoutFullScreen = false;
|
|
120
|
+
}
|
|
121
|
+
return isLayoutFullScreen;
|
|
122
|
+
}
|
|
48
123
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
{
|
|
2
|
-
"module": {
|
|
3
|
-
"name": "reanimated",
|
|
4
|
-
"type": "har",
|
|
5
|
-
"description": "$string:module_desc",
|
|
6
|
-
"mainElement": "ReanimatedAbility",
|
|
7
|
-
"deviceTypes": [
|
|
8
|
-
"phone",
|
|
9
|
-
"tablet",
|
|
10
|
-
"2in1"
|
|
11
|
-
],
|
|
12
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"module": {
|
|
3
|
+
"name": "reanimated",
|
|
4
|
+
"type": "har",
|
|
5
|
+
"description": "$string:module_desc",
|
|
6
|
+
"mainElement": "ReanimatedAbility",
|
|
7
|
+
"deviceTypes": [
|
|
8
|
+
"phone",
|
|
9
|
+
"tablet",
|
|
10
|
+
"2in1"
|
|
11
|
+
],
|
|
12
|
+
}
|
|
13
13
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
{
|
|
2
|
-
"color": [
|
|
3
|
-
{
|
|
4
|
-
"name": "start_window_background",
|
|
5
|
-
"value": "#FFFFFF"
|
|
6
|
-
}
|
|
7
|
-
]
|
|
1
|
+
{
|
|
2
|
+
"color": [
|
|
3
|
+
{
|
|
4
|
+
"name": "start_window_background",
|
|
5
|
+
"value": "#FFFFFF"
|
|
6
|
+
}
|
|
7
|
+
]
|
|
8
8
|
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
{
|
|
2
|
-
"string": [
|
|
3
|
-
{
|
|
4
|
-
"name": "module_desc",
|
|
5
|
-
"value": "module description"
|
|
6
|
-
},
|
|
7
|
-
{
|
|
8
|
-
"name": "ReanimatedAbility_desc",
|
|
9
|
-
"value": "description"
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"name": "ReanimatedAbility_label",
|
|
13
|
-
"value": "label"
|
|
14
|
-
}
|
|
15
|
-
]
|
|
1
|
+
{
|
|
2
|
+
"string": [
|
|
3
|
+
{
|
|
4
|
+
"name": "module_desc",
|
|
5
|
+
"value": "module description"
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"name": "ReanimatedAbility_desc",
|
|
9
|
+
"value": "description"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"name": "ReanimatedAbility_label",
|
|
13
|
+
"value": "label"
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
16
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
{
|
|
2
|
-
"src": [
|
|
3
|
-
"pages/Index"
|
|
4
|
-
]
|
|
5
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"src": [
|
|
3
|
+
"pages/Index"
|
|
4
|
+
]
|
|
5
|
+
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
{
|
|
2
|
-
"string": [
|
|
3
|
-
{
|
|
4
|
-
"name": "module_desc",
|
|
5
|
-
"value": "module description"
|
|
6
|
-
},
|
|
7
|
-
{
|
|
8
|
-
"name": "ReanimatedAbility_desc",
|
|
9
|
-
"value": "description"
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"name": "ReanimatedAbility_label",
|
|
13
|
-
"value": "label"
|
|
14
|
-
}
|
|
15
|
-
]
|
|
1
|
+
{
|
|
2
|
+
"string": [
|
|
3
|
+
{
|
|
4
|
+
"name": "module_desc",
|
|
5
|
+
"value": "module description"
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"name": "ReanimatedAbility_desc",
|
|
9
|
+
"value": "description"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"name": "ReanimatedAbility_label",
|
|
13
|
+
"value": "label"
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
16
|
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
{
|
|
2
|
-
"string": [
|
|
3
|
-
{
|
|
4
|
-
"name": "module_desc",
|
|
5
|
-
"value": "模块描述"
|
|
6
|
-
},
|
|
7
|
-
{
|
|
8
|
-
"name": "ReanimatedAbility_desc",
|
|
9
|
-
"value": "description"
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"name": "ReanimatedAbility_label",
|
|
13
|
-
"value": "label"
|
|
14
|
-
}
|
|
15
|
-
]
|
|
1
|
+
{
|
|
2
|
+
"string": [
|
|
3
|
+
{
|
|
4
|
+
"name": "module_desc",
|
|
5
|
+
"value": "模块描述"
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"name": "ReanimatedAbility_desc",
|
|
9
|
+
"value": "description"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"name": "ReanimatedAbility_label",
|
|
13
|
+
"value": "label"
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
16
|
}
|
package/harmony/reanimated/ts.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
// Copyright (c) 2025 Huawei Device Co., Ltd. All rights reserved
|
|
2
|
-
// Use of this source code is governed by a MIT license that can be
|
|
3
|
-
// found in the LICENSE file.
|
|
4
|
-
|
|
5
|
-
export * from './src/main/ets/ReanimatedPackage';
|
|
6
|
-
export * from './src/main/ets/ReanimatedModule';
|
|
1
|
+
// Copyright (c) 2025 Huawei Device Co., Ltd. All rights reserved
|
|
2
|
+
// Use of this source code is governed by a MIT license that can be
|
|
3
|
+
// found in the LICENSE file.
|
|
4
|
+
|
|
5
|
+
export * from './src/main/ets/ReanimatedPackage';
|
|
6
|
+
export * from './src/main/ets/ReanimatedModule';
|
package/harmony/reanimated.har
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,50 +1,51 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@react-native-ohos/react-native-reanimated",
|
|
3
|
-
"harmony": {
|
|
4
|
-
"alias": "react-native-reanimated",
|
|
5
|
-
"redirectInternalImports": true
|
|
6
|
-
},
|
|
7
|
-
"version": "3.18.2",
|
|
8
|
-
"description": "",
|
|
9
|
-
"main": "lib/index.js",
|
|
10
|
-
"scripts": {
|
|
11
|
-
"build": "tsc",
|
|
12
|
-
"pack
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"react
|
|
21
|
-
"react-native
|
|
22
|
-
"react-native-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
|
|
28
|
-
"
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"@babel/
|
|
33
|
-
"@babel/
|
|
34
|
-
"@babel/preset-
|
|
35
|
-
"@babel/
|
|
36
|
-
"@
|
|
37
|
-
"@types/
|
|
38
|
-
"
|
|
39
|
-
"react": "
|
|
40
|
-
"react
|
|
41
|
-
"react-native
|
|
42
|
-
"
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
|
|
50
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "@react-native-ohos/react-native-reanimated",
|
|
3
|
+
"harmony": {
|
|
4
|
+
"alias": "react-native-reanimated",
|
|
5
|
+
"redirectInternalImports": true
|
|
6
|
+
},
|
|
7
|
+
"version": "3.18.3-beta.2",
|
|
8
|
+
"description": "",
|
|
9
|
+
"main": "lib/index.js",
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"pack":"npm pack",
|
|
13
|
+
"pack:prod": "npm pack",
|
|
14
|
+
"prepack": "npm run build",
|
|
15
|
+
"prepublishOnly": "npm run prepack && react-native verify-package-harmony --package-path . --skip-checks oh_package_name_is_derived_from_npm_package_name",
|
|
16
|
+
"update_version": "node ./scripts/update-version.js",
|
|
17
|
+
"deploy": "node ./scripts/deploy.js"
|
|
18
|
+
},
|
|
19
|
+
"peerDependencies": {
|
|
20
|
+
"react": "*",
|
|
21
|
+
"react-native": "*",
|
|
22
|
+
"react-native-harmony": "*",
|
|
23
|
+
"react-native-reanimated": "3.18.0"
|
|
24
|
+
},
|
|
25
|
+
"author": "",
|
|
26
|
+
"license": "ISC",
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@types/node": "^20.11.4",
|
|
29
|
+
"react-native-reanimated": "3.18.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@babel/cli": "^7.23.4",
|
|
33
|
+
"@babel/core": "^7.23.7",
|
|
34
|
+
"@babel/preset-env": "^7.23.8",
|
|
35
|
+
"@babel/preset-typescript": "^7.23.3",
|
|
36
|
+
"@babel/runtime": "^7.23.8",
|
|
37
|
+
"@types/invariant": "^2.2.35",
|
|
38
|
+
"@types/react": "^18.2.15",
|
|
39
|
+
"metro-react-native-babel-preset": "^0.77.0",
|
|
40
|
+
"react": "18.3.1",
|
|
41
|
+
"react-native": "0.77.1",
|
|
42
|
+
"react-native-builder-bob": "^0.21.3",
|
|
43
|
+
"typescript": "^5.1.6"
|
|
44
|
+
},
|
|
45
|
+
"files": [
|
|
46
|
+
"lib",
|
|
47
|
+
"harmony",
|
|
48
|
+
"src",
|
|
49
|
+
"./harmony.tar.gz"
|
|
50
|
+
]
|
|
51
|
+
}
|