e69a5204db
android / Build + lint + test (push) Successful in 4m15s
Crash on cold boot: ResumeController.restore is suspend, lands on Dispatchers.Default after awaitReady() unblocks (drift #562), and calls PlayerController.setQueue which calls MediaController.setMediaItems — MediaController enforces application-thread access and throws IllegalStateException 'method is called from a wrong thread'. Drift #562 added awaitReady() to fix the race where setQueue early-returned on null controller and silently dropped the persisted queue. That fix exposed the next bug down the stack: the threading violation that was previously masked by the early-return. setQueue now posts the MediaController calls to the controller's applicationLooper if we're not already on it. UI callers (already Main) run inline with no re-dispatch latency. ResumeController's cold-boot path lands on the right thread. Discovered on-device 2026-06-03 during like-button verification on the Pixel 6 Pro emulator — crash log at PlayerController.kt:190.