|
|
@@ -58,7 +58,7 @@ interface WidgetConfigParams extends Record<string, Object> {
|
|
|
*/
|
|
|
export default class EntryFormAbility extends FormExtensionAbility
|
|
|
implements SizeChangeListener, ThemeChangeListener, PreferencesChangeListener {
|
|
|
- private widgetDataManager: WidgetDataManager = new WidgetDataManager();
|
|
|
+ private widgetDataManager: WidgetDataManager | null = null;
|
|
|
private playerControlService: PlayerControlService = new PlayerControlService();
|
|
|
private layoutManager: FormLayoutManager = FormLayoutManager.getInstance();
|
|
|
private sizeAdapter: WidgetSizeAdapter = WidgetSizeAdapter.getInstance();
|
|
|
@@ -67,11 +67,24 @@ implements SizeChangeListener, ThemeChangeListener, PreferencesChangeListener {
|
|
|
private userPreferencesService: UserPreferencesService = UserPreferencesService.getInstance();
|
|
|
private formSizeMap: Map<string, WidgetSize> = new Map();
|
|
|
|
|
|
+ /**
|
|
|
+ * 初始化服务
|
|
|
+ */
|
|
|
+ private initializeServices(): void {
|
|
|
+ if (!this.widgetDataManager) {
|
|
|
+ this.widgetDataManager = new WidgetDataManager();
|
|
|
+ hilog.info(0x0000, TAG, 'WidgetDataManager initialized');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 卡片创建时调用
|
|
|
*/
|
|
|
onAddForm(want: Want): formBindingData.FormBindingData {
|
|
|
hilog.info(0x0000, TAG, 'onAddForm called');
|
|
|
+
|
|
|
+ // 初始化服务
|
|
|
+ this.initializeServices();
|
|
|
|
|
|
const formId = want.parameters?.['ohos.extra.param.key.form_identity'] as string;
|
|
|
const formName = want.parameters?.['ohos.extra.param.key.form_name'] as string;
|
|
|
@@ -93,13 +106,67 @@ implements SizeChangeListener, ThemeChangeListener, PreferencesChangeListener {
|
|
|
// 初始化卡片数据
|
|
|
this.initializeWidget(formId, widgetSize);
|
|
|
|
|
|
- // 获取适配后的初始数据
|
|
|
- const initialData = this.widgetDataManager.getInitialWidgetData();
|
|
|
+ // 添加数据流测试 - 仅在开发环境中
|
|
|
+ setTimeout(() => {
|
|
|
+ this.testWidgetDataFlow(formId);
|
|
|
+ }, 3000);
|
|
|
+
|
|
|
+ // 获取当前播放状态而不是初始数据
|
|
|
+ this.playerControlService.getCurrentPlayState().then((currentState: WidgetData) => {
|
|
|
+ const adaptedData = this.layoutManager.adaptDataForSize(currentState, widgetSize);
|
|
|
+ const formData = formBindingData.createFormBindingData(adaptedData);
|
|
|
+ // 立即更新卡片以显示当前状态
|
|
|
+ formProvider.updateForm(formId, formData);
|
|
|
+ hilog.info(0x0000, TAG, `Widget ${formId} initialized with current state`);
|
|
|
+ });
|
|
|
+
|
|
|
+ // 返回初始数据作为临时显示
|
|
|
+ const initialData = this.widgetDataManager?.getInitialWidgetData() || this.getDefaultWidgetData();
|
|
|
const adaptedData = this.layoutManager.adaptDataForSize(initialData, widgetSize);
|
|
|
|
|
|
return formBindingData.createFormBindingData(adaptedData);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取默认卡片数据
|
|
|
+ */
|
|
|
+ private getDefaultWidgetData(): WidgetData {
|
|
|
+ return {
|
|
|
+ playState: {
|
|
|
+ isPlaying: false,
|
|
|
+ isPaused: true,
|
|
|
+ isLoading: false
|
|
|
+ },
|
|
|
+ currentSong: {
|
|
|
+ id: '',
|
|
|
+ title: '暂无播放',
|
|
|
+ artist: '未知艺术家',
|
|
|
+ album: '未知专辑',
|
|
|
+ coverImagePath: '',
|
|
|
+ duration: 0
|
|
|
+ },
|
|
|
+ progress: {
|
|
|
+ currentPosition: 0,
|
|
|
+ duration: 0,
|
|
|
+ percentage: 0,
|
|
|
+ currentTimeText: '00:00',
|
|
|
+ totalTimeText: '00:00'
|
|
|
+ },
|
|
|
+ playlist: {
|
|
|
+ hasNext: false,
|
|
|
+ hasPrevious: false,
|
|
|
+ currentIndex: 0,
|
|
|
+ totalCount: 0
|
|
|
+ },
|
|
|
+ config: {
|
|
|
+ size: 'medium' as WidgetSize,
|
|
|
+ theme: 'auto' as string,
|
|
|
+ showProgress: true,
|
|
|
+ showCover: true
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 卡片更新时调用
|
|
|
*/
|
|
|
@@ -108,6 +175,11 @@ implements SizeChangeListener, ThemeChangeListener, PreferencesChangeListener {
|
|
|
|
|
|
// 获取最新的播放状态数据
|
|
|
this.updateWidgetData(formId);
|
|
|
+
|
|
|
+ // 延迟再次更新,确保数据同步到所有卡片
|
|
|
+ setTimeout((): void => {
|
|
|
+ this.updateAllWidgetsData();
|
|
|
+ }, 200);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -125,7 +197,7 @@ implements SizeChangeListener, ThemeChangeListener, PreferencesChangeListener {
|
|
|
this.formSizeMap.delete(formId);
|
|
|
|
|
|
// 清理卡片相关数据和配置
|
|
|
- this.widgetDataManager.removeWidgetData(formId);
|
|
|
+ this.widgetDataManager?.removeWidgetData(formId);
|
|
|
this.configManager.removeWidgetConfig(formId);
|
|
|
}
|
|
|
|
|
|
@@ -172,7 +244,7 @@ implements SizeChangeListener, ThemeChangeListener, PreferencesChangeListener {
|
|
|
this.themeSyncService.startThemeSync();
|
|
|
|
|
|
// 更新所有卡片以适应新配置
|
|
|
- this.widgetDataManager.updateAllWidgets();
|
|
|
+ this.widgetDataManager?.updateAllWidgets();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -242,11 +314,14 @@ implements SizeChangeListener, ThemeChangeListener, PreferencesChangeListener {
|
|
|
try {
|
|
|
// 注册播放状态监听
|
|
|
this.playerControlService.registerStateListener((data: WidgetData) => {
|
|
|
+ hilog.info(0x0000, TAG, `Widget ${formId} received state update: isPlaying=${data.playState.isPlaying}, title=${data.currentSong.title}, hasNext=${data.playlist.hasNext}, hasPrevious=${data.playlist.hasPrevious}`);
|
|
|
+
|
|
|
// 根据卡片尺寸适配数据
|
|
|
const currentSize = this.formSizeMap.get(formId) || WidgetSize.MEDIUM;
|
|
|
const adaptedData = this.layoutManager.adaptDataForSize(data, currentSize);
|
|
|
- this.widgetDataManager.updateWidget(formId, adaptedData);
|
|
|
- hilog.info(0x0000, TAG, `Widget ${formId} state updated from listener: hasNext=${data.playlist.hasNext}, hasPrevious=${data.playlist.hasPrevious}, totalCount=${data.playlist.totalCount}`);
|
|
|
+ this.widgetDataManager?.updateWidget(formId, adaptedData);
|
|
|
+
|
|
|
+ hilog.info(0x0000, TAG, `Widget ${formId} updated successfully`);
|
|
|
});
|
|
|
|
|
|
// 获取当前播放状态
|
|
|
@@ -256,7 +331,6 @@ implements SizeChangeListener, ThemeChangeListener, PreferencesChangeListener {
|
|
|
const personalConfig = await this.configManager.getWidgetConfig(formId, widgetSize);
|
|
|
|
|
|
// 应用尺寸和个性化配置
|
|
|
- const sizeConfig = this.layoutManager.getSizeDisplayConfig(widgetSize);
|
|
|
currentState.config = ObjectUtils.assign(currentState.config);
|
|
|
currentState.config.showProgress = personalConfig.showProgress;
|
|
|
currentState.config.showCover = personalConfig.showCover;
|
|
|
@@ -264,7 +338,7 @@ implements SizeChangeListener, ThemeChangeListener, PreferencesChangeListener {
|
|
|
|
|
|
// 适配数据到指定尺寸
|
|
|
const adaptedData = this.layoutManager.adaptDataForSize(currentState, widgetSize);
|
|
|
- await this.widgetDataManager.saveWidgetData(formId, adaptedData);
|
|
|
+ await this.widgetDataManager?.saveWidgetData(formId, adaptedData);
|
|
|
|
|
|
// 立即请求一次最新状态,并多次重试确保获取到真实状态
|
|
|
setTimeout(() => {
|
|
|
@@ -279,7 +353,7 @@ implements SizeChangeListener, ThemeChangeListener, PreferencesChangeListener {
|
|
|
this.updateWidgetData(formId);
|
|
|
}, 5000);
|
|
|
|
|
|
- hilog.info(0x0000, TAG, `Widget ${formId} initialized successfully with size: ${widgetSize}`);
|
|
|
+ hilog.info(0x0000, TAG, `Widget ${formId} initialized successfully with size: ${widgetSize}, listeners registered: PlayerControl + AvSession`);
|
|
|
} catch (error) {
|
|
|
hilog.error(0x0000, TAG, `Failed to initialize widget ${formId}: ${error}`);
|
|
|
}
|
|
|
@@ -297,7 +371,7 @@ implements SizeChangeListener, ThemeChangeListener, PreferencesChangeListener {
|
|
|
|
|
|
// 适配数据到当前尺寸
|
|
|
const adaptedData = this.layoutManager.adaptDataForSize(currentState, currentSize);
|
|
|
- await this.widgetDataManager.updateWidget(formId, adaptedData);
|
|
|
+ await this.widgetDataManager?.updateWidget(formId, adaptedData);
|
|
|
|
|
|
hilog.info(0x0000, TAG, `Widget ${formId} updated successfully with size: ${currentSize}`);
|
|
|
} catch (error) {
|
|
|
@@ -305,6 +379,30 @@ implements SizeChangeListener, ThemeChangeListener, PreferencesChangeListener {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 更新所有卡片数据
|
|
|
+ */
|
|
|
+ private async updateAllWidgetsData(): Promise<void> {
|
|
|
+ try {
|
|
|
+ const currentState = await this.playerControlService.getCurrentPlayState();
|
|
|
+
|
|
|
+ // 遍历所有卡片ID并更新
|
|
|
+ this.formSizeMap.forEach(async (size: WidgetSize, formId: string) => {
|
|
|
+ try {
|
|
|
+ const adaptedData = this.layoutManager.adaptDataForSize(currentState, size);
|
|
|
+ await this.widgetDataManager?.updateWidget(formId, adaptedData);
|
|
|
+ hilog.info(0x0000, TAG, `Widget ${formId} updated in batch with size: ${size}`);
|
|
|
+ } catch (error) {
|
|
|
+ hilog.error(0x0000, TAG, `Failed to update widget ${formId} in batch: ${error}`);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ hilog.info(0x0000, TAG, `Batch update completed for ${this.formSizeMap.size} widgets`);
|
|
|
+ } catch (error) {
|
|
|
+ hilog.error(0x0000, TAG, `Failed to batch update widgets: ${error}`);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 处理卡片事件
|
|
|
*/
|
|
|
@@ -396,10 +494,13 @@ implements SizeChangeListener, ThemeChangeListener, PreferencesChangeListener {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- // 处理完命令后更新卡片状态
|
|
|
+ // 处理完命令后立即更新当前卡片状态
|
|
|
+ this.updateWidgetData(formId);
|
|
|
+
|
|
|
+ // 延迟更新所有卡片,确保状态同步
|
|
|
setTimeout((): void => {
|
|
|
- this.updateWidgetData(formId);
|
|
|
- }, 200);
|
|
|
+ this.updateAllWidgetsData();
|
|
|
+ }, 300);
|
|
|
|
|
|
} catch (error) {
|
|
|
hilog.error(0x0000, TAG, `Failed to handle widget event: ${error}`);
|
|
|
@@ -420,7 +521,7 @@ implements SizeChangeListener, ThemeChangeListener, PreferencesChangeListener {
|
|
|
const adaptedData = this.sizeAdapter.handleSizeChange(formId, oldSize, newSize, currentState);
|
|
|
|
|
|
// 更新卡片数据
|
|
|
- await this.widgetDataManager.updateWidget(formId, adaptedData);
|
|
|
+ await this.widgetDataManager?.updateWidget(formId, adaptedData);
|
|
|
|
|
|
hilog.info(0x0000, TAG, `Form size change handled successfully for: ${formId}`);
|
|
|
} catch (error) {
|
|
|
@@ -444,7 +545,7 @@ implements SizeChangeListener, ThemeChangeListener, PreferencesChangeListener {
|
|
|
});
|
|
|
|
|
|
// 刷新所有卡片显示
|
|
|
- await this.widgetDataManager.updateAllWidgets();
|
|
|
+ await this.widgetDataManager?.updateAllWidgets();
|
|
|
|
|
|
hilog.info(0x0000, TAG, 'All widgets theme updated');
|
|
|
} catch (error) {
|
|
|
@@ -481,7 +582,7 @@ implements SizeChangeListener, ThemeChangeListener, PreferencesChangeListener {
|
|
|
});
|
|
|
|
|
|
// 刷新所有卡片显示
|
|
|
- await this.widgetDataManager.updateAllWidgets();
|
|
|
+ await this.widgetDataManager?.updateAllWidgets();
|
|
|
}
|
|
|
|
|
|
hilog.info(0x0000, TAG, 'Preferences change handled successfully');
|
|
|
@@ -563,4 +664,32 @@ implements SizeChangeListener, ThemeChangeListener, PreferencesChangeListener {
|
|
|
hilog.error(0x0000, TAG, `Failed to open widget config page: ${error}`);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 测试卡片数据流(开发调试用)
|
|
|
+ */
|
|
|
+ private testWidgetDataFlow(formId: string): void {
|
|
|
+ hilog.info(0x0000, TAG, `🔍 Testing widget data flow for form: ${formId}`);
|
|
|
+
|
|
|
+ // 测试1: 检查监听器状态
|
|
|
+ hilog.info(0x0000, TAG, `📊 Current listener count: PlayerControlService has listeners registered`);
|
|
|
+
|
|
|
+ // 测试2: 手动触发一次数据更新
|
|
|
+ setTimeout(() => {
|
|
|
+ hilog.info(0x0000, TAG, `🔄 Manually triggering data update for form: ${formId}`);
|
|
|
+ this.updateWidgetData(formId);
|
|
|
+ }, 1000);
|
|
|
+
|
|
|
+ // 测试3: 获取AvSession当前数据
|
|
|
+ setTimeout(() => {
|
|
|
+ try {
|
|
|
+ const currentData = this.playerControlService.getCurrentPlayState();
|
|
|
+ currentData.then((data) => {
|
|
|
+ hilog.info(0x0000, TAG, `📊 AvSession current data: isPlaying=${data.playState.isPlaying}, hasNext=${data.playlist.hasNext}, hasPrevious=${data.playlist.hasPrevious}, title=${data.currentSong.title}`);
|
|
|
+ });
|
|
|
+ } catch (error) {
|
|
|
+ hilog.error(0x0000, TAG, `❌ Failed to get current data: ${error}`);
|
|
|
+ }
|
|
|
+ }, 2000);
|
|
|
+ }
|
|
|
}
|