From 9bf944e3272c74e164ee3be5bf32187f7477c7d0 Mon Sep 17 00:00:00 2001 From: zjxi Date: Wed, 25 Dec 2024 19:19:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E4=BE=A7=E5=8F=91=E9=80=81=E5=88=B0native=E6=97=A0=E9=9A=9C?= =?UTF-8?q?=E7=A2=8D=E9=80=9A=E9=81=93=E7=9A=84ontap,=20onlongpress,=20ont?= =?UTF-8?q?ooltip=E6=8E=A5=E5=8F=A3=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zjxi --- .../native_accessibility_channel.cpp | 30 ++++ .../ohos_accessibility_bridge.cpp | 165 +++++++++++------- .../accessibility/ohos_accessibility_bridge.h | 14 +- .../src/main/cpp/types/libflutter/index.d.ets | 8 +- .../systemchannels/AccessibilityChannel.ets | 16 +- shell/platform/ohos/library_loader.cpp | 13 +- .../ohos/napi/platform_view_ohos_napi.cpp | 66 ++++++- .../ohos/napi/platform_view_ohos_napi.h | 12 +- 8 files changed, 247 insertions(+), 77 deletions(-) diff --git a/shell/platform/ohos/accessibility/native_accessibility_channel.cpp b/shell/platform/ohos/accessibility/native_accessibility_channel.cpp index d8ba25cb99..d93a12e20e 100644 --- a/shell/platform/ohos/accessibility/native_accessibility_channel.cpp +++ b/shell/platform/ohos/accessibility/native_accessibility_channel.cpp @@ -105,4 +105,34 @@ namespace flutter { auto ohos_a11y_bridge = OhosAccessibilityBridge::GetInstance(); ohos_a11y_bridge->Announce(message); } + + /** + * 利用通道内部类AccessibilityMessageHandler处理主动点击给定id组件事件 + */ + void NativeAccessibilityChannel::AccessibilityMessageHandler::OnTap( + int32_t nodeId) + { + auto ohos_a11y_bridge = OhosAccessibilityBridge::GetInstance(); + ohos_a11y_bridge->OnTap(nodeId); + } + + /** + * 利用通道内部类AccessibilityMessageHandler处理主动长按给定id组件事件 + */ + void NativeAccessibilityChannel::AccessibilityMessageHandler::OnLongPress( + int32_t nodeId) + { + auto ohos_a11y_bridge = OhosAccessibilityBridge::GetInstance(); + ohos_a11y_bridge->OnLongPress(nodeId); + } + + /** + * 利用通道内部类AccessibilityMessageHandler处理提示文字事件 + */ + void NativeAccessibilityChannel::AccessibilityMessageHandler::OnTooltip( + std::unique_ptr& message) + { + auto ohos_a11y_bridge = OhosAccessibilityBridge::GetInstance(); + ohos_a11y_bridge->OnTooltip(message); + } } \ No newline at end of file diff --git a/shell/platform/ohos/accessibility/ohos_accessibility_bridge.cpp b/shell/platform/ohos/accessibility/ohos_accessibility_bridge.cpp index 672307a8ba..27ce3230a4 100644 --- a/shell/platform/ohos/accessibility/ohos_accessibility_bridge.cpp +++ b/shell/platform/ohos/accessibility/ohos_accessibility_bridge.cpp @@ -54,6 +54,7 @@ void OhosAccessibilityBridge::OnOhosAccessibilityStateChange( accessibilityFeatures_ = std::make_shared(); if (ohosAccessibilityEnabled) { + isAccessibilityEnabled_ = ohosAccessibilityEnabled; nativeAccessibilityChannel_->OnOhosAccessibilityEnabled(native_shell_holder_id_); } else { accessibilityFeatures_->SetAccessibleNavigation(false, native_shell_holder_id_); @@ -326,50 +327,49 @@ void OhosAccessibilityBridge::RequestFocusWhenPageUpdate(int32_t requestFocusId) } /** - * 主动播报特定文本 + * 业务侧通过无障碍通道主动播报自定义文本内容 */ void OhosAccessibilityBridge::Announce(std::unique_ptr& message) { - if (OHOS_API_VERSION < 13) { return; } - CHECK_NULL_PTR(provider_, Announce); - - // 创建并设置屏幕朗读事件 - auto OH_ArkUI_CreateAccessibilityEventInfo = - OhosAccessibilityDDL::DLLoadCreateEventInfoFunc(ArkUIAccessibilityConstant::ARKUI_CREATE_EVENT); - CHECK_DLL_NULL_PTR(OH_ArkUI_CreateAccessibilityEventInfo); - auto* announceEventInfo = OH_ArkUI_CreateAccessibilityEventInfo(); - - - auto OH_ArkUI_AccessibilityEventSetEventType = - OhosAccessibilityDDL::DLLoadSetEventFunc(ArkUIAccessibilityConstant::ARKUI_SET_EVENT_TYPE); - CHECK_DLL_NULL_PTR(OH_ArkUI_AccessibilityEventSetEventType); - ARKUI_ACCESSIBILITY_CALL_CHECK( - OH_ArkUI_AccessibilityEventSetEventType( - announceEventInfo, - ArkUI_AccessibilityEventType::ARKUI_ACCESSIBILITY_NATIVE_EVENT_TYPE_ANNOUNCE_FOR_ACCESSIBILITY)); - - auto OH_ArkUI_AccessibilityEventSetTextAnnouncedForAccessibility = - OhosAccessibilityDDL::DLLoadSetEventStringFunc(ArkUIAccessibilityConstant::ARKUI_SET_ANNOUNCED_TEXT); - CHECK_DLL_NULL_PTR(OH_ArkUI_AccessibilityEventSetTextAnnouncedForAccessibility); - ARKUI_ACCESSIBILITY_CALL_CHECK( - OH_ArkUI_AccessibilityEventSetTextAnnouncedForAccessibility( - announceEventInfo, message.get())); - FML_DLOG(INFO) << ("announce -> message: ") << (message.get()); + if (!isAccessibilityEnabled_) { return; } + Flutter_SendAccessibilityAnnounceEvent( + message, ArkUI_AccessibilityEventType::ARKUI_ACCESSIBILITY_NATIVE_EVENT_TYPE_ANNOUNCE_FOR_ACCESSIBILITY); + LOGD("Announce -> message: %{public}s", message.get()); +} - auto callback = [](int32_t errorCode) { - FML_DLOG(WARNING) << "announce callback-> errorCode =" << errorCode; - }; +/** + * 业务侧通过无障碍通道主动点击给定id的组件节点 + */ +void OhosAccessibilityBridge::OnTap(int32_t nodeId) +{ + if (!isAccessibilityEnabled_) { return; } + Flutter_SendAccessibilityAsyncEvent(static_cast(nodeId), + ArkUI_AccessibilityEventType::ARKUI_ACCESSIBILITY_NATIVE_EVENT_TYPE_CLICKED); + LOGD("OnTap -> nodeId: %{public}d", nodeId); +} - auto OH_ArkUI_SendAccessibilityAsyncEvent = - OhosAccessibilityDDL::DLLoadSendAsyncEventFunc(ArkUIAccessibilityConstant::ARKUI_SEND_A11Y_EVENT); - CHECK_DLL_NULL_PTR(OH_ArkUI_SendAccessibilityAsyncEvent); - OH_ArkUI_SendAccessibilityAsyncEvent(provider_, announceEventInfo, callback); +/** + * 业务侧通过无障碍通道主动长按给定id的组件节点 + */ +void OhosAccessibilityBridge::OnLongPress(int32_t nodeId) +{ + if (!isAccessibilityEnabled_) { return; } + Flutter_SendAccessibilityAsyncEvent(static_cast(nodeId), + ArkUI_AccessibilityEventType::ARKUI_ACCESSIBILITY_NATIVE_EVENT_TYPE_LONG_CLICKED); + LOGD("OnLongPress -> nodeId: %{public}d", nodeId); +} - auto OH_ArkUI_DestoryAccessibilityEventInfo = - OhosAccessibilityDDL::DLLoadDestroyEventFunc(ArkUIAccessibilityConstant::ARKUI_DESTORY_EVENT); - CHECK_DLL_NULL_PTR(OH_ArkUI_DestoryAccessibilityEventInfo); - OH_ArkUI_DestoryAccessibilityEventInfo(announceEventInfo); - announceEventInfo = nullptr; +/** + * 业务侧通过无障碍通道主动长按给定id的组件节点 + */ +void OhosAccessibilityBridge::OnTooltip(std::unique_ptr& message) +{ + if (!isAccessibilityEnabled_) { return; } + Flutter_SendAccessibilityAsyncEvent(static_cast(ROOT_NODE_ID), + ArkUI_AccessibilityEventType::ARKUI_ACCESSIBILITY_NATIVE_EVENT_TYPE_PAGE_STATE_UPDATE); + Flutter_SendAccessibilityAnnounceEvent( + message, ArkUI_AccessibilityEventType::ARKUI_ACCESSIBILITY_NATIVE_EVENT_TYPE_ANNOUNCE_FOR_ACCESSIBILITY); + LOGD("OnTooltip -> message: %{public}s", message.get()); } //获取根节点 @@ -779,6 +779,16 @@ void OhosAccessibilityBridge::FlutterSetElementInfoProperties( FML_DLOG(INFO) << "flutterNode.id=" << flutterNode.id << " OH_ArkUI_AccessibilityElementInfoSetFocusable -> true"; } + if (IsNodeFocused(flutterNode)) { + auto OH_ArkUI_AccessibilityElementInfoSetAccessibilityFocused = + OhosAccessibilityDDL::DLLoadSetElemBoolFunc(ArkUIAccessibilityConstant::ARKUI_SET_A11Y_FOCUSED); + CHECK_DLL_NULL_PTR(OH_ArkUI_AccessibilityElementInfoSetAccessibilityFocused); + ARKUI_ACCESSIBILITY_CALL_CHECK( + OH_ArkUI_AccessibilityElementInfoSetAccessibilityFocused(elementInfoFromList, true) + ); + FML_DLOG(INFO) << "flutterNode.id=" << flutterNode.id + << " OH_ArkUI_AccessibilityElementInfoSetAccessibilityFocused -> true"; + } // 判断当前节点是否为密码输入框 if (IsNodePassword(flutterNode)) { auto OH_ArkUI_AccessibilityElementInfoSetIsPassword = @@ -1563,6 +1573,51 @@ flutter::SemanticsAction OhosAccessibilityBridge::ArkuiActionsToFlutterActions( } } +/** + * flutter发送无障碍自定义主动播报事件 + */ +void OhosAccessibilityBridge::Flutter_SendAccessibilityAnnounceEvent( + std::unique_ptr& message, + ArkUI_AccessibilityEventType eventType) +{ + // 创建并设置屏幕朗读事件 + auto OH_ArkUI_CreateAccessibilityEventInfo = + OhosAccessibilityDDL::DLLoadCreateEventInfoFunc(ArkUIAccessibilityConstant::ARKUI_CREATE_EVENT); + CHECK_DLL_NULL_PTR(OH_ArkUI_CreateAccessibilityEventInfo); + auto* announceEventInfo = OH_ArkUI_CreateAccessibilityEventInfo(); + + auto OH_ArkUI_AccessibilityEventSetEventType = + OhosAccessibilityDDL::DLLoadSetEventFunc(ArkUIAccessibilityConstant::ARKUI_SET_EVENT_TYPE); + CHECK_DLL_NULL_PTR(OH_ArkUI_AccessibilityEventSetEventType); + ARKUI_ACCESSIBILITY_CALL_CHECK( + OH_ArkUI_AccessibilityEventSetEventType( + announceEventInfo, + ArkUI_AccessibilityEventType::ARKUI_ACCESSIBILITY_NATIVE_EVENT_TYPE_ANNOUNCE_FOR_ACCESSIBILITY)); + + auto OH_ArkUI_AccessibilityEventSetTextAnnouncedForAccessibility = + OhosAccessibilityDDL::DLLoadSetEventStringFunc(ArkUIAccessibilityConstant::ARKUI_SET_ANNOUNCED_TEXT); + CHECK_DLL_NULL_PTR(OH_ArkUI_AccessibilityEventSetTextAnnouncedForAccessibility); + ARKUI_ACCESSIBILITY_CALL_CHECK( + OH_ArkUI_AccessibilityEventSetTextAnnouncedForAccessibility( + announceEventInfo, message.get())); + FML_DLOG(INFO) << ("announce -> message: ") << (message.get()); + + auto callback = [](int32_t errorCode) { + FML_DLOG(WARNING) << "announce callback-> errorCode =" << errorCode; + }; + + auto OH_ArkUI_SendAccessibilityAsyncEvent = + OhosAccessibilityDDL::DLLoadSendAsyncEventFunc(ArkUIAccessibilityConstant::ARKUI_SEND_A11Y_EVENT); + CHECK_DLL_NULL_PTR(OH_ArkUI_SendAccessibilityAsyncEvent); + OH_ArkUI_SendAccessibilityAsyncEvent(provider_, announceEventInfo, callback); + + auto OH_ArkUI_DestoryAccessibilityEventInfo = + OhosAccessibilityDDL::DLLoadDestroyEventFunc(ArkUIAccessibilityConstant::ARKUI_DESTORY_EVENT); + CHECK_DLL_NULL_PTR(OH_ArkUI_DestoryAccessibilityEventInfo); + OH_ArkUI_DestoryAccessibilityEventInfo(announceEventInfo); + announceEventInfo = nullptr; +} + /** * 自定义无障碍异步事件发送 */ @@ -1574,56 +1629,46 @@ void OhosAccessibilityBridge::Flutter_SendAccessibilityAsyncEvent( CHECK_NULL_PTR(provider_, Flutter_SendAccessibilityAsyncEvent); - // 1.创建eventInfo对象 + // 创建eventInfo对象 auto OH_ArkUI_CreateAccessibilityEventInfo = OhosAccessibilityDDL::DLLoadCreateEventInfoFunc(ArkUIAccessibilityConstant::ARKUI_CREATE_EVENT); CHECK_DLL_NULL_PTR(OH_ArkUI_CreateAccessibilityEventInfo); auto* eventInfo = OH_ArkUI_CreateAccessibilityEventInfo(); CHECK_NULL_PTR(eventInfo, Flutter_SendAccessibilityAsyncEvent); - // 2.创建的elementinfo并根据对应id的flutternode进行属性初始化 + // 创建的elementinfo并根据对应id的flutternode进行属性初始化 auto OH_ArkUI_CreateAccessibilityElementInfo = OhosAccessibilityDDL::DLLoadCreateElemInfoFunc(ArkUIAccessibilityConstant::ARKUI_CREATE_NODE); CHECK_DLL_NULL_PTR(OH_ArkUI_CreateAccessibilityElementInfo); ArkUI_AccessibilityElementInfo* _elementInfo = OH_ArkUI_CreateAccessibilityElementInfo(); FlutterSetElementInfoProperties(_elementInfo, elementId); - // 若为获焦事件,则设置当前elementinfo获焦 - auto OH_ArkUI_AccessibilityElementInfoSetAccessibilityFocused = - OhosAccessibilityDDL::DLLoadSetElemBoolFunc(ArkUIAccessibilityConstant::ARKUI_SET_A11Y_FOCUSED); - CHECK_DLL_NULL_PTR(OH_ArkUI_AccessibilityElementInfoSetAccessibilityFocused); - if (eventType == ArkUI_AccessibilityEventType::ARKUI_ACCESSIBILITY_NATIVE_EVENT_TYPE_ACCESSIBILITY_FOCUSED) { - ARKUI_ACCESSIBILITY_CALL_CHECK( - OH_ArkUI_AccessibilityElementInfoSetAccessibilityFocused(_elementInfo, true) - ); - } + // 将eventinfo事件和当前elementinfo进行绑定 + auto OH_ArkUI_AccessibilityEventSetElementInfo = + OhosAccessibilityDDL::DLLoadSetEventElemFunc(ArkUIAccessibilityConstant::ARKUI_EVENT_SET_NODE); + CHECK_DLL_NULL_PTR(OH_ArkUI_AccessibilityEventSetElementInfo); + ARKUI_ACCESSIBILITY_CALL_CHECK(OH_ArkUI_AccessibilityEventSetElementInfo(eventInfo, _elementInfo)); - // 3.设置发送事件,如配置获焦、失焦、点击、滑动事件 + // 设置发送事件,如配置获焦、失焦、点击、滑动事件 auto OH_ArkUI_AccessibilityEventSetEventType = OhosAccessibilityDDL::DLLoadSetEventFunc(ArkUIAccessibilityConstant::ARKUI_SET_EVENT_TYPE); CHECK_DLL_NULL_PTR(OH_ArkUI_AccessibilityEventSetEventType); ARKUI_ACCESSIBILITY_CALL_CHECK(OH_ArkUI_AccessibilityEventSetEventType(eventInfo, eventType)); - // 4.将eventinfo事件和当前elementinfo进行绑定 - auto OH_ArkUI_AccessibilityEventSetElementInfo = - OhosAccessibilityDDL::DLLoadSetEventElemFunc(ArkUIAccessibilityConstant::ARKUI_EVENT_SET_NODE); - CHECK_DLL_NULL_PTR(OH_ArkUI_AccessibilityEventSetElementInfo); - ARKUI_ACCESSIBILITY_CALL_CHECK(OH_ArkUI_AccessibilityEventSetElementInfo(eventInfo, _elementInfo)); - - // 5.调用接口发送到ohos侧 + // 调用接口发送到ohos侧 auto callback = [](int32_t errorCode) { FML_DLOG(INFO) << "Flutter_SendAccessibilityAsyncEvent callback-> errorCode =" << errorCode; }; - // 6.发送event到OH侧 + // 发送event到OH侧 auto OH_ArkUI_SendAccessibilityAsyncEvent = OhosAccessibilityDDL::DLLoadSendAsyncEventFunc(ArkUIAccessibilityConstant::ARKUI_SEND_A11Y_EVENT); CHECK_DLL_NULL_PTR(OH_ArkUI_SendAccessibilityAsyncEvent); OH_ArkUI_SendAccessibilityAsyncEvent(provider_, eventInfo, callback); - // 7.销毁新创建的elementinfo, eventinfo + // 销毁新创建的elementinfo, eventinfo auto OH_ArkUI_DestoryAccessibilityElementInfo = OhosAccessibilityDDL::DLLoadDestroyElemFunc(ArkUIAccessibilityConstant::ARKUI_DESTORY_NODE); CHECK_DLL_NULL_PTR(OH_ArkUI_DestoryAccessibilityElementInfo); @@ -1934,8 +1979,6 @@ void OhosAccessibilityBridge::ClearFlutterSemanticsCaches() g_flutterSemanticsTree.clear(); g_parentChildIdVec.clear(); g_screenRectMap.clear(); - g_actions_mp.clear(); - g_flutterNavigationVec.clear(); } /** diff --git a/shell/platform/ohos/accessibility/ohos_accessibility_bridge.h b/shell/platform/ohos/accessibility/ohos_accessibility_bridge.h index 3e61c171ab..257adf502f 100644 --- a/shell/platform/ohos/accessibility/ohos_accessibility_bridge.h +++ b/shell/platform/ohos/accessibility/ohos_accessibility_bridge.h @@ -96,8 +96,12 @@ public: fml::MallocMapping args); void Announce(std::unique_ptr& message); + void OnTap(int32_t nodeId); + void OnLongPress(int32_t nodeId); + void OnTooltip(std::unique_ptr& message); SemanticsNodeExtent GetFlutterSemanticsNode(int32_t id); + int32_t GetParentId(int64_t elementId); int32_t FindAccessibilityNodeInfosById( int64_t elementId, @@ -132,7 +136,9 @@ public: void Flutter_SendAccessibilityAsyncEvent( int64_t elementId, ArkUI_AccessibilityEventType eventType); - int32_t GetParentId(int64_t elementId); + void Flutter_SendAccessibilityAnnounceEvent( + std::unique_ptr& message, + ArkUI_AccessibilityEventType eventType); void FlutterRelativeRectToScreenRect(SemanticsNodeExtent node); AbsoluteRect GetAbsoluteScreenRect(SemanticsNodeExtent& flutterNode); @@ -152,17 +158,15 @@ public: private: OhosAccessibilityBridge() = default; + bool isAccessibilityEnabled_ = false; static std::unique_ptr bridgeInstance_; - std::shared_ptr nativeAccessibilityChannel_; std::shared_ptr accessibilityFeatures_; std::vector> g_parentChildIdVec; std::map g_flutterSemanticsTree; std::unordered_map g_screenRectMap; - std::unordered_map g_actions_mp; - std::vector g_flutterNavigationVec; - + SemanticsNodeExtent inputFocusedNode; SemanticsNodeExtent lastInputFocusedNode; SemanticsNodeExtent accessibilityFocusedNode; diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/cpp/types/libflutter/index.d.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/cpp/types/libflutter/index.d.ets index 629988a893..279c97baa1 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/cpp/types/libflutter/index.d.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/cpp/types/libflutter/index.d.ets @@ -148,7 +148,13 @@ export const nativeSetAccessibilityFeatures: (accessibilityFeatureFlags: number, export const nativeAccessibilityStateChange: (nativeShellHolderId: number, state: Boolean) => void; -export const nativeAnnounce: (message: string) => void; +export const nativeAccessibilityAnnounce: (message: string) => void; + +export const nativeAccessibilityOnTap: (nodeId: number) => void; + +export const nativeAccessibilityOnLongPress: (nodeId: number) => void; + +export const nativeAccessibilityOnTooltip: (message: string) => void; export const nativeSetSemanticsEnabled: (nativeShellHolderId: number, enabled: boolean) => void; diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/systemchannels/AccessibilityChannel.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/systemchannels/AccessibilityChannel.ets index bbc5a658ea..1a6eba7bc9 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/systemchannels/AccessibilityChannel.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/systemchannels/AccessibilityChannel.ets @@ -122,24 +122,32 @@ export interface AccessibilityMessageHandler extends AccessibilityDelegate { announce(message: string): void; onTap(nodeId: number): void; onLongPress(nodeId: number): void; - onTooltip(nodeId: string): void; + onTooltip(message: string): void; } export class DefaultHandler implements AccessibilityMessageHandler { - private static TAG = "AccessibilityMessageHandler"; + private static TAG = "AccessibilityMessageHandler"; + announce(message: string): void { Log.i(DefaultHandler.TAG, "handler announce."); - flutter.nativeAnnounce(message); + flutter.nativeAccessibilityAnnounce(message); } + onTap(nodeId: number): void { Log.i(DefaultHandler.TAG, "handler onTap."); + flutter.nativeAccessibilityOnTap(nodeId); } + onLongPress(nodeId: number): void { Log.i(DefaultHandler.TAG, "handler onLongPress."); + flutter.nativeAccessibilityOnLongPress(nodeId); } - onTooltip(nodeId: string): void { + + onTooltip(message: string): void { Log.i(DefaultHandler.TAG, "handler onTooltip."); + flutter.nativeAccessibilityOnTooltip(message); } + updateSemantics(buffer: ByteBuffer, strings: string[], stringAttributeArgs: ByteBuffer[]): void { Log.i(DefaultHandler.TAG, "handler updateSemantics"); } diff --git a/shell/platform/ohos/library_loader.cpp b/shell/platform/ohos/library_loader.cpp index 4f7216d73e..7b2c7da1c0 100644 --- a/shell/platform/ohos/library_loader.cpp +++ b/shell/platform/ohos/library_loader.cpp @@ -146,8 +146,17 @@ static napi_value Init(napi_env env, napi_value exports) { "nativeAccessibilityStateChange", flutter::PlatformViewOHOSNapi::nativeAccessibilityStateChange), DECLARE_NAPI_FUNCTION( - "nativeAnnounce", - flutter::PlatformViewOHOSNapi::nativeAnnounce), + "nativeAccessibilityAnnounce", + flutter::PlatformViewOHOSNapi::nativeAccessibilityAnnounce), + DECLARE_NAPI_FUNCTION( + "nativeAccessibilityOnTap", + flutter::PlatformViewOHOSNapi::nativeAccessibilityOnTap), + DECLARE_NAPI_FUNCTION( + "nativeAccessibilityOnLongPress", + flutter::PlatformViewOHOSNapi::nativeAccessibilityOnLongPress), + DECLARE_NAPI_FUNCTION( + "nativeAccessibilityOnTooltip", + flutter::PlatformViewOHOSNapi::nativeAccessibilityOnTooltip), DECLARE_NAPI_FUNCTION( "nativeSetSemanticsEnabled", flutter::PlatformViewOHOSNapi::nativeSetSemanticsEnabled), diff --git a/shell/platform/ohos/napi/platform_view_ohos_napi.cpp b/shell/platform/ohos/napi/platform_view_ohos_napi.cpp index 431ff15b31..33535deff8 100644 --- a/shell/platform/ohos/napi/platform_view_ohos_napi.cpp +++ b/shell/platform/ohos/napi/platform_view_ohos_napi.cpp @@ -40,6 +40,7 @@ namespace flutter { napi_env PlatformViewOHOSNapi::env_; std::vector PlatformViewOHOSNapi::system_languages; int64_t PlatformViewOHOSNapi::napi_shell_holder_id_; +const int32_t PlatformViewOHOSNapi::OHOS_API_VERSION = OH_GetSdkApiVersion(); /** * @brief send empty PlatformMessage @@ -1881,7 +1882,7 @@ napi_value PlatformViewOHOSNapi::nativeAccessibilityStateChange( return nullptr; } -napi_value PlatformViewOHOSNapi::nativeAnnounce( +napi_value PlatformViewOHOSNapi::nativeAccessibilityAnnounce( napi_env env, napi_callback_info info) { size_t argc = 1; @@ -1895,8 +1896,8 @@ napi_value PlatformViewOHOSNapi::nativeAnnounce( auto char_array = std::make_unique(null_terminated_length); napi_get_value_string_utf8(env, args[0], char_array.get(), null_terminated_length, nullptr); - LOGD("PlatformViewOHOSNapi::nativeAnnounce message: %{public}s", char_array.get()); - const int32_t OHOS_API_VERSION = OH_GetSdkApiVersion(); + LOGD("PlatformViewOHOSNapi::nativeAccessibilityAnnounce message: %{public}s", char_array.get()); + if (OHOS_API_VERSION >= 13) { auto handler = std::make_shared(); handler->Announce(char_array); @@ -1904,6 +1905,65 @@ napi_value PlatformViewOHOSNapi::nativeAnnounce( return nullptr; } +napi_value PlatformViewOHOSNapi::nativeAccessibilityOnTap( + napi_env env, + napi_callback_info info) { + size_t argc = 1; + napi_value args[1] = {nullptr}; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + + int32_t nodeId; + napi_get_value_int32(env, args[0], &nodeId); + + if (OHOS_API_VERSION >= 13) { + auto handler = std::make_shared(); + handler->OnTap(nodeId); + LOGI("nativeAccessibilityOnTap -> nodeId:%{public}d", nodeId); + } + return nullptr; +} + +napi_value PlatformViewOHOSNapi::nativeAccessibilityOnLongPress( + napi_env env, + napi_callback_info info) { + size_t argc = 1; + napi_value args[1] = {nullptr}; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + + int32_t nodeId; + napi_get_value_int32(env, args[0], &nodeId);; + + if (OHOS_API_VERSION >= 13) { + auto handler = std::make_shared(); + handler->OnLongPress(nodeId); + LOGI("nativeAccessibilityOnLongPress -> nodeId:%{public}d", nodeId); + } + return nullptr; +} + +napi_value PlatformViewOHOSNapi::nativeAccessibilityOnTooltip( + napi_env env, + napi_callback_info info) { + size_t argc = 1; + napi_value args[1] = {nullptr}; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + + size_t length = 0; + napi_get_value_string_utf8(env, args[0], nullptr, 0, &length); + + auto null_terminated_length = length + 1; + auto char_array = std::make_unique(null_terminated_length); + napi_get_value_string_utf8(env, args[0], char_array.get(), + null_terminated_length, nullptr); + LOGD("PlatformViewOHOSNapi::nativeAccessibilityOnTooltip message: %{public}s", char_array.get()); + +if (OHOS_API_VERSION >= 13) { + auto handler = std::make_shared(); + handler->OnTooltip(char_array); + } + return nullptr; +} + napi_value PlatformViewOHOSNapi::nativeSetSemanticsEnabled(napi_env env, napi_callback_info info) { napi_status ret; size_t argc = 2; diff --git a/shell/platform/ohos/napi/platform_view_ohos_napi.h b/shell/platform/ohos/napi/platform_view_ohos_napi.h index b246ad75c0..013557aeae 100644 --- a/shell/platform/ohos/napi/platform_view_ohos_napi.h +++ b/shell/platform/ohos/napi/platform_view_ohos_napi.h @@ -219,7 +219,16 @@ class PlatformViewOHOSNapi { static napi_value nativeAccessibilityStateChange( napi_env env, napi_callback_info info); - static napi_value nativeAnnounce( + static napi_value nativeAccessibilityAnnounce( + napi_env env, + napi_callback_info info); + static napi_value nativeAccessibilityOnTap( + napi_env env, + napi_callback_info info); + static napi_value nativeAccessibilityOnLongPress( + napi_env env, + napi_callback_info info); + static napi_value nativeAccessibilityOnTooltip( napi_env env, napi_callback_info info); static napi_value nativeSetSemanticsEnabled(napi_env env, napi_callback_info info); @@ -266,6 +275,7 @@ class PlatformViewOHOSNapi { static std::vector system_languages; fml::RefPtr platform_task_runner_; static int64_t napi_shell_holder_id_; + static const int32_t OHOS_API_VERSION; }; } // namespace flutter -- Gitee