diff --git a/frameworks/bridge/declarative_frontend/engine/stateMgmt.js b/frameworks/bridge/declarative_frontend/engine/stateMgmt.js index 37dec1d5221f0a4ed73f85ed92558166dd75bae8..effad21897fb57e9bcc4ba3cc42fc25222c277e5 100644 --- a/frameworks/bridge/declarative_frontend/engine/stateMgmt.js +++ b/frameworks/bridge/declarative_frontend/engine/stateMgmt.js @@ -236,7 +236,15 @@ stateMgmtConsole.warn(`${this.constructor.name}: link: no property ${propName} error.`); return undefined; } - let linkResult = p.createLink(linkUser, propName); + let linkResult; + if (ViewStackProcessor.UsesNewPipeline()) { + linkResult = (p instanceof ObservedPropertySimple) + ? new SynchedPropertySimpleTwoWayPU(p, linkUser, propName) + : new SynchedPropertyObjectTwoWayPU(p, linkUser, propName); + } + else { + linkResult = p.createLink(linkUser, propName); + } linkResult.setInfo(subscribersName); return linkResult; } @@ -279,7 +287,15 @@ stateMgmtConsole.warn(`${this.constructor.name}: prop: no property ${propName} error.`); return undefined; } - let propResult = p.createProp(propUser, propName); + let propResult; + if (ViewStackProcessor.UsesNewPipeline()) { + propResult = (p instanceof ObservedPropertySimple) + ? new SynchedPropertySimpleOneWayPU(p, propUser, propName) + : new SynchedPropertyObjectOneWayPU(p, propUser, propName); + } + else { + propResult = p.createProp(propUser, propName); + } propResult.setInfo(subscribersName); return propResult; } diff --git a/frameworks/bridge/declarative_frontend/jsview/js_view_stack_processor.cpp b/frameworks/bridge/declarative_frontend/jsview/js_view_stack_processor.cpp index 7e9b32b693e4343f9fbfade9f3e885785061907d..fa95b0148ae7f8f79229f66ca83d91c289ce358c 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_view_stack_processor.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_view_stack_processor.cpp @@ -67,6 +67,7 @@ void JSViewStackProcessor::JSBind(BindingTarget globalObj) "ImplicitPopBeforeContinue", &JSViewStackProcessor::JsImplicitPopBeforeContinue, opt); JSClass::StaticMethod("visualState", JSVisualState, opt); JSClass::StaticMethod("MakeUniqueId", &JSViewStackProcessor::JSMakeUniqueId, opt); + JSClass::StaticMethod("UsesNewPipeline", &JSViewStackProcessor::JsUsesNewPipeline, opt); JSClass::Bind<>(globalObj); } @@ -145,5 +146,12 @@ void JSViewStackProcessor::JSMakeUniqueId(const JSCallbackInfo& info) const auto result = ElementRegister::GetInstance()->MakeUniqueId(); info.SetReturnValue(JSRef::Make(ToJSValue(result))); } +/** + * return true of current Container uses new Pipeline + */ +bool JSViewStackProcessor::JsUsesNewPipeline() +{ + return Container::IsCurrentUseNewPipeline(); +} } // namespace OHOS::Ace::Framework diff --git a/frameworks/bridge/declarative_frontend/jsview/js_view_stack_processor.h b/frameworks/bridge/declarative_frontend/jsview/js_view_stack_processor.h index 67acaae9ad3b60a5f4010eeed23f5791705cc811..7e5ddfa884828e5f21002be0a47fef0d3dafb9a5 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_view_stack_processor.h +++ b/frameworks/bridge/declarative_frontend/jsview/js_view_stack_processor.h @@ -76,6 +76,8 @@ public: return it->second; } + static bool JsUsesNewPipeline(); + private: static void JSVisualState(const JSCallbackInfo& info); static std::map> viewMap_; diff --git a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/partial_update/pu_viewstack_processor.d.ts b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/partial_update/pu_viewstack_processor.d.ts index 01fe6f2651c954876a3e656b73e66b01985e644d..900f973c1f6903a3c0806bd5ff0102e5d9a7c875 100644 --- a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/partial_update/pu_viewstack_processor.d.ts +++ b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/partial_update/pu_viewstack_processor.d.ts @@ -70,4 +70,11 @@ declare class ViewStackProcessor { * JS signatire: MakeUniqueId() : number */ public static MakeUniqueId(): number; + + /** + * return true if the current Container uses PartialUpdate code path + * see Container class foundation/arkui/ace_engine/frameworks/core/common/container.h + * calls UsesNewPipeline static function + */ + public static UsesNewPipeline(); } diff --git a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/sdk/local_storage.ts b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/sdk/local_storage.ts index 5b2847e212c221038337ec7d5d8bf77467974335..f943db997409a567df7fbe15bce8c3c063674976 100644 --- a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/sdk/local_storage.ts +++ b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/sdk/local_storage.ts @@ -217,7 +217,14 @@ class LocalStorage extends NativeLocalStorage { stateMgmtConsole.warn(`${this.constructor.name}: link: no property ${propName} error.`); return undefined; } - let linkResult = p.createLink(linkUser, propName); + let linkResult; + if (ViewStackProcessor.UsesNewPipeline()) { + linkResult = (p instanceof ObservedPropertySimple) + ? new SynchedPropertySimpleTwoWayPU(p, linkUser, propName) + : new SynchedPropertyObjectTwoWayPU(p, linkUser, propName); + } else { + linkResult = p.createLink(linkUser, propName); + } linkResult.setInfo(subscribersName); return linkResult; } @@ -258,13 +265,21 @@ class LocalStorage extends NativeLocalStorage { * return undefiend if named property does not already exist in LocalStorage. * @since 9 */ - public prop(propName: string, propUser?: IPropertySubscriber, subscribersName?: string): SubscribedAbstractProperty | undefined { - var p: ObservedPropertyAbstract | undefined = this.storage_.get(propName); + public prop(propName: string, propUser?: IPropertySubscriber, subscribersName?: string): SubscribedAbstractProperty | undefined { + var p: ObservedPropertyAbstract | undefined = this.storage_.get(propName); if (p == undefined) { stateMgmtConsole.warn(`${this.constructor.name}: prop: no property ${propName} error.`); return undefined; } - let propResult = p.createProp(propUser, propName) + + let propResult; + if (ViewStackProcessor.UsesNewPipeline()) { + propResult = (p instanceof ObservedPropertySimple) + ? new SynchedPropertySimpleOneWayPU(p, propUser, propName) + : new SynchedPropertyObjectOneWayPU(p, propUser, propName); + } else { + propResult = p.createProp(propUser, propName); + } propResult.setInfo(subscribersName); return propResult; } @@ -281,8 +296,8 @@ class LocalStorage extends NativeLocalStorage { * Apps can use SDK functions of base class SubscribedAbstractProperty * @since 9 */ - public setAndProp(propName: string, defaultValue: S, propUser?: IPropertySubscriber, subscribersName?: string): SubscribedAbstractProperty { - var p: ObservedPropertyAbstract | undefined = this.storage_.get(propName); + public setAndProp(propName: string, defaultValue: T, propUser?: IPropertySubscriber, subscribersName?: string): SubscribedAbstractProperty { + var p: ObservedPropertyAbstract | undefined = this.storage_.get(propName); if (!p) { this.setOrCreate(propName, defaultValue); }