From 92473e98e7ee0bade0402251d03d68579f455e48 Mon Sep 17 00:00:00 2001 From: zjxi Date: Sat, 28 Dec 2024 18:26:07 +0800 Subject: [PATCH 1/4] =?UTF-8?q?refactor:=E5=87=8F=E5=B0=91xcomponent?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E6=97=B6=E5=8D=B3=E8=8E=B7=E5=8F=96=E6=97=A0?= =?UTF-8?q?=E9=9A=9C=E7=A2=8D=E6=A1=A5=E6=8E=A5=E5=8D=95=E4=BE=8B=E7=B1=BB?= =?UTF-8?q?=E7=9A=84=E9=A2=9D=E5=A4=96=E5=BC=80=E9=94=80=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=9E=84=E9=80=A0=E5=87=BD=E6=95=B0=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E5=88=97=E8=A1=A8=E8=BF=9B=E8=A1=8C=E6=88=90=E5=91=98?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zjxi --- .../accessibility/ohos_accessibility_bridge.cpp | 9 +++++++-- .../ohos/accessibility/ohos_accessibility_bridge.h | 6 +++--- .../platform/ohos/napi/platform_view_ohos_napi.cpp | 7 ++----- shell/platform/ohos/ohos_xcomponent_adapter.cpp | 13 +++++-------- shell/platform/ohos/ohos_xcomponent_adapter.h | 1 + 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/shell/platform/ohos/accessibility/ohos_accessibility_bridge.cpp b/shell/platform/ohos/accessibility/ohos_accessibility_bridge.cpp index 27ce3230a4..b3a8116f59 100644 --- a/shell/platform/ohos/accessibility/ohos_accessibility_bridge.cpp +++ b/shell/platform/ohos/accessibility/ohos_accessibility_bridge.cpp @@ -23,6 +23,7 @@ #include "flutter/shell/platform/ohos/ohos_shell_holder.h" #include "third_party/skia/include/core/SkMatrix.h" #include "third_party/skia/include/core/SkScalar.h" +#include "flutter/shell/platform/ohos/ohos_xcomponent_adapter.h" namespace flutter { @@ -42,6 +43,9 @@ OhosAccessibilityBridge* OhosAccessibilityBridge::GetInstance() return bridgeInstance_.get(); } +OhosAccessibilityBridge::OhosAccessibilityBridge() + : isFlutterNavigated_(false), provider_(nullptr) {} + /** * 监听当前ohos平台是否开启无障碍屏幕朗读服务 */ @@ -50,6 +54,7 @@ void OhosAccessibilityBridge::OnOhosAccessibilityStateChange( bool ohosAccessibilityEnabled) { native_shell_holder_id_ = shellHolderId; + provider_ = XComponentAdapter::GetInstance()->accessibilityProvider_; nativeAccessibilityChannel_ = std::make_shared(); accessibilityFeatures_ = std::make_shared(); @@ -79,12 +84,12 @@ void OhosAccessibilityBridge::UpdateSemantics( std::vector updatedFlutterNodes; // 当flutter页面状态更新(路由新页面)时,自动请求root节点组件获焦(规避滑动组件更新干扰) - if (IS_FLUTTER_NAVIGATE) { + if (isFlutterNavigated_) { Flutter_SendAccessibilityAsyncEvent(0, ArkUI_AccessibilityEventType:: ARKUI_ACCESSIBILITY_NATIVE_EVENT_TYPE_PAGE_STATE_UPDATE); RequestFocusWhenPageUpdate(0); - IS_FLUTTER_NAVIGATE = false; + isFlutterNavigated_ = false; } /** 获取并分析每个语义节点的更新属性 */ diff --git a/shell/platform/ohos/accessibility/ohos_accessibility_bridge.h b/shell/platform/ohos/accessibility/ohos_accessibility_bridge.h index 257adf502f..98dc4dd93e 100644 --- a/shell/platform/ohos/accessibility/ohos_accessibility_bridge.h +++ b/shell/platform/ohos/accessibility/ohos_accessibility_bridge.h @@ -78,9 +78,9 @@ public: OhosAccessibilityBridge(const OhosAccessibilityBridge&) = delete; OhosAccessibilityBridge& operator=(const OhosAccessibilityBridge&) = delete; - bool IS_FLUTTER_NAVIGATE = false; + bool isFlutterNavigated_; int64_t native_shell_holder_id_; - ArkUI_AccessibilityProvider* provider_ = nullptr; + ArkUI_AccessibilityProvider* provider_; void OnOhosAccessibilityStateChange( int64_t shellHolderId, @@ -157,7 +157,7 @@ public: void ClearFlutterSemanticsCaches(); private: - OhosAccessibilityBridge() = default; + OhosAccessibilityBridge(); bool isAccessibilityEnabled_ = false; static std::unique_ptr bridgeInstance_; std::shared_ptr nativeAccessibilityChannel_; diff --git a/shell/platform/ohos/napi/platform_view_ohos_napi.cpp b/shell/platform/ohos/napi/platform_view_ohos_napi.cpp index 33535deff8..1fc61d507a 100644 --- a/shell/platform/ohos/napi/platform_view_ohos_napi.cpp +++ b/shell/platform/ohos/napi/platform_view_ohos_napi.cpp @@ -1872,10 +1872,8 @@ napi_value PlatformViewOHOSNapi::nativeAccessibilityStateChange( (state ? "true" : "false")); //send to accessibility bridge - const int32_t OHOS_API_VERSION = OH_GetSdkApiVersion(); if (OHOS_API_VERSION >= 13) { - auto a11y_bridge = OhosAccessibilityBridge::GetInstance(); - a11y_bridge->OnOhosAccessibilityStateChange(shell_holder_id, state); + OhosAccessibilityBridge::GetInstance()->OnOhosAccessibilityStateChange(shell_holder_id, state); } FML_DLOG(INFO) << "nativeAccessibilityStateChange: state=" << state << " shell_holder_id=" << shell_holder_id; @@ -2169,8 +2167,7 @@ napi_value PlatformViewOHOSNapi::nativeGetFlutterNavigationAction(napi_env env, return nullptr; } - auto ohosAccessibilityBridge = OhosAccessibilityBridge::GetInstance(); - ohosAccessibilityBridge->IS_FLUTTER_NAVIGATE = isNavigate; + OhosAccessibilityBridge::GetInstance()->isFlutterNavigated_ = isNavigate; FML_DLOG(INFO) << "PlatformViewOHOSNapi::nativeGetFlutterNavigationAction -> "<provider_ = accessibilityProvider; - + XComponentAdapter::GetInstance()->accessibilityProvider_ = a11yProvider; LOGI("XComponentBase::SetNativeXComponent OH_ArkUI_AccessibilityProviderRegisterCallback is succeed"); } @@ -404,7 +401,7 @@ void XComponentBase::SetNativeXComponent(OH_NativeXComponent* nativeXComponent){ BindXComponentCallback(); OH_NativeXComponent_RegisterCallback(nativeXComponent_, &callback_); OH_NativeXComponent_RegisterMouseEventCallback(nativeXComponent_, &mouseCallback_); - // 注册ArkUI无障碍服务 + // register the OH_ArkUI accessibility callbacks RegisterArkUIAccessibilityService(nativeXComponent_); } } diff --git a/shell/platform/ohos/ohos_xcomponent_adapter.h b/shell/platform/ohos/ohos_xcomponent_adapter.h index cf370fa62c..24fd7b0e7e 100644 --- a/shell/platform/ohos/ohos_xcomponent_adapter.h +++ b/shell/platform/ohos/ohos_xcomponent_adapter.h @@ -84,6 +84,7 @@ class XComponentAdapter { public: std::map xcomponetMap_; + ArkUI_AccessibilityProvider* accessibilityProvider_; private: static XComponentAdapter mXComponentAdapter; -- Gitee From 8c9d2a127c3e644ca1853fe5c1625214e83bd44d Mon Sep 17 00:00:00 2001 From: zjxi Date: Mon, 30 Dec 2024 19:35:44 +0800 Subject: [PATCH 2/4] =?UTF-8?q?refactor:=E5=88=A0=E5=87=8F=E5=86=97?= =?UTF-8?q?=E4=BD=99=E4=BB=A3=E7=A0=81,=E4=BC=98=E5=8C=96=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E6=96=B9=E6=B3=95=E6=89=A7=E8=A1=8C=E6=95=88=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zjxi --- .../native_accessibility_channel.cpp | 15 ++-- .../ohos_accessibility_bridge.cpp | 79 ++++++++----------- 2 files changed, 36 insertions(+), 58 deletions(-) diff --git a/shell/platform/ohos/accessibility/native_accessibility_channel.cpp b/shell/platform/ohos/accessibility/native_accessibility_channel.cpp index d93a12e20e..b772ab6603 100644 --- a/shell/platform/ohos/accessibility/native_accessibility_channel.cpp +++ b/shell/platform/ohos/accessibility/native_accessibility_channel.cpp @@ -83,8 +83,7 @@ namespace flutter { flutter::SemanticsNodeUpdates update, flutter::CustomAccessibilityActionUpdates actions) { - auto ohos_a11y_bridge = OhosAccessibilityBridge::GetInstance(); - ohos_a11y_bridge->UpdateSemantics(update, actions); + OhosAccessibilityBridge::GetInstance()->UpdateSemantics(update, actions); } /** @@ -102,8 +101,7 @@ namespace flutter { void NativeAccessibilityChannel::AccessibilityMessageHandler::Announce( std::unique_ptr& message) { - auto ohos_a11y_bridge = OhosAccessibilityBridge::GetInstance(); - ohos_a11y_bridge->Announce(message); + OhosAccessibilityBridge::GetInstance()->Announce(message); } /** @@ -112,8 +110,7 @@ namespace flutter { void NativeAccessibilityChannel::AccessibilityMessageHandler::OnTap( int32_t nodeId) { - auto ohos_a11y_bridge = OhosAccessibilityBridge::GetInstance(); - ohos_a11y_bridge->OnTap(nodeId); + OhosAccessibilityBridge::GetInstance()->OnTap(nodeId); } /** @@ -122,8 +119,7 @@ namespace flutter { void NativeAccessibilityChannel::AccessibilityMessageHandler::OnLongPress( int32_t nodeId) { - auto ohos_a11y_bridge = OhosAccessibilityBridge::GetInstance(); - ohos_a11y_bridge->OnLongPress(nodeId); + OhosAccessibilityBridge::GetInstance()->OnLongPress(nodeId); } /** @@ -132,7 +128,6 @@ namespace flutter { void NativeAccessibilityChannel::AccessibilityMessageHandler::OnTooltip( std::unique_ptr& message) { - auto ohos_a11y_bridge = OhosAccessibilityBridge::GetInstance(); - ohos_a11y_bridge->OnTooltip(message); + OhosAccessibilityBridge::GetInstance()->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 b3a8116f59..e6909b5f99 100644 --- a/shell/platform/ohos/accessibility/ohos_accessibility_bridge.cpp +++ b/shell/platform/ohos/accessibility/ohos_accessibility_bridge.cpp @@ -93,7 +93,7 @@ void OhosAccessibilityBridge::UpdateSemantics( } /** 获取并分析每个语义节点的更新属性 */ - for (auto& item : update) { + for (const auto& item : update) { // 获取当前更新的节点node const auto& node = item.second; @@ -464,24 +464,18 @@ std::pair OhosAccessibilityBridge::GetRealScaleFactor() } /** - * flutter无障碍语义树的子节点相对坐标系转化为屏幕绝对坐标的映射算法 - * 目前暂未考虑旋转、透视场景,不影响屏幕朗读功能 + * flutter语义树中相对坐标系转化为屏幕绝对坐标的映射算法实现 + * NOTE:目前暂未考虑旋转、透视场景,不影响屏幕朗读功能 + * (SkMatrix::kMSkewX, SkMatrix::kMSkewY, SkMatrix::kMPersp0, + * SkMatrix::kMPersp1, SkMatrix::kMPersp2) */ void OhosAccessibilityBridge::FlutterRelativeRectToScreenRect( SemanticsNodeExtent currNode) { // 获取当前flutter节点的相对rect - auto currLeft = static_cast(currNode.rect.fLeft); - auto currTop = static_cast(currNode.rect.fTop); - auto currRight = static_cast(currNode.rect.fRight); - auto currBottom = static_cast(currNode.rect.fBottom); + auto [currLeft, currTop, currRight, currBottom] = currNode.rect; - /** - * 获取当前flutter节点的缩放、平移、透视等矩阵坐标转换 - * 以下矩阵坐标变换参数(如:旋转/错切、透视)场景目前暂不考虑 - * NOTE: SkMatrix::kMSkewX, SkMatrix::kMSkewY, - * SkMatrix::kMPersp0, SkMatrix::kMPersp1, SkMatrix::kMPersp2 - */ + // 获取当前flutter节点的缩放、平移、透视等矩阵坐标转换以下矩阵坐标变换参数 SkMatrix transform = currNode.transform.asM33(); auto _kMScaleX = transform.get(SkMatrix::kMScaleX); auto _kMTransX = transform.get(SkMatrix::kMTransX); @@ -491,7 +485,7 @@ void OhosAccessibilityBridge::FlutterRelativeRectToScreenRect( // 获取当前flutter节点的父节点的相对rect int32_t parentId = GetParentId(currNode.id); auto parentNode = GetFlutterSemanticsNode(parentId); - if (!g_flutterSemanticsTree.count(parentId)) { + if (g_flutterSemanticsTree.find(parentId) != g_flutterSemanticsTree.end()) { LOGE("FlutterRelativeRectToScreenRect: GetFlutterSemanticsNode id=%{public}d null", parentId); } @@ -507,41 +501,30 @@ void OhosAccessibilityBridge::FlutterRelativeRectToScreenRect( // 获取真实缩放系数 auto [realScaleXFactor, realScaleYFactor] = GetRealScaleFactor(); - // 更新后的节点屏幕坐标 - float newLeft = 0.0; - float newTop = 0.0; - float newRight = 0.0; - float newBottom = 0.0; - - if (_kMScaleX > 1 && _kMScaleY > 1) { - // 子节点相对父节点进行变化(缩放、 平移) - newLeft = currLeft + _kMTransX * _kMScaleX; - newTop = currTop + _kMTransY * _kMScaleY; - newRight = currRight * _kMScaleX; - newBottom = currBottom * _kMScaleY; - // 更新当前flutter节点currNode的相对坐标 -> 屏幕绝对坐标 - SetAbsoluteScreenRect(currNode, newLeft, newTop, newRight, newBottom); + // 更新后的节点屏幕坐标,子节点的屏幕绝对坐标转换,包括offset偏移值计算、缩放系数变换 + bool isRectScaleChanged = _kMScaleX > 1 && _kMScaleY > 1; + float newLeft = isRectScaleChanged ? + currLeft + _kMTransX * _kMScaleX : (currLeft + _kMTransX) * realScaleXFactor + realParentLeft; + float newTop = isRectScaleChanged ? + currTop + _kMTransY * _kMScaleY : (currTop + _kMTransY) * realScaleYFactor + realParentTop; + float newRight = isRectScaleChanged ? + currRight * _kMScaleX : newLeft + currRight * realScaleXFactor; + float newBottom = isRectScaleChanged ? + currBottom * _kMScaleY : newTop + currBottom * realScaleYFactor; + + // 若子节点rect超过父节点则跳过显示(单个屏幕显示不下,滑动再重新显示) + const bool isExceedScreeArea = newLeft < realParentLeft || newTop < realParentTop || + newRight > realParentRight || newBottom > realParentBottom || + newLeft >= newRight || newTop >= newBottom || + newRight > rootWidth || newBottom > rootHeight; + if (isExceedScreeArea) { + FML_DLOG(WARNING) << "RelativeRectToScreenRect -> childRect exceeds parentRect {Id: " + << currNode.id << ", (" << newLeft << ", " << newTop + << ", " << newRight << ", " << newBottom << ")}"; + // 防止滑动场景下绿框坐标超出屏幕范围,进行正则化处理 + SetAbsoluteScreenRect(currNode, rootWidth, rootHeight, 0, 0); } else { - // 子节点的屏幕绝对坐标转换,包括offset偏移值计算、缩放系数变换 - newLeft = (currLeft + _kMTransX) * realScaleXFactor + realParentLeft; - newTop = (currTop + _kMTransY) * realScaleYFactor + realParentTop; - newRight = newLeft + currRight * realScaleXFactor; - newBottom = newTop + currBottom * realScaleYFactor; - - // 若子节点rect超过父节点则跳过显示(单个屏幕显示不下,滑动再重新显示) - const bool IS_OVER_SCREEN_AREA = newLeft < realParentLeft || newTop < realParentTop || - newRight > realParentRight || newBottom > realParentBottom || - newLeft >= newRight || newTop >= newBottom || - newRight > rootWidth || newBottom > rootHeight; - if (IS_OVER_SCREEN_AREA) { - FML_DLOG(WARNING) << "RelativeRectToScreenRect -> childRect exceeds parentRect {Id: " - << currNode.id << ", (" << newLeft << ", " << newTop - << ", " << newRight << ", " << newBottom << ")}"; - // 防止滑动场景下绿框坐标超出屏幕范围,进行正则化处理 - SetAbsoluteScreenRect(currNode, rootWidth, rootHeight, 0, 0); - } else { - SetAbsoluteScreenRect(currNode, newLeft, newTop, newRight, newBottom); - } + SetAbsoluteScreenRect(currNode, newLeft, newTop, newRight, newBottom); } } -- Gitee From 0aa2bbe313733d0a3fed63d74a174cef80fc21ac Mon Sep 17 00:00:00 2001 From: zjxi Date: Tue, 31 Dec 2024 19:27:00 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E5=BC=80=E5=90=AF?= =?UTF-8?q?=E6=97=A0=E9=9A=9C=E7=A2=8D=E6=9C=8D=E5=8A=A1=E5=86=8D=E5=86=B7?= =?UTF-8?q?=E5=90=AF=E5=8A=A8app=E9=80=A0=E6=88=90=E7=9A=84=E5=85=88?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E5=86=8D=E6=B3=A8=E5=86=8C=E7=9A=84bug?= =?UTF-8?q?=EF=BC=8C=E5=AF=BC=E8=87=B4=E6=97=A0=E9=9A=9C=E7=A2=8D=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E4=B8=AD=E4=BA=8B=E4=BB=B6=E5=8F=91=E9=80=81=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E7=9A=84provider=E6=8C=87=E9=92=88=E4=B8=BA=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zjxi --- .../ohos_accessibility_bridge.cpp | 17 +++++++++--- .../accessibility/ohos_accessibility_bridge.h | 2 +- .../ets/embedding/ohos/FlutterAbility.ets | 8 ------ .../main/ets/embedding/ohos/FlutterPage.ets | 2 ++ .../flutter/src/main/ets/view/FlutterView.ets | 10 +++++++ .../platform/ohos/ohos_xcomponent_adapter.cpp | 26 ++++++++----------- shell/platform/ohos/ohos_xcomponent_adapter.h | 1 - 7 files changed, 37 insertions(+), 29 deletions(-) diff --git a/shell/platform/ohos/accessibility/ohos_accessibility_bridge.cpp b/shell/platform/ohos/accessibility/ohos_accessibility_bridge.cpp index e6909b5f99..d173fdba5c 100644 --- a/shell/platform/ohos/accessibility/ohos_accessibility_bridge.cpp +++ b/shell/platform/ohos/accessibility/ohos_accessibility_bridge.cpp @@ -44,7 +44,7 @@ OhosAccessibilityBridge* OhosAccessibilityBridge::GetInstance() } OhosAccessibilityBridge::OhosAccessibilityBridge() - : isFlutterNavigated_(false), provider_(nullptr) {} + : isFlutterNavigated_(false), provider_(nullptr), isAccessibilityEnabled_(false) {} /** * 监听当前ohos平台是否开启无障碍屏幕朗读服务 @@ -274,7 +274,10 @@ void OhosAccessibilityBridge::RequestFocusWhenPageUpdate(int32_t requestFocusId) { if (OHOS_API_VERSION < 13) { return; } CHECK_NULL_PTR(provider_, RequestFocusWhenPageUpdate); - + if (provider_ == nullptr) { + return; + } + auto OH_ArkUI_CreateAccessibilityEventInfo = OhosAccessibilityDDL::DLLoadCreateEventInfoFunc(ArkUIAccessibilityConstant::ARKUI_CREATE_EVENT); CHECK_DLL_NULL_PTR(OH_ArkUI_CreateAccessibilityEventInfo); @@ -485,7 +488,7 @@ void OhosAccessibilityBridge::FlutterRelativeRectToScreenRect( // 获取当前flutter节点的父节点的相对rect int32_t parentId = GetParentId(currNode.id); auto parentNode = GetFlutterSemanticsNode(parentId); - if (g_flutterSemanticsTree.find(parentId) != g_flutterSemanticsTree.end()) { + if (g_flutterSemanticsTree.find(parentId) == g_flutterSemanticsTree.end()) { LOGE("FlutterRelativeRectToScreenRect: GetFlutterSemanticsNode id=%{public}d null", parentId); } @@ -1568,7 +1571,12 @@ void OhosAccessibilityBridge::Flutter_SendAccessibilityAnnounceEvent( std::unique_ptr& message, ArkUI_AccessibilityEventType eventType) { - // 创建并设置屏幕朗读事件 + if (OHOS_API_VERSION < 13) { return; } + + CHECK_NULL_PTR(provider_, Flutter_SendAccessibilityAnnounceEvent); + if (provider_ == nullptr) { return; } + + // 创建并设置屏幕朗读事件 auto OH_ArkUI_CreateAccessibilityEventInfo = OhosAccessibilityDDL::DLLoadCreateEventInfoFunc(ArkUIAccessibilityConstant::ARKUI_CREATE_EVENT); CHECK_DLL_NULL_PTR(OH_ArkUI_CreateAccessibilityEventInfo); @@ -1616,6 +1624,7 @@ void OhosAccessibilityBridge::Flutter_SendAccessibilityAsyncEvent( if (OHOS_API_VERSION < 13) { return; } CHECK_NULL_PTR(provider_, Flutter_SendAccessibilityAsyncEvent); + if (provider_ == nullptr) { return; } // 创建eventInfo对象 auto OH_ArkUI_CreateAccessibilityEventInfo = diff --git a/shell/platform/ohos/accessibility/ohos_accessibility_bridge.h b/shell/platform/ohos/accessibility/ohos_accessibility_bridge.h index 98dc4dd93e..d3ae2d4bf2 100644 --- a/shell/platform/ohos/accessibility/ohos_accessibility_bridge.h +++ b/shell/platform/ohos/accessibility/ohos_accessibility_bridge.h @@ -158,7 +158,7 @@ public: private: OhosAccessibilityBridge(); - bool isAccessibilityEnabled_ = false; + bool isAccessibilityEnabled_; static std::unique_ptr bridgeInstance_; std::shared_ptr nativeAccessibilityChannel_; std::shared_ptr accessibilityFeatures_; diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterAbility.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterAbility.ets index 9eb08c3d5e..00bd702866 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterAbility.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterAbility.ets @@ -36,7 +36,6 @@ import appRecovery from '@ohos.app.ability.appRecovery'; import FlutterManager from './FlutterManager'; import { FlutterView } from '../../view/FlutterView'; import ApplicationInfoLoader from '../engine/loader/ApplicationInfoLoader'; -import { accessibility } from '@kit.AccessibilityKit'; import { AccessibilityManager } from '../../view/AccessibilityBridge'; const TAG = "FlutterAbility"; @@ -107,13 +106,6 @@ export class FlutterAbility extends UIAbility implements Host { if (flutterApplicationInfo.isDebugMode) { this.delegate?.initWindow(); } - - //冷启动对os是否开启无障碍服务进行查询 - let accessibilityState: boolean = accessibility.isOpenAccessibilitySync(); - if(accessibilityState) { - this.delegate?.getFlutterNapi()?.accessibilityStateChange(accessibilityState); - } - Log.i(TAG, `accessibility isOpen state -> ${JSON.stringify(accessibilityState)}`); } onDestroy() { diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterPage.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterPage.ets index f5f641c4ec..533e1e6a51 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterPage.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/ohos/FlutterPage.ets @@ -56,6 +56,7 @@ export struct FlutterPage { .onLoad((context) => { this.flutterView?.onSurfaceCreated() Log.d(TAG, "XComponent onLoad "); + this.flutterView?.onAccessibilityIsOpen() }) .onDestroy(() => { Log.d(TAG, "XComponent onDestroy "); @@ -135,6 +136,7 @@ export struct FlutterPage { .onLoad((context) => { this.flutterView?.onSurfaceCreated() Log.d(TAG, "XComponent onLoad "); + this.flutterView?.onAccessibilityIsOpen() }) .onDestroy(() => { Log.d(TAG, "XComponent onDestroy "); diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/view/FlutterView.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/view/FlutterView.ets index afbb97ca41..f6b9d9b7b7 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/view/FlutterView.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/view/FlutterView.ets @@ -492,6 +492,16 @@ export class FlutterView { } } + onAccessibilityIsOpen() { + Log.i(TAG, `accessibility isOpen state -> 1`); + let accessibilityState: boolean = accessibility.isOpenAccessibilitySync(); + if(accessibilityState) { + Log.i(TAG, `accessibility isOpen state -> 2`); + this.flutterEngine?.getFlutterNapi()?.accessibilityStateChange(accessibilityState) + } + Log.i(TAG, `accessibility isOpen state -> ${JSON.stringify(accessibilityState)}`); + } + onAreaChange(newArea: Area | null, setFullScreen: boolean = false) { const originalMetrics = this.viewportMetrics.clone(); diff --git a/shell/platform/ohos/ohos_xcomponent_adapter.cpp b/shell/platform/ohos/ohos_xcomponent_adapter.cpp index b538a7c47a..8490fd1ade 100644 --- a/shell/platform/ohos/ohos_xcomponent_adapter.cpp +++ b/shell/platform/ohos/ohos_xcomponent_adapter.cpp @@ -18,6 +18,7 @@ #include "types.h" #include "ohos_logging.h" #include +#include "flutter/fml/logging.h" namespace flutter { @@ -247,9 +248,8 @@ int32_t FindAccessibilityNodeInfosById( int32_t requestId, ArkUI_AccessibilityElementInfoList* elementList) { - auto ohosAccessibilityBridge = OhosAccessibilityBridge::GetInstance(); - ohosAccessibilityBridge->FindAccessibilityNodeInfosById(elementId, mode, requestId, elementList); - LOGD("accessibilityProviderCallback_.FindAccessibilityNodeInfosById"); + OhosAccessibilityBridge::GetInstance()->FindAccessibilityNodeInfosById(elementId, mode, requestId, elementList); + FML_DLOG(INFO) << "accessibilityProviderCallback_.FindAccessibilityNodeInfosById"; return 0; } @@ -260,8 +260,7 @@ int32_t FindAccessibilityNodeInfosByText( int32_t requestId, ArkUI_AccessibilityElementInfoList* elementList) { - auto ohosAccessibilityBridge = OhosAccessibilityBridge::GetInstance(); - ohosAccessibilityBridge->FindAccessibilityNodeInfosByText(elementId, text, requestId, elementList); + OhosAccessibilityBridge::GetInstance()->FindAccessibilityNodeInfosByText(elementId, text, requestId, elementList); LOGD("accessibilityProviderCallback_.FindAccessibilityNodeInfosByText"); return 0; } @@ -273,8 +272,7 @@ int32_t FindFocusedAccessibilityNode( int32_t requestId, ArkUI_AccessibilityElementInfo* elementinfo) { - auto ohosAccessibilityBridge = OhosAccessibilityBridge::GetInstance(); - ohosAccessibilityBridge->FindFocusedAccessibilityNode(elementId, focusType, requestId, elementinfo); + OhosAccessibilityBridge::GetInstance()->FindFocusedAccessibilityNode(elementId, focusType, requestId, elementinfo); LOGD("accessibilityProviderCallback_.FindFocusedAccessibilityNode"); return 0; } @@ -286,8 +284,7 @@ int32_t FindNextFocusAccessibilityNode( int32_t requestId, ArkUI_AccessibilityElementInfo *elementList) { - auto ohosAccessibilityBridge = OhosAccessibilityBridge::GetInstance(); - ohosAccessibilityBridge->FindNextFocusAccessibilityNode(elementId, direction, requestId, elementList); + OhosAccessibilityBridge::GetInstance()->FindNextFocusAccessibilityNode(elementId, direction, requestId, elementList); LOGD("accessibilityProviderCallback_.FindNextFocusAccessibilityNode"); return 0; } @@ -299,8 +296,7 @@ int32_t ExecuteAccessibilityAction( ArkUI_AccessibilityActionArguments* actionArguments, int32_t requestId) { - auto ohosAccessibilityBridge = OhosAccessibilityBridge::GetInstance(); - ohosAccessibilityBridge->ExecuteAccessibilityAction(elementId, action, actionArguments, requestId); + OhosAccessibilityBridge::GetInstance()->ExecuteAccessibilityAction(elementId, action, actionArguments, requestId); LOGD("accessibilityProviderCallback_.ExecuteAccessibilityAction"); return 0; } @@ -318,8 +314,7 @@ int32_t GetAccessibilityNodeCursorPosition( int32_t requestId, int32_t* index) { - auto ohosAccessibilityBridge = OhosAccessibilityBridge::GetInstance(); - ohosAccessibilityBridge->GetAccessibilityNodeCursorPosition(elementId, requestId, index); + OhosAccessibilityBridge::GetInstance()->GetAccessibilityNodeCursorPosition(elementId, requestId, index); LOGD("accessibilityProviderCallback_.GetAccessibilityNodeCursorPosition"); return 0; } @@ -373,12 +368,12 @@ void XComponentBase::RegisterArkUIAccessibilityService(OH_NativeXComponent* nati { if (OH_GetSdkApiVersion() < 13) { return; } LOGD("api version: %{public}d", OH_GetSdkApiVersion()); + BindAccessibilityProviderCallback(); auto OH_NativeXComponent_GetNativeAccessibilityProvider = OhosAccessibilityDDL::DLLoadGetNativeA11yProvider(ArkUIAccessibilityConstant::OH_GET_A11Y_PROVIDER); CHECK_DLL_NULL_PTR(OH_NativeXComponent_GetNativeAccessibilityProvider); - ArkUI_AccessibilityProvider* a11yProvider = nullptr; ARKUI_ACCESSIBILITY_CALL_CHECK( OH_NativeXComponent_GetNativeAccessibilityProvider(nativeXComponent, &a11yProvider) @@ -387,12 +382,13 @@ void XComponentBase::RegisterArkUIAccessibilityService(OH_NativeXComponent* nati auto OH_ArkUI_AccessibilityProviderRegisterCallback = OhosAccessibilityDDL::DLLoadRegisterFunc(ArkUIAccessibilityConstant::ARKUI_REGISTER_CALLBACK); CHECK_DLL_NULL_PTR(OH_ArkUI_AccessibilityProviderRegisterCallback); + CHECK_NULL_PTR(a11yProvider, RegisterArkUIAccessibilityService); ARKUI_ACCESSIBILITY_CALL_CHECK( OH_ArkUI_AccessibilityProviderRegisterCallback(a11yProvider, &accessibilityProviderCallback_) ); XComponentAdapter::GetInstance()->accessibilityProvider_ = a11yProvider; - LOGI("XComponentBase::SetNativeXComponent OH_ArkUI_AccessibilityProviderRegisterCallback is succeed"); + FML_DLOG(INFO) << "RegisterArkUIAccessibilityService is finished"; } void XComponentBase::SetNativeXComponent(OH_NativeXComponent* nativeXComponent){ diff --git a/shell/platform/ohos/ohos_xcomponent_adapter.h b/shell/platform/ohos/ohos_xcomponent_adapter.h index 24fd7b0e7e..529a1d226b 100644 --- a/shell/platform/ohos/ohos_xcomponent_adapter.h +++ b/shell/platform/ohos/ohos_xcomponent_adapter.h @@ -26,7 +26,6 @@ #include "napi_common.h" #include "flutter/shell/platform/ohos/accessibility/ohos_accessibility_bridge.h" #include "flutter/shell/platform/ohos/utils/ddl_utils.h" - namespace flutter { class XComponentBase -- Gitee From 04a209ae64118572a59309c650e8877be7c8236a Mon Sep 17 00:00:00 2001 From: zjxi Date: Tue, 31 Dec 2024 19:34:15 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zjxi --- .../flutter_embedding/flutter/src/main/ets/view/FlutterView.ets | 2 -- 1 file changed, 2 deletions(-) diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/view/FlutterView.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/view/FlutterView.ets index f6b9d9b7b7..c38327f4fb 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/view/FlutterView.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/view/FlutterView.ets @@ -493,10 +493,8 @@ export class FlutterView { } onAccessibilityIsOpen() { - Log.i(TAG, `accessibility isOpen state -> 1`); let accessibilityState: boolean = accessibility.isOpenAccessibilitySync(); if(accessibilityState) { - Log.i(TAG, `accessibility isOpen state -> 2`); this.flutterEngine?.getFlutterNapi()?.accessibilityStateChange(accessibilityState) } Log.i(TAG, `accessibility isOpen state -> ${JSON.stringify(accessibilityState)}`); -- Gitee