diff --git a/commons/base/src/main/ets/utils/AvPlayerUtil.ets b/commons/base/src/main/ets/utils/AvPlayerUtil.ets index 6020a5b26918657aabe307ff0bc596846dc16015..79e61bd9fef1c6ad81303413aa650c2a076f43c7 100644 --- a/commons/base/src/main/ets/utils/AvPlayerUtil.ets +++ b/commons/base/src/main/ets/utils/AvPlayerUtil.ets @@ -17,6 +17,7 @@ import { media } from '@kit.MediaKit'; import { common } from '@kit.AbilityKit'; import { resourceManager } from '@kit.LocalizationKit'; import { BusinessError } from '@kit.BasicServicesKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; import Logger from './Logger'; import { CommonConstants } from '../constants/CommonConstants'; @@ -29,13 +30,15 @@ export class AvPlayerUtil { private isMoving: boolean = false; private onError: (err: BusinessError) => void = (err: BusinessError) => { Logger.error(`Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`); - this.avPlayer?.reset(); + this.avPlayer?.reset().catch((error: BusinessError) => { + hilog.error(0x00, 'AvPlayerUtil', `reset failed, code = ${error.code}, message = ${error.message}`); + }); }; private onTimeUpdateFunction: (updateTime: number) => void = (updateTime: number) => { AppStorage.setOrCreate(CommonConstants.AV_PLAYER_CURRENT_TIME, this.formatTime(updateTime)); AppStorage.setOrCreate(CommonConstants.AV_PLAYER_UPDATE_TIME, updateTime); AppStorage.setOrCreate(CommonConstants.AV_PLAYER_PROGRESS, updateTime / this.avPlayer!.duration * - CommonConstants.PROGRESS_HUNDRED); + CommonConstants.PROGRESS_HUNDRED); }; private onStateChange: (state: media.AVPlayerState) => void = async (state: media.AVPlayerState) => { if (this.avPlayer === undefined) { @@ -44,24 +47,34 @@ export class AvPlayerUtil { } switch (state) { case CommonConstants.AV_PLAYER_IDLE_STATE: - this.url = await this.context.resourceManager.getRawFd(CommonConstants.PRODUCT_VIDEO_NAME); - this.avPlayer.fdSrc = this.url; - Logger.info('AVPlayer state idle called.'); + try { + this.url = await this.context.resourceManager.getRawFd(CommonConstants.PRODUCT_VIDEO_NAME); + this.avPlayer.fdSrc = this.url; + Logger.info('AVPlayer state idle called.'); + } catch (error) { + hilog.error(0x00, 'AvPlayerUtil', `getRawFd failed, code = ${error.code}, message = ${error.message}`); + } break; case CommonConstants.AV_PLAYER_INITIALIZED_STATE: Logger.info('AVPlayer initialized called.'); this.avPlayer.surfaceId = this.surfaceId; - this.avPlayer.prepare().then(() => { + this.avPlayer.prepare().catch((error: BusinessError) => { + hilog.error(0x00, 'AvPlayerUtil', `prepare failed, code = ${error.code}, message = ${error.message}`); + }).then(() => { Logger.info('AVPlayer prepare succeeded.'); }, (err: BusinessError) => { Logger.error(`Invoke prepare failed, code is ${err.code}, message is ${err.message}`); - this.avPlayer!.reset(); + this.avPlayer!.reset().catch((error: BusinessError) => { + hilog.error(0x00, 'AvPlayerUtil', `reset failed, code = ${error.code}, message = ${error.message}`); + }); }); break; case CommonConstants.AV_PLAYER_PREPARED_STATE: this.avPlayer.videoScaleType = media.VideoScaleType.VIDEO_SCALE_TYPE_FIT; Logger.info('AVPlayer state prepared called.'); - this.avPlayer.play(); + this.avPlayer.play().catch((error: BusinessError) => { + hilog.error(0x00, 'AvPlayerUtil', `play failed, code = ${error.code}, message = ${error.message}`); + }); AppStorage.setOrCreate(CommonConstants.AV_PLAYER_TOTAL_TIME, this.formatTime(this.avPlayer.duration)); break; case CommonConstants.AV_PLAYER_PLAYING_STATE: @@ -75,7 +88,9 @@ export class AvPlayerUtil { case CommonConstants.AV_PLAYER_COMPLETED_STATE: Logger.info('AVPlayer state completed called.'); AppStorage.setOrCreate('avplayerState', this.avPlayer.state); - this.avPlayer.stop(); + this.avPlayer.stop().catch((error: BusinessError) => { + hilog.error(0x00, 'AvPlayerUtil', `stop failed, code = ${error.code}, message = ${error.message}`); + }); break; case CommonConstants.AV_PLAYER_STOPPED_STATE: Logger.info('AVPlayer state stopped called.'); @@ -107,13 +122,19 @@ export class AvPlayerUtil { async createAvPlayer(surfaceId: string): Promise { if (!this.avPlayer || this.avPlayer.state === CommonConstants.AV_PLAYER_RELEASE_STATE) { - this.avPlayer = await media.createAVPlayer(); - this.surfaceId = surfaceId; - Logger.info('Created AvPlayer successfully.'); - // Entering idle state. - this.url = await this.context.resourceManager.getRawFd(CommonConstants.PRODUCT_VIDEO_NAME); - this.avPlayer.fdSrc = this.url; - this.setAVPlayerCallback(); + try { + this.avPlayer = await media.createAVPlayer(); + this.surfaceId = surfaceId; + Logger.info('Created AvPlayer successfully.'); + // Entering idle state. + this.url = await this.context.resourceManager.getRawFd(CommonConstants.PRODUCT_VIDEO_NAME); + this.avPlayer.fdSrc = this.url; + this.setAVPlayerCallback(); + } catch (error) { + let err = error as BusinessError; + hilog.error(0x00, 'testTag', `createAVPlayer failed, code = ${err.code}, message = ${err.message}`); + } + } else { Logger.info(`AvPlayer has been created`); } @@ -149,7 +170,9 @@ export class AvPlayerUtil { } catch (exception) { Logger.error('Failed to unregister callback. Code: ' + JSON.stringify(exception)); } - this.avPlayer.release(); + this.avPlayer.release().catch((error: BusinessError) => { + hilog.error(0x00, 'AvPlayerUtil', `release failed, code = ${error.code}, message = ${error.message}`); + }); } else { Logger.info(`AvPlayer release failed`); } @@ -162,7 +185,9 @@ export class AvPlayerUtil { case SliderChangeMode.Begin: Logger.info(`AvPlayer SliderChangeMode Begin`); this.sliderBegin = value; - this.avPlayer?.pause(); + this.avPlayer?.pause().catch((error: BusinessError) => { + hilog.error(0x00, 'AvPlayerUtil', `pause failed, code = ${error.code}, message = ${error.message}`); + }); break; case SliderChangeMode.Moving: Logger.info(`AvPlayer SliderChangeMode Moving`); @@ -174,7 +199,9 @@ export class AvPlayerUtil { this.avPlayer?.seek(value / CommonConstants.PROGRESS_HUNDRED * this.avPlayer.duration, seekType); this.isMoving = false; } - this.avPlayer?.play(); + this.avPlayer?.play().catch((error: BusinessError) => { + hilog.error(0x00, 'AvPlayerUtil', `play failed, code = ${error.code}, message = ${error.message}`); + }); break; case SliderChangeMode.Click: Logger.info(`AvPlayer SliderChangeMode Click`); @@ -187,24 +214,30 @@ export class AvPlayerUtil { playerStateControl(): void { if (this.avPlayer?.state === CommonConstants.AV_PLAYER_STOPPED_STATE) { - this.avPlayer.prepare(); + this.avPlayer.prepare().catch((error: BusinessError) => { + hilog.error(0x00, 'AvPlayerUtil', `prepare failed, code = ${error.code}, message = ${error.message}`); + }); } else if (this.avPlayer?.state === CommonConstants.AV_PLAYER_PAUSED_STATE) { - this.avPlayer.play(); + this.avPlayer.play().catch((error: BusinessError) => { + hilog.error(0x00, 'AvPlayerUtil', `play failed, code = ${error.code}, message = ${error.message}`); + }); } else if (this.avPlayer?.state === CommonConstants.AV_PLAYER_PLAYING_STATE) { - this.avPlayer.pause(); + this.avPlayer.pause().catch((error: BusinessError) => { + hilog.error(0x00, 'AvPlayerUtil', `pause failed, code = ${error.code}, message = ${error.message}`); + }); } } fastForward(): void { if (this.avPlayer?.state === CommonConstants.AV_PLAYER_PLAYING_STATE || this.avPlayer?.state === - CommonConstants.AV_PLAYER_PAUSED_STATE) { + CommonConstants.AV_PLAYER_PAUSED_STATE) { this.avPlayer.seek(this.avPlayer.currentTime + 5000); } } rewind(): void { if (this.avPlayer?.state === CommonConstants.AV_PLAYER_PLAYING_STATE || this.avPlayer?.state === - CommonConstants.AV_PLAYER_PAUSED_STATE) { + CommonConstants.AV_PLAYER_PAUSED_STATE) { this.avPlayer.seek(this.avPlayer.currentTime - 5000); } } @@ -215,7 +248,7 @@ export class AvPlayerUtil { let minNum: number = Math.floor((totalSecond % CommonConstants.SECOND_IN_HOUR) / CommonConstants.SECOND_IN_MINUTE); let secNum: number = (totalSecond % CommonConstants.SECOND_IN_HOUR) % CommonConstants.SECOND_IN_MINUTE; return this.formatUnitTime(hourNum) + CommonConstants.COLON + this.formatUnitTime(minNum) + CommonConstants.COLON + - this.formatUnitTime(secNum); + this.formatUnitTime(secNum); } formatUnitTime(time: number): string { diff --git a/commons/base/src/main/ets/utils/DeviceScreen.ets b/commons/base/src/main/ets/utils/DeviceScreen.ets index 1b5a27b4757534febd89f5d09cc71703f31ee326..01ef58f2d04c30b9b9c01ddc6b60d470b18946dd 100644 --- a/commons/base/src/main/ets/utils/DeviceScreen.ets +++ b/commons/base/src/main/ets/utils/DeviceScreen.ets @@ -14,6 +14,8 @@ */ import { display } from '@kit.ArkUI'; +import { BusinessError } from '@kit.BasicServicesKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; import { CommonConstants } from '../constants/CommonConstants'; export class DeviceScreen { @@ -23,10 +25,16 @@ export class DeviceScreen { * @returns screen height. */ public static getDeviceHeight(): number { - let displayObject = display.getDefaultDisplaySync(); - let screenPixelHeight = displayObject.height; - let screenDensityDPI = displayObject.densityDPI; - return screenPixelHeight * (CommonConstants.SCREEN_DPI_CONSTANT / screenDensityDPI); + try { + let displayObject = display.getDefaultDisplaySync(); + let screenPixelHeight = displayObject.height; + let screenDensityDPI = displayObject.densityDPI; + return screenPixelHeight * (CommonConstants.SCREEN_DPI_CONSTANT / screenDensityDPI); + } catch (error) { + let err = error as BusinessError; + hilog.error(0x00, 'DeviceScreen', `getDefaultDisplaySync failed, code = ${err.code}, message = ${err.message}`); + } + return 0; } /** @@ -35,9 +43,16 @@ export class DeviceScreen { * @returns screen width. */ public static getDeviceWidth(): number { - let displayObject = display.getDefaultDisplaySync(); - let screenPixelWidth = displayObject.width; - let screenDensityDPI = displayObject.densityDPI; - return screenPixelWidth * (CommonConstants.SCREEN_DPI_CONSTANT / screenDensityDPI); + try { + let displayObject = display.getDefaultDisplaySync(); + let screenPixelWidth = displayObject.width; + let screenDensityDPI = displayObject.densityDPI; + return screenPixelWidth * (CommonConstants.SCREEN_DPI_CONSTANT / screenDensityDPI); + } catch (error) { + let err = error as BusinessError; + hilog.error(0x00, 'DeviceScreen', `getDefaultDisplaySync failed, code = ${err.code}, message = ${err.message}`); + } + return 0; + } } \ No newline at end of file diff --git a/commons/base/src/main/ets/utils/DisplayUtil.ets b/commons/base/src/main/ets/utils/DisplayUtil.ets index 8036850fb2caa3ab82a154271b8ba42723ad4651..3e5448db81a4da36d5e70728da319c7ff46f98f3 100644 --- a/commons/base/src/main/ets/utils/DisplayUtil.ets +++ b/commons/base/src/main/ets/utils/DisplayUtil.ets @@ -14,19 +14,27 @@ */ import { display } from '@kit.ArkUI'; +import { BusinessError } from '@kit.BasicServicesKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; // [Start display_util] export class DisplayUtil { static getFoldCreaseRegion(uiContext: UIContext): void { - if(canIUse('SystemCapability.Window.SessionManager')) { - if (display.isFoldable()) { - let foldRegion: display.FoldCreaseRegion = display.getCurrentFoldCreaseRegion(); - let rect: display.Rect = foldRegion.creaseRects[0]; - // Height of the avoidance area in the upper half screen and height of the avoidance area. - let creaseRegion: number[] = [uiContext!.px2vp(rect.top), uiContext!.px2vp(rect.height)]; - AppStorage.setOrCreate('creaseRegion', creaseRegion); + if (canIUse('SystemCapability.Window.SessionManager')) { + try { + if (display.isFoldable()) { + let foldRegion: display.FoldCreaseRegion = display.getCurrentFoldCreaseRegion(); + let rect: display.Rect = foldRegion.creaseRects[0]; + // Height of the avoidance area in the upper half screen and height of the avoidance area. + let creaseRegion: number[] = [uiContext!.px2vp(rect.top), uiContext!.px2vp(rect.height)]; + AppStorage.setOrCreate('creaseRegion', creaseRegion); + } + } catch (error) { + let err = error as BusinessError; + hilog.error(0x00, 'DisplayUtil', `geetIsFoldable failed, code = ${err.code}, message = ${err.message}`); } } } } + // [End display_util] \ No newline at end of file diff --git a/commons/base/src/main/ets/utils/WindowUtil.ets b/commons/base/src/main/ets/utils/WindowUtil.ets index 88a83d9403d829c4f6885da21b5e39baf17264d7..13de82f7284a0fbd911b4bf3067bf9f4d0a382b8 100644 --- a/commons/base/src/main/ets/utils/WindowUtil.ets +++ b/commons/base/src/main/ets/utils/WindowUtil.ets @@ -31,7 +31,7 @@ export class WindowUtil { if (!AppStorage.get(CommonConstants.WINDOW_UTIL)) { AppStorage.setOrCreate(CommonConstants.WINDOW_UTIL, new WindowUtil()); } else { - hilog.info(0x0000, 'testTag', '%{public}s', `AppStorage does not have windowUtil.`); + hilog.info(0x0000, 'WindowUtil', '%{public}s', `AppStorage does not have windowUtil.`); } return AppStorage.get(CommonConstants.WINDOW_UTIL); } @@ -41,7 +41,7 @@ export class WindowUtil { this.windowStage.getMainWindow((err, windowClass: window.Window) => { this.mainWindowClass = windowClass; if (err.code) { - hilog.error(0x0000, 'testTag', `Failed to obtain the main window. Code:${err.code}, message:${err.message}`, + hilog.error(0x0000, 'WindowUtil', `Failed to obtain the main window. Code:${err.code}, message:${err.message}`, JSON.stringify(err) ?? ''); return; } @@ -52,10 +52,10 @@ export class WindowUtil { // Setting orientation. this.mainWindowClass!.setPreferredOrientation(orientation) .then(() => { - hilog.info(0x0000, 'testTag', '%{public}s', `Succeed in setting the orientation.`); + hilog.info(0x0000, 'WindowUtil', '%{public}s', `Succeed in setting the orientation.`); }) .catch((err: BusinessError) => { - hilog.error(0x0000, 'testTag', `Failed to set the orientation. Code: ${err.code}, message: ${err.message}`, + hilog.error(0x0000, 'WindowUtil', `Failed to set the orientation. Code: ${err.code}, message: ${err.message}`, JSON.stringify(err) ?? ''); }); } @@ -64,10 +64,10 @@ export class WindowUtil { // Set the status bar and navigation bar to be invisible in full-screen mode. this.mainWindowClass!.setWindowSystemBarEnable([]) .then(() => { - hilog.info(0x0000, 'testTag', '%{public}s', `Succeed in setting the window system bar disable.`); + hilog.info(0x0000, 'WindowUtil', '%{public}s', `Succeed in setting the window system bar disable.`); }) .catch((err: BusinessError) => { - hilog.error(0x0000, 'testTag', + hilog.error(0x0000, 'WindowUtil', `Failed to set the window system bar disable. Code: ${err.code}, message: ${err.message}`, JSON.stringify(err) ?? ''); }); @@ -76,10 +76,10 @@ export class WindowUtil { enableWindowSystemBar(): void { this.mainWindowClass!.setWindowSystemBarEnable(['status', 'navigation']) .then(() => { - hilog.info(0x0000, 'testTag', '%{public}s', `Succeed in setting the window system bar enable.`); + hilog.info(0x0000, 'WindowUtil', '%{public}s', `Succeed in setting the window system bar enable.`); }) .catch((err: BusinessError) => { - hilog.error(0x0000, 'testTag', `Failed to set the orientation. Code: ${err.code}, message: ${err.message}`, + hilog.error(0x0000, 'WindowUtil', `Failed to set the orientation. Code: ${err.code}, message: ${err.message}`, JSON.stringify(err) ?? ''); }); } @@ -88,41 +88,53 @@ export class WindowUtil { // Set full-screen display. this.mainWindowClass!.setWindowLayoutFullScreen(true) .then(() => { - hilog.info(0x0000, 'testTag', '%{public}s', `Succeed in setting the window layout full screen.`); + hilog.info(0x0000, 'WindowUtil', '%{public}s', `Succeed in setting the window layout full screen.`); }) .catch((err: BusinessError) => { - hilog.error(0x0000, 'testTag', + hilog.error(0x0000, 'WindowUtil', `Failed to set the window layout full screen. Code: ${err.code}, message: ${err.message}`, JSON.stringify(err) ?? ''); }); } maximize(): void { - if(canIUse('SystemCapability.Window.SessionManager')){ - if (this.mainWindowClass!.getWindowStatus() === window.WindowStatusType.FLOATING) { - this.mainWindowClass!.maximize() - .then(() => { - hilog.info(0x0000, 'testTag', '%{public}s', `Succeed in maximizing the window.`); - }) - .catch((err: BusinessError) => { - hilog.error(0x0000, 'testTag', `Failed to maximize the window. Code: ${err.code}, message: ${err.message}`, - JSON.stringify(err) ?? ''); - }); + if (canIUse('SystemCapability.Window.SessionManager')) { + try { + if (this.mainWindowClass!.getWindowStatus() === window.WindowStatusType.FLOATING) { + this.mainWindowClass!.maximize() + .then(() => { + hilog.info(0x0000, 'WindowUtil', '%{public}s', `Succeed in maximizing the window.`); + }) + .catch((err: BusinessError) => { + hilog.error(0x0000, 'WindowUtil', + `Failed to maximize the window. Code: ${err.code}, message: ${err.message}`, + JSON.stringify(err) ?? ''); + }); + } + } catch (error) { + let err = error as BusinessError; + hilog.error(0x00, 'WindowUtil', `getWindowStatus failed, code = ${err.code}, message = ${err.message}`); } } } recover(): void { - if(canIUse('SystemCapability.Window.SessionManager')){ - if (this.mainWindowClass!.getWindowStatus() === window.WindowStatusType.FULL_SCREEN) { - this.mainWindowClass!.recover() - .then(() => { - hilog.info(0x0000, 'testTag', '%{public}s', `Succeed in rovering the window.`); - }) - .catch((err: BusinessError) => { - hilog.error(0x0000, 'testTag', `Failed to rover the window. Code: ${err.code}, message: ${err.message}`, - JSON.stringify(err) ?? ''); - }); + if (canIUse('SystemCapability.Window.SessionManager')) { + try { + if (this.mainWindowClass!.getWindowStatus() === window.WindowStatusType.FULL_SCREEN) { + this.mainWindowClass!.recover() + .then(() => { + hilog.info(0x0000, 'WindowUtil', '%{public}s', `Succeed in rovering the window.`); + }) + .catch((err: BusinessError) => { + hilog.error(0x0000, 'WindowUtil', + `Failed to rover the window. Code: ${err.code}, message: ${err.message}`, + JSON.stringify(err) ?? ''); + }); + } + } catch (error) { + let err = error as BusinessError; + hilog.error(0x00, 'WindowUtil', `getWindowStatus failed, code = ${err.code}, message = ${err.message}`); } } } @@ -135,7 +147,7 @@ export class WindowUtil { try { this.mainWindowClass!.off('windowSizeChange'); } catch (err) { - hilog.error(0x0000, 'testTag', `Failed to off window size change. Code: ${err.code}, message: ${err.message}`, + hilog.error(0x0000, 'WindowUtil', `Failed to off window size change. Code: ${err.code}, message: ${err.message}`, JSON.stringify(err) ?? ''); } } @@ -143,52 +155,64 @@ export class WindowUtil { // [Start update_widthbp] // [Start dd_update_widthbp] updateWidthBp(): void { - let mainWindow: window.WindowProperties = this.mainWindowClass!.getWindowProperties(); - let windowWidth: number = mainWindow.windowRect.width; - let windowWidthVp = windowWidth / (display.getDefaultDisplaySync().densityDPI / 160); - if (deviceInfo.deviceType === CommonConstants.DEVICE_TYPE) { - windowWidthVp -= 2 * CommonConstants.WINDOW_FLOATING_MARGIN; - } - let widthBp: string = ''; - let videoGridColumn: string = CommonConstants.VIDEO_GRID_COLUMNS[0]; - if (windowWidthVp < 320) { - widthBp = 'xs'; - videoGridColumn = CommonConstants.VIDEO_GRID_COLUMNS[0]; - } else if (windowWidthVp >= 320 && windowWidthVp < 600) { - widthBp = 'sm'; - videoGridColumn = CommonConstants.VIDEO_GRID_COLUMNS[0]; - } else if (windowWidthVp >= 600 && windowWidthVp < 840) { - widthBp = 'md'; - videoGridColumn = CommonConstants.VIDEO_GRID_COLUMNS[1]; - } else { - widthBp = 'lg'; - videoGridColumn = CommonConstants.VIDEO_GRID_COLUMNS[2]; + try { + let mainWindow: window.WindowProperties = this.mainWindowClass!.getWindowProperties(); + let windowWidth: number = mainWindow.windowRect.width; + let windowWidthVp = windowWidth / (display.getDefaultDisplaySync().densityDPI / 160); + if (deviceInfo.deviceType === CommonConstants.DEVICE_TYPE) { + windowWidthVp -= 2 * CommonConstants.WINDOW_FLOATING_MARGIN; + } + let widthBp: string = ''; + let videoGridColumn: string = CommonConstants.VIDEO_GRID_COLUMNS[0]; + if (windowWidthVp < 320) { + widthBp = 'xs'; + videoGridColumn = CommonConstants.VIDEO_GRID_COLUMNS[0]; + } else if (windowWidthVp >= 320 && windowWidthVp < 600) { + widthBp = 'sm'; + videoGridColumn = CommonConstants.VIDEO_GRID_COLUMNS[0]; + } else if (windowWidthVp >= 600 && windowWidthVp < 840) { + widthBp = 'md'; + videoGridColumn = CommonConstants.VIDEO_GRID_COLUMNS[1]; + } else { + widthBp = 'lg'; + videoGridColumn = CommonConstants.VIDEO_GRID_COLUMNS[2]; + } + AppStorage.setOrCreate('currentWidthBreakpoint', widthBp); + AppStorage.setOrCreate('videoGridColumn', videoGridColumn); + } catch (error) { + let err = error as BusinessError; + hilog.error(0x00, 'WindowUtil', `getDefaultDisplaySync failed, code = ${err.code}, message = ${err.message}`); } - AppStorage.setOrCreate('currentWidthBreakpoint', widthBp); - AppStorage.setOrCreate('videoGridColumn', videoGridColumn); } + // [End dd_update_widthbp] // [End update_heightbp] // [Start update_heightbp] // [Start dd_update_heightbp] updateHeightBp(): void { - let mainWindow: window.WindowProperties = this.mainWindowClass!.getWindowProperties(); - let windowHeight: number = mainWindow.windowRect.height; - let windowWidth: number = mainWindow.windowRect.width; - let windowWidthVp = windowWidth / (display.getDefaultDisplaySync().densityDPI / 160); - let windowHeightVp = windowHeight / (display.getDefaultDisplaySync().densityDPI / 160); - let heightBp: string = ''; - let aspectRatio: number = windowHeightVp / windowWidthVp; - if (aspectRatio < 0.8) { - heightBp = 'sm'; - } else if (aspectRatio >= 0.8 && aspectRatio < 1.2) { - heightBp = 'md'; - } else { - heightBp = 'lg'; + try { + let mainWindow: window.WindowProperties = this.mainWindowClass!.getWindowProperties(); + let windowHeight: number = mainWindow.windowRect.height; + let windowWidth: number = mainWindow.windowRect.width; + let windowWidthVp = windowWidth / (display.getDefaultDisplaySync().densityDPI / 160); + let windowHeightVp = windowHeight / (display.getDefaultDisplaySync().densityDPI / 160); + let heightBp: string = ''; + let aspectRatio: number = windowHeightVp / windowWidthVp; + if (aspectRatio < 0.8) { + heightBp = 'sm'; + } else if (aspectRatio >= 0.8 && aspectRatio < 1.2) { + heightBp = 'md'; + } else { + heightBp = 'lg'; + } + AppStorage.setOrCreate('currentHeightBreakpoint', heightBp); + } catch (error) { + let err = error as BusinessError; + hilog.error(0x00, 'WindowUtil', `getDefaultDisplaySync failed, code = ${err.code}, message = ${err.message}`); } - AppStorage.setOrCreate('currentHeightBreakpoint', heightBp); } + // [End dd_update_heightbp] // [End update_heightbp] } \ No newline at end of file diff --git a/features/home/src/main/ets/view/IconView.ets b/features/home/src/main/ets/view/IconView.ets index c65aac5ca80ced868d022d35dbf39ddf8f6b8765..e77e5452bb86d9f13b20c188bd8386205904ebdf 100644 --- a/features/home/src/main/ets/view/IconView.ets +++ b/features/home/src/main/ets/view/IconView.ets @@ -13,6 +13,8 @@ * limitations under the License. */ +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BusinessError } from '@kit.BasicServicesKit'; import { BreakpointConstants, CommonConstants } from '@ohos/commons'; import { BreakpointType } from '@ohos/commons'; import { HomeConstants } from '../constants/HomeConstants'; @@ -51,7 +53,8 @@ export struct IconView { .height($r('app.float.icon_list_height')) } .padding({ - right: index === this.iconList.length - 1 ? this.getSpace(this.windowWidth, this.currentWidthBreakpoint) / 2 : 0 + right: index === this.iconList.length - 1 ? + this.getSpace(this.windowWidth, this.currentWidthBreakpoint) / 2 : 0 }) }, (item: VideoIcon) => JSON.stringify(item)) } @@ -78,17 +81,27 @@ export struct IconView { getSpace(windowWidth: number, currentWidthBreakpoint: string): number { // Obtain the window width and subtract the blank parts on both sides. - let result: number = this.getUIContext().px2vp(windowWidth) - (new BreakpointType(HomeConstants.VIDEO_GRID_MARGIN[0], - HomeConstants.VIDEO_GRID_MARGIN[1], HomeConstants.VIDEO_GRID_MARGIN[2]).getValue(this.currentWidthBreakpoint) / - HomeConstants.TWO) - this.getUIContext().getHostContext()!.resourceManager.getNumber($r('app.float.icon_img_size').id) / 2; - if (currentWidthBreakpoint === BreakpointConstants.BREAKPOINT_SM) { - result = (result - HomeConstants.ICONVIEW_ITEM_WIDTH[0] * CommonConstants.FOUR) / CommonConstants.FOUR; - } else if (currentWidthBreakpoint === BreakpointConstants.BREAKPOINT_MD) { - result = (result - HomeConstants.ICONVIEW_ITEM_WIDTH[1] * HomeConstants.SIX) / HomeConstants.SIX; - } else { - result = (result - HomeConstants.LG_SIDEBAR_WIDTH - HomeConstants.ICONVIEW_ITEM_WIDTH[2] * HomeConstants.EIGHT) / - HomeConstants.EIGHT; + try { + let result: number = + this.getUIContext().px2vp(windowWidth) - (new BreakpointType(HomeConstants.VIDEO_GRID_MARGIN[0], + HomeConstants.VIDEO_GRID_MARGIN[1], + HomeConstants.VIDEO_GRID_MARGIN[2]).getValue(this.currentWidthBreakpoint) / + HomeConstants.TWO) - + this.getUIContext().getHostContext()!.resourceManager.getNumber($r('app.float.icon_img_size').id) / 2; + if (currentWidthBreakpoint === BreakpointConstants.BREAKPOINT_SM) { + result = (result - HomeConstants.ICONVIEW_ITEM_WIDTH[0] * CommonConstants.FOUR) / CommonConstants.FOUR; + } else if (currentWidthBreakpoint === BreakpointConstants.BREAKPOINT_MD) { + result = (result - HomeConstants.ICONVIEW_ITEM_WIDTH[1] * HomeConstants.SIX) / HomeConstants.SIX; + } else { + result = + (result - HomeConstants.LG_SIDEBAR_WIDTH - HomeConstants.ICONVIEW_ITEM_WIDTH[2] * HomeConstants.EIGHT) / + HomeConstants.EIGHT; + } + return result; + } catch (error) { + let err = error as BusinessError; + hilog.error(0x00, 'IconView', `getNumber failed, code = ${err.code}, message = ${err.message}`); } - return result; + return 0; } } \ No newline at end of file diff --git a/features/home/src/main/ets/view/VideoDialog.ets b/features/home/src/main/ets/view/VideoDialog.ets index d15f85365711996ee9d304a1aaaeef383eb4f2f1..d8e31a1ce5f2d8389c367c07ba66f9fe878b98fa 100644 --- a/features/home/src/main/ets/view/VideoDialog.ets +++ b/features/home/src/main/ets/view/VideoDialog.ets @@ -20,8 +20,10 @@ import { BusinessError } from '@kit.BasicServicesKit'; import { BreakpointConstants, CommonConstants } from '@ohos/commons'; import { BreakpointType, Logger } from '@ohos/commons'; import { HomeConstants } from '../constants/HomeConstants'; +import { hilog } from '@kit.PerformanceAnalysisKit'; -@Builder function MenuItemFunction(img: Resource, text: ResourceStr) { +@Builder +function MenuItemFunction(img: Resource, text: ResourceStr) { Row() { Image(img) .width($r('app.float.dialog_icon_size')) @@ -35,7 +37,8 @@ import { HomeConstants } from '../constants/HomeConstants'; .height($r('app.float.dialog_menu_row_height')) } -@Builder export function RightClickMenu(currentWidthBreakpoint: string) { +@Builder +export function RightClickMenu(currentWidthBreakpoint: string) { Column() { MenuItemFunction($r('app.media.ic_public_view_list'), HomeConstants.VIDEO_DIALOG_OPTIONS[0]) MenuItemFunction($r('app.media.ic_public_highlights'), HomeConstants.VIDEO_DIALOG_OPTIONS[1]) @@ -63,7 +66,9 @@ export struct VideoDialog { private controller?: CustomDialogController; private onError: (err: BusinessError) => void = (err: BusinessError) => { Logger.error(`Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`); - this.avPlayer!.reset(); + this.avPlayer!.reset().catch((error: BusinessError) => { + hilog.error(0x00, 'VideoDialog', `reset failed, code = ${error.code}, message = ${error.message}`); + }); } private onStateChange: (state: media.AVPlayerState) => void = async (state: media.AVPlayerState) => { if (this.avPlayer === undefined) { @@ -72,44 +77,58 @@ export struct VideoDialog { } switch (state) { case CommonConstants.AV_PLAYER_IDLE_STATE: - this.url = await this.context.resourceManager.getRawFd(CommonConstants.PRODUCT_VIDEO_NAME); - this.avPlayer.fdSrc = this.url; - Logger.info('AVPlayer state idle called.'); + try { + this.url = await this.context.resourceManager.getRawFd(CommonConstants.PRODUCT_VIDEO_NAME); + this.avPlayer.fdSrc = this.url; + Logger.info('AVPlayer state idle called.'); + } catch (error) { + let err = error as BusinessError; + hilog.error(0x00, 'VideoDialog', `getRawFd failed, code = ${err.code}, message = ${err.message}`); + } + break; case CommonConstants.AV_PLAYER_INITIALIZED_STATE: - // This status is reported after the AVPlayer sets the playback source. + // This status is reported after the AVPlayer sets the playback source. Logger.info('AVPlayer initialized called.'); this.avPlayer.surfaceId = this.surfaceId; - this.avPlayer.prepare().then(() => { + this.avPlayer.prepare().catch((error: BusinessError) => { + hilog.error(0x00, 'VideoDialog', `prepare failed, code = ${error.code}, message = ${error.message}`); + }).then(() => { Logger.info('AVPlayer prepare succeeded.'); }, (err: BusinessError) => { Logger.error(`Invoke prepare failed, code is ${err.code}, message is ${err.message}`); - this.avPlayer!.reset(); + this.avPlayer!.reset().catch((error: BusinessError) => { + hilog.error(0x00, 'VideoDialog', `reset failed, code = ${error.code}, message = ${error.message}`); + }); }); break; case CommonConstants.AV_PLAYER_PREPARED_STATE: - // Report the state machine after the prepare interface is successfully invoked. + // Report the state machine after the prepare interface is successfully invoked. this.avPlayer.videoScaleType = media.VideoScaleType.VIDEO_SCALE_TYPE_FIT; Logger.info('AVPlayer state prepared called.'); - this.avPlayer.play(); + this.avPlayer.play().catch((error: BusinessError) => { + hilog.error(0x00, 'VideoDialog', `play failed, code = ${error.code}, message = ${error.message}`); + }); break; case CommonConstants.AV_PLAYER_PLAYING_STATE: - // Trigger the state machine to report after the play interface is successfully invoked. + // Trigger the state machine to report after the play interface is successfully invoked. Logger.info('AVPlayer state playing called.'); this.playState = true; break; case CommonConstants.AV_PLAYER_PAUSED_STATE: - // Trigger the state machine to report after the pause function is successfully invoked. + // Trigger the state machine to report after the pause function is successfully invoked. Logger.info('AVPlayer state paused called.'); this.playState = false; break; case CommonConstants.AV_PLAYER_COMPLETED_STATE: - // Trigger the state machine to report after the playback ends. + // Trigger the state machine to report after the playback ends. Logger.info('AVPlayer state completed called.'); - this.avPlayer.stop(); + this.avPlayer.stop().catch((error: BusinessError) => { + hilog.error(0x00, 'VideoDialog', `stop failed, code = ${error.code}, message = ${error.message}`); + }); break; case CommonConstants.AV_PLAYER_STOPPED_STATE: - // Trigger the state machine to report after the stop interface is successfully invoked. + // Trigger the state machine to report after the stop interface is successfully invoked. Logger.info('AVPlayer state stopped called.'); break; case CommonConstants.AV_PLAYER_RELEASE_STATE: @@ -135,7 +154,9 @@ export struct VideoDialog { } catch (exception) { Logger.error('Failed to unregister callback. Code: ' + JSON.stringify(exception)); } - this.avPlayer!.release(); + this.avPlayer!.release().catch((error: BusinessError) => { + hilog.error(0x00, 'VideoDialog', `release failed, code = ${error.code}, message = ${error.message}`); + }); } build() { @@ -160,13 +181,19 @@ export struct VideoDialog { .aspectRatio(HomeConstants.VIDEO_DIALOG_ASPECT_RATIO) .onClick(() => { if (this.avPlayer!.state === CommonConstants.AV_PLAYER_STOPPED_STATE) { - this.avPlayer!.prepare(); + this.avPlayer!.prepare().catch((error: BusinessError) => { + hilog.error(0x00, 'VideoDialog', `prepare failed, code = ${error.code}, message = ${error.message}`); + }); return; } if (!this.playState) { - this.avPlayer!.play(); + this.avPlayer!.play().catch((error: BusinessError) => { + hilog.error(0x00, 'VideoDialog', `play failed, code = ${error.code}, message = ${error.message}`); + }); } else { - this.avPlayer!.pause(); + this.avPlayer!.pause().catch((error: BusinessError) => { + hilog.error(0x00, 'VideoDialog', `pause failed, code = ${error.code}, message = ${error.message}`); + }); } }) @@ -176,13 +203,19 @@ export struct VideoDialog { } async createAvPlayer(): Promise { - this.avPlayer = await media.createAVPlayer(); - // Entering the idle state. - this.url = await this.context.resourceManager.getRawFd(CommonConstants.PRODUCT_VIDEO_NAME); - this.avPlayer.fdSrc = this.url; - this.setAVPlayerCallback(); - // Initialize the playback status. - this.playState = false; + try { + this.avPlayer = await media.createAVPlayer(); + // Entering the idle state. + this.url = await this.context.resourceManager.getRawFd(CommonConstants.PRODUCT_VIDEO_NAME); + this.avPlayer.fdSrc = this.url; + this.setAVPlayerCallback(); + // Initialize the playback status. + this.playState = false; + } catch (error) { + let err = error as BusinessError; + hilog.error(0x00, 'VideoDialog', `createAVPlayer failed, code = ${err.code}, message = ${err.message}`); + } + } // Registering the avplayer callback function. diff --git a/features/videoDetail/src/main/ets/view/VideoDetailView.ets b/features/videoDetail/src/main/ets/view/VideoDetailView.ets index d71d4ad51f9824d3766faf5e16452102ad1e3245..c3313aa1e43cff930c50f7ddb0bb255301bec9eb 100644 --- a/features/videoDetail/src/main/ets/view/VideoDetailView.ets +++ b/features/videoDetail/src/main/ets/view/VideoDetailView.ets @@ -14,6 +14,8 @@ */ import { display } from '@kit.ArkUI'; +import { BusinessError } from '@kit.BasicServicesKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; import { BreakpointConstants, CommonConstants } from '@ohos/commons'; import { Logger } from '@ohos/commons'; import { RelatedList } from './RelatedList'; @@ -37,8 +39,13 @@ export struct VideoDetailView { private scroller: Scroller = new Scroller(); aboutToAppear(): void { - if(canIUse('SystemCapability.Window.SessionManager')){ - this.foldStatus = display.getFoldStatus(); + if (canIUse('SystemCapability.Window.SessionManager')) { + try { + this.foldStatus = display.getFoldStatus(); + } catch (error) { + let err = error as BusinessError; + hilog.error(0x00, 'VideoDetailView', `getFoldStatus failed, code = ${err.code}, message = ${err.message}`); + } } } @@ -57,7 +64,7 @@ export struct VideoDetailView { .height(this.creaseRegion[1]) .width(CommonConstants.FULL_PERCENT) .visibility(this.isHalfFolded && this.isShowingSideBar && this.isFullScreen ? Visibility.Visible : - Visibility.None) + Visibility.None) FooterEpisodes({ isShowingSideBar: this.isShowingSideBar, diff --git a/features/videoDetail/src/main/ets/view/VideoPlayer.ets b/features/videoDetail/src/main/ets/view/VideoPlayer.ets index c66532d8b233b62fdb3946acabe6ce510bb22905..a4129dae69c3f643b4a3f7fbd510675193238ca6 100644 --- a/features/videoDetail/src/main/ets/view/VideoPlayer.ets +++ b/features/videoDetail/src/main/ets/view/VideoPlayer.ets @@ -15,6 +15,8 @@ import { display } from '@kit.ArkUI'; import { deviceInfo } from '@kit.BasicServicesKit'; +import { BusinessError } from '@kit.BasicServicesKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; import { AvPlayerUtil, BreakpointConstants, CommonConstants, VideoNavPathStack, WindowUtil } from '@ohos/commons'; import { DetailConstants } from '../constants/DetailConstants'; @@ -57,13 +59,23 @@ export struct VideoPlayer { aboutToAppear(): void { this.avPlayerUtil = AvPlayerUtil.getInstance(this.getUIContext()); if (canIUse('SystemCapability.Window.SessionManager')) { - display.on('foldStatusChange', this.onFoldStatusChange); + try { + display.on('foldStatusChange', this.onFoldStatusChange); + } catch (error) { + let err = error as BusinessError; + hilog.error(0x00, 'VideoPlayer', `onFoldStatusChange failed, code = ${err.code}, message = ${err.message}`); + } } } aboutToDisappear(): void { if (canIUse('SystemCapability.Window.SessionManager')) { - display.off('foldStatusChange'); + try { + display.off('foldStatusChange'); + } catch (error) { + let err = error as BusinessError; + hilog.error(0x00, 'VideoPlayer', `onFoldStatusChange failed, code = ${err.code}, message = ${err.message}`); + } } } @@ -100,6 +112,7 @@ export struct VideoPlayer { .justifyContent(FlexAlign.Center) .height(this.isHalfFolded ? this.creaseRegion[0] : (this.isFullScreen ? '100%' : 'auto')) .width('100%') + // [StartExclude stack_isfullscreen] } .width('100%') @@ -119,6 +132,7 @@ export struct VideoPlayer { } }) ) + // [EndExclude stack_isfullscreen] Column() { // [StartExclude stack_isfullscreen] @@ -188,6 +202,7 @@ export struct VideoPlayer { .height('60vp') .width('100%') .visibility(this.isFullScreen ? Visibility.Visible : Visibility.None) + // [EndExclude stack_aligncontent] // [EndExclude stack_isfullscreen] } @@ -204,6 +219,7 @@ export struct VideoPlayer { } }) ) + // [StartExclude stack_isfullscreen] // [StartExclude stack_aligncontent] Row() { @@ -283,6 +299,7 @@ export struct VideoPlayer { .width('100%') .backgroundColor(Color.Black) .focusable(false) + // [End stack_isfullscreen] // [End stack_aligncontent] } diff --git a/products/phone/src/main/ets/entryability/EntryAbility.ets b/products/phone/src/main/ets/entryability/EntryAbility.ets index 6a4215db7972e346172c7808bf36509baa3d310f..05c32337132c71d1b69a6a73bedb7c2e00ec7668 100644 --- a/products/phone/src/main/ets/entryability/EntryAbility.ets +++ b/products/phone/src/main/ets/entryability/EntryAbility.ets @@ -20,7 +20,8 @@ import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; import { display, window } from '@kit.ArkUI'; import { hilog } from '@kit.PerformanceAnalysisKit'; -import { CommonConstants, WindowUtil } from '@ohos/commons'; +import { BusinessError } from '@kit.BasicServicesKit'; +import { WindowUtil } from '@ohos/commons'; // [Start multi_entryAbility] export default class EntryAbility extends UIAbility { @@ -34,6 +35,7 @@ export default class EntryAbility extends UIAbility { AppStorage.setOrCreate('windowWidth', windowSize.width); // [EndExclude EntryAbility] }; + // [StartExclude multi_entryAbility] // [StartExclude EntryAbility] onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { @@ -43,12 +45,13 @@ export default class EntryAbility extends UIAbility { onDestroy() { hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); } + // [EndExclude multi_entryAbility] // [EndExclude EntryAbility] onWindowStageCreate(windowStage: window.WindowStage) { // [StartExclude EntryAbility] // Main window is created, set main page for this ability - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + hilog.info(0x0000, 'EntryAbility', '%{public}s', 'Ability onWindowStageCreate'); // [EndExclude EntryAbility] this.windowUtil!.setWindowStage(windowStage); // [Start window_util_set] @@ -62,37 +65,46 @@ export default class EntryAbility extends UIAbility { this.windowObj = data; this.windowUtil!.updateWidthBp(); this.windowUtil!.updateHeightBp(); - AppStorage.setOrCreate('windowWidth', data.getWindowProperties().windowRect.width); + try { + AppStorage.setOrCreate('windowWidth', data.getWindowProperties().windowRect.width); + } catch (error) { + let err = error as BusinessError; + hilog.error(0x00, 'EntryAbility', `getWindowProperties failed, code = ${err.code}, message = ${err.message}`); + } this.windowObj.on('windowSizeChange', this.onWindowSizeChange); - }); + }).catch((error: BusinessError) => { + hilog.error(0x00, 'EntryAbility', `getWindowProperties failed, code = ${error.code}, message = ${error.message}`); + }) // [StartExclude EntryAbility] // [StartExclude multi_entryAbility] windowStage.loadContent('pages/Index', (err, data) => { if (err.code) { - hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + hilog.error(0x0000, 'EntryAbility', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); return; } - hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? ''); + hilog.info(0x0000, 'EntryAbility', 'Succeeded in loading the content. Data: %{public}s', + JSON.stringify(data) ?? ''); }); // [EndExclude EntryAbility] // [EndExclude multi_entryAbility] } + // [End EntryAbility] // [StartExclude multi_entryAbility] onWindowStageDestroy() { // Main window is destroyed, release UI related resources - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + hilog.info(0x0000, 'EntryAbility', '%{public}s', 'Ability onWindowStageDestroy'); } onForeground() { // Ability has brought to foreground - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + hilog.info(0x0000, 'EntryAbility', '%{public}s', 'Ability onForeground'); } onBackground() { // Ability has back to background - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + hilog.info(0x0000, 'EntryAbility', '%{public}s', 'Ability onBackground'); } // [Start update_width_bp] @@ -101,31 +113,38 @@ export default class EntryAbility extends UIAbility { if (this.windowObj === undefined) { return; } - let mainWindow: window.WindowProperties = this.windowObj.getWindowProperties(); - let windowWidth: number = mainWindow.windowRect.width; - let windowWidthVp = windowWidth / display.getDefaultDisplaySync().densityPixels; - let widthBp: string = ''; - let videoGridColumn: string = '1fr 1fr'; - if (windowWidthVp < 320) { - widthBp = 'xs'; - videoGridColumn = '1fr 1fr'; - } else if (windowWidthVp >= 320 && windowWidthVp < 600) { - widthBp = 'sm'; - videoGridColumn = '1fr 1fr'; - } else if (windowWidthVp >= 600 && windowWidthVp < 840) { - widthBp = 'md'; - videoGridColumn = '1fr 1fr 1fr'; - } else if (windowWidthVp >= 840 && windowWidthVp < 1440) { - widthBp = 'lg'; - videoGridColumn = '1fr 1fr 1fr 1fr'; - } else { - widthBp = 'xl'; - videoGridColumn = '1fr 1fr 1fr 1fr'; + try { + let mainWindow: window.WindowProperties = this.windowObj.getWindowProperties(); + let windowWidth: number = mainWindow.windowRect.width; + let windowWidthVp = windowWidth / display.getDefaultDisplaySync().densityPixels; + let widthBp: string = ''; + let videoGridColumn: string = '1fr 1fr'; + if (windowWidthVp < 320) { + widthBp = 'xs'; + videoGridColumn = '1fr 1fr'; + } else if (windowWidthVp >= 320 && windowWidthVp < 600) { + widthBp = 'sm'; + videoGridColumn = '1fr 1fr'; + } else if (windowWidthVp >= 600 && windowWidthVp < 840) { + widthBp = 'md'; + videoGridColumn = '1fr 1fr 1fr'; + } else if (windowWidthVp >= 840 && windowWidthVp < 1440) { + widthBp = 'lg'; + videoGridColumn = '1fr 1fr 1fr 1fr'; + } else { + widthBp = 'xl'; + videoGridColumn = '1fr 1fr 1fr 1fr'; + } + AppStorage.setOrCreate('currentWidthBreakpoint', widthBp); + AppStorage.setOrCreate('videoGridColumn', videoGridColumn); + } catch (error) { + let err = error as BusinessError; + hilog.error(0x00, 'EntryAbility', `getDefaultDisplaySync failed, code = ${err.code}, message = ${err.message}`); } - AppStorage.setOrCreate('currentWidthBreakpoint', widthBp); - AppStorage.setOrCreate('videoGridColumn', videoGridColumn); } + // [End update_width_bp] // [EndExclude multi_entryAbility] } + // [End multi_entryAbility]