chendeben преди 1 година
родител
ревизия
07a3aca5f8
променени са 2 файла, в които са добавени 89 реда и са изтрити 13 реда
  1. 34 5
      entry/src/main/ets/common/service/UnifiedPlayerService.ets
  2. 55 8
      entry/src/main/ets/entryformability/EntryFormAbility.ets

+ 34 - 5
entry/src/main/ets/common/service/UnifiedPlayerService.ets

@@ -1698,8 +1698,6 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
       this.playlistSync.removeSyncListener(this);
       this.playlistSync.release();
 
-      this.playerManager.release();
-
       this.playlistModel.clear();
       this.isInitialized = false;
 
@@ -2334,12 +2332,12 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
     try {
       // 获取当前状态
       const currentState = this.stateModel.getState();
-      
+
       // 验证播放器实际状态,确保状态模型与实际播放器状态一致
       try {
         const ijkPlayer = this.playerManager.getIjkPlayer();
         const actualPlaying = ijkPlayer ? ijkPlayer.isPlaying() : false;
-        
+
         // 如果状态不一致,以实际播放器状态为准
         if (currentState.isPlaying !== actualPlaying) {
           LogUtils.getInstance().LOGI(`UnifiedPlayerService: State mismatch detected during save - StateModel: ${currentState.isPlaying}, Actual: ${actualPlaying}`);
@@ -2360,7 +2358,7 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
 
       this.savePlaybackPosition();
       this.syncPlaylistToStorage();
-      
+
       LogUtils.getInstance().LOGI(`UnifiedPlayerService: Current state saved successfully`);
     } catch (error) {
       LogUtils.getInstance().LOGI(`UnifiedPlayerService saveCurrentState error: ${error}`);
@@ -3027,6 +3025,37 @@ export class UnifiedPlayerService implements IPlayerService, PlaylistSyncListene
     }
   }
 
+  /**
+   * 处理新卡片添加事件。
+   * 此方法专为 FormExtensionAbility 的 onAddForm 调用。
+   * 它会确保在获取卡片数据前,服务的数据状态(如播放列表,当前歌曲)已从持久化存储中恢复,
+   * 从而避免新添加的卡片显示默认的“未知歌曲”信息。
+   * @param formId 新创建的卡片的ID
+   * @returns FormBindingData 实例,包含了正确的初始歌曲信息。
+   */
+  public async onFormAdded(formId: string): Promise<formBindingData.FormBindingData> {
+    try {
+      LogUtils.getInstance().LOGI(`UnifiedPlayerService: Form [${formId}] added. Preparing initial data.`);
+
+      // 1. 强制数据恢复,这是解决新卡片显示默认信息的关键步骤。
+      await this.forceDataRestoration();
+
+      // 2. 获取完整的卡片数据(包括图片)
+      const widgetData = await this.getWidgetFormData(true);
+      if (!widgetData) {
+        LogUtils.getInstance().LOGI(`UnifiedPlayerService onFormAdded: Failed to get widget data after restoration.`);
+        // 即使失败,也返回一个空的绑定数据,避免卡片创建失败
+        return formBindingData.createFormBindingData({});
+      }
+
+      // 3. 创建并返回 FormBindingData
+      return formBindingData.createFormBindingData(widgetData);
+    } catch (error) {
+      LogUtils.getInstance().LOGI(`UnifiedPlayerService onFormAdded: Error preparing data for form [${formId}]: ${error}`);
+      return formBindingData.createFormBindingData({});
+    }
+  }
+
   public async getWidgetFormData(loadImage: boolean = true): Promise<widgeData | undefined> {
     this.updatePlaylistStateInModelSync();
     const formData: VideoItem = this.getCurrentSong()!; // VideoItem

+ 55 - 8
entry/src/main/ets/entryformability/EntryFormAbility.ets

@@ -1,4 +1,4 @@
-import { formBindingData, FormExtensionAbility, formInfo, formProvider } from '@kit.FormKit';
+import { formBindingData, FormExtensionAbility, formProvider } from '@kit.FormKit';
 import { Want } from '@kit.AbilityKit';
 import { hilog } from '@kit.PerformanceAnalysisKit';
 import { PreferencesUtil } from '../common/utils/PreferencesUtil';
@@ -14,6 +14,21 @@ const TAG = 'EntryFormAbility';
  * 负责处理卡片的生命周期管理和用户交互事件
  * 支持多尺寸适配和UI重构
  */
+interface GeneratedObjectLiteralInterface_1 {
+  name: string;
+  artist: string;
+  album: string;
+  imageColorHex: string;
+  isPlaying: boolean;
+  isPaused: boolean;
+  isLoading: boolean;
+  currentTimeText: string;
+  totalTimeText: string;
+  progressPercentage: number;
+  imgName: string;
+  isFavorite: boolean;
+}
+
 export default class EntryFormAbility extends FormExtensionAbility {
   private unifiedPlayerService:UnifiedPlayerService = UnifiedPlayerService.getInstance();
 
@@ -24,7 +39,7 @@ export default class EntryFormAbility extends FormExtensionAbility {
    */
   onAddForm(want: Want): formBindingData.FormBindingData {
     hilog.info(0x0000, TAG, 'onAddForm');
-    
+
     // 检查参数有效性
     if (!want || !want.parameters) {
       hilog.error(0x0000, TAG, 'FormAbility onAddForm want or want.parameters is undefined');
@@ -65,19 +80,51 @@ export default class EntryFormAbility extends FormExtensionAbility {
       formInfo.formName = formName;
 
       hilog.info(0x0000, TAG, `onAddForm formInfo: ${JSON.stringify(formInfo)}`);
-      
+
       // 保存到数据库
       FormRdbHelper.getInstance(this.context).insertForm(formInfo).catch((error: Error) => {
         hilog.error(0x0000, TAG, `Failed to insert form to database: ${error.message}`);
       });
-
     }
 
-    // 返回初始数据作为临时显示
-    const adaptedData = this.unifiedPlayerService.getWidgetFormData();
-    console.info(`[EntryFormAbility] onAddForm returning data for ${formId}:`, JSON.stringify(adaptedData));
+    // 异步获取真实数据并更新卡片
+    this.updateFormWithRealData(formId);
+
+    // 立即返回一个加载中的临时数据,以满足同步返回的要求
+    const loadingData: GeneratedObjectLiteralInterface_1 = {
+      name: '正在加载...',
+      artist: '请稍候',
+      album: '',
+      imageColorHex: '2A2A2A',
+      isPlaying: false,
+      isPaused: true,
+      isLoading: true,
+      currentTimeText: '00:00',
+      totalTimeText: '00:00',
+      progressPercentage: 0,
+      imgName: '',
+      isFavorite: false
+    };
+    hilog.info(0x0000, TAG, `[${formId}] Returning initial loading data.`);
+    return formBindingData.createFormBindingData(loadingData);
+  }
 
-    return formBindingData.createFormBindingData(adaptedData);
+  /**
+   * 异步更新卡片真实数据
+   * @param formId 卡片ID
+   */
+  private updateFormWithRealData(formId: string): void {
+    // 使用setTimeout确保此操作在当前事件循环之后执行
+    setTimeout(async () => {
+      try {
+        hilog.info(0x0000, TAG, `[${formId}] Starting async data fetch for new form.`);
+        const realBindingData = await this.unifiedPlayerService.onFormAdded(formId);
+        await formProvider.updateForm(formId, realBindingData);
+        hilog.info(0x0000, TAG, `[${formId}] Successfully updated form with real data.`);
+      } catch (error) {
+        hilog.error(0x0000, TAG, `[${formId}] Failed to update form with real data: ${error}`);
+      }
+    }, 100); // 延迟100ms,给服务一点初始化时间
   }