/** * 导航能力(契约 §8.8/§8.9/§8.10/§11,T-M3-06)。 * - OpenurlTitleData:打开通用网页容器(路径 B,§11.2),关闭回传 → 上层 getWebdata。 * - SwitchOverGameData:容器内切换子游戏(路径 A,§11.1),同容器 loadUrl。 * - getGameinstall:同步返回子游戏资源是否就绪("1"/"0")。 * - backgameData:子游戏带数据返回大厅。 * * 容器持 pathStack/WebviewController,本 Provider 经 EventBus 发导航事件,由 BridgeGameContainer 执行。 */ import { common } from '@kit.AbilityKit'; import { FileSystem } from 'platform'; import { ResourceManager, ConfigManager } from 'domain_resource'; import { BridgeController } from 'feature_bridge'; import { InboundHandlers, OpenUrlTitleDataReq, SwitchOverGameReq } from 'contracts'; import { EventBus, NavEvents, OpenGenericWebPayload, SwitchGamePayload, BackGamePayload, Logger } from 'common'; import { CapabilityContext, CapabilityProvider } from '../core/CapabilityProvider'; export class NavProvider implements CapabilityProvider { readonly name: string = 'nav'; private readonly log: Logger = Logger.tag('NavProvider'); private context: common.UIAbilityContext | undefined = undefined; private config: ConfigManager | undefined = undefined; register(bridge: BridgeController, ctx: CapabilityContext): void { this.context = ctx.uiAbilityContext; this.config = ctx.config; bridge.registerHandler(InboundHandlers.OpenUrlTitleData, (data: string, _cb: (resp: string) => void) => { this.openUrl(data); }); bridge.registerHandler(InboundHandlers.SwitchOverGameData, (data: string, _cb: (resp: string) => void) => { this.switchGame(data); }); bridge.registerHandler(InboundHandlers.GetGameInstall, (data: string, cb: (resp: string) => void) => { cb(this.isGameInstalled(data) ? '1' : '0'); }); bridge.registerHandler(InboundHandlers.BackGameData, (data: string, _cb: (resp: string) => void) => { const payload: BackGamePayload = { data }; EventBus.emit(NavEvents.BACK_GAME, payload); }); } private openUrl(data: string): void { let req: OpenUrlTitleDataReq; try { req = JSON.parse(data) as OpenUrlTitleDataReq; } catch (e) { this.log.w(`OpenurlTitleData bad json: ${(e as Error).message}`); return; } const payload: OpenGenericWebPayload = { url: req.url, title: req.title, data: req.data, orientation: '' }; EventBus.emit(NavEvents.OPEN_GENERIC_WEB, payload); } private switchGame(data: string): void { let req: SwitchOverGameReq; try { req = JSON.parse(data) as SwitchOverGameReq; } catch (e) { this.log.w(`SwitchOverGameData bad json: ${(e as Error).message}`); return; } // webtype 契约为 "2"竖/"3"横,但 H5 可能发数字(如 3)。统一转字符串, // 否则下游 `webtype !== '2'` 的严格比较对数字恒为真,会把竖屏子游戏错误强制横屏。 const payload: SwitchGamePayload = { webtype: String(req.webtype), dir: req.Gamedirectory, data: req.data }; EventBus.emit(NavEvents.SWITCH_GAME, payload); } /** 子游戏资源是否就绪:<解压根>/