|
|
@@ -37,6 +37,8 @@ import { util } from '@kit.ArkTS';
|
|
|
import json from '@ohos.util.json';
|
|
|
import MediaTable from '../util/MediaTable';
|
|
|
import { Utility } from '../util/Utility';
|
|
|
+import { FormRdbHelper } from '../../database/FormRdbHelper';
|
|
|
+import { FormInfo } from '../../viewmodel/FormInfo';
|
|
|
|
|
|
/**
|
|
|
* 服务就绪状态详情接口
|
|
|
@@ -495,6 +497,9 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// 异步初始化耗时组件,避免阻塞
|
|
|
this.initializeHeavyComponentsAsync(context);
|
|
|
|
|
|
+ // 清理无效的Form ID
|
|
|
+ this.cleanupInvalidFormIds();
|
|
|
+
|
|
|
LogUtils.getInstance().LOGI('UnifiedPlayerService: Core initialization completed');
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`UnifiedPlayerService initialization error: ${error}`);
|
|
|
@@ -502,6 +507,44 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 为卡片进程设置context
|
|
|
+ * 卡片进程是独立的,需要单独设置context
|
|
|
+ */
|
|
|
+ setFormContext(context: common.UIAbilityContext | common.FormExtensionContext): void {
|
|
|
+ try {
|
|
|
+ this.context = context as common.UIAbilityContext;
|
|
|
+ // 同时设置到AppStorage,确保卡片进程中其他地方能访问
|
|
|
+ AppStorage.setOrCreate('context', context);
|
|
|
+ LogUtils.getInstance().LOGI('UnifiedPlayerService: Form context set successfully');
|
|
|
+ } catch (error) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Failed to set form context: ${error}`);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取当前context
|
|
|
+ */
|
|
|
+ getContext(): common.UIAbilityContext | null {
|
|
|
+ // 优先返回实例的context
|
|
|
+ if (this.context) {
|
|
|
+ return this.context;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 尝试从AppStorage获取
|
|
|
+ try {
|
|
|
+ const appStorageContext = AppStorage.get('context') as common.UIAbilityContext;
|
|
|
+ if (appStorageContext) {
|
|
|
+ this.context = appStorageContext;
|
|
|
+ return appStorageContext;
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Failed to get context from AppStorage: ${error}`);
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 异步初始化耗时组件
|
|
|
*/
|
|
|
@@ -1059,12 +1102,10 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
getFav(): Array<VideoItem> {
|
|
|
if (this.favList.length > 0) {
|
|
|
- console.log("Heanup UnifiedPlayerService favList cached:" + json.stringify(this.favList));
|
|
|
return this.favList;
|
|
|
}
|
|
|
// 如果缓存为空,异步更新但返回空数组,避免阻塞
|
|
|
this.getTable().queryByisFav(1, async (result: VideoItem[]) => {
|
|
|
- console.log("Heanup UnifiedPlayerService favList:" + json.stringify(result));
|
|
|
this.favList = result;
|
|
|
// 更新收藏列表后,重新更新AVSession状态以反映正确的收藏状态
|
|
|
if (result.length > 0) {
|
|
|
@@ -1613,7 +1654,6 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
// 播放事件监听
|
|
|
avSession.on('play', () => {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: AVSession play command received');
|
|
|
this.startPlayOrResumePlay().catch((error: Error) => {
|
|
|
LogUtils.getInstance().LOGI(`AVSession play command failed: ${error}`);
|
|
|
});
|
|
|
@@ -2195,7 +2235,6 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// 保存播放进度
|
|
|
this.savePlaybackPosition();
|
|
|
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService: Current state saved');
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`UnifiedPlayerService saveCurrentState error: ${error}`);
|
|
|
}
|
|
|
@@ -2807,68 +2846,65 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
// 定义变量在方法开始处,确保在整个方法中都可以访问
|
|
|
try {
|
|
|
const now = Date.now();
|
|
|
- // 防重复调用:如果正在更新或距离上次更新时间太近,则跳过(除非强制更新)
|
|
|
- if (!forceUpdate && (this.isUpdatingForms || (now - this.lastUpdateTime) < this.UPDATE_THROTTLE_MS)) {
|
|
|
- LogUtils.getInstance()
|
|
|
- .LOGI(`UnifiedPlayerService updateAllForms: Skipping duplicate call (last update: ${now -
|
|
|
- this.lastUpdateTime}ms ago)`);
|
|
|
- return;
|
|
|
- }
|
|
|
this.isUpdatingForms = true;
|
|
|
this.lastUpdateTime = now;
|
|
|
- // 从持久化存储获取所有formId
|
|
|
+ // 从数据库获取所有Form信息
|
|
|
const context = AppStorage.get('context') as common.UIAbilityContext;
|
|
|
if (!context) {
|
|
|
LogUtils.getInstance().LOGI('UnifiedPlayerService updateAllForms: No context available');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- const preferencesUtil: PreferencesUtil = PreferencesUtil.getInstance();
|
|
|
- const prefs = await preferencesUtil.getPreferences(context);
|
|
|
- const formIds: string[] = await preferencesUtil.getFormIds(prefs);
|
|
|
+ // 从数据库读取所有Form信息
|
|
|
+ let formInfoList: FormInfo[] = [];
|
|
|
+ try {
|
|
|
+ formInfoList = await FormRdbHelper.getInstance(context).queryAllForms();
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService updateAllForms: Found ${formInfoList.length} forms in database`);
|
|
|
+ } catch (error) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService updateAllForms: Failed to query forms from database: ${error}`);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- if (formIds.length === 0) {
|
|
|
- LogUtils.getInstance().LOGI('UnifiedPlayerService updateAllForms: No form IDs found');
|
|
|
+ if (formInfoList.length === 0) {
|
|
|
+ LogUtils.getInstance().LOGI('UnifiedPlayerService updateAllForms: No forms found in database');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
|
|
|
// 记录更新统计
|
|
|
- let successCount = 0;
|
|
|
- let failedCount = 0;
|
|
|
const invalidFormIds: string[] = [];
|
|
|
- let flatWidgetData = this.getWidgetFormData();
|
|
|
- if (flatWidgetData) {
|
|
|
- // 逐个更新所有卡片
|
|
|
- for (const formId of formIds) {
|
|
|
+ let flatWidgetData = await this.getWidgetFormData();
|
|
|
+
|
|
|
+ // 逐个更新所有卡片,根据卡片类型进行个性化处理
|
|
|
+ for (const formInfo of formInfoList) {
|
|
|
try {
|
|
|
const formBindingDataInstance = formBindingData.createFormBindingData(flatWidgetData);
|
|
|
- await formProvider.updateForm(formId, formBindingDataInstance);
|
|
|
- successCount++;
|
|
|
+ await formProvider.updateForm(formInfo.formId, formBindingDataInstance);
|
|
|
+
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService updateAllForms: Successfully updated form ${formInfo.formId} (${formInfo.formName})`);
|
|
|
} catch (error) {
|
|
|
- failedCount++;
|
|
|
const errorStr: string = error?.toString() || '';
|
|
|
- invalidFormIds.push(formId);
|
|
|
+ invalidFormIds.push(formInfo.formId);
|
|
|
LogUtils.getInstance()
|
|
|
- .LOGI(`UnifiedPlayerService updateAllForms: Form ${formId} - ${errorStr}}`);
|
|
|
-
|
|
|
+ .LOGI(`UnifiedPlayerService updateAllForms: Form ${formInfo.formId} (${formInfo.formName}) - ${errorStr}}`);
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- // 自动清理无效的Form ID
|
|
|
- if (invalidFormIds.length > 0) {
|
|
|
- try {
|
|
|
- await preferencesUtil.removeFormIds(prefs, invalidFormIds);
|
|
|
- LogUtils.getInstance()
|
|
|
- .LOGI(`UnifiedPlayerService updateAllForms: Removed ${invalidFormIds.length} invalid form IDs: ${invalidFormIds.join(', ')}`);
|
|
|
- } catch (error) {
|
|
|
- LogUtils.getInstance()
|
|
|
- .LOGI(`UnifiedPlayerService updateAllForms: Failed to clean invalid form IDs: ${error}`);
|
|
|
+ // 自动清理无效的Form ID
|
|
|
+ if (invalidFormIds.length > 0) {
|
|
|
+ try {
|
|
|
+ for (const invalidFormId of invalidFormIds) {
|
|
|
+ await FormRdbHelper.getInstance(context).deleteForm(invalidFormId);
|
|
|
}
|
|
|
+ LogUtils.getInstance()
|
|
|
+ .LOGI(`UnifiedPlayerService updateAllForms: Removed ${invalidFormIds.length} invalid form IDs from database: ${invalidFormIds.join(', ')}`);
|
|
|
+ } catch (error) {
|
|
|
+ LogUtils.getInstance()
|
|
|
+ .LOGI(`UnifiedPlayerService updateAllForms: Failed to clean invalid form IDs from database: ${error}`);
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- } catch (error) {
|
|
|
+ } catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`UnifiedPlayerService updateAllForms error: ${error}`);
|
|
|
} finally {
|
|
|
// 重置更新标志
|
|
|
@@ -2884,9 +2920,14 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
this.lastUpdateTime = now;
|
|
|
const formData: VideoItem = this.getCurrentSong() as VideoItem; // VideoItem
|
|
|
const songState: PlayerState = this.getCurrentState(); // PlayerState
|
|
|
- // 从持久化存储获取所有formId
|
|
|
- const context = AppStorage.get('context') as common.UIAbilityContext;
|
|
|
-
|
|
|
+
|
|
|
+ // 从持久化存储获取所有formId - 使用新的getContext方法
|
|
|
+ let context = this.getContext();
|
|
|
+
|
|
|
+ // 如果还是没有context,尝试从AppStorage获取
|
|
|
+ if (!context) {
|
|
|
+ context = AppStorage.get('context') as common.UIAbilityContext;
|
|
|
+ }
|
|
|
|
|
|
// 构建卡片数据,包含VideoItem和PlayerState信息
|
|
|
const widgetPlayerState: WidgetPlayerState = {
|
|
|
@@ -2911,7 +2952,8 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
progressPercentage: this.calculateProgressPercentage(songState.currentPosition || 0, songState.duration || 0)
|
|
|
};
|
|
|
|
|
|
- if (!context || !formData) {
|
|
|
+ if (!formData) {
|
|
|
+ console.log('UnifiedPlayerService getWidgetFormData: No formData available - formData:'+json.stringify(formData))
|
|
|
const defaultData: widgeData = {
|
|
|
id: '',
|
|
|
name: '未知歌曲',
|
|
|
@@ -2942,7 +2984,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
}
|
|
|
return defaultData;
|
|
|
}
|
|
|
-
|
|
|
+ console.log('UnifiedPlayerService getWidgetFormData - context: '+json.stringify(context)+" - formData:"+json.stringify(formData))
|
|
|
// 处理封面图片
|
|
|
let imgName: string = '';
|
|
|
|
|
|
@@ -3080,15 +3122,6 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 歌曲变化时更新卡片
|
|
|
- */
|
|
|
- private async updateWidgetsForSongChange(song: VideoItem, forceUpdate: boolean = false): Promise<void> {
|
|
|
-
|
|
|
- this.updateAllForms();
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
|
|
|
/**
|
|
|
* 状态变化时更新卡片
|
|
|
@@ -3271,10 +3304,6 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
|
|
|
// 记录上次更新时间
|
|
|
this.lastAvSessionUpdate = now;
|
|
|
-
|
|
|
- LogUtils.getInstance()
|
|
|
- .LOGI(`UnifiedPlayerService: AVSession play state updated successfully` + JSON.stringify(playbackState));
|
|
|
-
|
|
|
} catch (error) {
|
|
|
LogUtils.getInstance().LOGI(`UnifiedPlayerService: Failed to update AVSession play state: ${error}`);
|
|
|
}
|
|
|
@@ -3568,4 +3597,105 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
|
|
|
LogUtils.getInstance().LOGI(`UnifiedPlayerService: Failed to clean expired cache: ${error}`);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 清理无效的Form ID
|
|
|
+ * 应用启动时调用,验证所有保存的Form ID是否仍然有效
|
|
|
+ */
|
|
|
+ private async cleanupInvalidFormIds(): Promise<void> {
|
|
|
+ try {
|
|
|
+ if (!this.context) {
|
|
|
+ LogUtils.getInstance().LOGI('UnifiedPlayerService: No context for cleanup invalid form IDs');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 从数据库读取所有Form信息
|
|
|
+ let formInfoList: FormInfo[] = [];
|
|
|
+ try {
|
|
|
+ formInfoList = await FormRdbHelper.getInstance(this.context).queryAllForms();
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService cleanupInvalidFormIds: Found ${formInfoList.length} forms in database`);
|
|
|
+ } catch (error) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService cleanupInvalidFormIds: Failed to query forms from database: ${error}`);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (formInfoList.length === 0) {
|
|
|
+ LogUtils.getInstance().LOGI('UnifiedPlayerService cleanupInvalidFormIds: No forms found in database');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 记录更新统计
|
|
|
+ const invalidFormIds: string[] = [];
|
|
|
+ let flatWidgetData = await this.getWidgetFormData();
|
|
|
+
|
|
|
+ // 逐个更新所有卡片,根据卡片类型进行个性化处理
|
|
|
+ for (const formInfo of formInfoList) {
|
|
|
+ try {
|
|
|
+ const formBindingDataInstance = formBindingData.createFormBindingData(flatWidgetData);
|
|
|
+ await formProvider.updateForm(formInfo.formId, formBindingDataInstance);
|
|
|
+
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService cleanupInvalidFormIds: Successfully updated form ${formInfo.formId} (${formInfo.formName})`);
|
|
|
+ } catch (error) {
|
|
|
+ const errorStr: string = error?.toString() || '';
|
|
|
+ invalidFormIds.push(formInfo.formId);
|
|
|
+ LogUtils.getInstance()
|
|
|
+ .LOGI(`UnifiedPlayerService cleanupInvalidFormIds: Form ${formInfo.formId} (${formInfo.formName}) - ${errorStr}}`);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 自动清理无效的Form ID
|
|
|
+ if (invalidFormIds.length > 0) {
|
|
|
+ try {
|
|
|
+ for (const invalidFormId of invalidFormIds) {
|
|
|
+ await FormRdbHelper.getInstance(this.context).deleteForm(invalidFormId);
|
|
|
+ }
|
|
|
+ LogUtils.getInstance()
|
|
|
+ .LOGI(`UnifiedPlayerService cleanupInvalidFormIds: Removed ${invalidFormIds.length} invalid form IDs from database: ${invalidFormIds.join(', ')}`);
|
|
|
+ } catch (error) {
|
|
|
+ LogUtils.getInstance()
|
|
|
+ .LOGI(`UnifiedPlayerService cleanupInvalidFormIds: Failed to clean invalid form IDs from database: ${error}`);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ // const preferencesUtil = PreferencesUtil.getInstance();
|
|
|
+ // const prefs = await preferencesUtil.getPreferences(this.context);
|
|
|
+ // const formIds = await preferencesUtil.getFormIds(prefs);
|
|
|
+ //
|
|
|
+ // if (formIds.length === 0) {
|
|
|
+ // LogUtils.getInstance().LOGI('UnifiedPlayerService: No form IDs to cleanup');
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // const invalidFormIds: string[] = [];
|
|
|
+ //
|
|
|
+ // // 逐个验证Form ID的有效性
|
|
|
+ // for (const formId of formIds) {
|
|
|
+ // try {
|
|
|
+ // // 尝试更新卡片来验证其有效性
|
|
|
+ // const flatWidgetData = await this.getWidgetFormData();
|
|
|
+ // if (flatWidgetData) {
|
|
|
+ // const formBindingDataInstance = formBindingData.createFormBindingData(flatWidgetData);
|
|
|
+ // await formProvider.updateForm(formId, formBindingDataInstance);
|
|
|
+ // }
|
|
|
+ // } catch (error) {
|
|
|
+ // // 如果更新失败,说明这个Form ID无效
|
|
|
+ // invalidFormIds.push(formId);
|
|
|
+ // LogUtils.getInstance().LOGI(`UnifiedPlayerService: Invalid form ID detected: ${formId}, error: ${error}`);
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // // 移除无效的Form ID
|
|
|
+ // if (invalidFormIds.length > 0) {
|
|
|
+ //
|
|
|
+ //
|
|
|
+ // LogUtils.getInstance().LOGI(`UnifiedPlayerService: Cleaned up ${invalidFormIds.length} invalid form IDs: ${invalidFormIds.join(', ')}`);
|
|
|
+ // } else {
|
|
|
+ // LogUtils.getInstance().LOGI(`UnifiedPlayerService: All ${formIds.length} form IDs are valid`);
|
|
|
+ // }
|
|
|
+ } catch (error) {
|
|
|
+ LogUtils.getInstance().LOGI(`UnifiedPlayerService: Failed to cleanup invalid form IDs: ${error}`);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|