/*
* Copyright (c) Huawei Technologies Co., Ltd. 2024-2025. All rights reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import accessibility from '@ohos.accessibility';
import { LogUtil } from './LogUtil';
import { ResourceUtil } from './ResourceUtil';
const TAG: string = 'AccessibilityUtils : ';
/**
* 无障碍的默认描述值 单指双击即可执行
*/
export const TALKBACK_SUPPORT_DEFAULT_CLICK_TIPS: string = '';
/**
* 无障碍的无描述值
*/
export const TALKBACK_NOT_SUPPORT_DEFAULT_CLICK_TIPS: string = ' ';
/**
* Accessibility工具类
*
* @since 2024-07-08
*/
export class AccessibilityUtils {
/**
* 判断当前是否在无障碍模式下
*/
public static isAccessibilityMode(): boolean {
const isOpenAccessibility: boolean = accessibility.isOpenAccessibilitySync();
const isOpenTouchGuide: boolean = accessibility.isOpenTouchGuideSync();
return isOpenAccessibility && isOpenTouchGuide;
}
/**
* 在无障碍模式主动聚焦
*
* @param bundleName 主动播报信息
*
*/
public static requestFocusAccessibility(customId: string): void {
AccessibilityUtils.requestFocusAccessibilityWithBundleName(customId, 'com.ohos.sceneboard');
}
/**
* 无障碍模式主动聚焦
*
* @param customId 组件id
* @param bundleName 不传则默认设置包名
*/
public static requestFocusAccessibilityWithBundleName(customId: string, bundleName?: string): void {
if (!AccessibilityUtils.isAccessibilityMode()) {
return;
}
let eventInfo: accessibility.EventInfo = ({
type: 'requestFocusForAccessibility',
bundleName: bundleName ?? 'com.ohos.settings',
triggerAction: 'common',
customId,
});
try {
accessibility.sendAccessibilityEvent(eventInfo, (err) => {
/* instrument ignore if*/
if (err) {
LogUtil.error(`${TAG} sendAccessibilityEvent is failed, code:${err?.code} message:${err?.message}`);
return;
}
LogUtil.info(`${TAG} sendAccessibilityEvent is Succeeded, customId:${customId}`);
});
} catch (error) {
LogUtil.error(`${TAG} sendAccessibilityEvent catch failed, code:${error?.code} message:${error?.message}`);
}
}
/**
* 无障碍模式下主动播报内容,如Radio选中后播报"已选中"
*
* @param text 播报内容资源字符串
*/
public static announceText(text: ResourceStr): void {
LogUtil.debug(`${TAG} announceText`);
if (!AccessibilityUtils.isAccessibilityMode()) {
return;
}
let eventInfo: accessibility.EventInfo = ({
type: 'announceForAccessibility',
bundleName: 'com.ohos.settings',
triggerAction: 'common',
textAnnouncedForAccessibility: ResourceUtil.getStringSync(text)
});
accessibility.sendAccessibilityEvent(eventInfo).then(() => {
LogUtil.debug(`${TAG} announceText success`);
});
}
/**
* 无障碍模式下不打断主动播报内容,如Radio选中后播报"已选中"
*
* @param text 播报内容资源字符串
*/
public static announceTextNoInterrupt(text: ResourceStr): void {
LogUtil.debug(`${TAG} announceTextNoInterrupt`);
/* instrument ignore if*/
if (!AccessibilityUtils.isAccessibilityMode()) {
return;
}
let eventInfo: accessibility.EventInfo = ({
type: 'announceForAccessibilityNotInterrupt',
bundleName: 'com.ohos.settings',
triggerAction: 'common',
textAnnouncedForAccessibility: ResourceUtil.getStringSync(text)
});
accessibility.sendAccessibilityEvent(eventInfo).then(() => {
LogUtil.debug(`${TAG} announceTextNoInterrupt success`);
});
}
/**
* 延迟播报文本
*
* @param text 播报内容
* @param delay 需要延迟的时间
*/
public static delayedAnnounceText(text: ResourceStr | undefined, delay: number): void {
if (!text) {
return;
}
setTimeout(() => {
AccessibilityUtils.announceText(text);
}, delay);
}
/**
* 无障碍模式下Radio选中后播报"已选中",未选中播报“未选中”
*/
public static announceRadioSelected(isSelected: boolean = true): void {
AccessibilityUtils.announceText(isSelected ? $r('app.string.be_chosen') : $r('app.string.not_selected_click_tips'));
}
}
export enum AccessibilityLevelType {
/**
* 组件可以被无障碍识别
*/
YES = 'yes',
/**
* 组件不能被无障碍识别
*/
NO = 'no',
/**
* 组件根据组件类型采用默认的无障碍识别策略
*/
AUTO = 'auto',
/**
* 当前组件及其所有子组件不可被无障碍辅助服务所识别
*/
NO_HIDE_DESCENDANTS = 'no-hide-descendants'
}