/*
* 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 display from '@ohos.display';
import { LogDomain, LogHelper } from '@ohos/basicutils';
import { DeviceHelper } from '@ohos/frameworkwrapper/src/main/ets/TsIndex';
import { SCBScreenProperty } from '@ohos/windowscene';
import { SlMainStateType, SlStaticStateType } from '../constants/SlStateType';
import { slUiStateMgr } from '../manager/ScreenLockUiStateManager';
import { BpCalculator, ScreenBp, SizeBp } from '../immersivekgcommon/base/utils/ScreenBreakPoint';
const TAG = 'DisplayUtils';
const log: LogHelper = LogHelper.getLogHelper(LogDomain.KG, TAG);
const IS_ULTRA_SCREEN: boolean = DeviceHelper.isUltraScreenProduct();
/**
* 超大屏状态
*/
export enum UltraScreenStatus {
F_STATUS,
M_STATUS,
G_STATUS
}
/**
* display工具类
*/
export class DisplayUtils {
private static _isFoldAble?: boolean;
private constructor() {
}
/**
* 判断设备是否可折叠
*
* @returns 是否可折叠
*/
public static isFoldAble(): boolean {
if (DisplayUtils._isFoldAble !== undefined) {
return DisplayUtils._isFoldAble;
}
try {
DisplayUtils._isFoldAble = display.isFoldable();
log.showInfo(`isFoldable ${DisplayUtils._isFoldAble}`);
return DisplayUtils._isFoldAble;
} catch (error) {
log.showError(`isFoldable failed. ${error.code}`);
}
return false;
}
/**
* 获取显示信息
*
* @returns display.Display
*/
public static getDefaultDisplaySync(): display.Display | undefined {
try {
return display.getDefaultDisplaySync();
} catch (error) {
log.showError(`getDefaultDisplaySync failed. ${error.code}`);
}
return undefined;
}
/**
* 获取设备折叠状态
*
* @returns 设备折叠状态
*/
public static getFoldStatus(): display.FoldStatus {
try {
return display.getFoldStatus();
} catch (error) {
log.showError(`getFoldStatus failed. ${error.code}`);
}
return display.FoldStatus.FOLD_STATUS_UNKNOWN;
}
/**
* 获取设备当前FoldDisplayMode
*
* @returns display.FoldDisplayMode
*/
public static getFoldDisplayMode(): display.FoldDisplayMode {
let foldDisplayMode: display.FoldDisplayMode = display.FoldDisplayMode.FOLD_DISPLAY_MODE_UNKNOWN;
try {
foldDisplayMode = display.getFoldDisplayMode();
} catch (error) {
log.showError('getFoldDisplayMode failed');
}
return foldDisplayMode;
}
/**
* 获得超大屏当前状态
*
* @param screenProperty 屏幕属性
* @returns 折展状态
*/
public static getUltraScreenStatus(screenProperty?: SCBScreenProperty): UltraScreenStatus | undefined {
if (!IS_ULTRA_SCREEN) {
return undefined;
}
let screenBp: ScreenBp;
if (screenProperty) {
screenBp = BpCalculator.calcScreenBp(screenProperty.width, screenProperty.height);
} else {
// 否则从全局断点信息直接获取断点状态
screenBp =
slUiStateMgr.getSlState(SlMainStateType.SL_STATIC_STATE)?.getSlState(SlStaticStateType.SCREEN_BP) as ScreenBp;
}
if (!screenBp) {
return DeviceHelper.isFState() ? UltraScreenStatus.F_STATUS :
(DeviceHelper.isMState() ? UltraScreenStatus.M_STATUS : UltraScreenStatus.G_STATUS);
}
// F态竖屏:宽MSmall,高Large;F态横屏:宽Medium,高Small;M态横&竖屏:宽Medium,高Medium
if ((screenBp.widthBp === SizeBp.SM && screenBp.heightBp === SizeBp.LG) ||
(screenBp.widthBp === SizeBp.MD && screenBp.heightBp === SizeBp.SM)) {
return UltraScreenStatus.F_STATUS;
} else if (screenBp.widthBp === SizeBp.MD && screenBp.heightBp === SizeBp.MD) {
return UltraScreenStatus.M_STATUS;
} else {
return UltraScreenStatus.G_STATUS;
}
}
/**
* 超大屏是否是F态
*
* @param screenProperty 屏幕属性
* @returns true, 超大屏是F态
*/
public static isUltraScreenFStatus(screenProperty?: SCBScreenProperty): boolean {
return DisplayUtils.getUltraScreenStatus(screenProperty) === UltraScreenStatus.F_STATUS;
}
/**
* 超大屏是否是M态
*
* @param screenProperty 屏幕属性
* @returns true, 超大屏是M态
*/
public static isUltraScreenMStatus(screenProperty?: SCBScreenProperty): boolean {
return DisplayUtils.getUltraScreenStatus(screenProperty) === UltraScreenStatus.M_STATUS;
}
/**
* 超大屏是否是G态
*
* @param screenProperty 屏幕属性
* @returns true, 超大屏是G态
*/
public static isUltraScreenGStatus(screenProperty?: SCBScreenProperty): boolean {
return DisplayUtils.getUltraScreenStatus(screenProperty) === UltraScreenStatus.G_STATUS;
}
/**
* 是否是大屏
*
* @param screenProperty 屏幕属性
* @returns true, 表示是大屏
*/
public static isLargeScreen(screenProperty?: SCBScreenProperty): boolean {
return DeviceHelper.isPadOr2in1PcType() || DisplayUtils.isUltraScreenGStatus(screenProperty);
}
}