Browse Source

fix(card): skip form updates on snapshot write failure

onecold 4 tháng trước cách đây
mục cha
commit
b6d93b76f5

+ 5 - 1
entry/src/main/ets/common/player/MusicCardManager.ets

@@ -103,7 +103,11 @@ export class MusicCardManager {
       return
     }
     snapshot.updatedAtMs = Date.now()
-    MusicCardSnapshotStore.writeSnapshot(snapshot, context)
+    const saved = MusicCardSnapshotStore.writeSnapshot(snapshot, context)
+    if (!saved) {
+      Logger.error(TAG, 'notifyPlaybackStateChanged failed to write snapshot')
+      return
+    }
     this.updateAllForms(context)
   }
 

+ 28 - 0
entry/src/ohosTest/ets/test/MusicCardManager.test.ets

@@ -1,6 +1,8 @@
 import { describe, it, expect } from '@ohos/hypium'
 import { MusicCardManager } from '../../../main/ets/common/player/MusicCardManager'
 import { VideoItem } from '../../../main/ets/viewmodel/VideoItem'
+import { createEmptyMusicCardSnapshot } from '../../../main/ets/common/player/MusicCardSnapshot'
+import { MusicCardSnapshotStore } from '../../../main/ets/common/player/MusicCardSnapshotStore'
 
 export default function musicCardManagerTest() {
   describe('MusicCardManagerTest', () => {
@@ -34,5 +36,31 @@ export default function musicCardManagerTest() {
       const result = MusicCardManager.shouldUpdateLyricCardForTest(1000, 2100, 800)
       expect(result).assertEqual(true)
     })
+
+    it('notifyPlaybackStateChangedSkipsUpdateWhenWriteFails', 0, () => {
+      class TestMusicCardManager extends MusicCardManager {
+        updateCalled: boolean = false
+
+        updateAllForms(): void {
+          this.updateCalled = true
+        }
+      }
+
+      const manager = new TestMusicCardManager()
+      const snapshot = createEmptyMusicCardSnapshot()
+      const store = MusicCardSnapshotStore as unknown as {
+        writeSnapshot: (value: unknown, context?: unknown) => boolean
+      }
+      const originalWrite = store.writeSnapshot
+
+      store.writeSnapshot = () => false
+      try {
+        manager.notifyPlaybackStateChanged(undefined, snapshot)
+      } finally {
+        store.writeSnapshot = originalWrite
+      }
+
+      expect(manager.updateCalled).assertEqual(false)
+    })
   })
 }