无障碍功能上报

Signed-off-by: Xing guang <xingguang1@huawei.com>
This commit is contained in:
Xing guang 2023-11-16 11:43:31 +08:00
parent 93bbad5b66
commit 8410e4077a
12 changed files with 174 additions and 6 deletions

View File

@ -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();

View File

@ -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,

View File

@ -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)
{

View File

@ -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

View File

@ -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(

View File

@ -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;

View File

@ -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)
{

View File

@ -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:

View File

@ -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) {

View File

@ -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,

View File

@ -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_;
};

View File

@ -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