ke: 鸿蒙 UI 整改:emoji→AmIcon 图标、宽屏侧栏、Md 第三方库、通知可配置项

- common/Icons.ets(生成器产出):43 枚与 WebUI icons.tsx 同几何的 Path 图标
- NavItems.ts:icon(emoji) → iconKey,与 WebUI 导航同图标
- 全页面 emoji 清除(空态改单行灰字,按钮/头像/刷新等换 AmIcon)
- MailDetailPage 接入 @luvi/lv-markdown-in(第三方,替代手写解析器)
- WideSidebar + MainPage isWide(≥768vp):宽屏侧栏 60vp 图标轨、藏底部条、onAreaChange 断点
- 通知=可配置项(默认关):PushService.isEnabled/setEnabled + reportToken 最前 gate (关=不取token/不弹权限/不打网关)+ SettingsPage Toggle + 服务端通道状态提示
- EntryAbility.onCreate 解析 want:冷启点通知也能路由(原来只有 onNewWant)
- 判据:harmony-widescreen(4) + harmony-push-optin(4) 新增;harmony-nav 同步 iconKey/条件 padding
This commit is contained in:
2026-09-16 07:46:52 +08:00
parent 9c6e9c66ad
commit cfe7808af4
19 changed files with 766 additions and 89 deletions

View File

@ -37,6 +37,14 @@ const DOMAIN: number = 0x0001;
const TAG: string = 'PushService';
const STORE: string = 'push_store';
const MARKER_KEY: string = 'reported_marker';
const SETTING_KEY: string = 'push_enabled';
/*
* ★ 2026-09-15:接入系统通知是**可配置项**(用户强调多次)。
* 默认 **关** —— 自部署的用户没有服务端推送凭证时,App 不取 token、不请求权限、不上报、不打网关。
* 开了以后才走 getToken → requestEnableNotification → 上报这一整条。
* 这条开关存在 PushService 里(而不是设置页 @State),是因为 onCreate(ability 阶段)要读它。
*/
/** 点击跳转的目标(由通知 data 解析而来;只有两样东西要路由) */
export interface PushRoute {
@ -72,6 +80,31 @@ export class PushService {
return PushService.instance;
}
/**
* 读「接入系统通知」开关(**默认关** —— 自部署/无凭证时零开销)。
* 读不到(首次/异常)都返回 false:宁可不开,也不要"默认就把用户裹进来"。
*/
static isEnabled(context: common.Context): boolean {
try {
const store = preferences.getPreferencesSync(context, { name: STORE });
const v = store.getSync(SETTING_KEY, false);
return v === true;
} catch (e) {
return false;
}
}
/** 写开关(设置页 Toggle 回调;写入失败静默 —— 关着总比误开着安全,下次再试不迟) */
static setEnabled(context: common.Context, enabled: boolean): void {
try {
const store = preferences.getPreferencesSync(context, { name: STORE });
store.putSync(SETTING_KEY, enabled);
store.flush();
} catch (e) {
hilog.info(DOMAIN, TAG, '推送开关写不进去(静默):%{public}s', (e as BusinessError).message);
}
}
/**
* 取 Push Kit 的 token。**取不到就返回空串**(没装 HMS Core、没登录华为账号、没权限……都是正常情况)。
*/
@ -132,6 +165,15 @@ export class PushService {
* 放在启动后调用(登录成功之后、或已有账号时),调用方**不需要** catch —— 它自己内部全静默。
*/
async reportToken(api: ApiClient): Promise<void> {
/*
* ★ 开关 gate(2026-09-15):"接入系统通知"是**可配置项**,默认关。
* 关 ⇒ 不取 token(不碰 Push Kit)、不申请权限(不弹系统弹窗)、不上报、不打网关 ——
* 自部署用户没有服务端推送凭证时,这一整条都是无谓的开销。
* 这条 gate 在**最前**:getToken/requestEnableNotification 都在它后面。
*/
if (!PushService.isEnabled(this.context)) {
return;
}
const token: string = await this.getToken();
if (token.length === 0) {
return; // 没有 token 就没什么可报的(这不是错误)