WidgetRegistrationFix.ets 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { hilog } from '@kit.PerformanceAnalysisKit';
  2. import { Context } from '@kit.AbilityKit';
  3. import { PreferencesUtil } from '../utils/PreferencesUtil';
  4. import { GlobalWidgetManager } from './GlobalWidgetManager';
  5. const TAG = 'WidgetRegistrationFix';
  6. /**
  7. * 卡片注册修复工具
  8. * 用于修复卡片注册和持久化问题
  9. */
  10. export class WidgetRegistrationFix {
  11. private static instance: WidgetRegistrationFix | null = null;
  12. private preferencesUtil: PreferencesUtil = PreferencesUtil.getInstance();
  13. private globalWidgetManager: GlobalWidgetManager = GlobalWidgetManager.getInstance();
  14. private constructor() {}
  15. public static getInstance(): WidgetRegistrationFix {
  16. if (!WidgetRegistrationFix.instance) {
  17. WidgetRegistrationFix.instance = new WidgetRegistrationFix();
  18. }
  19. return WidgetRegistrationFix.instance;
  20. }
  21. /**
  22. * 执行卡片注册修复
  23. */
  24. public async fixWidgetRegistration(context: Context): Promise<void> {
  25. try {
  26. hilog.info(0x0000, TAG, '🔧 开始卡片注册修复...');
  27. // 同步活跃卡片到持久化存储
  28. await this.syncActiveWidgetsToPersistence(context);
  29. hilog.info(0x0000, TAG, '✅ 卡片注册修复完成');
  30. } catch (error) {
  31. hilog.error(0x0000, TAG, `❌ 卡片注册修复失败: ${error}`);
  32. }
  33. }
  34. /**
  35. * 同步活跃卡片到持久化存储
  36. */
  37. private async syncActiveWidgetsToPersistence(context: Context): Promise<void> {
  38. try {
  39. const prefs = await this.preferencesUtil.getPreferences(context);
  40. const persistedIds = await this.preferencesUtil.getFormIds(prefs);
  41. const activeWidgets = this.globalWidgetManager.getActiveWidgets();
  42. const activeIds = Array.from(activeWidgets.keys());
  43. hilog.info(0x0000, TAG, `📊 持久化: ${persistedIds.length}个, 活跃: ${activeIds.length}个`);
  44. // 将活跃但未持久化的卡片添加到持久化存储
  45. const missingInPersistence = activeIds.filter(id => !persistedIds.includes(id));
  46. if (missingInPersistence.length > 0) {
  47. hilog.info(0x0000, TAG, `🔧 同步 ${missingInPersistence.length} 个活跃卡片到持久化存储`);
  48. // 串行处理,避免并发问题
  49. for (const formId of missingInPersistence) {
  50. try {
  51. await this.preferencesUtil.addFormId(prefs, formId);
  52. hilog.info(0x0000, TAG, `✅ 同步卡片成功: ${formId}`);
  53. } catch (error) {
  54. hilog.error(0x0000, TAG, `❌ 同步卡片失败 ${formId}: ${error}`);
  55. }
  56. }
  57. }
  58. } catch (error) {
  59. hilog.error(0x0000, TAG, `❌ 同步活跃卡片失败: ${error}`);
  60. }
  61. }
  62. }