mirror of
https://gitee.com/openharmony/arkui_ace_engine
synced 2024-10-07 08:24:11 +00:00
无障碍功能上报
Signed-off-by: Xing guang <xingguang1@huawei.com>
This commit is contained in:
parent
93bbad5b66
commit
8410e4077a
@ -65,6 +65,8 @@ constexpr int32_t UI_EXTENSION_OFFSET_MIN = 1000000;
|
||||
|
||||
constexpr int32_t UI_EXTENSION_ID_21 = 21;
|
||||
constexpr int32_t UI_EXTENSION_ID_10 = 10;
|
||||
constexpr int32_t UI_EXTENSION_LEVEL_MAX = 3;
|
||||
constexpr int32_t UI_EXTENSION_LEVEL_OFFSET = 10;
|
||||
|
||||
struct ActionTable {
|
||||
AceAction aceAction;
|
||||
@ -1583,9 +1585,71 @@ bool JsAccessibilityManager::SendAccessibilitySyncEvent(
|
||||
eventInfo.SetItemCounts(static_cast<int>(accessibilityEvent.itemCount));
|
||||
eventInfo.SetBundleName(AceApplicationInfo::GetInstance().GetPackageName());
|
||||
|
||||
auto pipeline = context_.Upgrade();
|
||||
CHECK_NULL_RETURN(pipeline, false);
|
||||
RefPtr<NG::PipelineContext> ngPipeline;
|
||||
ngPipeline = AceType::DynamicCast<NG::PipelineContext>(pipeline);
|
||||
CHECK_NULL_RETURN(ngPipeline, false);
|
||||
auto uiExtensionManager = ngPipeline->GetUIExtensionManager();
|
||||
CHECK_NULL_RETURN(uiExtensionManager, false);
|
||||
if (uiExtensionManager->IsWindowTypeUIExtension(pipeline)) {
|
||||
auto rootNode = ngPipeline->GetRootElement();
|
||||
CHECK_NULL_RETURN(rootNode, false);
|
||||
auto node = GetInspectorById(rootNode, accessibilityEvent.nodeId);
|
||||
CHECK_NULL_RETURN(node, false);
|
||||
std::vector<int32_t> uiExtensionIdLevelList;
|
||||
return node->SendAccessibilityEventInfo(eventInfo, uiExtensionIdLevelList, pipeline);
|
||||
}
|
||||
|
||||
return client->SendEvent(eventInfo);
|
||||
}
|
||||
|
||||
bool JsAccessibilityManager::SendAccessibilitySyncEvent(
|
||||
const AccessibilityEventInfo& eventInfo, std::vector<int32_t>& uiExtensionIdLevelList)
|
||||
{
|
||||
if (!IsRegister()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (uiExtensionIdLevelList.size() > UI_EXTENSION_LEVEL_MAX) {
|
||||
return false;
|
||||
}
|
||||
auto client = AccessibilitySystemAbilityClient::GetInstance();
|
||||
CHECK_NULL_RETURN(client, false);
|
||||
bool isEnabled = false;
|
||||
client->IsEnabled(isEnabled);
|
||||
if (!isEnabled) {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto pipeline = context_.Upgrade();
|
||||
CHECK_NULL_RETURN(pipeline, false);
|
||||
RefPtr<NG::PipelineContext> ngPipeline;
|
||||
ngPipeline = AceType::DynamicCast<NG::PipelineContext>(pipeline);
|
||||
CHECK_NULL_RETURN(ngPipeline, false);
|
||||
auto uiExtensionManager = ngPipeline->GetUIExtensionManager();
|
||||
CHECK_NULL_RETURN(uiExtensionManager, false);
|
||||
if (uiExtensionManager->IsWindowTypeUIExtension(pipeline)) {
|
||||
auto rootNode = ngPipeline->GetRootElement();
|
||||
CHECK_NULL_RETURN(rootNode, false);
|
||||
return rootNode->SendAccessibilityEventInfo(eventInfo, uiExtensionIdLevelList, pipeline);
|
||||
}
|
||||
|
||||
int32_t wrapLevelid = 0;
|
||||
int32_t startLevelOffset = UI_EXTENSION_OFFSET_MAX;
|
||||
for (auto uiExtensionId : uiExtensionIdLevelList) {
|
||||
if ((startLevelOffset == UI_EXTENSION_OFFSET_MAX && uiExtensionId >= UI_EXTENSION_ID_21) ||
|
||||
(startLevelOffset != UI_EXTENSION_OFFSET_MAX && uiExtensionId >= UI_EXTENSION_ID_10)) {
|
||||
return false;
|
||||
}
|
||||
wrapLevelid = wrapLevelid + uiExtensionId * startLevelOffset;
|
||||
startLevelOffset = startLevelOffset / UI_EXTENSION_LEVEL_OFFSET;
|
||||
}
|
||||
AccessibilityEventInfo eventInfoNew = eventInfo;
|
||||
eventInfoNew.SetSource(wrapLevelid + eventInfo.GetViewId());
|
||||
return client->SendEvent(eventInfoNew);
|
||||
}
|
||||
|
||||
void JsAccessibilityManager::SendAccessibilityAsyncEvent(const AccessibilityEvent& accessibilityEvent)
|
||||
{
|
||||
auto context = GetPipelineContext().Upgrade();
|
||||
|
@ -92,7 +92,8 @@ public:
|
||||
void DeregisterInteractionOperation();
|
||||
bool SendAccessibilitySyncEvent(
|
||||
const AccessibilityEvent& accessibilityEvent, Accessibility::AccessibilityEventInfo eventInfo);
|
||||
|
||||
bool SendAccessibilitySyncEvent(
|
||||
const Accessibility::AccessibilityEventInfo& eventInfo, std::vector<int32_t>& uiExtensionIdLevelList) override;
|
||||
void SearchElementInfoByAccessibilityId(const int32_t elementId, const int32_t requestId,
|
||||
Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t mode, const int32_t windowId);
|
||||
void SearchElementInfosByText(const int32_t elementId, const std::string& text, const int32_t requestId,
|
||||
|
@ -23,7 +23,8 @@
|
||||
|
||||
namespace OHOS::Accessibility {
|
||||
class AccessibilityElementInfo;
|
||||
}
|
||||
class AccessibilityEventInfo;
|
||||
} // namespace OHOS::Accessibility
|
||||
|
||||
namespace OHOS::Ace {
|
||||
|
||||
@ -97,6 +98,11 @@ public:
|
||||
const RefPtr<PipelineBase>& context, const int32_t uiExtensionOffset = 0) = 0;
|
||||
virtual bool ExecuteExtensionActionNG(int32_t elementId, const std::map<std::string, std::string>& actionArguments,
|
||||
int32_t action, const RefPtr<PipelineBase>& context, int32_t uiExtensionOffset) = 0;
|
||||
virtual bool SendAccessibilitySyncEvent(
|
||||
const Accessibility::AccessibilityEventInfo& eventInfo, std::vector<int32_t>& uiExtensionIdLevelList)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
void SetVersion(AccessibilityVersion version)
|
||||
{
|
||||
|
@ -2810,6 +2810,7 @@ void FrameNode::FocusMoveSearchNG(int32_t elementId, int32_t direction,
|
||||
pattern_->FocusMoveSearch(elementId, direction, offset, output);
|
||||
}
|
||||
}
|
||||
|
||||
bool FrameNode::TransferExecuteAction(int32_t elementId, const std::map<std::string, std::string>& actionArguments,
|
||||
int32_t action, int32_t offset)
|
||||
{
|
||||
@ -2819,4 +2820,13 @@ bool FrameNode::TransferExecuteAction(int32_t elementId, const std::map<std::str
|
||||
}
|
||||
return isExecuted;
|
||||
}
|
||||
|
||||
bool FrameNode::SendAccessibilityEventInfo(const Accessibility::AccessibilityEventInfo& eventInfo,
|
||||
std::vector<int32_t>& uiExtensionIdLevelList, const RefPtr<PipelineBase>& pipeline)
|
||||
{
|
||||
if (pattern_) {
|
||||
return pattern_->SendAccessibilityEventInfo(eventInfo, uiExtensionIdLevelList, pipeline);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} // namespace OHOS::Ace::NG
|
||||
|
@ -51,6 +51,7 @@
|
||||
|
||||
namespace OHOS::Accessibility {
|
||||
class AccessibilityElementInfo;
|
||||
class AccessibilityEventInfo;
|
||||
}
|
||||
|
||||
namespace OHOS::Ace::NG {
|
||||
@ -606,6 +607,9 @@ public:
|
||||
int32_t offset, Accessibility::AccessibilityElementInfo& output);
|
||||
bool TransferExecuteAction(int32_t elementId, const std::map<std::string, std::string>& actionArguments,
|
||||
int32_t action, int32_t offset);
|
||||
bool SendAccessibilityEventInfo(const Accessibility::AccessibilityEventInfo& eventInfo,
|
||||
std::vector<int32_t>& uiExtensionIdLevelList, const RefPtr<PipelineBase>& pipeline);
|
||||
|
||||
private:
|
||||
void MarkNeedRender(bool isRenderBoundary);
|
||||
std::pair<float, float> ContextPositionConvertToPX(
|
||||
|
@ -31,6 +31,7 @@
|
||||
|
||||
namespace OHOS::Accessibility {
|
||||
class AccessibilityElementInfo;
|
||||
class AccessibilityEventInfo;
|
||||
}
|
||||
|
||||
namespace OHOS::Ace::NG {
|
||||
@ -419,11 +420,17 @@ public:
|
||||
int32_t baseParent, Accessibility::AccessibilityElementInfo& output) {}
|
||||
virtual void FocusMoveSearch(int32_t elementId, int32_t direction,
|
||||
int32_t baseParent, Accessibility::AccessibilityElementInfo& output) {}
|
||||
virtual bool TransferExecuteAction(int32_t elementId, const std::map<std::string, std::string>& actionArguments,
|
||||
int32_t action, int32_t offset)
|
||||
virtual bool TransferExecuteAction(
|
||||
int32_t elementId, const std::map<std::string, std::string>& actionArguments, int32_t action, int32_t offset)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
virtual bool SendAccessibilityEventInfo(const Accessibility::AccessibilityEventInfo& eventInfo,
|
||||
std::vector<int32_t>& uiExtensionIdLevelList, const RefPtr<PipelineBase>& pipeline)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual int32_t GetUiExtensionId()
|
||||
{
|
||||
return -1;
|
||||
|
@ -15,6 +15,8 @@
|
||||
|
||||
#include "core/components_ng/pattern/ui_extension/ui_extension_manager.h"
|
||||
#include "core/components_ng/pattern/ui_extension/ui_extension_pattern.h"
|
||||
#include "adapter/ohos/entrance/ace_container.h"
|
||||
|
||||
namespace OHOS::Ace::NG {
|
||||
namespace {
|
||||
constexpr int32_t UI_EXTENSION_OFFSET_MIN = 1000000;
|
||||
@ -37,6 +39,13 @@ bool UIExtensionManager::IsWrapExtensionAbilityId(int32_t elementId)
|
||||
return elementId > UI_EXTENSION_OFFSET_MIN;
|
||||
}
|
||||
|
||||
bool UIExtensionManager::IsWindowTypeUIExtension(const RefPtr<PipelineBase>& pipeline)
|
||||
{
|
||||
auto instanceId = pipeline->GetInstanceId();
|
||||
auto window = Platform::AceContainer::GetUIWindow(instanceId);
|
||||
return window->GetType() == OHOS::Rosen::WindowType::WINDOW_TYPE_UI_EXTENSION;
|
||||
}
|
||||
|
||||
std::pair<int32_t, int32_t> UIExtensionManager::UnWrapExtensionAbilityId(
|
||||
int32_t extensionOffset, int32_t elementId)
|
||||
{
|
||||
|
@ -33,6 +33,7 @@ public:
|
||||
bool OnBackPressed();
|
||||
const RefPtr<FrameNode> GetFocusUiExtensionNode();
|
||||
bool IsWrapExtensionAbilityId(int32_t elementId);
|
||||
bool IsWindowTypeUIExtension(const RefPtr<PipelineBase>& pipeline);
|
||||
std::pair<int32_t, int32_t> UnWrapExtensionAbilityId(int32_t extensionOffset, int32_t elementId);
|
||||
|
||||
private:
|
||||
|
@ -94,6 +94,22 @@ public:
|
||||
}, TaskExecutor::TaskType::UI);
|
||||
}
|
||||
|
||||
void OnAccessibilityEvent(
|
||||
const Accessibility::AccessibilityEventInfo& info, const std::vector<int32_t>& uiExtensionIdLevelList) override
|
||||
{
|
||||
auto pipeline = PipelineBase::GetCurrentContext();
|
||||
CHECK_NULL_VOID(pipeline);
|
||||
auto taskExecutor = pipeline->GetTaskExecutor();
|
||||
CHECK_NULL_VOID(taskExecutor);
|
||||
taskExecutor->PostTask(
|
||||
[weak = uiExtensionPattern_, &info, uiExtensionIdLevelList]() {
|
||||
auto pattern = weak.Upgrade();
|
||||
CHECK_NULL_VOID(pattern);
|
||||
pattern->OnAccessibilityEvent(info, uiExtensionIdLevelList);
|
||||
},
|
||||
TaskExecutor::TaskType::UI);
|
||||
}
|
||||
|
||||
private:
|
||||
int32_t instanceId_;
|
||||
WeakPtr<UIExtensionPattern> uiExtensionPattern_;
|
||||
@ -204,6 +220,32 @@ void UIExtensionPattern::OnConnect()
|
||||
}
|
||||
}
|
||||
|
||||
void UIExtensionPattern::OnAccessibilityEvent(
|
||||
const Accessibility::AccessibilityEventInfo& info, std::vector<int32_t> uiExtensionIdLevelList)
|
||||
{
|
||||
CHECK_RUN_ON(UI);
|
||||
LOGI("UIExtension OnAccessibilityEvent called");
|
||||
CHECK_NULL_VOID(session_);
|
||||
ContainerScope scope(instanceId_);
|
||||
auto container = AceType::DynamicCast<Platform::AceContainer>(Container::Current());
|
||||
CHECK_NULL_VOID(container);
|
||||
auto pipelineContext = container->GetPipelineContext();
|
||||
auto ngPipeline = AceType::DynamicCast<NG::PipelineContext>(pipelineContext);
|
||||
if (ngPipeline) {
|
||||
auto window = container->GetUIWindow(instanceId_);
|
||||
CHECK_NULL_VOID(window);
|
||||
if (window->GetType() == Rosen::WindowType::WINDOW_TYPE_UI_EXTENSION) {
|
||||
uiExtensionIdLevelList.insert(uiExtensionIdLevelList.begin(), uiExtensionId_);
|
||||
}
|
||||
auto frontend = container->GetFrontend();
|
||||
CHECK_NULL_VOID(frontend);
|
||||
auto accessibilityManager = frontend->GetAccessibilityManager();
|
||||
if (accessibilityManager) {
|
||||
accessibilityManager->SendAccessibilitySyncEvent(info, uiExtensionIdLevelList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UIExtensionPattern::OnDisconnect()
|
||||
{
|
||||
CHECK_RUN_ON(UI);
|
||||
@ -894,6 +936,16 @@ void UIExtensionPattern::FocusMoveSearch(int32_t elementId, int32_t direction,
|
||||
session_->TransferFocusMoveSearch(elementId, direction, baseParent, output);
|
||||
}
|
||||
|
||||
bool UIExtensionPattern::SendAccessibilityEventInfo(const Accessibility::AccessibilityEventInfo& eventInfo,
|
||||
std::vector<int32_t>& uiExtensionIdLevelList, const RefPtr<PipelineBase>& pipeline)
|
||||
{
|
||||
auto instanceId = pipeline->GetInstanceId();
|
||||
auto window = Platform::AceContainer::GetUIWindow(instanceId);
|
||||
CHECK_NULL_RETURN(window, false);
|
||||
OHOS::Rosen::WMError ret = window->TransferAccessibilityEvent(eventInfo, uiExtensionIdLevelList);
|
||||
return ret == OHOS::Rosen::WMError::WM_OK;
|
||||
}
|
||||
|
||||
void UIExtensionPattern::ProcessUIExtensionSessionActivationResult(OHOS::Rosen::WSError errcode)
|
||||
{
|
||||
if (errcode != OHOS::Rosen::WSError::WS_OK) {
|
||||
|
@ -37,8 +37,9 @@ enum class WSError;
|
||||
} // namespace OHOS::Rosen
|
||||
|
||||
namespace OHOS::Accessibility {
|
||||
class AccessibilityElementInfo;
|
||||
}
|
||||
class AccessibilityElementInfo;
|
||||
class AccessibilityEventInfo;
|
||||
} // namespace OHOS::Accessibility
|
||||
|
||||
namespace OHOS::MMI {
|
||||
class KeyEvent;
|
||||
@ -107,6 +108,8 @@ public:
|
||||
int32_t baseParent, Accessibility::AccessibilityElementInfo& output) override;
|
||||
virtual bool TransferExecuteAction(int32_t elementId, const std::map<std::string, std::string>& actionArguments,
|
||||
int32_t action, int32_t offset) override;
|
||||
virtual bool SendAccessibilityEventInfo(const Accessibility::AccessibilityEventInfo& eventInfo,
|
||||
std::vector<int32_t>& uiExtensionIdLevelList, const RefPtr<PipelineBase>& pipeline) override;
|
||||
|
||||
int32_t GetSessionId();
|
||||
|
||||
@ -118,6 +121,9 @@ public:
|
||||
return contentNode_;
|
||||
}
|
||||
|
||||
void OnAccessibilityEvent(
|
||||
const Accessibility::AccessibilityEventInfo& info, std::vector<int32_t> uiExtensionIdLevelList);
|
||||
|
||||
private:
|
||||
enum ReleaseCode {
|
||||
DESTROY_NORMAL = 0,
|
||||
|
@ -74,6 +74,9 @@ public:
|
||||
|
||||
void OnExtensionDied() override {}
|
||||
|
||||
void OnAccessibilityEvent(const Accessibility::AccessibilityEventInfo& info,
|
||||
const std::vector<int32_t>& uiExtensionIdLevelVec) override {};
|
||||
|
||||
private:
|
||||
WeakPtr<WindowPattern> windowPattern_;
|
||||
};
|
||||
|
@ -31,4 +31,9 @@ std::shared_ptr<AbilityRuntime::Context> AceContainer::GetAbilityContextByModule
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
sptr<OHOS::Rosen::Window> AceContainer::GetUIWindow(int32_t instanceId)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
} // namespace OHOS::Ace::Platform
|
||||
|
Loading…
Reference in New Issue
Block a user