新增了提醒静音功能,可以在设置中关闭某个日历本的提醒。

This commit is contained in:
2026-09-13 21:56:51 +08:00
parent 0fef40c7f3
commit d9c212785d
3 changed files with 120 additions and 1 deletions
+28
View File
@@ -13,6 +13,7 @@ export class AppSettings {
private static readonly KEY_SYS_MODE: string = 'sys_cal_mode'; // 'display' | 'backup'
private static readonly KEY_BACKUP_KEY: string = 'sys_backup_cal_key'; // 备份目标 DAV 日历本
private static readonly KEY_MANUAL_READONLY: string = 'manual_readonly_keys'; // 手动标记只读的 calKey
private static readonly KEY_MUTED_REMINDER: string = 'muted_reminder_keys'; // 提醒静音的 calKey
private static readonly KEY_FULL_REFETCH: string = 'full_refetch_done'; // 一次性全量重拉已完成
/**
@@ -86,6 +87,33 @@ export class AppSettings {
}
}
/**
* 提醒静音的日历本 calKey 列表。
* 适用于别人分享的日历本:静音后其中所有日程都不再发布系统提醒(日程本身仍正常显示)。
*/
static async getMutedReminderKeys(context: common.Context): Promise<string[]> {
try {
const store: preferences.Preferences =
await preferences.getPreferences(context, AppSettings.STORE);
const raw: string = await store.get(AppSettings.KEY_MUTED_REMINDER, '') as string;
return raw === '' ? [] : raw.split(';');
} catch (err) {
return [];
}
}
static async setMutedReminderKeys(context: common.Context, keys: string[]): Promise<void> {
try {
const store: preferences.Preferences =
await preferences.getPreferences(context, AppSettings.STORE);
await store.put(AppSettings.KEY_MUTED_REMINDER, keys.join(';'));
await store.flush();
} catch (err) {
const e = err as BusinessError;
console.error(`保存提醒静音标记失败: ${e.message}`);
}
}
/** 系统日历模式:display = 仅混合显示;backup = 本地系统日程备份到选定 CalDAV 日历本 */
static async getSysCalMode(context: common.Context): Promise<string> {
try {
@@ -5,6 +5,7 @@ import { reminderAgentManager } from '@kit.BackgroundTasksKit';
import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { EventDb, LocalEvent } from './EventDb';
import { AppSettings } from './AppSettings';
import { LogUtil } from './LogUtil';
export class ReminderService {
@@ -18,8 +19,13 @@ export class ReminderService {
const now: number = Date.now();
const rows: LocalEvent[] =
await EventDb.queryRemindable(context, now, now + ReminderService.WINDOW);
// 提醒静音的日历本(如别人分享的本):其中所有日程都不再提醒
const muted: string[] = await AppSettings.getMutedReminderKeys(context);
let published: number = 0;
for (const e of rows) {
if (muted.includes(e.calKey)) {
continue;
}
if (published >= ReminderService.MAX_REMINDERS) {
break;
}
@@ -50,7 +56,7 @@ export class ReminderService {
await reminderAgentManager.publishReminder(request);
published++;
}
LogUtil.write(`提醒刷新完成:发布 ${published} 个提醒(窗口 7 天)`);
LogUtil.write(`提醒刷新完成:发布 ${published} 个提醒(窗口 7 天,静音日历本 ${muted.length} 个`);
} catch (err) {
const e = err as BusinessError;
LogUtil.write(`提醒刷新失败: ${e.code} - ${e.message}`);