* Copyright (c) Huawei Device 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 { CheckEmptyUtils, LogDomain, LogHelper } from '@ohos/basicutils';
import { AccessibilityManager, GlobalContext } from '@ohos/frameworkwrapper';
import { SwiperLoadData } from '@ohos/swiperdata';
import type ctx from '@ohos.app.ability.common';
import {
DesktopUtils,
editModeManager,
LaunchLayoutCacheManager,
lockLayoutManager,
PageInfoManager
} from '../../TsIndex';
import { desktopUtil } from '@ohos/componenthelper';
import { launcherStatusUtil } from '@ohos/windowscene';
import { BusinessType } from '../../constants/CommonConstants';
import { AppListInfo } from '../../folder/FolderModel';
const TAG: string = 'EditModeAccessibilityUtil';
const log: LogHelper = LogHelper.getLogHelper(LogDomain.HOME, TAG);
* 编辑模式无障碍适配功能类
*/
export class EditModeAccessibilityUtil {
* 获取编辑模式当前屏屏幕朗读播报字串
* @param index: 页面index
*
* @returns 播报字串
*/
public static getAccessibilityText(index: number): string {
let appListInfo: AppListInfo | undefined = AppStorage.get('appListInfo');
const pages = appListInfo?.appGridInfo;
const displayCnt:number = PageInfoManager.getInstance().getDisplayCount();
const totalPages = Math.ceil(pages?.length ?? 0 / displayCnt);
const currentPage = Math.floor(index / displayCnt) + 1;
let currentPageText: string = '';
const accessibilityManager = AccessibilityManager.getInstance();
const isAccessibilityMode: boolean = accessibilityManager.getIsAccessibilityMode();
if (isAccessibilityMode) {
if (GlobalContext.getInstance().hasObject('desktopContext')) {
const serviceExtensionContext =
GlobalContext.getInstance().getObject('desktopContext') as ctx.ServiceExtensionContext;
currentPageText = serviceExtensionContext
.resourceManager
.getStringSync($r('app.string.desktop_current_page').id, String(currentPage), String(totalPages));
}
}
log.showInfo(`textAnnouncedForCurrentPage ${currentPageText}`);
return currentPageText;
}
* 获取编辑模式背景板聚焦屏幕朗读播报字串
*
* @returns 播报字串
*/
public static getBackPlaneAccessibilityText(index: number): string {
let appListInfo: AppListInfo | undefined = AppStorage.get('appListInfo');
const pages = appListInfo?.appGridInfo;
const displayCnt:number = PageInfoManager.getInstance().getDisplayCount();
const totalPages = Math.ceil(pages?.length ?? 0 / displayCnt);
const currentPage = Math.floor(index / displayCnt) + 1;
let exitEditModeText: string = '';
if (GlobalContext.getInstance().hasObject('desktopContext') && editModeManager.isInEditMode()) {
const serviceExtensionContext =
GlobalContext.getInstance().getObject('desktopContext') as ctx.ServiceExtensionContext;
exitEditModeText = serviceExtensionContext
.resourceManager
.getStringSync($r('app.string.desktop_current_page').id, String(currentPage), String(totalPages));
if (!lockLayoutManager.isLockLayout()) {
exitEditModeText += ',' + serviceExtensionContext
.resourceManager.getStringSync($r('app.string.talkback_double_click_press_drag').id);
}
}
log.showInfo(`getBackPlaneAccessibilityText ${exitEditModeText}`);
return exitEditModeText;
}
* 获取编辑模式加号页添加按钮聚焦屏幕朗读播报字串
*
* @returns 播报字串
*/
public static getAddButtonAccessibilityText(): string {
let addButtonText: string = '';
if (GlobalContext.getInstance().hasObject('desktopContext')) {
const serviceExtensionContext =
GlobalContext.getInstance().getObject('desktopContext') as ctx.ServiceExtensionContext;
addButtonText =
serviceExtensionContext
.resourceManager
.getStringSync($r('app.string.talkback_add_screen').id) + ',' +
serviceExtensionContext
.resourceManager
.getStringSync($r('app.string.double_tap_to_execute').id);
}
log.showInfo(`textAnnouncedForAddButton ${addButtonText}`);
return addButtonText;
}
* 获取编辑模式空白页删除按钮聚焦屏幕朗读播报字串
*
* @returns 播报字串
*/
public static getDeleteButtonAccessibilityText(): string {
let deleteButtonText: string = '';
if (GlobalContext.getInstance().hasObject('desktopContext')) {
const serviceExtensionContext =
GlobalContext.getInstance().getObject('desktopContext') as ctx.ServiceExtensionContext;
deleteButtonText =
serviceExtensionContext
.resourceManager
.getStringSync($r('app.string.talkback_delete_screen').id) + ',' +
serviceExtensionContext
.resourceManager
.getStringSync($r('app.string.double_tap_to_execute').id);
}
log.showInfo(`textAnnouncedForDeleteButton ${deleteButtonText}`);
return deleteButtonText;
}
* 获取编辑模式加号页聚焦屏幕朗读播报字串
*
* @returns 播报字串
*/
public static getAddPageAccessibilityText(): string {
let addPageText: string = '';
if (GlobalContext.getInstance().hasObject('desktopContext')) {
const serviceExtensionContext =
GlobalContext.getInstance().getObject('desktopContext') as ctx.ServiceExtensionContext;
addPageText = serviceExtensionContext
.resourceManager
.getStringSync($r('app.string.talkback_add_screen_page').id);
}
log.showInfo(`textAnnouncedForAddPageText ${addPageText}`);
return addPageText;
}
* 在无障碍模式主动播报添加页面成功
*/
public static async textAnnouncedForAddPageSuccess(current: number, total: number): Promise<void> {
log.showInfo(`textAnnouncedForAddPageSuccess current:${current}, total:${total}}`);
const accessibilityManager = AccessibilityManager.getInstance();
const isAccessibilityMode: boolean = accessibilityManager.getIsAccessibilityMode();
if (isAccessibilityMode) {
try {
let addPageText: string = (GlobalContext.getInstance().getObject('desktopContext') as ctx.ServiceExtensionContext)
.resourceManager.getStringSync($r('app.string.talkback_add_screen_success').id);
log.showInfo(`textAnnouncedForCurrentPage ${addPageText}`);
accessibilityManager.sendTextAnnouncedForAccessibility(addPageText, 'textAnnouncedForAddPageSuccess');
} catch (err) {
if (err) {
log.showError(`textAnnouncedForAddPageSuccess failed, Code is ${err.code}, message is ${err.message}`);
}
}
}
}
* 在无障碍模式主动播报删除页面成功
*/
public static async textAnnouncedForDeletePageSuccess(current: number, total: number): Promise<void> {
log.showInfo(`textAnnouncedForDeletePageSuccess current:${current}, total:${total}}`);
const accessibilityManager = AccessibilityManager.getInstance();
const isAccessibilityMode: boolean = accessibilityManager.getIsAccessibilityMode();
if (isAccessibilityMode) {
try {
let deletePageText: string = (GlobalContext.getInstance().getObject('desktopContext') as ctx.ServiceExtensionContext)
.resourceManager.getStringSync($r('app.string.talkback_delete_screen_success').id);
log.showInfo(`textAnnouncedForCurrentPage ${deletePageText}`);
accessibilityManager.sendTextAnnouncedForAccessibility(deletePageText, 'textAnnouncedForDeletePageSuccess');
} catch (err) {
if (err) {
log.showError(`textAnnouncedForDeletePageSuccess failed, Code is ${err.code}, message is ${err.message}`);
}
}
}
}
* 在无障碍模式主动播报页面拖起
*/
public static async textAnnouncedForDragPage(): Promise<void> {
log.showInfo(`textAnnouncedForDragPage`);
const accessibilityManager = AccessibilityManager.getInstance();
const isAccessibilityMode: boolean = accessibilityManager.getIsAccessibilityMode();
if (isAccessibilityMode) {
try {
let dragPageText: string = (GlobalContext.getInstance().getObject('desktopContext') as ctx.ServiceExtensionContext)
.resourceManager.getStringSync($r('app.string.cc_accessibility_str_edit_move_start').id);
log.showInfo(`textAnnouncedForDragPage ${dragPageText}`);
accessibilityManager.sendTextAnnouncedForAccessibility(dragPageText, 'textAnnouncedForDragPage');
} catch (err) {
if (err) {
log.showError(`textAnnouncedForDragPage failed, Code is ${err.code}, message is ${err.message}`);
}
}
}
}
* 在无障碍模式主动播报页面拖拽挤位
*/
public static async textAnnouncedForDragSqueezePageToSwipe(oldPageIndex: number, currentPageIndex: number): Promise<void> {
log.showInfo(`textAnnouncedForDragSqueezePageToSwipe`);
const accessibilityManager = AccessibilityManager.getInstance();
const isAccessibilityMode: boolean = accessibilityManager.getIsAccessibilityMode();
if (isAccessibilityMode) {
try {
const displayCnt:number = PageInfoManager.getInstance().getDisplayCount();
const realOldPageIndex: number = Math.floor(oldPageIndex / displayCnt);
const realCurrentPageIndex: number = Math.floor(currentPageIndex / displayCnt);
log.showInfo(`textAnnouncedForDragSqueezePageToSwipe realOldPageIndex: ${realOldPageIndex}, realCurrentPageIndex: ${realCurrentPageIndex}`);
const squeezedPages = realCurrentPageIndex - realOldPageIndex;
const dragPageToIndexText: string = (GlobalContext.getInstance().getObject('desktopContext') as ctx.ServiceExtensionContext)
.resourceManager.getPluralStringValueSync($r('app.plural.talkback_drag_page_to_n').id, realCurrentPageIndex + 1);
let pastSqueezedPages: string = '';
if (squeezedPages > 0) {
pastSqueezedPages = (GlobalContext.getInstance().getObject('desktopContext') as ctx.ServiceExtensionContext)
.resourceManager.getPluralStringValueSync($r('app.plural.talkback_n_page_move_forward').id, squeezedPages);
} else {
pastSqueezedPages = (GlobalContext.getInstance().getObject('desktopContext') as ctx.ServiceExtensionContext)
.resourceManager.getPluralStringValueSync($r('app.plural.talkback_n_page_move_back').id, Math.abs(squeezedPages));
}
log.showInfo(`textAnnouncedForDragSqueezePageToSwipe ${dragPageToIndexText + ',' + pastSqueezedPages}`);
accessibilityManager.sendTextAnnouncedForAccessibility(dragPageToIndexText + ',' + pastSqueezedPages, 'textAnnouncedForDragSqueezePageToSwipe');
} catch (err) {
if (err) {
log.showError(`textAnnouncedForDragSqueezePageToSwipe failed, Code is ${err.code}, message is ${err.message}`);
}
}
}
}
* 在无障碍模式获取本页首个图标Id用于走焦
*/
public static getCurrentPageFirstIconId(): string {
const isOuter = launcherStatusUtil.getShowOutLauncherStatus();
const currentPageIndex = AppStorage.get<number>(desktopUtil.getPageIndex());
const appListInfo = LaunchLayoutCacheManager.getInstance()
.getAllGridLayoutItemList(BusinessType.BUSINESS_BASIC_DESKTOP, isOuter);
const currentShowedAppListInfo = appListInfo.filter(appItemInfo => appItemInfo.page === currentPageIndex);
if (CheckEmptyUtils.isEmptyArr(currentShowedAppListInfo)) {
return '';
}
const firstIcon = currentShowedAppListInfo.sort((a, b) => {
if (a.row !== b.row) {
return (a.row ?? 0) < (b.row ?? 0) ? -1 : 1;
}
return (a.column ?? 0) - (b.column ?? 0);
})[0];
return DesktopUtils.getGridItemId(currentPageIndex ?? -1, firstIcon, isOuter);
}
* 编号编辑模式下按钮,用于无障碍走焦
*/
public static getEditModeDockIconId(index: number): string {
return `editModeDockButton${index}`;
}
* 编号编辑模式下页面背景板,用于无障碍走焦
*/
public static getEditModeBackPlaneId(key: number): string {
return `single_page_background_${key}`;
}
}