1.增加了重力感应,也就是横屏响应式布局。

2.修改了沉浸式布局。
3.修改了添加日程和编辑日程页面,增加了重复、提醒等功能。
4.修改了权限问题,如果日历本是只读,则有删除线做标识。同时,对于只读的日程,点击后将不再进入编辑页面,而是展示详情。
5.系统日历的处理。给用户两个选择,第一个选择就是只显示系统日历。第二种选择,用户可以选择一个caldav账户中的某一个日历本,把系统日历中的日程,包括日历日程和应用创建的日程,都读取出来,然后加入到这个日历本下,最后同步到caldav的服务器上,这样的好处是,手机丢失了,或者换了手机品牌型号,手机上的日程仍然在自己的caldav服务器上有一个备份。当然,系统日历中的caldav日历,就不会再读取了。
This commit is contained in:
2026-09-13 20:25:18 +08:00
parent 61bd6fc75f
commit 04fdf3d386
14 changed files with 1211 additions and 210 deletions
+77
View File
@@ -9,6 +9,83 @@ export class AppSettings {
private static readonly KEY_SHOW_SYSTEM: string = 'show_system_calendar';
private static readonly KEY_SYNC_INTERVAL: string = 'sync_interval_minutes';
private static readonly KEY_BACKGROUND_SYNC: string = 'background_sync';
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
/**
* 手动标记为只读的日历本 calKey 列表。
* 部分服务器(如群晖某些共享方式)不在 CalDAV 层拒绝写入,自动探测无法区分,
* 由用户手动标记,标记后其中日程只显示详情、不出现在新建日程选择中。
*/
static async getManualReadonlyKeys(context: common.Context): Promise<string[]> {
try {
const store: preferences.Preferences =
await preferences.getPreferences(context, AppSettings.STORE);
const raw: string = await store.get(AppSettings.KEY_MANUAL_READONLY, '') as string;
return raw === '' ? [] : raw.split(';');
} catch (err) {
return [];
}
}
static async setManualReadonlyKeys(context: common.Context, keys: string[]): Promise<void> {
try {
const store: preferences.Preferences =
await preferences.getPreferences(context, AppSettings.STORE);
await store.put(AppSettings.KEY_MANUAL_READONLY, 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 {
const store: preferences.Preferences =
await preferences.getPreferences(context, AppSettings.STORE);
return await store.get(AppSettings.KEY_SYS_MODE, 'display') as string;
} catch (err) {
return 'display';
}
}
static async setSysCalMode(context: common.Context, mode: string): Promise<void> {
try {
const store: preferences.Preferences =
await preferences.getPreferences(context, AppSettings.STORE);
await store.put(AppSettings.KEY_SYS_MODE, mode);
await store.flush();
} catch (err) {
const e = err as BusinessError;
console.error(`保存系统日历模式失败: ${e.message}`);
}
}
/** 备份目标日历本 calKeyaccId_序号),空 = 未选择 */
static async getBackupCalKey(context: common.Context): Promise<string> {
try {
const store: preferences.Preferences =
await preferences.getPreferences(context, AppSettings.STORE);
return await store.get(AppSettings.KEY_BACKUP_KEY, '') as string;
} catch (err) {
return '';
}
}
static async setBackupCalKey(context: common.Context, calKey: string): Promise<void> {
try {
const store: preferences.Preferences =
await preferences.getPreferences(context, AppSettings.STORE);
await store.put(AppSettings.KEY_BACKUP_KEY, calKey);
await store.flush();
} catch (err) {
const e = err as BusinessError;
console.error(`保存备份目标失败: ${e.message}`);
}
}
/** 是否开启后台持续同步(长时任务,默认关) */
static async getBackgroundSync(context: common.Context): Promise<boolean> {