**Build #177** — Release APK (signed)
Commit: bc5c6e5f991924979fe4417e531ceb266673b7e0
fix(update): แตะพลาดครั้งเดียว = ไม่เห็นอัพเดทอีกเลยแบบเงียบ ๆ — เปลี่ยนเป็น snooze 24 ชม. + ให้ Settings บอกความจริงเสมอ
อาการ: ลูกค้าบางเครื่อง (Samsung หนักสุด) ไม่ได้อัพเดททั้งที่มีเวอร์ชันใหม่
กดปุ่ม "เช็คอัพเดท" ก็ไม่ขึ้นอะไรเลย เงียบสนิท
ฝั่งเซิร์ฟเวอร์ไม่ผิด — ยิงทดสอบ /api/v1/product/smschecker/update/check
ด้วย 2.0.175 / 2.0.99 / 2.0.9 / 1.9.999 ตอบ has_update ถูกทุกเคส
(ใช้ version_compare() ของ PHP ไม่ใช่ string compare)
ต้นเหตุอยู่ในแอป 3 ชั้นซ้อนกัน
1. dismissVersion() ผูกกับ onDismissRequest ของ AlertDialog
→ แตะนอกกล่องหรือปัดกลับ = เขียน dismissed_version ถาวร โดยไม่ถามยืนยัน
Samsung ตั้ง gesture navigation ปัดขอบจอเป็นค่าเริ่มต้นและพื้นที่ปัดไวมาก
จึงโดนง่ายกว่าเครื่องที่ใช้ปุ่ม 3 ปุ่ม (ข้อนี้เป็นสมมติฐาน ยังไม่ได้ทดสอบบนเครื่อง Samsung จริง)
2. พอถูก dismiss แล้ว state กลายเป็น hasUpdate=false + isUpToDate=false + error=""
พร้อมกัน → ไม่มี branch ไหนใน MainActivity/SettingsScreen เป็นจริง → ไม่แสดงอะไรเลย
และ isManual=true ข้ามได้แค่ throttle ไม่ข้าม dismissal กดเช็คมือกี่ครั้งก็ไม่หลุด
3. ทางรอดเดียวคือ auto_update_enabled ซึ่ง default = false
→ เครื่องที่เปิดไว้อัพเดทปกติ เครื่องที่ไม่ได้เปิดตันถาวร (ตรงกับ "บางเครื่องได้ บางเครื่องไม่ได้")
การแก้
- แยก onDismissRequest (ซ่อนชั่วคราวในหน่วยความจำ ไม่เขียน prefs)
ออกจากปุ่ม "ภายหลัง" (snooze 24 ชม. มีวันหมดอายุ)
- เพิ่ม UpdateInfo.updateAvailable = ความจริงจากเซิร์ฟเวอร์ ไม่สนใจ snooze
หน้า Settings อิงฟิลด์นี้ → ไม่มีทางเงียบอีก มีปุ่มดาวน์โหลดให้กดเสมอ
- ล้าง dismissed_version ของเดิมทิ้งตอน init → เครื่องที่ตันอยู่หลุดทันทีที่ได้ v2.0.177
- throttle 6 ชม. → 30 นาที และไม่เขียน last_check_at ตอนมีอัพเดทค้าง
(ของเดิมเขียนทุกครั้งที่เช็คสำเร็จ ทำให้ release ที่ออกหลังเช็คไปนิดเดียวมองไม่เห็นได้ถึง 6 ชม.)
Smoke test บน AVD crashtest (ติดตั้งทับเครื่องที่ seed dismissed_version=2.0.176 ไว้)
- init ล้าง legacy key จริง → "Cleared legacy dismissed_version" + dialog เด้ง v2.0.176
- กด BACK → dialog ปิด prefs ไม่ถูกเขียนอะไรเลย เปิดแอปใหม่ dialog กลับมา
- กด "ภายหลัง" → snoozed_version=2.0.176 + snoozed_until = +24.0 ชม. เป๊ะ
- เปิดใหม่ขณะ snooze → dialog ไม่เด้ง (snoozed=true) แต่หน้า Settings ยังขึ้น
"อัพเดทใหม่: v2.0.176" + ปุ่ม "ดาวน์โหลดอัพเดท" ← จุดที่เดิมเงียบสนิท
- last_check_at ไม่ถูกเขียนตอน hasUpdate=true
- unit test 10/10 ผ่าน
Co-Authored-By: Claude Opus 5 <
[email protected]>