ā§Šā§Ļ āĻŽāĻžāĻ°ā§āϚ, ⧍ā§Ļ⧍ā§Ģ¡7 āĻŽāĻŋāύāĻŋāϟ āĻĒāĻĄāĻŧāϤ⧇

āĻĢāĻŋāĻ˛ā§āĻĄ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āϜāĻ¨ā§āϝ Kotlin WorkManager āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āϏāĻŋāĻ™ā§āĻ• āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ

Kotlin WorkManager āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āϏāĻŋāĻ™ā§āĻ• āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ āĻĢāĻŋāĻ˛ā§āĻĄ āĻ…ā§āϝāĻžāĻĒāϗ⧁āϞ⧋āϰ āϜāĻ¨ā§āϝ: āϏāĻ āĻŋāĻ• āĻ•āĻžāϜ āϟāĻžāχāĻĒ āĻŦ⧇āϛ⧇ āύāĻŋāύ, āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāύāϟ āϏ⧇āϟ āĻ•āϰ⧁āύ, āĻāĻ•ā§āϏāĻĒā§‹āύ⧇āύāĻļāĻŋāϝāĻŧāĻžāϞ āĻŦā§āϝāĻžāĻ•āĻ…āĻĢ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ, āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀-āĻĻ⧃āĻļā§āϝāĻŽāĻžāύ āĻĒā§āϰāĻ—ā§āϰ⧇āϏ āĻĻ⧇āĻ–āĻžāύāĨ¤

āĻĢāĻŋāĻ˛ā§āĻĄ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āϜāĻ¨ā§āϝ Kotlin WorkManager āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āϏāĻŋāĻ™ā§āĻ• āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ

āĻĢāĻŋāĻ˛ā§āĻĄ āĻ“ āĻ…āĻĒāϏ āĻ…ā§āϝāĻžāĻĒāϗ⧁āϞāĻŋāϤ⧇ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āϏāĻŋāĻ™ā§āĻ• āϕ⧀ āĻŽāĻžāύ⧇\n\nāĻĢāĻŋāĻ˛ā§āĻĄ āĻ“ āĻ…āĻĒāϏ āĻ…ā§āϝāĻžāĻĒāϗ⧁āϞāĻŋāϤ⧇, āϏāĻŋāĻ™ā§āĻ• āĻāĻ•āϟāĻž “āĻ­āĻžāϞ⧋ āĻšāĻŦā§‡â€ āϟ⧁āχāĻ• āύāϝāĻŧ—āĻāϟāĻž āĻšāϞ⧋ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻĄāĻŋāĻ­āĻžāχāϏ āĻĨ⧇āϕ⧇ āĻŦ⧇āϰāĻŋāϝāĻŧ⧇ āϟāĻŋāĻŽā§‡āϰ āϜāĻ¨ā§āϝ āĻŦāĻžāĻ¸ā§āϤāĻŦ āĻšāϝāĻŧāĨ¤ āϝāĻ–āύ āϏāĻŋāĻ™ā§āĻ• āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϝāĻŧ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻĻā§āϰ⧁āϤ āĻĻ⧇āĻ–āĻŦ⧇: āĻāĻ•āϟāĻŋ āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻ•āĻžāϜ āĻāĻ–āύāĻ“ "pending" āĻĻ⧇āĻ–āĻžāϝāĻŧ, āĻ›āĻŦāĻŋ āĻšāĻžāϰāĻŋāϝāĻŧ⧇ āϝāĻžāϝāĻŧ, āĻ…āĻĨāĻŦāĻž āĻāĻ•āχ āϰāĻŋāĻĒā§‹āĻ°ā§āϟāϟāĻŋ āĻĻ⧁āχāĻŦāĻžāϰ āφāĻĒāϞ⧋āĻĄ āĻšāϝāĻŧ⧇ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĨ¤\n\nāĻāĻŽāύ āĻ…ā§āϝāĻžāĻĒāϗ⧁āϞ⧋ āϏāĻžāϧāĻžāϰāĻŖ āĻ•āύāϜāĻŋāωāĻŽāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āϤ⧁āϞāύāĻžāϝāĻŧ āĻ•āĻ āĻŋāύ āĻ•āĻžāϰāĻŖ āĻĢā§‹āύāϗ⧁āϞ⧋ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻ–āĻžāϰāĻžāĻĒ āĻĒāϰāĻŋāĻ¸ā§āĻĨāĻŋāϤāĻŋāϤ⧇āχ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āϞāĻžāϤāĻž-āϞāĻžāϟāĻŋ āĻ•āϰ⧇ LTE, āĻĻ⧁āĻ°ā§āĻŦāϞ Wi‑Fi āĻāĻŦāĻ‚ āϕ⧋āύ āϏāĻŋāĻ—āύāĻžāϞ āύāĻžâ€”āϏāĻŽāĻ¸ā§āϤ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ āϝāĻžāϝāĻŧāĨ¤ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āϏ⧇āĻ­āĻžāϰ āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āĻ•āĻžāϜ āĻŦā§āϞāĻ• āĻ•āϰ⧇āĨ¤ āĻ…ā§āϝāĻžāĻĒKilled āĻšāϝāĻŧ, OS āφāĻĒāĻĄā§‡āϟ āĻšāϝāĻŧ, āĻĄāĻŋāĻ­āĻžāχāϏ āϰ⧁āϟ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ āϰāĻŋāĻŦ⧁āϟ āĻ•āϰ⧇āĨ¤ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ WorkManager āϏ⧇āϟāφāĻĒāϕ⧇ āĻāϏāĻŦ āĻ›āĻžāĻĄāĻŧāĻž āĻŦ⧇āρāĻšā§‡ āĻĨāĻžāĻ•āϤ⧇ āĻšāĻŦ⧇āĨ¤\n\nāύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻŦāϞāϤ⧇ āϏāĻžāϧāĻžāϰāĻŖāϤ āϚāĻžāϰāϟāĻŋ āϜāĻŋāύāĻŋāϏ āĻŦā§‹āĻāĻžāϝāĻŧ:\n\n- āĻ…āĻŦāĻļ⧇āώ⧇ āϏāĻžāĻŽāĻžā§āϜāĻ¸ā§āϝāĻĒā§‚āĻ°ā§āĻŖ: āĻĄā§‡āϟāĻž āĻĻ⧇āϰāĻŋāϤ⧇ āφāϏāϤ⧇ āĻĒāĻžāϰ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻŽā§āϝāĻžāύ⧁āϝāĻŧāĻžāϞ āύāϜāϰāĻĻāĻžāϰāĻŋ āĻ›āĻžāĻĄāĻŧāĻžāχ āĻāϏ⧇ āϝāĻžāϝāĻŧāĨ¤\n- āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰāϝ⧋āĻ—ā§āϝ: āϝāĻĻāĻŋ āĻ…ā§āϝāĻžāĻĒ āφāĻĒāϞ⧋āĻĄā§‡āϰ āĻŽāĻžāĻāĻ–āĻžāύ⧇ āĻŽāĻžāϰāĻž āϝāĻžāϝāĻŧ, āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϰāĻžāύ āύāĻŋāϰāĻžāĻĒāĻĻ⧇ āϚāĻžāϞāĻŋāϝāĻŧ⧇ āϝāĻžāϝāĻŧāĨ¤\n- āĻĻ⧃āĻļā§āϝāĻŽāĻžāύ: āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻ“ āϏāĻžāĻĒā§‹āĻ°ā§āϟ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻšāĻšā§āϛ⧇ āĻāĻŦāĻ‚ āϕ⧀ āφāϟāϕ⧇āϛ⧇ āϤāĻž āϜāĻžāύāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤\n- āĻ§ā§āĻŦāĻ‚āϏāĻžāĻ¤ā§āĻŽāĻ• āύāϝāĻŧ: āϰāĻŋāĻŸā§āϰāĻžāχ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āϏ⧃āĻˇā§āϟāĻŋ āύāĻž āĻ•āϰ⧇ āĻŦāĻž āĻ¸ā§āĻŸā§‡āϟ āĻ•āϰāĻžāĻĒā§āϟ āύāĻž āĻ•āϰ⧇āĨ¤\n\n“Run now” āϛ⧋āϟ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀-āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž āĻ…ā§āϝāĻžāĻ•āĻļāύ⧇āϰ āϜāĻ¨ā§āϝ āĻ­āĻžāϞ (āϝ⧇āĻŽāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āφāĻĒāĻĄā§‡āϟ āĻĒāĻžāĻ āĻŋāϝāĻŧ⧇ āĻĢ⧇āϞ⧇)āĨ¤ “Wait” āĻ­āĻžāϰ⧀ āĻ•āĻžāĻœā§‡āϰ āϜāĻ¨ā§āĻ¯â€”āĻĢāĻŸā§‹ āφāĻĒāϞ⧋āĻĄ, āĻŦā§āϝāĻžāϚ āφāĻĒāĻĄā§‡āϟ āĻŦāĻž āĻāĻŽāύ āĻ•āĻŋāϛ⧁ āϝāĻž āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āĻ–āĻžāϝāĻŧ āĻŦāĻž āĻ–āĻžāϰāĻžāĻĒ āύ⧇āĻŸā§‡ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāĻ“āϝāĻŧāĻžāϰ āϏāĻŽā§āĻ­āĻžāĻŦāύāĻž āĻŦ⧇āĻļāĻŋāĨ¤\n\nāωāĻĻāĻžāĻšāϰāĻŖ: āĻāĻ•āϜāύ āχāĻ¨ā§āϏāĻĒ⧇āĻ•ā§āϟāϰ āĻŦ⧇āχāϏāĻŽā§‡āĻ¨ā§āĻŸā§‡ āϏāĻŋāĻ—āύāĻžāϞ āύāĻž āĻĨāĻžāĻ•āĻžāϝāĻŧ 12āϟāĻŋ āĻĢāĻŸā§‹ āϏāĻš āĻāĻ•āϟāĻŋ āĻĢāĻ°ā§āĻŽ āϜāĻŽāĻž āĻĻ⧇āϝāĻŧāĨ¤ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āϏāĻŋāĻ™ā§āĻ• āĻĒā§āϰāĻĨāĻŽā§‡ āϏāĻŦāĻ•āĻŋāϛ⧁ āϞ⧋āĻ•āĻžāϞāĻŋ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇, āĻ•āĻŋāωāϜ āĻšāĻŋāϏ⧇āĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰ⧇, āĻāĻŦāĻ‚ āĻĒāϰ⧇ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āĻ­āĻžāϞ⧋ āĻ•āĻžāύ⧇āĻ•āĻļāύ āĻĒ⧇āϞ⧇ āφāĻĒāϞ⧋āĻĄ āĻ•āĻ°ā§‡â€”āχāĻ¨ā§āϏāĻĒ⧇āĻ•ā§āϟāϰāϕ⧇ āĻ•āĻžāϜ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āύāĻžāĨ¤\n\n## āϏāĻ āĻŋāĻ• WorkManager āĻŦāĻŋāĻ˛ā§āĻĄāĻŋāĻ‚ āĻŦā§āϞāĻ• āĻŦ⧇āϛ⧇ āύāĻŋāύ\n\nāϛ⧋āϟ āĻ“ āĻ¸ā§āĻĒāĻˇā§āϟ āĻ•āĻžāĻœā§‡āϰ āχāωāύāĻŋāϟ āĻŦ⧇āϛ⧇ āύāĻŋāĻ¨â€”āĻāχ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤāϟāĻž āĻĒāϰ⧇ āϝ⧇ āϕ⧋āύāĻ“ āĻŦ⧁āĻĻā§āϧāĻŋāĻŽāĻžāύ āϰāĻŋāĻŸā§āϰāĻžāχ āϞāϜāĻŋāϕ⧇āϰ āĻšā§‡āϝāĻŧ⧇ āĻŦ⧇āĻļāĻŋ āĻĒā§āϰāĻ­āĻžāĻŦ āĻĢ⧇āϞ⧇āĨ¤\n\n### One-time āĻŦāύāĻžāĻŽ periodic work\n\nāϝ⧇āϏāĻŦ āĻ•āĻžāϜ āϘāϟāĻŦ⧇ āϝāĻ–āύ āĻ•āĻŋāϛ⧁ āĻŦāĻĻāϞ⧇ āϝāĻžāϝāĻŧ (āύāϤ⧁āύ āĻĢāĻ°ā§āĻŽ āϏ⧇āĻ­, āĻ›āĻŦāĻŋ āĻ•āĻŽā§āĻĒā§āϰ⧇āϏ āĻļ⧇āώ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ Sync āϚāĻžāĻĒāϞ), āϏ⧇āϗ⧁āϞ⧋āϰ āϜāĻ¨ā§āϝ OneTimeWorkRequest āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤ āϤāĻžā§ŽāĻ•ā§āώāĻŖāĻŋāĻ•āĻ­āĻžāĻŦ⧇ enqueue āĻ•āϰ⧁āύ (āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāύāϟ āϏāĻš) āĻāĻŦāĻ‚ WorkManager āϝ⧇āĻĻāĻŋāύ āĻĄāĻŋāĻ­āĻžāχāϏ āĻĒā§āϰāĻ¸ā§āϤ⧁āϤ āĻšāĻŦ⧇ āϚāĻžāϞāĻŋāϝāĻŧ⧇ āĻĻ⧇āĻŦ⧇āĨ¤\n\nāĻ¸ā§āĻŸā§‡āĻĄāĻŋ āĻŽā§‡āχāύāĻŸā§‡āĻ¨ā§āϝāĻžāĻ¨ā§āϏ⧇āϰ āϜāĻ¨ā§āϝ, āϝ⧇āĻŽāύ “āφāĻĒāĻĄā§‡āϟ āĻšā§‡āĻ•â€ āĻŦāĻž āύ⧈āϟāϞāĻŋ āĻ•ā§āϞāĻŋāύāφāĻĒ, PeriodicWorkRequest āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤ Periodic work āϏāĻ āĻŋāĻ• āύāϝāĻŧ—āĻāϰ āĻāĻ•āϟāĻŋ āĻ¨ā§āϝ⧂āύāϤāĻŽ āχāĻ¨ā§āϟāĻžāϰāĻ­āĻžāϞ āĻĨāĻžāϕ⧇ āĻāĻŦāĻ‚ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āĻ“ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āύāĻŋāϝāĻŧāĻŽā§‡āϰ āĻ“āĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āĻāϟāĻŋ āĻĄā§āϰāĻŋāĻĢā§āϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇, āϤāĻžāχ āĻāϟāĻŋ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āφāĻĒāϞ⧋āĻĄā§‡āϰ āĻāĻ•āĻŽāĻžāĻ¤ā§āϰ āĻĒāĻĨ āĻšāĻ“āϝāĻŧāĻž āωāϚāĻŋāϤ āύāϝāĻŧāĨ¤\n\nāĻĒā§āϰāĻžāϝāĻŧā§‹āĻ—āĻŋāĻ• āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ āĻšāϞ⧋: “āĻŽā§‹āĻ¸ā§āϟ-āϏāĻŋāĻ‚āĻ•-āϏ⧁āĻ¨â€ āϜāĻ¨ā§āϝ one-time work, āĻāĻŦāĻ‚ periodic work āϕ⧇ āĻāĻ• āϧāϰāύ⧇āϰ āϏ⧇āĻĢāϟāĻŋ āύ⧇āϟ āĻšāĻŋāϏ⧇āĻŦ⧇ āϰāĻžāĻ–āĻžāĨ¤\n\n### Worker, CoroutineWorker, āύāĻž RxWorker āĻŦ⧇āϛ⧇ āύ⧇āĻ“āϝāĻŧāĻž\n\nāφāĻĒāύāĻŋ āϝāĻĻāĻŋ Kotlin āϞāĻŋāϖ⧇āύ āĻāĻŦāĻ‚ suspend āĻĢāĻžāĻ‚āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āύ, āϤāĻžāĻšāϞ⧇ CoroutineWorker āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰ⧁āύāĨ¤ āĻāϟāĻŋ āϕ⧋āĻĄ āϛ⧋āϟ āϰāĻžāϖ⧇ āĻāĻŦāĻ‚ āĻ•ā§āϝāĻžāύāϏ⧇āϞ⧇āĻļāύ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻļāĻŋāϤāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤\n\nWorker āϏāϰāϞ āĻŦā§āϞāĻ•āĻŋāĻ‚ āϕ⧋āĻĄā§‡āϰ āϜāĻ¨ā§āϝ āωāĻĒāϝ⧁āĻ•ā§āϤ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϖ⧁āĻŦ āĻŦ⧇āĻļāĻŋ āĻŦā§āϞāĻ• āĻ•āϰāϞ⧇ āϏāĻŽāĻ¸ā§āϝāĻž āĻšāĻŦ⧇āĨ¤\n\nRxWorker āϕ⧇āĻŦāϞ āϤāĻ–āύāχ āϝ⧁āĻ•ā§āϤāĻŋāϝ⧁āĻ•ā§āϤ āϝāĻĻāĻŋ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ RxJava āĻŦāĻĄāĻŧ āĻĒāϰāĻŋāϏāϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āĻ°ā§‡â€”āĻ…āĻ¨ā§āϝāĻĨāĻžāϝāĻŧ āĻāϟāĻž āĻ…āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āϜāϟāĻŋāϞāϤāĻžāĨ¤\n\n### āϧāĻžāĻĒāϗ⧁āϞ⧋ āĻšā§‡āχāύ āĻ•āϰāĻŦ⧇āύ āύāĻžāĻ•āĻŋ āĻāĻ• worker-āĻ āĻĢ⧇āϜ āĻ•āϰāĻŦ⧇āύ?\n\nāĻšā§‡āχāύāĻŋāĻ‚ āĻ­āĻžāϞ⧋ āϝāĻ–āύ āϧāĻžāĻĒāϗ⧁āϞ⧋ āĻ¸ā§āĻŦāĻžāϧ⧀āύāĻ­āĻžāĻŦ⧇ āϏāĻĢāϞ āĻŦāĻž āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϤ⧇ āĻĒāĻžāϰ⧇ āĻāĻŦāĻ‚ āφāϞāĻžāĻĻāĻž āϰāĻŋāĻŸā§āϰāĻžāχ āĻ“ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āϞāĻ— āϚāĻžāύāĨ¤ āĻāĻ• worker-āĻ āĻĢ⧇āϜ āĻ­āĻžāϞ⧋ āϝāĻ–āύ āϧāĻžāĻĒāϗ⧁āϞ⧋ āĻĄā§‡āϟāĻž āĻļ⧇āϝāĻŧāĻžāϰ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋāχ āĻŸā§āϰāĻžāύāĻœā§‡āĻ•āĻļāύ⧇āϰ āĻŽāϤ⧋ āĻŦāĻŋāĻŦ⧇āϚāĻŋāϤ āĻšāĻ“āϝāĻŧāĻž āωāϚāĻŋāϤāĨ¤\n\nāĻāĻ•āϟāĻŋ āϏāĻšāϜ āύāĻŋāϝāĻŧāĻŽ:\n\n- āϝāĻ–āύ āϧāĻžāĻĒāϗ⧁āϞ⧋āϰ āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāύāϟ āφāϞāĻžāĻĻāĻž (Wi‑Fi-āĻ āφāĻĒāϞ⧋āĻĄ, āϤāĻžāϰāĻĒāϰ āϞāĻžāχāϟāĻ“āϝāĻŧ⧇āϟ API āĻ•āϞ), āϤāĻ–āύ āĻšā§‡āχāύ āĻ•āϰ⧁āύāĨ¤\n- āϝāĻ–āύ āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ “all-or-nothing” āϏāĻŋāĻ™ā§āĻ• āϚāĻžāύ, āϤāĻ–āύ āĻāĻ• worker āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤\n\nWorkManager āĻ—ā§āϝāĻžāϰāĻžāĻ¨ā§āϟāĻŋ āĻĻ⧇āϝāĻŧ āϝ⧇ āĻ•āĻžāϜ āĻĒā§āϰāϏ⧇āϏ āĻĄā§‡āĻĨ āĻ“ āϰāĻŋāĻŦ⧁āϟ āϏāĻš āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ āĻĨāĻžāĻ•āĻŦ⧇ āĻāĻŦāĻ‚ āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāύāϟ āĻŽāĻžāύāĻŦ⧇āĨ¤ āĻāϟāĻŋ āĻ¤ā§ŽāĻ•ā§āώāĻŖāĻŋāĻ• āĻāĻ•ā§āϏāĻŋāĻ•āĻŋāωāĻļāύ āĻŦāĻž āχāωāϜāĻžāϰ āĻĢā§‹āĻ°ā§āϏ-āĻ¸ā§āϟāĻĒ⧇āϰ āĻĒāϰ⧇ āϚāϞāĻžāϰ āύāĻŋāĻļā§āϚāϝāĻŧāϤāĻž āĻĻ⧇āϝāĻŧ āύāĻžāĨ¤ āϝāĻĻāĻŋ āφāĻĒāύāĻŋ Android āĻĢāĻŋāĻ˛ā§āĻĄ āĻ…ā§āϝāĻžāĻĒ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āύ, āϏāĻŋāĻ™ā§āĻ• āĻĄāĻŋāϜāĻžāχāύ āĻ•āϰ⧁āύ āϝāĻžāϤ⧇ āĻĻ⧇āϰāĻŋ āύāĻŋāϰāĻžāĻĒāĻĻ āĻ“ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻļāĻŋāϤ āĻšāϝāĻŧāĨ¤\n\n## āϏāĻŋāĻ™ā§āĻ• āύāĻŋāϰāĻžāĻĒāĻĻ āĻ•āϰ⧁āύ: idempotent, āϧāĻžāĻĒ⧇ āϧāĻžāĻĒ⧇ āĻāĻŦāĻ‚ resumable āϰāĻžāϖ⧁āύ\n\nāĻĢāĻŋāĻ˛ā§āĻĄ āĻ…ā§āϝāĻžāĻĒ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻ•āĻžāϜ āϚāĻžāϞāĻžāĻŦā§‡â€”āĻĢā§‹āύ āϏāĻŋāĻ—āύāĻžāϞ āĻšāĻžāϰāĻžāϝāĻŧ, OS āĻĒā§āϰāϏ⧇āϏ āĻŽā§‡āϰ⧇ āĻĢ⧇āϞ⧇, āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻĻ⧁āχāĻŦāĻžāϰ āĻŸā§āϝāĻžāĻĒ āĻ•āϰāĻŦ⧇ āĻ•āĻžāϰāĻŖ āĻ•āĻŋāϛ⧁āχ āϘāĻŸā§‡āύāĻŋ āĻŽāύ⧇ āĻšāϝāĻŧāĨ¤ āϝāĻĻāĻŋ āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āϏāĻŋāĻ™ā§āĻ• āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāϰāĻžāĻĒāĻĻ āύāĻž āĻšāϝāĻŧ, āϤāĻžāĻšāϞ⧇ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āϰ⧇āĻ•āĻ°ā§āĻĄ, āĻŽāĻŋāϏāĻŋāĻ‚ āφāĻĒāĻĄā§‡āϟ āĻŦāĻž āĻ…āύāĻ¨ā§āϤ āϰāĻŋāĻŸā§āϰāĻžāχ āĻšāĻŦ⧇āĨ¤\n\nāĻĒā§āϰāĻ¤ā§āϝ⧇āĻ• āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻ•āϞ āĻĻ⧁āχāĻŦāĻžāϰ āϚāĻžāϞāĻžāύ⧋ āύāĻŋāϰāĻžāĻĒāĻĻ āĻ•āϰ⧇ āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύāĨ¤ āϏāĻšāϜ āĻĒāĻĻā§āϧāϤāĻŋ āĻšāϞ⧋ āĻĒā§āϰāϤāĻŋāϟāĻŋ āφāχāĻŸā§‡āĻŽā§‡āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ idempotency key (āωāĻĻāĻžāĻšāϰāĻŖ: āϞ⧋āĻ•āĻžāϞ āϰ⧇āĻ•āĻ°ā§āĻĄā§‡āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ UUID) āϝāĻž āϏāĻžāĻ°ā§āĻ­āĻžāϰ “āĻāĻ•āχ āĻ…āύ⧁āϰ⧋āϧ, āĻāĻ•āχ āĻĢāϞāĻžāĻĢāĻ˛â€ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰ⧇āĨ¤ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻŦāĻĻāϞāĻžāϤ⧇ āύāĻž āĻĒāĻžāϰāϞ⧇ stable natural key āĻ“ upsert endpoint āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ, āĻ…āĻĨāĻŦāĻž āĻ­āĻžāĻ°ā§āϏāύ āύāĻŽā§āĻŦāϰ āĻĻāĻŋāύ āϝāĻžāϤ⧇ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻ¸ā§āĻŸā§‡āϞ āφāĻĒāĻĄā§‡āϟ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻ–ā§āϝāĻžāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤\n\nāϞ⧋āĻ•āĻžāϞ āĻ¸ā§āĻŸā§‡āϟ āĻ¸ā§āĻĒāĻˇā§āϟāĻ­āĻžāĻŦ⧇ āĻŸā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰ⧁āύ āϝāĻžāϤ⧇ worker āĻ•ā§āĻ°ā§āϝāĻžāĻļ⧇āϰ āĻĒāϰ⧇ āĻ…āύ⧁āĻŽāĻžāύ āύāĻž āĻ•āϰ⧇ āĻĒ⧁āύāϰāĻžāϝāĻŧ āϚāϞāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāĻ•āϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻ¸ā§āĻŸā§‡āϟ āĻŽā§‡āĻļāĻŋāύ āĻĒā§āϰāĻžāϝāĻŧāχ āϝāĻĨ⧇āĻˇā§āϟ:\n\n- queued\n- uploading\n- uploaded\n- needs-review\n- failed-temporary\n\nāχāύāĻ•ā§āϰāĻŋāĻŽā§‡āĻ¨ā§āϟāĻžāϞ āϏāĻŋāĻ™ā§āĻ• āϰāĻžāϖ⧁āύāĨ¤ “āϏāĻŦāĻ•āĻŋāϛ⧁ āϏāĻŋāĻ™ā§āĻ• āĻ•āϰ⧁āĻ¨â€ āĻŦāϞāĻžāϰ āĻŦāĻĻāϞ⧇ lastSuccessfulTimestamp āĻŦāĻž āϏāĻžāĻ°ā§āĻ­āĻžāϰ-āχāĻ¸ā§āϝ⧁āĻ•ā§ƒāϤ āĻŸā§‹āϕ⧇āύ⧇āϰ āĻŽāϤ⧋ āĻāĻ•āϟāĻŋ āĻ•āĻžāĻ°ā§āϏāϰ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύāĨ¤ āϛ⧋āϟ āĻŦā§āϝāĻžāĻšā§‡ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻĒāĻĄāĻŧ⧁āύ, āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰ⧁āύ, āϤāĻžāϰāĻĒāϰ āĻŦā§āϝāĻžāϚ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖāĻ­āĻžāĻŦ⧇ āϞ⧋āĻ•āĻžāϞāĻŋ āĻ•āĻŽāĻŋāϟ āĻšāϞ⧇ āĻ•āĻžāĻ°ā§āϏāϰ āĻ…ā§āϝāĻžāĻĄāĻ­āĻžāĻ¨ā§āϏ āĻ•āϰ⧁āύāĨ¤ āϛ⧋āϟ āĻŦā§āϝāĻžāϚ (⧍ā§Ļâ€“ā§§ā§Ļā§Ļ āφāχāĻŸā§‡āĻŽ) āϟāĻžāχāĻŽāφāωāϟ āĻ•āĻŽāĻžāϝāĻŧ, āĻĒā§āϰāĻ—ā§āϰ⧇āϏ āĻĻ⧃āĻļā§āϝāĻŽāĻžāύ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻŦāĻŋāϰāϤāĻŋ āĻšāϞ⧇ āϝ⧇ āĻ•āĻžāϜ āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤāĻŋ āĻšāĻŦ⧇ āϤāĻž āϏ⧀āĻŽāĻžāĻŦāĻĻā§āϧ āϰāĻžāϖ⧇āĨ¤\n\nāφāĻĒāϞ⧋āĻĄāϗ⧁āϞ⧋āĻ“ resumable āĻ•āϰ⧁āύāĨ¤ āĻĢāĻŸā§‹ āĻŦāĻž āĻŦāĻĄāĻŧ āĻĒ⧇-āϞ⧋āĻĄā§‡āϰ āϜāĻ¨ā§āϝ āĻĢāĻžāχāϞ URI āĻāĻŦāĻ‚ āφāĻĒāϞ⧋āĻĄ āĻŽā§‡āϟāĻžāĻĄā§‡āϟāĻž āĻ…āĻ•ā§āώ⧁āĻŖā§āĻŖ āϰāĻžāϖ⧁āύ, āĻāĻŦāĻ‚ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻ•āύāĻĢāĻžāĻ°ā§āĻŽ āύāĻž āĻ•āϰāϞ⧇ uploaded āĻŽāĻžāĻ°ā§āĻ• āĻ•āϰāĻŦ⧇āύ āύāĻžāĨ¤ worker āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻļ⧁āϰ⧁ āĻšāϞ⧇ āĻļ⧇āώ āϜāĻžāύāĻž āĻ¸ā§āĻŸā§‡āϟ āĻĨ⧇āϕ⧇ āϚāĻžāϞāĻŋāϝāĻŧ⧇ āĻĻ⧇āϝāĻŧ, āύāϤ⧁āύ āĻ•āϰ⧇ āĻļ⧁āϰ⧁ āĻ•āϰ⧇ āύāĻžāĨ¤\n\nāωāĻĻāĻžāĻšāϰāĻŖ: āĻāĻ•āϜāύ āĻŸā§‡āĻ•āύāĻŋāĻļāĻŋāϝāĻŧāĻžāύ āĻ­āĻžāϞ āϏāĻ‚āϝ⧋āĻ— āύāĻž āĻĨāĻžāĻ•āϞ⧇ 12āϟāĻŋ āĻĢāĻ°ā§āĻŽ āĻĒā§‚āϰāĻŖ āĻ•āϰ⧇ āĻāĻŦāĻ‚ 8āϟāĻŋ āĻĢāĻŸā§‹ āĻœā§‹āĻĄāĻŧ⧇āĨ¤ āĻĄāĻŋāĻ­āĻžāχāϏ āĻĒ⧁āύāϰāĻžāϝāĻŧ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻšāϞ⧇ worker āĻŦā§āϝāĻžāĻšā§‡ āφāĻĒāϞ⧋āĻĄ āĻ•āϰ⧇, āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĢāĻ°ā§āĻŽā§‡āϰ idempotency key āĻĨāĻžāϕ⧇, āĻāĻŦāĻ‚ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻŦā§āϝāĻžāϚ āϏāĻĢāϞ āĻšāϞ⧇ āĻ•āĻžāĻ°ā§āϏāϰ āĻ…ā§āϝāĻžāĻĄāĻ­āĻžāĻ¨ā§āϏ āĻ•āϰ⧇āĨ¤ āĻ…ā§āϝāĻžāĻĒ āĻŽāĻžāĻāĻĒāĻĨ⧇ āĻŽāĻžāϰāĻž āϗ⧇āϞ⧇ worker āĻĒ⧁āύāϰāĻžāϝāĻŧ āϚāĻžāϞāĻžāϞ⧇ āĻŦāĻžāĻ•āĻŋ āĻ•āĻŋāω āĻ•āϰāĻž āφāχāĻŸā§‡āĻŽāϗ⧁āϞ⧋ āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻšāĻŦ⧇ āϕ⧋āύ āĻ•āĻŋāϛ⧁ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āύāĻž āĻ•āϰ⧇āĨ¤\n\n## āĻŦāĻžāĻ¸ā§āϤāĻŦ-āϜāĻ—āϤ⧇āϰ āĻĄāĻŋāĻ­āĻžāχāϏ āĻ•āύāĻĄāĻŋāĻļāύ āĻŽā§‡āϞāĻžāύ⧋ āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāύāϟāϏ\n\nāĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāύāϟ āĻšāϞ⧋ āϏ⧇āχ āĻ—āĻžāĻ°ā§āĻĄāϰ⧇āχāϞ āϝāĻž āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āϏāĻŋāĻ™ā§āĻ•āϕ⧇ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āĻļ⧁āĻ•āĻžāύ⧋, āĻŽā§‹āĻŦāĻžāχāϞ āĻĄā§‡āϟāĻž āĻŦāĻžāĻĄāĻŧāĻžāύ⧋ āĻŦāĻž āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϭ⧁āϞ āϏāĻŽāϝāĻŧ⧇ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāĻ“āϝāĻŧāĻž āĻĨ⧇āϕ⧇ āϰāĻ•ā§āώāĻž āĻ•āϰ⧇āĨ¤ āφāĻĒāύāĻŋ āĻāĻŽāύ āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāύāϟ āϚāĻžāύ āϝāĻž āĻĢāĻŋāĻ˛ā§āĻĄā§‡ āĻĄāĻŋāĻ­āĻžāχāϏ āϕ⧀āĻ­āĻžāĻŦ⧇ āφāϚāϰāĻŖ āĻ•āϰ⧇ āϤāĻž āĻĒā§āϰāϤāĻŋāĻĢāϞāĻŋāϤ āĻ•āĻ°ā§‡â€”āφāĻĒāύāĻžāϰ āĻĄā§‡āĻ¸ā§āϕ⧇ āύāĻž āϕ⧇āĻŽāύ āφāϚāϰāĻŖ āĻ•āϰ⧇ āϤāĻž āύāϝāĻŧāĨ¤\n\nāϛ⧋āϟ āĻāĻ•āϟāĻŋ āϏ⧇āϟ āĻĻāĻŋāϝāĻŧ⧇ āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύ āϝāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āϰāĻ•ā§āώāĻž āĻ•āϰ⧇ āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻ•āĻžāϜāϟāĻŋ āĻ…āϧāĻŋāĻ•āĻžāĻ‚āĻļ āĻĻāĻŋāύ⧇ āϚāϞāĻžāϰ āϏ⧁āϝ⧋āĻ— āϰāĻžāϖ⧇āĨ¤ āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻžāϝāĻŧā§‹āĻ—āĻŋāĻ• āĻŦ⧇āϏāϞāĻžāχāύ: āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻĨāĻžāĻ•āĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύ, āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āϞ⧋ āĻšāϞ⧇ āϚāĻžāϞāĻžāĻŦ⧇āύ āύāĻž, āĻāĻŦāĻ‚ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻ•ā§āϰāĻŋāϟāĻŋāĻ•ā§āϝāĻžāϞ āĻšāϞ⧇ āϚāĻžāϞāĻžāĻŦ⧇āύ āύāĻžāĨ¤ āĻļ⧁āϧ⧁ āϖ⧁āĻŦ āĻ­āĻžāϰ⧀ āĻ•āĻžāϜ āĻšāϞ⧇ āϚāĻžāĻ°ā§āϜāĻŋāĻ‚ āĻĻāϰāĻ•āĻžāϰ āĻŦāϞ⧁āĻ¨â€”āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻ…āύ⧇āĻ• āĻĢāĻŋāĻ˛ā§āĻĄ āĻĄāĻŋāĻ­āĻžāχāϏ āĻļāĻŋāĻĢāĻŸā§‡āϰ āϏāĻŽāϝāĻŧ⧇ āĻĒā§āϰāĻžāϝāĻŧāχ āĻĒā§āϞāĻžāĻ— āχāύ āĻ•āϰāĻž āĻĨāĻžāϕ⧇ āύāĻžāĨ¤\n\nāĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāύāϟ āϏāĻžāϧāĻžāϰāĻŖāϤ “āϏāĻŋāĻ™ā§āĻ• āĻ•āĻ–āύāχ āϚāϞ⧇āύāĻŋ” āϰāĻŋāĻĒā§‹āĻ°ā§āĻŸā§‡āϰ āĻ•āĻžāϰāĻŖāĨ¤ āϝāĻĻāĻŋ āφāĻĒāύāĻŋ unmetered Wi‑Fi, charging, āĻāĻŦāĻ‚ battery not low āϏāĻŦāχ āϚāĻžāύ, āϤāĻžāĻšāϞ⧇ āĻĒā§āϰāĻžāϝāĻŧ āĻ•āĻ–āύ⧋āχ āωāĻĒāϝ⧁āĻ•ā§āϤ āĻŽā§āĻšā§‚āĻ°ā§āϤ āĻĒāĻžāĻŦ⧇āύ āύāĻžāĨ¤ āĻŦā§āϝāĻŦāϏāĻžāϝāĻŧ āϝāĻĻāĻŋ āφāϜ āĻĄā§‡āϟāĻž āĻĻāϰāĻ•āĻžāϰ āĻšāϝāĻŧ, āϤāĻžāĻšāϞ⧇ āϛ⧋āϟ āĻ•āĻžāϜāϗ⧁āϞāĻŋ āĻŦ⧇āĻļāĻŋ āĻŦāĻžāϰ āϚāĻžāϞāĻžāύ⧋ āĻ­āĻžāĻ˛ā§‹â€”āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻļāĻ°ā§āϤ⧇āϰ āϜāĻ¨ā§āϝ āĻ…āĻĒ⧇āĻ•ā§āώāĻž āĻ•āϰāĻžāϰ āĻšā§‡āϝāĻŧ⧇āĨ¤\n\nāĻ•ā§āϝāĻžāĻĒāϟāĻŋāĻ­ āĻĒā§‹āĻ°ā§āϟāĻžāϞ āφāϰ⧇āĻ• āĻŦāĻžāĻ¸ā§āϤāĻŦ āϏāĻŽāĻ¸ā§āϝāĻž: āĻĢā§‹āύ āĻŦāϞāϛ⧇ āĻāϟāĻŋ āϏāĻ‚āϝ⧁āĻ•ā§āϤ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āĻšā§‹āĻŸā§‡āϞ āĻŦāĻž āĻĒāĻžāĻŦāϞāĻŋāĻ• Wi‑Fi āĻĒ⧃āĻˇā§āĻ āĻžāϝāĻŧ “Accept” āϟāĻŋāĻĒāϤ⧇ āĻšāĻŦ⧇āĨ¤ WorkManager āĻāϟāĻž āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝāĻ­āĻžāĻŦ⧇ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āύāĻžāĨ¤ āĻāϟāĻžāϕ⧇ āϏāĻžāϧāĻžāϰāĻŖ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻž āĻšāĻŋāϏ⧇āĻŦ⧇ āϧāϰ⧁āύ: āϏāĻŋāĻ™ā§āĻ• āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧁āύ, āĻĻā§āϰ⧁āϤ āϟāĻžāχāĻŽāφāωāϟ āĻĻāĻŋāύ, āĻāĻŦāĻ‚ āĻĒāϰ⧇ āϰāĻŋāĻŸā§āϰāĻžāχ āĻ•āϰ⧁āύāĨ¤ āĻ…āύ⧁āϰ⧋āϧ āϚāϞāĻžāĻ•āĻžāϞ⧇ āĻāϟāĻŋ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāϞ⧇ āĻāĻ•āϟāĻŋ āϏāϰāϞ āχāύ-āĻ…ā§āϝāĻžāĻĒ āĻŦāĻžāĻ°ā§āϤāĻž āĻĻ⧇āĻ–āĻžāύ āϝ⧇āĻŽāύ “Wi‑Fi-āĻ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āĻŋāĻ¨ā§āϤ⧁ āχāĻ¨ā§āϟāĻžāϰāύ⧇āϟ āύ⧇āĻ‡â€āĨ¤\n\nāϛ⧋āϟ āĻŦāύāĻžāĻŽ āĻŦāĻĄāĻŧ āφāĻĒāϞ⧋āĻĄā§‡āϰ āϜāĻ¨ā§āϝ āφāϞāĻžāĻĻāĻž āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāύāϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ āϝāĻžāϤ⧇ āĻ…ā§āϝāĻžāĻĒ responsive āĻĨāĻžāϕ⧇:\n\n- āϛ⧋āϟ āĻĒ⧇-āϞ⧋āĻĄ (āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āĻĒāĻŋāĻ‚, āĻĢāĻ°ā§āĻŽ āĻŽā§‡āϟāĻžāĻĄā§‡āϟāĻž): āϝ⧇ āϕ⧋āύāĻ“ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ•, āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āύāϟ āϞ⧋āĨ¤\n- āĻŦāĻĄāĻŧ āĻĒ⧇-āϞ⧋āĻĄ (āĻĢāĻŸā§‹, āĻ­āĻŋāĻĄāĻŋāĻ“, āĻŽā§āϝāĻžāĻĒ āĻĒā§āϝāĻžāĻ•): āϏāĻŽā§āĻ­āĻŦ āĻšāϞ⧇ unmetered āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻāĻŦāĻ‚ āϚāĻžāĻ°ā§āϜāĻŋāĻ‚ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰ⧁āύāĨ¤\n\nāωāĻĻāĻžāĻšāϰāĻŖ: āĻāĻ•āϜāύ āĻŸā§‡āĻ•āύāĻŋāĻļāĻŋāϝāĻŧāĻžāύ 2āϟāĻŋ āĻĢāĻŸā§‹āϏāĻš āĻāĻ•āϟāĻŋ āĻĢāĻ°ā§āĻŽ āϏ⧇āĻ­ āĻ•āϰ⧇āĨ¤ āĻĢāĻ°ā§āĻŽ āĻĢāĻŋāĻ˛ā§āĻĄāϰāĻž āϝ⧇āϕ⧋āύ⧋ āĻ•āĻžāύ⧇āĻ•āĻļāύ⧇ āϏāĻžāĻŦāĻŽāĻŋāϟ āĻ•āϰ⧁āύ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻĢāĻŸā§‹ āφāĻĒāϞ⧋āĻĄāϗ⧁āϞ⧋ Wi‑Fi āĻŦāĻž āĻ­āĻžāϞ⧋ āĻŽā§āĻšā§‚āĻ°ā§āϤ⧇ āĻ•āĻŋāω āĻ•āϰ⧁āύāĨ¤ āĻ…āĻĢāĻŋāϏ āĻĻā§āϰ⧁āϤ āĻ•āĻžāϜāϟāĻž āĻĻ⧇āϖ⧇ āĻĒāĻžāϝāĻŧ, āĻāĻŦāĻ‚ āĻĄāĻŋāĻ­āĻžāχāϏ āĻŽā§‹āĻŦāĻžāχāϞ āĻĄā§‡āϟāĻž āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄā§‡ āĻ›āĻŦāĻŋ āφāĻĒāϞ⧋āĻĄ āĻ•āϰ⧇ āĻ–āĻžāϝāĻŧ āύāĻžāĨ¤\n\n## āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻŦāĻŋāϰāĻ•ā§āϤ āύāĻž āĻ•āϰ⧇ āĻāĻ•ā§āϏāĻĒā§‹āύ⧇āύāĻļāĻŋāϝāĻŧāĻžāϞ āĻŦā§āϝāĻžāĻ•āĻ…āĻĢ āϏāĻš āϰāĻŋāĻŸā§āϰāĻžāχ\n\nāϰāĻŋāĻŸā§āϰāĻžāχ āĻšāϞ⧋ āϝ⧇āĻ–āĻžāύ⧇ āĻĢāĻŋāĻ˛ā§āĻĄ āĻ…ā§āϝāĻžāĻĒāϗ⧁āϞ⧋ āĻļāĻžāĻ¨ā§āϤ āϞāĻžāϗ⧇ āύāĻž āĻ–āĻžāϰāĻžāĻĒ āϞāĻžāĻ—ā§‡â€”āϏāĻ āĻŋāĻ• āĻŦā§āϝāĻžāĻ•āĻ…āĻĢ āĻĒāϞāĻŋāϏāĻŋ āϚāϝāĻŧāύ āĻ•āϰ⧁āύ āϝāĻž āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻļāĻŋāϤ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻžāϰ āϧāϰāύ āĻŽā§‡āϞ⧇āĨ¤\n\nāύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ•-āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ•ā§āϏāĻĒā§‹āύ⧇āύāĻļāĻŋāϝāĻŧāĻžāϞ āĻŦā§āϝāĻžāĻ•āĻ…āĻĢ āϏāĻžāϧāĻžāϰāĻŖāϤ āύāĻŋāϰāĻžāĻĒāĻĻ āĻĄāĻŋāĻĢāĻ˛ā§āϟāĨ¤ āĻāϟāĻŋ āĻĻā§āϰ⧁āϤ āĻ“āϝāĻŧ⧇āϟ āϟāĻžāχāĻŽ āĻŦāĻžāĻĄāĻŧāĻžāϝāĻŧ āϝāĻžāϤ⧇ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āωāĻĒāϰ āϚāĻžāĻĒ āύāĻž āĻĒāĻĄāĻŧ⧇ āĻŦāĻž āĻĻ⧁āĻ°ā§āĻŦāϞ āĻ•āĻ­āĻžāϰ⧇āĻœā§‡ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āĻ–āϰāϚ āύāĻž āĻšāϝāĻŧāĨ¤ āϞāĻŋāύāĻŋāϝāĻŧāĻžāϰ āĻŦā§āϝāĻžāĻ•āĻ…āĻĢ āϛ⧋āϟ āϏāĻžāĻŽāϝāĻŧāĻŋāĻ• āϏāĻŽāĻ¸ā§āϝāĻžāϰ āϜāĻ¨ā§āϝ āĻĢāĻŋāϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻĻ⧁āĻ°ā§āĻŦāϞ āϏāĻŋāĻ—āύāĻžāϞ āĻāϞāĻžāĻ•āĻžāϝāĻŧ āϖ⧁āĻŦ āϘāύāϘāύ āϰāĻŋāĻŸā§āϰāĻžāχ āĻ•āϰ⧇āĨ¤\n\nāĻŦā§āϝāĻ°ā§āĻĨāϤāĻžāϰ āϧāϰāύ āĻĻ⧇āϖ⧇ āϰāĻŋāĻŸā§āϰāĻžāχ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύāĻŋāύ, āϕ⧇āĻŦāϞ “āĻ•āĻŋāϛ⧁ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϝāĻŧ⧇āĻ›ā§‡â€ āĻŦāϞ⧇ āύāĻžāĨ¤ āĻāĻ•āϟāĻŋ āϏāĻšāϜ āϰ⧁āϞāϏ⧇āϟ:\n\n- āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āϟāĻžāχāĻŽāφāωāϟ, 5xx, DNS, āϕ⧋āύ āĻ•āĻžāύ⧇āĻ•āϟāĻŋāĻ­āĻŋāϟāĻŋ āύāĻž āĻĨāĻžāĻ•āĻž: Result.retry()\n- āĻ…āĻĨ⧇āĻ¨ā§āϟāĻŋāϕ⧇āĻļāύ āĻŽā§‡āϝāĻŧāĻžāĻĻā§‹āĻ¤ā§āϤ⧀āĻ°ā§āĻŖ (401): āĻāĻ•āĻŦāĻžāϰ āĻŸā§‹āϕ⧇āύ āϰāĻŋāĻĢā§āϰ⧇āĻļ āĻ•āϰ⧁āύ, āϤāĻžāϰāĻĒāϰ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϞ⧇ āχāωāϜāĻžāϰāϕ⧇ āϏāĻžāχāύ-āχāύ āĻŦāϞ⧁āύ\n- āĻ­ā§āϝāĻžāϞāĻŋāĻĄā§‡āĻļāύ āĻŦāĻž 4xx (āĻŦā§āϝāĻžāĻĄ āϰāĻŋāϕ⧁āϝāĻŧ⧇āĻ¸ā§āϟ): Result.failure() āĻāĻŦāĻ‚ āϏāĻžāĻĒā§‹āĻ°ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āĻ¸ā§āĻĒāĻˇā§āϟ āĻ¤ā§āϰ⧁āϟāĻŋ āĻĻ⧇āĻ–āĻžāύ\n- āĻ•āύāĻĢā§āϞāĻŋāĻ•ā§āϟ (409) āϝ⧇āϗ⧁āϞ⧋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇ āĻĒāĻžāĻ āĻžāύ⧋ āφāχāĻŸā§‡āĻŽ āĻŦā§‹āĻāĻžāϝāĻŧ: āϝāĻĻāĻŋ āφāĻĒāύāĻžāϰ āϏāĻŋāĻ™ā§āĻ• idempotent āĻšāϝāĻŧ āϤāĻžāĻšāϞ⧇ āϏ⧇āϗ⧁āϞ⧋āϕ⧇ āϏāĻĢāϞ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰ⧁āύ\n\nāĻ¸ā§āĻĨāĻžāϝāĻŧā§€ āĻ¤ā§āϰ⧁āϟāĻŋ āϝ⧇āύ āĻ…āύāĻ¨ā§āϤ āϞ⧁āĻĒ āύāĻž āĻ•āϰ⧇ āϤāĻžāϰ āϜāĻ¨ā§āϝ āĻ•ā§āώāϤāĻŋ āĻ•āĻžāϟāĻŋāϝāĻŧ⧇ āωāϠ⧁āύāĨ¤ āϏāĻ°ā§āĻŦā§‹āĻšā§āϚ āĻšā§‡āĻˇā§āϟāĻž āϏāĻ‚āĻ–ā§āϝāĻž āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰ⧁āύ, āĻāĻŦāĻ‚ āϤāĻžāϰ āĻĒāϰ⧇ āĻĨāĻžāĻŽā§āύ āĻ“ āĻāĻ•āϟāĻŋ āύ⧀āϰāĻŦ, āĻ•āĻžāϜāϝ⧋āĻ—ā§āϝ āĻŦāĻžāĻ°ā§āϤāĻž(surface) āĻĻ⧇āĻ–āĻžāύ (āĻĒ⧁āύāϰāĻžāϝāĻŧ āύ⧋āϟāĻŋāĻĢāĻžāχ āύāĻž āĻ•āϰ⧇)āĨ¤\n\nāĻšā§‡āĻˇā§āϟāĻž āĻŦāĻžāĻĄāĻŧāϞ⧇ āφāϚāϰāĻŖāĻ“ āĻŦāĻĻāϞāĻžāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, 2āϟāĻŋ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻžāϰ āĻĒāϰ⧇ āϛ⧋āϟ āĻŦā§āϝāĻžāϚ āĻĒāĻžāĻ āĻžāύ āĻŦāĻž āĻŦāĻĄāĻŧ āφāĻĒāϞ⧋āĻĄ āĻŦāĻžāĻĻ āĻĻāĻŋāύ āϝāϤāĻ•ā§āώāĻŖ āύāĻž āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϏāĻĢāϞ āĻĒ⧁āϞ āĻšāϝāĻŧāĨ¤\n\nkotlin\nval request = OneTimeWorkRequestBuilder\u003cSyncWorker\u003e()\n .setBackoffCriteria(\n BackoffPolicy.EXPONENTIAL,\n 30, TimeUnit.SECONDS\n )\n .build()\n\n// in doWork()\nif (runAttemptCount \u003e= 5) return Result.failure()\nreturn Result.retry()\n\n\nāĻāϟāĻŋ āϰāĻŋāĻŸā§āϰāĻžāχāϕ⧇ āĻ­āĻĻā§āϰ āϰāĻžāϖ⧇: āĻ•āĻŽ āĻ“ā§Ÿā§‡āĻ•-āφāĻĒ, āĻ•āĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻŦāĻŋāϰāĻ•ā§āϤāĻŋ, āĻāĻŦāĻ‚ āĻ•āĻžāύ⧇āĻ•āĻļāύ āĻĢāĻŋāϰ⧇ āϗ⧇āϞ⧇ āĻĻā§āϰ⧁āϤ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰāĨ¤\n\n## āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀-āĻĻ⧃āĻļā§āϝāĻŽāĻžāύ āĻ…āĻ—ā§āϰāĻ—āϤāĻŋ: āύ⧋āϟāĻŋāĻĢāĻŋāϕ⧇āĻļāύ, āĻĢā§‹āϰāĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āĻ•āĻžāϜ, āĻ“ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ\n\nāĻĢāĻŋāĻ˛ā§āĻĄ āĻ…ā§āϝāĻžāĻĒāϗ⧁āϞ⧋ āĻĒā§āϰāĻžāϝāĻŧāχ āϏāĻŋāĻ™ā§āĻ• āϤāĻ–āύ āϚāĻžāϞāĻžāϝāĻŧ āϝāĻ–āύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻļāĻž āĻ•āϰ⧇ āύāĻž: āĻŦ⧇āχāϏāĻŽā§‡āĻ¨ā§āĻŸā§‡, āϧ⧀āϰ āύ⧇āĻŸā§‡, āĻŦāĻž āĻĒā§āϰāĻžāϝāĻŧ āĻĄā§‡āĻĄ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋāϤ⧇āĨ¤ āϝāĻĻāĻŋ āϏāĻŋāĻ™ā§āĻ• āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āϜāĻ¨ā§āϝ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻšāϝāĻŧ (āφāĻĒāϞ⧋āĻĄ, āϰāĻŋāĻĒā§‹āĻ°ā§āϟ āĻĒāĻžāĻ āĻžāύ⧋, āĻĢāĻŸā§‹ āĻŦā§āϝāĻžāϚ), āϤāĻžāĻšāϞ⧇ āĻāϟāĻž āĻĻ⧃āĻļā§āϝāĻŽāĻžāύ āĻ“ āĻŦā§‹āĻāĻžāĻĒāĻĄāĻŧāĻžāϝ⧋āĻ—ā§āϝ āĻ•āϰ⧁āύāĨ¤ āϛ⧋āϟ āϤāĻžā§ŽāĻ•ā§āώāĻŖāĻŋāĻ• āφāĻĒāĻĄā§‡āϟāϗ⧁āϞ⧋āϰ āϜāĻ¨ā§āϝ āϏāĻžāχāϞ⧇āĻ¨ā§āϟ āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āĻ•āĻžāϜ āĻĻāĻžāϰ⧁āĻŖāĨ¤ āĻĻā§€āĻ°ā§āϘ āϝ⧇āϕ⧋āύ⧋ āĻ•āĻŋāϛ⧁ āĻšāϞ⧇ āϏ⧇āϟāĻž āχāĻŽāĻžāύāĻĻāĻžāϰ āĻšāĻ“āϝāĻŧāĻž āωāϚāĻŋāϤāĨ¤\n\n### āĻ•āĻ–āύ āĻĢā§‹āϰāĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āĻ•āĻžāϜ āĻĒā§āϰāϝāĻŧā§‹āϜāύ\n\nāĻ•āĻžāϜ āϝāĻĻāĻŋ āĻĻā§€āĻ°ā§āϘāĻŽā§‡āϝāĻŧāĻžāĻĻāĻŋ, āϏāĻŽāϝāĻŧ-āϏāĻ‚āĻŦ⧇āĻĻāύāĻļā§€āϞ, āĻŦāĻž āĻ¸ā§āĻĒāĻˇā§āϟāĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻ…ā§āϝāĻžāĻ•āĻļāύ⧇āϰ āϏāĻ™ā§āϗ⧇ āϜāĻĄāĻŧāĻŋāϤ āĻšāϝāĻŧ āϤāĻžāĻšāϞ⧇ āĻĢā§‹āϰāĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āĻāĻ•ā§āϏāĻŋāĻ•āĻŋāωāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤ āφāϧ⧁āύāĻŋāĻ• Android- āĻ āĻŦāĻĄāĻŧ āφāĻĒāϞ⧋āĻĄ āĻ¸ā§āϟāĻĒ āĻŦāĻž āĻŦāĻŋāϞāĻŽā§āĻŦāĻŋāϤ āĻšāϤ⧇ āĻĒāĻžāϰ⧇ āϝāĻĻāĻŋ āφāĻĒāύāĻŋ āĻĢā§‹āϰāĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āύāĻž āϚāĻžāϞāĻžāύāĨ¤ WorkManager-āĻ āĻāϰ āĻŽāĻžāύ⧇ āĻšāϞ⧋ ForegroundInfo āϰāĻŋāϟāĻžāĻ°ā§āύ āĻ•āϰāĻž āϝāĻžāϤ⧇ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻāĻ•āϟāĻŋ āϚāϞāĻŽāĻžāύ āύ⧋āϟāĻŋāĻĢāĻŋāϕ⧇āĻļāύ āĻĻ⧇āĻ–āĻžāϝāĻŧāĨ¤\n\nāĻāĻ•āϟāĻŋ āĻ­āĻžāϞ⧋ āύ⧋āϟāĻŋāĻĢāĻŋāϕ⧇āĻļāύ āϤāĻŋāύāϟāĻŋ āĻĒā§āϰāĻļā§āύ⧇āϰ āωāĻ¤ā§āϤāϰ āĻĻ⧇āϝāĻŧ: āϕ⧀ āϏāĻŋāĻ™ā§āĻ• āĻšāĻšā§āϛ⧇, āĻāϟāĻž āĻ•āϤāϟāĻž āĻāĻ—āĻŋāϝāĻŧ⧇āϛ⧇, āĻāĻŦāĻ‚ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻŦāĻ¨ā§āϧ āĻ•āϰāĻž āϝāĻžāϝāĻŧāĨ¤ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻĒāĻˇā§āϟ āĻ•ā§āϝāĻžāύāϏ⧇āϞ āĻ…ā§āϝāĻžāĻ•āĻļāύ āĻĻāĻŋāύ āϝāĻžāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻŽā§‡āϟāĻžāĻ°ā§āĻĄ āĻĄā§‡āϟāĻžāϝāĻŧ āĻĨāĻžāĻ•āϞ⧇ āĻŦāĻž āĻĢā§‹āύ āĻāĻ–āύāχ āϞāĻžāĻ—āϞ⧇ āĻ•āĻžāϜ āĻŦāĻ¨ā§āϧ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤\n\n### āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰāĻž āĻŦāĻŋāĻļā§āĻŦāĻžāϏāϝ⧋āĻ—ā§āϝ āĻŽāύ⧇ āϰāĻžāĻ–āĻžāϰ āĻŽāϤ⧋ āĻĒā§āϰāĻ—ā§āϰ⧇āϏ\n\nāĻĒā§āϰāĻ—ā§āϰ⧇āϏ āĻŦāĻžāĻ¸ā§āϤāĻŦ āχāωāύāĻŋāĻŸā§‡āϰ āϏāĻ™ā§āϗ⧇ āĻŽāĻžāύāĻžāύāϏāχ āĻšāĻ“āϝāĻŧāĻž āωāϚāĻŋāϤ, āĻāĻžāĻĒāϏāĻž āĻļāϤāĻžāĻ‚āĻļ āύāϝāĻŧāĨ¤ setProgress āĻĻāĻŋāϝāĻŧ⧇ āφāĻĒāĻĄā§‡āϟ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ UI-āϤ⧇ (WorkInfo āĻĨ⧇āϕ⧇) āĻĒāĻĄāĻŧ⧁āύāĨ¤\n\nāφāĻĒāύāĻŋ āϝāĻĻāĻŋ 12āϟāĻž āĻĢāĻŸā§‹ āĻāĻŦāĻ‚ 3āϟāĻž āĻĢāĻ°ā§āĻŽ āφāĻĒāϞ⧋āĻĄ āĻ•āϰ⧇āύ, āĻŦāϞ⧁āύ “5 of 15 items uploaded”, āϕ⧀ āĻŦāĻžāĻ•āĻŋ āφāϛ⧇ āĻĻ⧇āĻ–āĻžāύ, āĻāĻŦāĻ‚ āĻļ⧇āώ āĻ¤ā§āϰ⧁āϟāĻŋ āĻŽā§‡āϏ⧇āϜ āϏāĻžāĻĒā§‹āĻ°ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āϰāĻžāϖ⧁āύāĨ¤\n\nāĻĒā§āϰāĻ—ā§āϰ⧇āϏ āĻŽāĻžāύ⧇ āϰāĻžāϖ⧁āύ:\n\n- āϏāĻŽā§āĻĒāĻ¨ā§āύ āφāχāĻŸā§‡āĻŽ āĻ“ āĻŦāĻžāĻ•āĻŋ āφāχāĻŸā§‡āĻŽ\n- āĻŦāĻ°ā§āϤāĻŽāĻžāύ āϧāĻžāĻĒ ("Uploading photos", "Sending forms", "Finalizing")\n- āĻļ⧇āώ āϏāĻĢāϞ āϏāĻŋāĻ™ā§āĻ• āϏāĻŽāϝāĻŧ\n- āĻļ⧇āώ āĻ¤ā§āϰ⧁āϟāĻŋ (āϏāĻ‚āĻ•ā§āώāĻŋāĻĒā§āϤ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāĻžāĻžā§āϜāϞ)\n- āĻāĻ•āϟāĻŋ āĻĻ⧃āĻļā§āϝāĻŽāĻžāύ āĻ•ā§āϝāĻžāύāϏ⧇āϞ/āĻ¸ā§āϟāĻĒ āĻ…āĻĒāĻļāύ\n\nāφāĻĒāύāĻŋ āϝāĻĻāĻŋ āφāĻĒāύāĻžāϰ āϟāĻŋāĻŽ āĻĻā§āϰ⧁āϤ āύāĻŋāϜāĻ¸ā§āĻŦ āϟ⧁āϞ AppMaster āĻĻāĻŋāϝāĻŧ⧇ āĻŦāĻžāύāĻžāύ, āĻāĻ•āχ āύāĻŋāϝāĻŧāĻŽ āϰāĻžāϖ⧁āύ: āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰāĻž āϏāĻŋāĻ™ā§āϕ⧇ āĻŦāĻŋāĻļā§āĻŦāĻžāϏ āϤāĻ–āύāχ āĻ•āϰ⧇ āϝāĻ–āύ āϤāĻžāϰāĻž āĻāϟāĻž āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāϝāĻŧ āĻāĻŦāĻ‚ āϏ⧇āϟāĻž āϤāĻžāĻĻ⧇āϰ āĻŦāĻžāĻ¸ā§āϤāĻŦ āĻ•āĻžāĻœā§‡āϰ āϏāĻ™ā§āϗ⧇ āĻŽā§‡āϞ⧇āĨ¤\n\n## āχāωāύāĻŋāĻ• āĻ“āϝāĻŧāĻžāĻ°ā§āĻ•, āĻŸā§āϝāĻžāĻ—āϏ, āĻāĻŦāĻ‚ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āϏāĻŋāĻ™ā§āĻ• āϜāĻŦ āĻāĻĄāĻŧāĻžāύ⧋\n\nāĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āϏāĻŋāĻ™ā§āĻ• āϜāĻŦ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āĻ–āϰāϚ, āĻŽā§‹āĻŦāĻžāχāϞ āĻĄā§‡āϟāĻž āĻŦāĻžāĻĄāĻŧāĻžāύ⧋ āĻāĻŦāĻ‚ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻžāχāĻĄ āĻ•āύāĻĢā§āϞāĻŋāĻ•ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϏāĻšāϜ āωāĻĒāĻžāϝāĻŧāĨ¤ WorkManager āφāĻĒāύāĻžāϕ⧇ āĻĻ⧁āχāϟāĻŋ āϏāϰāϞ āϟ⧁āϞ āĻĻ⧇āϝāĻŧ: unique work name āĻ“ tagsāĨ¤\n\nāĻāĻ•āϟāĻŋ āĻ­āĻžāϞ⧋ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻšāϞ⧋ “sync” āϕ⧇ āĻāĻ•āϟāĻŋ āϏāĻŋāĻ™ā§āϗ⧇āϞ āϞ⧇āύ āϧāϰāĻžāĨ¤ āĻ…ā§āϝāĻžāĻĒ āϝāĻ–āύ āϜāĻžāϗ⧇, āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āϘāĻŸā§‡ āĻāĻŦāĻ‚ āĻĒāĻŋāϰāĻŋ⧟āĻĄāĻŋāĻ• āϜāĻŦ āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϏāĻžāĻĨ⧇, āϤāĻ–āύ āĻāĻ•āĻžāϧāĻŋāĻ• āϜāĻŦ enqueue āύāĻž āĻ•āϰ⧇ āĻāĻ•āχ unique work name enqueue āĻ•āϰ⧁āĻ¨â€”āĻāĻ­āĻžāĻŦ⧇ sync storm āĻšāĻŦ⧇ āύāĻžāĨ¤\n\nkotlin\nval request = OneTimeWorkRequestBuilder\u003cSyncWorker\u003e()\n .addTag(\"sync\")\n .build()\n\nWorkManager.getInstance(context)\n .enqueueUniqueWork(\"sync\", ExistingWorkPolicy.KEEP, request)\n\n\nāĻĒāϞāĻŋāϏāĻŋ āĻŦāĻžāĻ›āĻžāχ āĻšāĻšā§āϛ⧇ āĻĒā§āϰāϧāĻžāύ āφāϚāϰāĻŖāĻ—āϤ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ:\n\n- KEEP: āϝāĻĻāĻŋ āĻāĻ•āϟāĻŋ āϏāĻŋāĻ™ā§āĻ• āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ āϚāϞāϛ⧇ (āĻŦāĻž āĻ•āĻŋāω āĻ•āϰāĻž āφāϛ⧇), āύāϤ⧁āύ āĻ…āύ⧁āϰ⧋āϧ āωāĻĒ⧇āĻ•ā§āώāĻž āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤ āĻŦ⧇āĻļāĻŋāϰāĻ­āĻžāĻ— “Sync now” āĻŦā§‹āϤāĻžāĻŽ āĻ“ āĻ…āĻŸā§‹-āĻŸā§āϰāĻŋāĻ—āĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤\n- REPLACE: āĻŦāĻ°ā§āϤāĻŽāĻžāύāϟāĻŋ āĻŦāĻžāϤāĻŋāϞ āĻ•āϰ⧇ āύāϤ⧁āύ āĻļ⧁āϰ⧁ āĻ•āϰāĻŦ⧇āĨ¤ āϝāĻ–āύ āχāύāĻĒ⧁āϟ āϏāĻ¤ā§āϝāĻŋāχ āĻŦāĻĻāϞ⧇ āϝāĻžāϝāĻŧ (āϝ⧇āĻŽāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŦāĻĻāϞāĻžāύ⧋ āĻŦāĻž āĻ­āĻŋāĻ¨ā§āύ āĻĒā§āϰāĻœā§‡āĻ•ā§āϟ āϏāĻŋāϞ⧇āĻ•ā§āϟ āĻ•āϰāĻž) āϤāĻ–āύ āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤\n\nāĻŸā§āϝāĻžāĻ—āϗ⧁āϞ⧋ āĻ•āύāĻŸā§āϰ⧋āϞ āĻ“ āĻĻ⧃āĻļā§āϝāĻŽāĻžāύāϤāĻžāϰ āϜāĻ¨ā§āϝ āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞāĨ¤ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻĨāĻžāϝ⧀ āĻŸā§āϝāĻžāĻ— (sync) āĻĻāĻŋāϝāĻŧ⧇ āφāĻĒāύāĻŋ āĻ•ā§āϝāĻžāύāϏ⧇āϞ, āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āĻšā§‡āĻ• āĻŦāĻž āϞāĻ— āĻĢāĻŋāĻ˛ā§āϟāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύāĨ¤ āĻāϟāĻŋ āĻŽā§āϝāĻžāύ⧁āϝāĻŧāĻžāϞ “sync now” āĻ…ā§āϝāĻžāĻ•āĻļāύ⧇āϰ āϜāĻ¨ā§āϝ āĻŦāĻŋāĻļ⧇āώāĻ­āĻžāĻŦ⧇ āωāĻĒāĻ•āĻžāϰ⧀: āφāĻĒāύāĻŋ āĻšā§‡āĻ• āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āϕ⧋āύ āĻ•āĻžāϜ āχāϤ⧋āĻŽāĻ§ā§āϝ⧇ āϚāϞāϛ⧇ āĻāĻŦāĻ‚ āύāϤ⧁āύ worker āϞāĻžā§āϚ āĻ•āϰāĻžāϰ āφāϗ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āĻāĻ•āϟāĻŋ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻŽā§‡āϏ⧇āϜ āĻĻ⧇āĻ–āĻžāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤\n\nāĻĒāĻŋāϰāĻŋ⧟āĻĄāĻŋāĻ• āĻ“ āĻ…āύ-āĻĄāĻŋāĻŽāĻžāĻ¨ā§āĻĄ āϏāĻŋāĻ™ā§āĻ•āχ āĻāϕ⧇ āĻ…āĻĒāϰ⧇āϰ āϏāĻžāĻĨ⧇ āϞāĻĄāĻŧāĻžāχ āĻ•āϰāĻž āωāϚāĻŋāϤ āύāϝāĻŧāĨ¤ āφāϞāĻžāĻĻāĻž āĻ•āĻŋāĻ¨ā§āϤ⧁ āϏāĻŽāĻ¨ā§āĻŦāĻŋāϤ āϰāĻžāϖ⧁āύ:\n\n- āĻļāĻŋāĻĄāĻŋāωāϞāĻĄ āĻ•āĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ enqueueUniquePeriodicWork("sync_periodic", KEEP, ...) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤\n- āĻ…āύ-āĻĄāĻŋāĻŽāĻžāĻ¨ā§āĻĄā§‡āϰ āϜāĻ¨ā§āϝ enqueueUniqueWork("sync", KEEP, ...) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤\n- worker-āĻ āĻ•āĻŋāϛ⧁ āφāĻĒāϞ⧋āĻĄ āĻŦāĻž āĻĄāĻžāωāύāϞ⧋āĻĄ āύāĻž āĻĨāĻžāĻ•āϞ⧇ āĻĻā§āϰ⧁āϤ exit āĻ•āϰ⧁āύ, āϝāĻžāϤ⧇ āĻĒāĻŋāϰāĻŋ⧟āĻĄāĻŋāĻ• āϰāĻžāύ āϏāĻ¸ā§āϤāĻž āĻĨāĻžāϕ⧇āĨ¤\n- āϐāĻšā§āĻ›āĻŋāĻ•āĻ­āĻžāĻŦ⧇, āĻĒāĻŋāϰāĻŋ⧟āĻĄāĻŋāĻ• worker āĻāĻ•āχ one-time unique sync enqueue āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇, āϝāĻžāϤ⧇ āĻŦāĻžāĻ¸ā§āϤāĻŦ āĻ•āĻžāϜ āĻāĻ•āϟāĻŋ āϜāĻžāϝāĻŧāĻ—āĻžāϝāĻŧ āĻšāϝāĻŧāĨ¤\n\nāĻāχ āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύāϗ⧁āϞ⧋ āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āϏāĻŋāĻ™ā§āĻ•āϕ⧇ āĻĒā§āϰ⧇āĻĄāĻŋāĻ•ā§āĻŸā§‡āĻŦāϞ āϰāĻžāϖ⧇: āĻāĻ• āϏāĻŽāϝāĻŧ⧇ āĻāĻ• āϏāĻŋāĻ™ā§āĻ•, āϏāĻšāĻœā§‡ āĻ•ā§āϝāĻžāύāϏ⧇āϞāϝ⧋āĻ—ā§āϝ, āĻāĻŦāĻ‚ āϏāĻšāĻœā§‡ āĻĒāĻ°ā§āϝāĻŦ⧇āĻ•ā§āώāĻŖāϝ⧋āĻ—ā§āϝāĨ¤\n\n## āϧāĻžāĻĒ⧇ āϧāĻžāĻĒ⧇: āĻāĻ•āϟāĻŋ āĻĒā§āĻ°ā§āϝāĻžāĻ•āϟāĻŋāĻ•ā§āϝāĻžāϞ āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āϏāĻŋāĻ™ā§āĻ• āĻĒāĻžāχāĻĒāϞāĻžāχāύ\n\nāĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āϏāĻŋāĻ™ā§āĻ• āĻĒāĻžāχāĻĒāϞāĻžāχāύ āϛ⧋āϟ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻŸā§‡āϟ āĻŽā§‡āĻļāĻŋāύ āĻšāĻŋāϏ⧇āĻŦ⧇ āφāϚāϰāĻŖ āĻ•āϰāϞ⧇ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āϏāĻšāϜ: āĻ•āĻžāϜāϗ⧁āϞ⧋ āĻĒā§āϰāĻĨāĻŽā§‡ āϞ⧋āĻ•āĻžāϞāĻŋ āĻĨāĻžāϕ⧇, āφāϰ WorkManager āϕ⧇āĻŦāϞ āϤāĻ–āύāχ āĻāϗ⧁āϞ⧋āϕ⧇ āϏāĻžāĻŽāύ⧇ āĻŦāĻžāĻĄāĻŧāĻžāϝāĻŧ āϝāĻ–āύ āĻļāĻ°ā§āϤ āĻ āĻŋāĻ• āĻĨāĻžāϕ⧇āĨ¤\n\n### āĻāĻ•āϟāĻŋ āϏāϰāϞ āĻĒāĻžāχāĻĒāϞāĻžāχāύ āϝāĻž āφāĻĒāύāĻŋ āĻĒāĻžāĻ āĻžāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύ\n\n1) āϞ⧋āĻ•āĻžāϞ “queue” āĻŸā§‡āĻŦāĻŋāϞ āĻĻāĻŋāϝāĻŧ⧇ āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύāĨ¤ āĻĒ⧁āύāϰāĻžāϝāĻŧ āφāϰāĻŽā§āĻ­ āĻ•āϰāϤ⧇ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻ•āĻŽ āĻŽā§‡āϟāĻžāĻĄā§‡āϟāĻž āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύ: āφāχāĻŸā§‡āĻŽ āφāχāĻĄāĻŋ, āϟāĻžāχāĻĒ (form, photo, note), āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ (pending, uploading, done), attempts count, last error, āĻāĻŦāĻ‚ āĻĄāĻžāωāύāϞ⧋āĻĄā§‡āϰ āϜāĻ¨ā§āϝ āĻ•āĻžāĻ°ā§āϏāϰ āĻŦāĻž āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϰāĻŋāĻ­āĻŋāĻļāύāĨ¤\n\n2) āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻŸā§āϝāĻžāĻĒ āĻ•āϰāϞ⧇ “Sync now”–āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ OneTimeWorkRequest enqueue āĻ•āϰ⧁āύ āϝāĻžāϰ āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāύāϟ āφāĻĒāύāĻžāϰ āĻŦāĻžāĻ¸ā§āϤāĻŦ āĻŦāĻŋāĻļā§āĻŦ⧇āϰ āϏāĻžāĻĨ⧇ āĻŽā§‡āϞ⧇āĨ¤ āϏāĻžāϧāĻžāϰāĻŖāĻ­āĻžāĻŦ⧇ network connected āĻāĻŦāĻ‚ battery not low āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āϝāĻĻāĻŋ āφāĻĒāϞ⧋āĻĄ āĻ­āĻžāϰ⧀ āĻšāϝāĻŧ, āϤāĻ–āύ chargingāĻ“ āφāĻŦāĻļā§āϝāĻ• āĻ•āϰ⧁āύāĨ¤\n\n3) āĻāĻ•āϟāĻŋ CoroutineWorker āχāĻŽāĻĒā§āϞāĻŋāĻŽā§‡āĻ¨ā§āϟ āĻ•āϰ⧁āύ āĻ•ā§āϞāĻŋāϝāĻŧāĻžāϰ āĻĢ⧇āϜāϏāĻš: upload, download, reconcileāĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĢ⧇āϜ āχāύāĻ•ā§āϰāĻŋāĻŽā§‡āĻ¨ā§āϟāĻžāϞ āϰāĻžāϖ⧁āύāĨ¤ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ pending āĻŽāĻžāĻ°ā§āĻ• āĻ•āϰāĻž āφāχāĻŸā§‡āĻŽ āφāĻĒāϞ⧋āĻĄ āĻ•āϰ⧁āύ, āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āφāĻĒāύāĻžāϰ āĻļ⧇āώ āĻ•āĻžāĻ°ā§āϏāϰ⧇āϰ āĻĒāϰ āĻĨ⧇āϕ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰ⧁āύ, āϤāĻžāϰāĻĒāϰ āĻ•āύāĻĢā§āϞāĻŋāĻ•ā§āϟāϕ⧇ āϏāϰāϞ āύāĻŋāϝāĻŧāĻŽā§‡ āϰāĻŋāĻ•āύāϏāĻžāχāϞ āĻ•āϰ⧁āύ (āωāĻĻāĻžāĻšāϰāĻŖ: āĻāϏāĻžāχāύāĻŽā§‡āĻ¨ā§āϟ āĻĢāĻŋāĻ˛ā§āĻĄā§‡ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϜāϝāĻŧā§€, āϞ⧋āĻ•āĻžāϞ āĻĄā§āϰāĻžāĻĢāϟ āύ⧋āĻŸā§‡ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āϜāϝāĻŧā§€)āĨ¤\n\n4) āĻŦā§āϝāĻžāĻ•āĻ…āĻĢāϏāĻš āϰāĻŋāĻŸā§āϰāĻžāχ āϝ⧋āĻ— āĻ•āϰ⧁āύ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻ•āĻŋ āϰāĻŋāĻŸā§āϰāĻžāχ āĻ•āϰāĻŦ⧇āύ āϏ⧇āϟāĻž āĻŦ⧇āϛ⧇ āύāĻŋāύāĨ¤ āϟāĻžāχāĻŽāφāωāϟ āĻ“ 500s āϰāĻŋāĻŸā§āϰāĻžāχ āĻ•āϰāĻŦ⧇āύ; 401 āĻšāϞ⧇ āĻĻā§āϰ⧁āϤ āĻŦā§āϝāĻ°ā§āĻĨ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ UI-āϕ⧇ āϜāĻžāύāĻžāύāĨ¤\n\n5) UI āĻ“ āύ⧋āϟāĻŋāĻĢāĻŋāϕ⧇āĻļāύ⧇āϰ āϜāĻ¨ā§āϝ WorkInfo āĻĒāĻ°ā§āϝāĻŦ⧇āĻ•ā§āώāĻŖ āĻ•āϰ⧁āύāĨ¤ “Uploading 3 of 10”–āĻāϰ āĻŽāϤ⧋ āĻĢ⧇āϜāϗ⧁āϞ⧋āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāĻ—ā§āϰ⧇āϏ āφāĻĒāĻĄā§‡āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ, āĻāĻŦāĻ‚ āϏāĻ‚āĻ•ā§āώāĻŋāĻĒā§āϤ āĻ¤ā§āϰ⧁āϟāĻŋ āĻŦāĻžāĻ°ā§āϤāĻž āĻĻ⧇āĻ–āĻžāύ āϝāĻž āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āĻ•āϰāĻŖā§€āϝāĻŧ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ•āϰ⧇ (retry, sign in, connect to Wi‑Fi)āĨ¤\n\nkotlin\nval constraints = Constraints.Builder()\n .setRequiredNetworkType(NetworkType.CONNECTED)\n .setRequiresBatteryNotLow(true)\n .build()\n\nval request = OneTimeWorkRequestBuilder\u003cSyncWorker\u003e()\n .setConstraints(constraints)\n .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 30, TimeUnit.SECONDS)\n .build()\n\n\nāφāĻĒāύāĻŋ āĻ•āĻŋāω āϞ⧋āĻ•āĻžāϞ āϰāĻžāĻ–āϞ⧇ āĻāĻŦāĻ‚ worker āĻĢ⧇āϜāϗ⧁āϞ⧋ explicit āϰāĻžāĻ–āϞ⧇, āφāϚāϰāĻŖ āĻĒā§āϰ⧇āĻĄāĻŋāĻ•ā§āĻŸā§‡āĻŦāϞ āĻšāϝāĻŧ: āĻ•āĻžāϜ āĻ¸ā§āĻĨāĻ—āĻŋāϤ, āĻĒ⧁āύāϰāĻžāϰāĻŽā§āĻ­, āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āĻŦā§āϝāĻžāĻ–ā§āϝāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āϕ⧋āύ āĻ•āĻŋāϛ⧁ āϘāϟāϞ āύāĻž āϧāϰ⧇ āύāĻŋāϝāĻŧ⧇ āύāĻžāĨ¤\n\n## āϏāĻžāϧāĻžāϰāĻŖ āϭ⧁āϞ āĻ“ āĻĢāĻžāρāĻĻ (āĻāĻŦāĻ‚ āϏ⧇āϗ⧁āϞ⧋ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻāĻĄāĻŧāĻžāĻŦ⧇āύ)\n\nāύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āϏāĻŋāĻ™ā§āĻ• āĻĒā§āϰāĻžāϝāĻŧāχ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āϛ⧋āϟ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ⧇āϰ āĻ•āĻžāϰāϪ⧇ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϝāĻŧ āϝāĻž āĻĄā§‡āĻ­-āĻĢā§‹āύ⧇ āĻ āĻŋāĻ• āĻŽāύ⧇ āĻšāϞ⧇āĻ“ āĻŦāĻžāĻ¸ā§āϤāĻŦ⧇ āϭ⧇āϙ⧇ āĻĒāĻĄāĻŧ⧇āĨ¤ āϞāĻ•ā§āĻˇā§āϝ āĻšāϞ āϝāϤāϟāĻž āϏāĻŽā§āĻ­āĻŦ āĻ āĻŋāĻ• āϏāĻŽāϝāĻŧ⧇ āĻ•āĻžāϜ āϚāĻžāϞāĻžāĻ¨ā§‹â€”āύāĻŋāϝāĻŧāĻŽāĻŋāϤ āϚāϞāĻžāϰ āĻšā§‡āϝāĻŧ⧇āĨ¤\n\n### āĻŽāύ⧋āϝ⧋āϗ⧇āϰ āĻĢāĻžāρāĻĻāϗ⧁āϞ⧋\n\n- āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāύāϟ āĻ›āĻžāĻĄāĻŧāĻž āĻŦāĻĄāĻŧ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻžāĨ¤ āϝāĻĻāĻŋ āφāĻĒāύāĻŋ āϕ⧋āύāĻ“ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻ“ āϕ⧋āύāĻ“ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āϞ⧇āϭ⧇āϞ⧇ āĻĢāĻŸā§‹ āĻĒāĻžāĻ āĻžāύ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰāĻž āϤāĻž āĻ…āύ⧁āĻ­āĻŦ āĻ•āϰāĻŦ⧇āĨ¤ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āϟāĻžāχāĻĒ āĻ“ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āϞ⧋ āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāύāϟ āĻĻāĻŋāύ, āφāϰ āĻŦāĻĄāĻŧ āĻ•āĻžāϜ āϛ⧋āϟ āϛ⧋āϟ āϟ⧁āĻ•āϰ⧋āϤ⧇ āĻ­āĻžāĻ— āĻ•āϰ⧁āύāĨ¤\n- āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻžāϕ⧇ āĻ…āύāĻ¨ā§āϤāĻ•āĻžāϞ āϰāĻŋāĻŸā§āϰāĻžāχ āĻ•āϰāĻžāĨ¤ 401, āĻŽā§‡āϝāĻŧāĻžāĻĻā§‹āĻ¤ā§āϤ⧀āĻ°ā§āĻŖ āĻŸā§‹āϕ⧇āύ āĻŦāĻž āĻ…āύ⧁āĻĒāĻ¸ā§āĻĨāĻŋāϤ āĻ…āύ⧁āĻŽāϤāĻŋ āĻ…āĻ¸ā§āĻĨāĻžāϝāĻŧā§€ āϏāĻŽāĻ¸ā§āϝāĻž āύāϝāĻŧāĨ¤ āĻāϗ⧁āϞ⧋āϕ⧇ āĻšāĻžāĻ°ā§āĻĄ āĻĢ⧇āχāϞ āĻšāĻŋāϏ⧇āĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰ⧁āύ, āĻ¸ā§āĻĒāĻˇā§āϟ āĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻĻ⧇āĻ–āĻžāύ (āĻĒ⧁āύāϰāĻžāϝāĻŧ āϞāĻ—āχāύ), āφāϰ āϕ⧇āĻŦāϞ āϟāĻžāχāĻŽāφāωāĻŸā§‡āϰ āĻŽāϤ⧋ āĻŸā§āϰāĻžāύāϜāĻŋāϝāĻŧ⧇āĻ¨ā§āϟ āϏāĻŽāĻ¸ā§āϝāĻž āϰāĻŋāĻŸā§āϰāĻžāχ āĻ•āϰ⧁āύāĨ¤\n- āĻĻ⧁āĻ°ā§āϘāϟāύāĻžāĻ•ā§āϰāĻŽā§‡ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāĨ¤ āϝāĻĻāĻŋ worker āĻĻ⧁āχāĻŦāĻžāϰ āϚāϞāϤ⧇ āĻĒāĻžāϰ⧇, āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻĄāĻŦāϞ āĻ•ā§āϰāĻŋāϝāĻŧ⧇āϟ āĻĒāĻžāĻŦ⧇ āϝāĻĻāĻŋ āĻ…āύ⧁āϰ⧋āϧ idempotent āύāĻž āĻšāϝāĻŧāĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻŋ āφāχāĻŸā§‡āĻŽā§‡ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ-āĻœā§‡āύāĻžāϰ⧇āϟ āĻ•āϰāĻž āĻ¸ā§āĻĨāĻžāϝāĻŧā§€ ID āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āϏāĻžāĻ°ā§āĻ­āĻžāϰāϕ⧇ āϰāĻŋāĻĒāĻŋāϟāϕ⧇ āφāĻĒāĻĄā§‡āϟ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰāϤ⧇ āĻŦāϞ⧁āύāĨ¤\n- near real-time āϜāĻ¨ā§āϝ periodic work āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāĨ¤ Periodic work āĻŽā§‡āχāύāĻŸā§‡āĻ¨ā§āϝāĻžāĻ¨ā§āϏ⧇āϰ āϜāĻ¨ā§āϝ āĻ­āĻžāϞ⧋, āĻ•āĻŋāĻ¨ā§āϤ⧁ “sync now”–āĻāϰ āϜāĻ¨ā§āϝ āύāϝāĻŧāĨ¤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀-āωāĻĻā§āĻĻāĻŋāĻˇā§āϟ āϏāĻŋāĻ™ā§āϕ⧇āϰ āϜāĻ¨ā§āϝ one-time unique work enqueue āĻ•āϰ⧁āύāĨ¤\n- “100%” āϖ⧁āĻŦ āϤāĻžāĻĄāĻŧāĻžāϤāĻžāĻĄāĻŧāĻŋ āϰāĻŋāĻĒā§‹āĻ°ā§āϟ āĻ•āϰāĻžāĨ¤ āφāĻĒāϞ⧋āĻĄ āĻ•āĻŽāĻĒā§āϞāĻŋāĻļāύ āĻŽāĻžāύ⧇āχ āĻĄā§‡āϟāĻž āĻ—ā§āϰāĻšāĻŖ āĻ“ āϰāĻŋāĻ•āύāϏāĻžāχāϞ āĻšāĻ“āϝāĻŧāĻž āύāϝāĻŧāĨ¤ āĻ¸ā§āĻŸā§‡āϜ āϧāϰ⧇ āĻĒā§āϰāĻ—ā§āϰ⧇āϏ āĻŸā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰ⧁āύ (queued, uploading, server confirmed) āĻāĻŦāĻ‚ āϕ⧇āĻŦāϞ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻ•āύāĻĢāĻžāĻ°ā§āĻŽā§‡āĻļāύ⧇āϰ āĻĒāϰ⧇ done āĻĻ⧇āĻ–āĻžāύāĨ¤\n\nāĻāĻ•āϟāĻŋ āĻ•āĻ‚āĻ•ā§āϰāĻŋāϟ āωāĻĻāĻžāĻšāϰāĻŖ: āĻāĻ•āϜāύ āĻŸā§‡āĻ•āύāĻŋāĻļāĻŋāϝāĻŧāĻžāύ āϤāĻŋāύāϟāĻŋ āĻ›āĻŦāĻŋāϏāĻš āĻāĻ•āϟāĻŋ āĻĢāĻ°ā§āĻŽ elevator-āĻ āĻĻ⧁āĻ°ā§āĻŦāϞ āϏāĻŋāĻ—āύāĻžāϞ āĻĻāĻŋāϝāĻŧ⧇ āϏāĻžāĻŦāĻŽāĻŋāϟ āĻ•āϰ⧇āĨ¤ āϝāĻĻāĻŋ āφāĻĒāύāĻŋ āϕ⧋āύ āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāύāϟ āύāĻž āĻĻāĻŋāϝāĻŧ⧇ āĻĢāĻŸā§‹ āφāĻĒāϞ⧋āĻĄ āĻļ⧁āϰ⧁ āĻ•āϰ⧇āύ, āφāĻĒāϞ⧋āĻĄ āφāϟāϕ⧇ āϝāĻžāĻŦ⧇, āϰāĻŋāĻŸā§āϰāĻžāχ āĻŦāĻžāĻĄāĻŧāĻŦ⧇, āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻĒ āϰāĻŋāĻ¸ā§āϟāĻžāĻ°ā§āĻŸā§‡ āĻĢāĻ°ā§āĻŽ āĻĻ⧁āĻŦāĻžāϰ āϤ⧈āϰāĻŋ āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āϝāĻĻāĻŋ āφāĻĒāύāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāϝ⧋āĻ—ā§āϝ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāύāϟ āĻĻ⧇āύ, āϧāĻžāĻĒ⧇ āφāĻĒāϞ⧋āĻĄ āĻ•āϰ⧁āύ, āĻāĻŦāĻ‚ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĢāĻ°ā§āĻŽā§‡ āĻ¸ā§āĻĨāĻžāϝāĻŧā§€ ID āϰāĻžāϖ⧇āύ, āϤāĻžāĻšāϞ⧇ āĻāĻ•āχ āϏāĻŋāύāĻžāϰāĻŋāĻ“āϤ⧇ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āĻāĻ•āϟāĻŋ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āϰ⧇āĻ•āĻ°ā§āĻĄ āĻĨāĻžāĻ•āĻŦ⧇ āĻ“ āĻĒā§āϰāĻ—ā§āϰ⧇āϏ āϏāĻ¤ā§āϝāĨ¤\n\n## āϰāĻŋāϞāĻŋāĻœā§‡āϰ āφāϗ⧇ āĻĻā§āϰ⧁āϤ āĻšā§‡āĻ•āϞāĻŋāĻ¸ā§āϟ\n\nāϰāĻŋāϞāĻŋāĻœā§‡āϰ āφāϗ⧇ āĻŦāĻžāĻ¸ā§āϤāĻŦ āĻĢāĻŋāĻ˛ā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰāĻž āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ­āĻžāĻ™āĻŦ⧇ āϏ⧇āϟāĻž āĻŽāϤ⧋ āϏāĻŋāĻ™ā§āĻ• āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧁āύ: āĻ…āύāĻŋāϝāĻŧāĻŽāĻŋāϤ āϏāĻŋāĻ—āύāĻžāϞ, āĻĄā§‡āĻĄ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ, āĻāĻŦāĻ‚ āĻ…āύ⧇āĻ• āĻŸā§āϝāĻžāĻĒāĨ¤ āĻĄā§‡āĻ­ āĻĢā§‹āύ⧇ āĻ āĻŋāĻ• āĻĻ⧇āĻ–āϞ⧇āχ āĻŦāĻžāĻ¸ā§āϤāĻŦ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ scheduling, retries āĻŦāĻž āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āϰāĻŋāĻĒā§‹āĻ°ā§āϟāĻŋāĻ‚ āϏāĻŽāĻ¸ā§āϝāĻž āĻšāϞ⧇ āϤāĻž āĻĢ⧇āϞ āĻšāϝāĻŧ⧇ āϝāĻžāĻŦ⧇āĨ¤\n\nāĻ•āĻŽāĻĒāĻ•ā§āώ⧇ āĻāĻ•āϟāĻŋ āĻĒ⧁āϰāύ⧋ āĻĄāĻŋāĻ­āĻžāχāϏ āĻ“ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āĻāϗ⧁āϞ⧋ āϚāĻžāϞāĻžāύāĨ¤ āϞ⧋āĻ— āϰāĻžāϖ⧁āύ, āĻ•āĻŋāĻ¨ā§āϤ⧁ UI-āϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϕ⧀ āĻĻ⧇āĻ–āϛ⧇ āϤāĻžāĻ“ āĻĻ⧇āϖ⧁āύāĨ¤\n\n- āύ⧋āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ•, āϤāĻžāϰāĻĒāϰ āϰāĻŋāĻ•āĻ­āĻžāϰāĻŋ: āĻ•āĻžāύ⧇āĻ•āϟāĻŋāĻ­āĻŋāϟāĻŋ āĻŦāĻ¨ā§āϧ āϰ⧇āϖ⧇ āϏāĻŋāĻ™ā§āĻ• āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύ, āĻĒāϰ⧇ āϚāĻžāϞ⧁ āĻ•āϰ⧁āύāĨ¤ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧁āύ āĻ•āĻžāϜ āĻ•āĻŋāω āĻ•āϰāĻž āφāϛ⧇ (āϤāϤāĻ•ā§āώāĻŖāĻžā§Ž āĻŦā§āϝāĻ°ā§āĻĨ āύāϝāĻŧ) āĻāĻŦāĻ‚ āĻĒ⧁āύāϰāĻžāϝāĻŧ āϚāĻžāϞ⧁ āĻšāϞ⧇ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āĻ›āĻžāĻĄāĻŧāĻž āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻļ⧁āϰ⧁ āĻšāϝāĻŧāĨ¤\n- āĻĄāĻŋāĻ­āĻžāχāϏ āϰāĻŋāĻ¸ā§āϟāĻžāĻ°ā§āϟ: āϏāĻŋāĻ™ā§āĻ• āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύ, āĻŽāĻžāĻāĻĒāĻĨ⧇ āϰāĻŋāĻŦ⧁āϟ āĻĻāĻŋāύ, āϤāĻžāϰāĻĒāϰ āĻ…ā§āϝāĻžāĻĒ āϖ⧁āϞ⧁āύāĨ¤ āϝāĻžāϚāĻžāχ āĻ•āϰ⧁āύ āĻ•āĻžāϜ āϚāĻžāϞāĻŋāϝāĻŧ⧇ āϝāĻžāϝāĻŧ āĻŦāĻž āϰāĻŋ-āĻļ⧇āĻĄāĻŋāωāϞ āĻšāϝāĻŧ āĻāĻŦāĻ‚ UI āϏāĻ āĻŋāĻ• āĻ¸ā§āĻŸā§‡āϟ āĻĻ⧇āĻ–āĻžāϝāĻŧ ("syncing" āĻ āφāϟāĻ• āύāϝāĻŧ)āĨ¤\n- āϞ⧋ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āĻ“ āĻ•āĻŽ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ: āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āϏ⧇āĻ­āĻžāϰ āĻ…āύ āĻ•āϰ⧁āύ, āϏāĻŽā§āĻ­āĻŦ āĻšāϞ⧇ āϞ⧋ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āĻĨā§āϰ⧇āĻļāĻšā§‹āĻ˛ā§āĻĄā§‡ āύāĻžāĻŽāĻžāύ, āĻāĻŦāĻ‚ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻĒā§āϰāĻžāϝāĻŧ āĻĒā§‚āĻ°ā§āĻŖ āĻ•āϰ⧁āύāĨ¤ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧁āύ āĻ•āĻžāϜ āĻ…āĻĒ⧇āĻ•ā§āώāĻž āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻļāĻ°ā§āϤ āωāĻ¨ā§āύāϤ āĻšāϞ⧇ āϚāĻžāϞāĻŋāϝāĻŧ⧇ āϝāĻžāϝāĻŧ, āĻĒ⧁āύāϰāĻžāϝāĻŧ āϰāĻŋāĻŸā§āϰāĻžāχ āϞ⧁āĻĒ⧇ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āĻ–āϰāϚ āĻ•āϰ⧇ āύāĻžāĨ¤\n- āĻ…āύ⧇āĻ•āĻŦāĻžāϰ āĻŸā§āϰāĻŋāĻ—āĻžāϰ: Sync āĻŦā§‹āϤāĻžāĻŽ āĻāĻ•āĻžāϧāĻŋāĻ•āĻŦāĻžāϰ āĻŸā§āϝāĻžāĻĒ āĻ•āϰ⧁āύ āĻŦāĻž āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ¸ā§āĻ•ā§āϰāĻŋāύ āĻĨ⧇āϕ⧇ āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻ•āϰ⧁āύāĨ¤ āφāĻĒāύāĻžāϕ⧇ āĻāĻ•āϟāĻŋ āϞāϜāĻŋāĻ•ā§āϝāĻžāϞ āϏāĻŋāĻ™ā§āĻ• āϰāĻžāύ āĻĒāĻžāĻ“ā§ŸāĻž āωāϚāĻŋāϤ, āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞ worker-āĻāϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇āĨ¤\n- āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻž āϝ⧇āϗ⧁āϞ⧋ āĻŦā§āϝāĻžāĻ–ā§āϝāĻžāϝ⧋āĻ—ā§āϝ: 500s, āϟāĻžāχāĻŽāφāωāϟ, āĻ“ auth āĻ¤ā§āϰ⧁āϟāĻŋ āϏāĻŋāĻŽā§āϞ⧇āϟ āĻ•āϰ⧁āύāĨ¤ āϝāĻžāϚāĻžāχ āĻ•āϰ⧁āύ āϰāĻŋāĻŸā§āϰāĻžāχ āĻŦā§āϝāĻžāĻ•āĻ…āĻĢ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āĻ•ā§āϝāĻžāĻĒ⧇āϰ āĻĒāϰ⧇ āĻĨāĻžāĻŽā§‡, āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻĒāĻˇā§āϟ āĻŽā§‡āϏ⧇āϜ āĻĻ⧇āϖ⧇ ("Can’t reach server, will retry")—āĻœā§‡āύ⧇āϰāĻŋāĻ• āĻ¤ā§āϰ⧁āϟāĻŋ āύāϝāĻŧāĨ¤\n\nāϝāĻĻāĻŋ āϕ⧋āύ⧋ āĻŸā§‡āĻ¸ā§āϟ āĻ…ā§āϝāĻžāĻĒāϕ⧇ āĻ…āĻ¸ā§āĻĒāĻˇā§āϟ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ āĻĢ⧇āϞ⧇, āϏ⧇āϟāĻžāϕ⧇ āĻŦāĻžāĻ— āĻšāĻŋāϏ⧇āĻŦ⧇ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰ⧁āύāĨ¤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰāĻž āϧ⧀āϰ āϏāĻŋāĻ™ā§āĻ• āĻ•ā§āώāĻŽāĻž āĻ•āϰ⧇ āĻĻ⧇āύ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻĄā§‡āϟāĻž āĻšāĻžāϰāĻžāύ⧋ āĻŦāĻž āĻŦ⧁āĻāϤ⧇ āύāĻž āĻĒāĻžāϰāĻž āĻŽāĻžāĻĢ āĻ•āϰ⧇ āύāĻžāĨ¤\n\n## āωāĻĻāĻžāĻšāϰāĻŖ āĻĒāϰāĻŋāĻ¸ā§āĻĨāĻŋāϤāĻŋ: āĻ…āĻĢāϞāĻžāχāύ āĻĢāĻ°ā§āĻŽ āĻ“ āĻĢāĻŸā§‹ āφāĻĒāϞ⧋āĻĄ āĻĢāĻŋāĻ˛ā§āĻĄ āĻ…ā§āϝāĻžāĻĒ⧇\n\nāĻāĻ•āϜāύ āĻŸā§‡āĻ•āύāĻŋāĻļāĻŋāϝāĻŧāĻžāύ āĻĻ⧁āĻ°ā§āĻŦāϞ āĻ•āĻ­āĻžāϰ⧇āĻœā§‡ āϏāĻžāχāĻŸā§‡ āĻĒ⧌āρāϛ⧇āĨ¤ āϤāĻžāϰāĻž āĻ…āĻĢāϞāĻžāχāύ⧇ āĻāĻ•āϟāĻŋ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻĢāĻ°ā§āĻŽ āĻĒā§‚āϰāĻŖ āĻ•āϰ⧇, 12āϟāĻŋ āĻ›āĻŦāĻŋ āĻ•ā§āϝāĻžāĻĒāϚāĻžāϰ āĻ•āϰ⧇, āĻāĻŦāĻ‚ Submit āĻŸā§āϝāĻžāĻĒ āĻ•āϰ⧇āĨ¤ āĻ…ā§āϝāĻžāĻĒ āĻĒā§āϰāĻĨāĻŽā§‡ āϏāĻŦāĻ•āĻŋāϛ⧁ āϞ⧋āĻ•āĻžāϞāĻŋ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇ (āωāĻĻāĻžāĻšāϰāĻŖ: āϞ⧋āĻ•āĻžāϞ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇): āĻāĻ•āϟāĻŋ āϰ⧇āĻ•āĻ°ā§āĻĄ āĻĢāĻ°ā§āĻŽā§‡āϰ āϜāĻ¨ā§āϝ, āĻāĻŦāĻ‚ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ›āĻŦāĻŋāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϰ⧇āĻ•āĻ°ā§āĻĄ āĻ¸ā§āĻĒāĻˇā§āϟ āĻ¸ā§āĻŸā§‡āϟ āϏāĻš āϝ⧇āĻŽāύ PENDING, UPLOADING, DONE, āĻŦāĻž FAILEDāĨ¤\n\nāϤāĻžāϰāĻž Submit āĻŸā§āϝāĻžāĻĒ āĻ•āϰāϞ⧇ āĻ…ā§āϝāĻžāĻĒ āĻāĻ•āϟāĻŋ unique sync job enqueue āĻ•āϰ⧇ āϝāĻžāϤ⧇ āϤāĻžāϰāĻž āĻĻ⧁āχāĻŦāĻžāϰ āĻŸā§āϝāĻžāĻĒ āĻ•āϰāϞ⧇ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āύāĻž āĻšāϝāĻŧāĨ¤ āĻāĻ•āϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āϏ⧇āϟāφāĻĒ āĻšāϞ⧋ WorkManager āĻšā§‡āχāύ: āĻĒā§āϰāĻĨāĻŽā§‡ āĻĢāĻŸā§‹ āφāĻĒāϞ⧋āĻĄ (āĻŦāĻĄāĻŧ, āϧ⧀āϰ), āϤāĻžāϰāĻĒāϰ attachments āĻ•āύāĻĢāĻžāĻ°ā§āĻŽ āĻšāϞ⧇ āĻĢāĻ°ā§āĻŽ āĻĒ⧇-āϞ⧋āĻĄ āĻĒāĻžāĻ āĻžāύ⧋āĨ¤\n\nāϏāĻŋāĻ™ā§āĻ• āϤāĻ–āύāχ āϚāϞ⧇ āϝāĻ–āύ āĻļāĻ°ā§āϤ āĻŦāĻžāĻ¸ā§āϤāĻŦ āĻœā§€āĻŦāύ⧇āϰ āϏāĻ™ā§āϗ⧇ āĻŽā§‡āĻ˛ā§‡â€”āωāĻĻāĻžāĻšāϰāĻŖ: āϏāĻ‚āϝ⧁āĻ•ā§āϤ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ•, āύāύ-āϞ⧋ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ, āĻāĻŦāĻ‚ āĻĒāĻ°ā§āϝāĻžāĻĒā§āϤ āĻ¸ā§āĻŸā§‹āϰ⧇āϜāĨ¤ āϝāĻĻāĻŋ āĻŸā§‡āĻ• āĻāĻ–āύ⧋ āĻŦ⧇āχāϏāĻŽā§‡āĻ¨ā§āĻŸā§‡ āĻĨāĻžāϕ⧇, āĻ•āĻŋāϛ⧁āχ āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄā§‡ āϞ⧁āĻĒ āĻ•āϰ⧇ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āĻ–āĻžāĻŦ⧇ āύāĻžāĨ¤\n\nāĻĒā§āϰāϗ⧇āϏ āĻ¸ā§āĻĒāĻˇā§āϟ āĻ“ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀-āĻĢā§āϰ⧇āĻ¨ā§āĻĄāϞāĻŋāĨ¤ āφāĻĒāϞ⧋āĻĄ āĻĢā§‹āϰāĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āĻ•āĻžāĻœā§‡ āϚāϞ⧇ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āύ⧋āϟāĻŋāĻĢāĻŋāϕ⧇āĻļāύ āĻĻ⧇āĻ–āĻžāϝāĻŧ “Uploading 3 of 12”, āĻāĻ•āϟāĻŋ āĻ¸ā§āĻĒāĻˇā§āϟ Cancel āĻ…āĻĒāĻļāύ⧇āϰ āϏāĻ™ā§āϗ⧇āĨ¤ āϝāĻĻāĻŋ āϤāĻžāϰāĻž āĻ•ā§āϝāĻžāύāϏ⧇āϞ āĻ•āϰ⧇, āĻ…ā§āϝāĻžāĻĒ āĻ•āĻžāϜ āĻŦāĻ¨ā§āϧ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻŦāĻžāĻ•āĻŋ āφāχāĻŸā§‡āĻŽāϗ⧁āϞ⧋ PENDING āϰ⧇āϖ⧇āχ āϰāĻžāϖ⧇ āϝāĻžāϤ⧇ āĻĒāϰ⧇ āϰāĻŋāĻŸā§āϰāĻžāχ āĻ•āϰāĻž āϝāĻžāϝāĻŧ āĻĄā§‡āϟāĻž āύāĻž āĻšāĻžāϰāĻŋāϝāĻŧ⧇āĨ¤\n\nāĻĢā§āĻ˛ā§āϝāĻžāĻ•āĻŋ āĻšāϟāĻ¸ā§āĻĒāĻŸā§‡āϰ āĻĒāϰ⧇ āϰāĻŋāĻŸā§āϰāĻžāχ āĻ­āĻĻā§āϰāĻ­āĻžāĻŦ⧇ āφāϚāϰāĻŖ āĻ•āϰ⧇: āĻĒā§āϰāĻĨāĻŽ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻž āĻĻā§āϰ⧁āϤ āϰāĻŋāĻŸā§āϰāĻžāχ āĻ•āϰ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϞ⧇ āĻ…āĻĒ⧇āĻ•ā§āώāĻž āĻŦāĻžāĻĄāĻŧ⧇ (āĻāĻ•ā§āϏāĻĒā§‹āύ⧇āύāĻļāĻŋāϝāĻŧāĻžāϞ āĻŦā§āϝāĻžāĻ•āĻ…āĻĢ)āĨ¤ āĻļ⧁āϰ⧁āϤ⧇ āĻāϟāĻŋ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻļā§€āϞ āĻŽāύ⧇ āĻšāϝāĻŧ, āĻĒāϰ⧇ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āĻ“ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻ¸ā§āĻĒā§āϝāĻžāĻŽ āĻāĻĄāĻŧāĻžāϤ⧇ āĻŦā§āϝāĻžāĻ•-āĻ…āĻĢ āĻ•āϰ⧇āĨ¤\n\nāĻ…āĻĒāϏ āϟāĻŋāĻŽā§‡āϰ āϜāĻ¨ā§āϝ āĻĢāϞāĻžāĻĢāϞ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ: āĻ•āĻŽ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āϜāĻŽāĻž āĻ•āĻžāϰāĻŖ āφāχāĻŸā§‡āĻŽāϗ⧁āϞ⧋ idempotent āĻ“ āχāωāύāĻŋāĻ• āĻ•āĻŋāω āĻ•āϰāĻž āφāϛ⧇, āĻ¸ā§āĻĒāĻˇā§āϟ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻž āĻ¸ā§āĻŸā§‡āϟ (āϕ⧋āύ āĻ›āĻŦāĻŋ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϝāĻŧ⧇āϛ⧇, āϕ⧇āύ, āĻ•āĻ–āύ āϏ⧇āϟāĻž āϰāĻŋāĻŸā§āϰāĻžāχ āĻ•āϰāĻŦ⧇), āĻāĻŦāĻ‚ “submitted” āĻŽāĻžāύ⧇ “āύāĻŋāϰāĻžāĻĒāĻĻ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ āĻāĻŦāĻ‚ āϏāĻŋāĻ™ā§āĻ• āĻšāĻŦā§‡â€ āĻŦāϞ⧇ āĻŦāĻĄāĻŧ āĻŦāĻŋāĻļā§āĻŦāĻžāϏāĨ¤\n\n## āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϧāĻžāĻĒ: āĻĒā§āϰāĻĨāĻŽā§‡ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝāϤāĻž āĻĒāĻžāĻ āĻžāύ, āϤāĻžāϰāĻĒāϰ āϏāĻŋāĻ™ā§āĻ• āĻ¸ā§āϕ⧋āĻĒ āĻŦāĻžāĻĄāĻŧāĻžāύ\n\nāφāϰāĻ“ āϏāĻŋāĻ™ā§āĻ• āĻĢāĻŋāϚāĻžāϰ āϝ⧋āĻ— āĻ•āϰāĻžāϰ āφāϗ⧇, āĻ¸ā§āĻĒāĻˇā§āϟāĻ­āĻžāĻŦ⧇ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰ⧁āύ “āĻ•ė™„â€ āϕ⧀ āĻŽāĻžāύ⧇āĨ¤ āĻŦ⧇āĻļāĻŋāϰāĻ­āĻžāĻ— āĻĢāĻŋāĻ˛ā§āĻĄ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āϜāĻ¨ā§āϝ āĻāϟāĻž āĻšāϞ⧋ āϕ⧇āĻŦāϞ “āϰāĻŋāϕ⧁āϝāĻŧ⧇āĻ¸ā§āϟ āĻĒāĻžāĻ āĻžāĻ¨ā§‹â€ āύāϝāĻŧ—āĻāϟāĻž āĻšāϞ⧋ “āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰ⧇āϛ⧇ āĻ“ āĻ•āύāĻĢāĻžāĻ°ā§āĻŽ āĻ•āϰ⧇āĻ›ā§‡â€, āĻāĻŦāĻ‚ UI-āϰ āĻ¸ā§āĻŸā§‡āϟ āĻŦāĻžāĻ¸ā§āϤāĻŦāϤāĻžāϰ āϏāĻ™ā§āϗ⧇ āĻŽā§‡āϞ⧇āĨ¤ āĻāĻ•āϟāĻŋ āĻĢāĻ°ā§āĻŽ āϝāĻž “Synced” āĻŦāϞ⧇ āϏ⧇āϟāĻŋ āĻ…ā§āϝāĻžāĻĒ āϰāĻŋāĻ¸ā§āϟāĻžāĻ°ā§āĻŸā§‡āϰ āĻĒāϰ⧇ āϏ⧇āχ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ āĻĨāĻžāĻ•āĻž āωāϚāĻŋāϤ, āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āĻŦā§āϝāĻ°ā§āĻĨ āĻĢāĻ°ā§āĻŽ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āĻ•āϰāĻŖā§€āϝāĻŧ āĻĻ⧇āĻ–āĻžāύ⧋ āωāϚāĻŋāϤāĨ¤\n\nāĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻŦāĻŋāĻļā§āĻŦāĻžāϏ āĻ•āϰāϤ⧇ āϏāĻšāϜ āĻ•āϰ⧁āύ āĻ•āĻŋāϛ⧁ āĻ¸ā§āĻĒāĻˇā§āϟ āϏāĻŋāĻ—āĻ¨ā§āϝāĻžāϞ āϝ⧋āĻ— āĻ•āϰ⧇ āϝāĻž āϏāĻžāĻĒā§‹āĻ°ā§āϟ āϜāĻŋāĻœā§āĻžā§‡āϏ āĻ•āϰāϞ⧇ āϜāĻžāύāĻž āϝāĻžāϝāĻŧāĨ¤ āϏ⧇āϗ⧁āϞ⧋ āϏāĻšāϜ āĻ“ consistent āϰāĻžāϖ⧁āύ across screen:\n\n- āĻļ⧇āώ āϏāĻĢāϞ āϏāĻŋāĻ™ā§āĻ• āϏāĻŽāϝāĻŧ\n- āĻļ⧇āώ āϏāĻŋāĻ™ā§āĻ• āĻ¤ā§āϰ⧁āϟāĻŋ (āϏāĻ‚āĻ•ā§āώāĻŋāĻĒā§āϤ āĻŽā§‡āϏ⧇āϜ, āĻ¸ā§āĻŸā§āϝāĻžāĻ• āĻŸā§āϰ⧇āϏ āύāϝāĻŧ)\n- āĻĒ⧇āĻ¨ā§āĻĄāĻŋāĻ‚ āφāχāĻŸā§‡āĻŽ (āωāĻĻāĻžāĻšāϰāĻŖ: 3 āĻĢāĻ°ā§āĻŽ, 12 āĻĢāĻŸā§‹)\n- āĻŦāĻ°ā§āϤāĻŽāĻžāύ āϏāĻŋāĻ™ā§āĻ• āĻ¸ā§āĻŸā§‡āϟ (Idle, Syncing, Needs attention)\n\nāĻĒāĻ°ā§āϝāĻŦ⧇āĻ•ā§āώāĻŖāϝ⧋āĻ—ā§āϝāϤāĻžāϕ⧇ āĻĢāĻŋāϚāĻžāϰ⧇āϰ āĻ…āĻ‚āĻļ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰ⧁āύāĨ¤ āĻāϟāĻž āĻĻ⧁āĻ°ā§āĻŦāϞ āĻ•āĻžāύ⧇āĻ•āĻļāύ⧇ āĻĒāύ⧇āϰ⧋ āĻŽāĻŋāύāĻŋāϟ āĻŦāĻžāρāϚāĻžāϝāĻŧ āϝāĻ–āύ āϕ⧇āω āϜāĻžāύ⧇ āύāĻž āĻ…ā§āϝāĻžāĻĒ āĻ•āĻžāϜ āĻ•āϰāϛ⧇ āĻ•āĻŋ āύāĻžāĨ¤\n\nāφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āĻ“ āĻ…ā§āϝāĻžāĻĄāĻŽāĻŋāύ āϟ⧁āϞāĻ“ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āύ, āϏ⧇āϗ⧁āϞ⧋ āĻāĻ•āϏāĻžāĻĨ⧇ āĻœā§‡āύāĻžāϰ⧇āϟ āĻ•āϰāϞ⧇ āϏāĻŋāĻ™ā§āĻ• āĻ•āύāĻŸā§āϰāĻžāĻ•ā§āϟ āĻ¸ā§āĻĨāĻŋāϤāĻŋāĻļā§€āϞ āϰāĻžāĻ–āĻž āϏāĻšāϜ āĻšāϝāĻŧāĨ¤ AppMaster (appmaster.io) āφāĻĒāύāĻžāϕ⧇ āĻĒā§āϰ⧋āĻĄāĻžāĻ•āĻļāύ-āϰ⧇āĻĄāĻŋ āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ, āĻāĻ•āϟāĻŋ āĻ“āϝāĻŧ⧇āĻŦ āĻ…ā§āϝāĻžāĻĄāĻŽāĻŋāύ āĻĒā§āϝāĻžāύ⧇āϞ, āĻāĻŦāĻ‚ āύ⧇āϟāĻŋāĻ­ āĻŽā§‹āĻŦāĻžāχāϞ āĻ…ā§āϝāĻžāĻĒ āĻœā§‡āύāĻžāϰ⧇āϟ āĻ•āϰāϤ⧇ āĻĒāĻžāĻ°ā§‡â€”āĻāϟāĻŋ āĻŽāĻĄā§‡āϞ āĻ“ auth āϏāĻ™ā§āĻ—āϤ āϰāĻžāĻ–āϤ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰ⧇ āϝāĻžāϤ⧇ āφāĻĒāύāĻŋ āϜāϟāĻŋāϞ āϏāĻŋāĻ™ā§āĻ• āĻāϜāϗ⧁āϞ⧋āϰ āωāĻĒāϰ āĻĢā§‹āĻ•āĻžāϏ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤\n\nāĻļ⧇āώ⧇, āĻāĻ•āϟāĻŋ āϛ⧋āϟ āĻĒāĻžāχāϞāϟ āϚāĻžāϞāĻžāύāĨ¤ āĻāĻ•āϟāĻŋ end-to-end āϏāĻŋāĻ™ā§āĻ• āĻ¸ā§āϞāĻžāχāϏ āĻŦ⧇āϛ⧇ āύāĻŋāύ (āωāĻĻāĻžāĻšāϰāĻŖ: “1–2 āĻĢāĻŸā§‹āϰ āϏāĻ™ā§āϗ⧇ āĻāĻ• āχāĻ¨ā§āϏāĻĒ⧇āĻ•āĻļāύ āĻĢāĻ°ā§āĻŽ āϏāĻžāĻŦāĻŽāĻŋāĻŸâ€), āĻāĻŦāĻ‚ āϏ⧇āϟāĻŋ constraints, retries, āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀-āĻĻ⧃āĻļā§āϝāĻŽāĻžāύ āĻĒā§āϰāĻ—ā§āϰ⧇āϏ āϏāĻš āĻĒ⧁āϰ⧋āĻĒ⧁āϰāĻŋ āĻ•āĻžāϜ āĻ•āϰāĻŦ⧇ āĻāĻŽāύāĻ­āĻžāĻŦ⧇ āĻĒāĻžāĻ āĻžāύāĨ¤ āϝāĻ–āύ āϏ⧇āχ āĻ¸ā§āϞāĻžāχāϏ āĻŦāĻŋāϰāĻ•ā§āϤāĻŋāĻ•āϰ āĻ“ predictable āĻšāϝāĻŧ⧇ āϝāĻžāϝāĻŧ, āϤāĻ–āύ āĻāĻ•āĻŦāĻžāϰ⧇ āĻāĻ•āϟāĻŋ āĻĢāĻŋāϚāĻžāϰ āĻ•āϰ⧇ āĻŦāĻžāĻĄāĻŧāĻžāύāĨ¤

āĻĒā§āϰāĻļā§āύ⧋āĻ¤ā§āϤāϰ

āĻĢāĻŋāĻ˛ā§āĻĄ āĻ…ā§āϝāĻžāĻĒ⧇ “āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āϏāĻŋāĻ™ā§āĻ•â€ āφāϏāϞ⧇ āϕ⧀ āĻ…āĻ°ā§āĻĨ?

āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āϏāĻŋāĻ™ā§āĻ• āĻ…āĻ°ā§āĻĨ āĻšāϞ⧋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āϤ⧈āϰāĻŋ āĻ•āĻžāϜāϗ⧁āϞ⧋ āφāϗ⧇ āϞ⧋āĻ•āĻžāϞāĻŋ āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ āĻšāϝāĻŧ āĻāĻŦāĻ‚ āĻĒāϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āĻāĻ•āχ āĻ•āĻžāϜ āĻŦāĻžāϰāĻŦāĻžāϰ āĻ•āϰāϤ⧇ āύāĻž āĻĻāĻŋāϝāĻŧ⧇ āφāĻĒāϞ⧋āĻĄ āĻšāϝāĻŧāĨ¤ āĻ…ā§āϝāĻžāĻĒ āĻŦāĻ¨ā§āϧ āĻšāϝāĻŧ⧇ āϝāĻžāĻ“āϝāĻŧāĻž, āϰāĻŋāĻŦ⧁āϟ, āĻĻ⧁āĻ°ā§āĻŦāϞ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻŦāĻž āϰāĻŋāĻŸā§āϰāĻžāχāϝāĻŧ⧇āϰ āϏāĻŽāϝāĻŧāĻ“ āĻĄā§‡āϟāĻž āϞ⧁āĻĒā§āϤ āύāĻž āĻšāĻ“āϝāĻŧāĻž āĻāĻŦāĻ‚ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āύāĻž āĻšāĻ“āϝāĻŧāĻžāχ āϞāĻ•ā§āĻˇā§āϝāĨ¤

āĻ•āĻ–āύ OneTimeWorkRequest vs PeriodicWorkRequest āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āωāϚāĻŋāϤ?

āχāϭ⧇āĻ¨ā§āϟ-āĻ­āĻŋāĻ¤ā§āϤāĻŋāĻ• āĻŦāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀-āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž āĻ•āĻžāϜāϗ⧁āϞ⧋āϰ āϜāĻ¨ā§āϝ OneTimeWorkRequest āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ (āϝ⧇āĻŽāύ āĻĢāĻ°ā§āĻŽ āϏāĻ‚āϰāĻ•ā§āώāĻŖ, āĻ›āĻŦāĻŋ āϝ⧋āĻ— āĻ•āϰāĻž, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ Sync āĻŸā§‡āĻĒ āĻ•āϰāĻž)āĨ¤ PeriodicWorkRequest āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ āϰāĻ•ā§āώāĻŖāĻžāĻŦ⧇āĻ•ā§āώāĻŖ āĻŦāĻž āĻ¨ā§āϝāĻžāχāϟāϞāĻŋ āĻ•ā§āϞāĻŋāύāφāĻĒ⧇āϰ āĻŽāϤ⧋ āĻ•āĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āφāĻĒāϞ⧋āĻĄāϗ⧁āϞ⧋āϰ āĻāĻ•āĻŽāĻžāĻ¤ā§āϰ āĻĒāĻĨ āĻšāĻŋāϏ⧇āĻŦ⧇ āύāĻžâ€”āĻ•āĻžāϰāĻŖ āĻāϰ āϏāĻŽāϝāĻŧāϏ⧀āĻŽāĻž āĻ­āĻŋāĻ¨ā§āύāϤāĻž āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āϕ⧋āύ Worker āϟāĻžāχāĻĒ āĻŦ⧇āϛ⧇ āύ⧇āĻŦā§‹: Worker, CoroutineWorker, āύāĻž RxWorker?

Kotlin āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϰ āϏāĻŋāĻ™ā§āĻ• āϕ⧋āĻĄ suspend āĻĢāĻžāĻ‚āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ CoroutineWorker āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϏāĻšāϜ āĻ“ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻļāĻŋāϤ āφāϚāϰāĻŖ āĻĻ⧇āϝāĻŧ (āĻŦāĻŋāĻļ⧇āώāϤ āĻ•ā§āϝāĻžāύāϏ⧇āϞ⧇āĻļāύ⧇āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇)āĨ¤ āϛ⧋āϟ āĻŦā§āϞāĻ•āĻŋāĻ‚ āĻ•āĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ Worker āωāĻĒāϝ⧁āĻ•ā§āϤ, āφāϰ RxWorker āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ āϕ⧇āĻŦāϞ āϤāĻ–āύāχ āϝāĻ–āύ āĻ…ā§āϝāĻžāĻĒ āχāϤ⧋āĻŽāĻ§ā§āϝ⧇āχ RxJava-āĻāϰ āĻ“āĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āĻ—āĻ āĻŋāϤāĨ¤

āĻāĻ•āĻžāϧāĻŋāĻ• worker āĻšā§‡āχāύ āĻ•āϰāĻž āωāϚāĻŋāϤ āύāĻžāĻ•āĻŋ āϏāĻŦāĻ•āĻŋāϛ⧁ āĻāĻ• worker-āĻ āĻ•āϰāĻž āωāϚāĻŋāϤ?

āĻ¸ā§āĻŸā§‡āĻĒāϗ⧁āϞ⧋āϰ āφāϞāĻžāĻĻāĻž āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāύāϟ āĻĨāĻžāϕ⧇ āĻŦāĻž āφāϞāĻžāĻĻāĻž āϰāĻŋāϟāĻžāϰāĻŋāϰ āĻĻāϰāĻ•āĻžāϰ āĻšāϞ⧇ workers āĻšā§‡āχāύ āĻ•āϰ⧁āύ (āϝ⧇āĻŽāύ Wi‑Fi-āĻ āĻŦāĻĄāĻŧ āφāĻĒāϞ⧋āĻĄ, āϤāĻžāϰāĻĒāϰ āϝ⧇ āϕ⧋āύāĻ“ āύ⧇āĻŸā§‡ āϛ⧋āϟ API āĻ•āϞ)āĨ¤ āĻ¸ā§āĻŸā§‡āĻĒāϗ⧁āϞ⧋ āĻļ⧇āϝāĻŧāĻžāϰāĻĄ āĻĄā§‡āϟāĻž āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋāχ āĻŸā§āϰāĻžāύāĻœā§‡āĻ•āĻļāύ⧇āϰ āĻŽāϤ⧋ āφāϚāϰāĻŖ āĻ•āϰāϞ⧇ āĻāĻ•āϟāĻŋ worker-āĻ āĻ•ā§āϞāĻŋāϝāĻŧāĻžāϰ āĻĢ⧇āϜ āϰāĻžāϖ⧁āĻ¨â€”āĻāϟāĻŋ “all-or-nothing” āĻļāĻŦā§āĻĻāϟāĻŋ āĻĻā§‡ā§ŸāĨ¤

āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āϰāĻŋāĻŸā§āϰāĻžāχ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āϰ⧇āĻ•āĻ°ā§āĻĄ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻŦāĻ¨ā§āϧ āĻ•āϰāĻŦ⧇?

āĻĒā§āϰāϤāĻŋāϟāĻŋ create/update āĻ…āύ⧁āϰ⧋āϧ āĻĻ⧁āχāĻŦāĻžāϰ āϚāĻžāϞāĻžāύ⧋āχ āύāĻŋāϰāĻžāĻĒāĻĻ āĻšāĻ“āϝāĻŧāĻž āωāϚāĻŋāĻ¤â€”āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ āĻĒā§āϰāϤāĻŋāϟāĻŋ āφāχāĻŸā§‡āĻŽā§‡ āĻāĻ•āϟāĻŋ idempotency key (āϏāĻžāϧāĻžāϰāĻŖāϤ āĻāĻ•āϟāĻŋ UUID) āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύ āϝāĻžāϤ⧇ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻāĻ•āχ āĻ…āύ⧁āϰ⧋āϧāϕ⧇ āĻāĻ•āχ āĻĢāϞāĻžāĻĢāϞ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰ⧇āĨ¤ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻŦāĻĻāϞāĻžāϤ⧇ āύāĻž āĻĒāĻžāϰāϞ⧇ stable natural key āĻāĻŦāĻ‚ upsert āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āĻŦāĻž āĻ­āĻžāĻ°ā§āϏāύ āύāĻŽā§āĻŦāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ āϝāĻžāϤ⧇ stale āφāĻĒāĻĄā§‡āϟ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻ–ā§āϝāĻžāϤ āĻšāϝāĻŧāĨ¤

āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āφāĻĒāϞ⧋āĻĄāϕ⧇ resumable āϰāĻžāĻ–āĻŦ āϝāĻĻāĻŋ āĻ…ā§āϝāĻžāĻĒ āĻŽāĻžāĻāĻĒāĻĨ⧇ āĻŽāĻžāϰāĻž āϝāĻžāϝāĻŧ?

āĻ¸ā§āĻĒāĻˇā§āϟ āϞ⧋āĻ•āĻžāϞ āĻ¸ā§āĻŸā§‡āϟ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύ (āϝ⧇āĻŽāύ queued, uploading, uploaded, failed) āϝāĻžāϤ⧇ worker āĻ•ā§āĻ°ā§āϝāĻžāĻļ⧇āϰ āĻĒāϰ⧇ āĻ…āύ⧁āĻŽāĻžāύ āύāĻž āĻ•āϰ⧇ āĻĒ⧁āύāϰāĻžāϝāĻŧ āϚāĻžāϞāĻŋāϝāĻŧ⧇ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻŋ āφāχāĻŸā§‡āĻŽ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻ•āύāĻĢāĻžāĻ°ā§āĻŽ āύāĻž āĻĻāĻŋāϞ⧇ done āĻŽāĻžāĻ°ā§āĻ• āĻ•āϰāĻŦ⧇āύ āύāĻžâ€”āĻĢāĻžāχāϞ URI āĻ“ āφāĻĒāϞ⧋āĻĄ āĻŽā§‡āϟāĻžāĻĄā§‡āϟāĻžāĻ“ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύ āϝāĻžāϤ⧇ āĻĒ⧁āύāϰāĻžāϝāĻŧ āφāϰāĻŽā§āĻ­ āĻ•āϰāϞ⧇ āĻļ⧇āώ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ āĻĨ⧇āϕ⧇ āϚāĻžāϞāĻžāύ⧋ āϝāĻžāϝāĻŧāĨ¤

āĻĢāĻŋāĻ˛ā§āĻĄ āĻ…ā§āϝāĻžāĻĒ āϏāĻŋāĻ™ā§āĻ• āϜāĻŦāϗ⧁āϞ⧋āϰ āϜāĻ¨ā§āϝ āϕ⧋āύ āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāύāϟ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻ­āĻžāϞ?

āĻāĻ•āϟāĻŋ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻ­āĻŋāĻ¤ā§āϤāĻŋāĻ• āĻŦ⧇āϏāϞāĻžāχāύ āĻšāϞ⧋: āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻĨāĻžāĻ•āĻž āωāϚāĻŋāϤ, āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āϞ⧋ āĻšāϞ⧇ āϚāĻžāϞāĻžāĻŦ⧇āύ āύāĻž, āĻāĻŦāĻ‚ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻ•ā§āϰāĻŋāϟāĻŋāĻ•ā§āϝāĻžāϞ āύāĻž āĻĨāĻžāĻ•āϞ⧇ āϚāĻžāϞāĻžāύāĨ¤ āĻ•āĻžāϜ āĻ­āĻžāϰ⧀ āĻšāϞ⧇ āϚāĻžāĻ°ā§āϜāĻŋāĻ‚ āĻĒā§āĻ°ā§Ÿā§‹āϜāύ āĻŦāϞ⧁āύ; āĻ•āĻŋāĻ¨ā§āϤ⧁ āϖ⧁āĻŦ āĻŦ⧇āĻļāĻŋ āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāύāϟ āĻĻāĻŋāϞ⧇ āϏāĻŋāĻ™ā§āĻ• āĻĒā§āϰāĻžāϝāĻŧ āĻ•āĻ–āύ⧋āχ āϚāϞāĻŦ⧇ āύāĻžâ€”āĻ…āϤāĻāĻŦ “unmetered” āĻŦāĻž “charging” āĻĒā§āĻ°ā§Ÿā§‹āϜāύ āĻšāϞ⧇ āϏāϤāĻ°ā§āĻ• āĻšā§‹āύāĨ¤

āĻ•ā§āϝāĻžāĻĒāϟāĻŋāĻ­ āĻĒā§‹āĻ°ā§āϟāĻžāϞ āĻŦāĻž “Wi‑Fi āĻ•āĻŋāĻ¨ā§āϤ⧁ āϕ⧋āύ⧋ āχāĻ¨ā§āϟāĻžāϰāύ⧇āϟ āύ⧇āĻ‡â€ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞ āĻ•āϰāĻŦ?

āĻ•ā§āϝāĻžāĻĒāϟāĻŋāĻ­ āĻĒā§‹āĻ°ā§āϟāĻžāϞ āĻŦāĻž “Wi‑Fi āφāϛ⧇ āĻ•āĻŋāĻ¨ā§āϤ⧁ āχāĻ¨ā§āϟāĻžāϰāύ⧇āϟ āύ⧇āĻ‡â€ āĻāĻŽāύ āĻĒāϰāĻŋāĻ¸ā§āĻĨāĻŋāϤāĻŋāϕ⧇ āϏāĻžāϧāĻžāϰāĻŖ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻž āĻšāĻŋāϏ⧇āĻŦ⧇ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰ⧁āύ: āĻĻā§āϰ⧁āϤ āϟāĻžāχāĻŽāφāωāϟ āĻ•āϰ⧁āύ, Result.retry() āĻĻāĻŋāύ āĻāĻŦāĻ‚ āĻĒāϰ⧇ āφāĻŦāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧁āύāĨ¤ āĻ…āύ⧁āϰ⧋āϧ āϚāϞāĻžāĻ•āĻžāϞ⧇ āϝāĻĻāĻŋ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ, āĻāĻ•āϟāĻŋ āϏāϰāϞ āĻŽā§‡āϏ⧇āϜ āĻĻ⧇āĻ–āĻžāύ āϝāĻžāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻŦ⧁āĻāϤ⧇ āĻĒāĻžāϰ⧇ āϕ⧇āύ āĻĄāĻŋāĻ­āĻžāχāϏ āĻ…āύāϞāĻžāχāύ āĻŽāύ⧇ āĻšāϞ⧇āĻ“ āϏāĻŋāĻ™ā§āĻ• āϚāϞāϛ⧇ āύāĻžāĨ¤

āĻĻ⧁āĻ°ā§āĻŦāϞ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āϕ⧇āϰ āϜāĻ¨ā§āϝ āϏāĻŦāĻšā§‡ā§Ÿā§‡ āύāĻŋāϰāĻžāĻĒāĻĻ āϰāĻŋāĻŸā§āϰāĻžāχ āĻ•ā§ŒāĻļāϞ āϕ⧀?

āĻĻ⧁āĻ°ā§āĻŦāϞ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āϕ⧇āϰ āϜāĻ¨ā§āϝ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻāĻ•ā§āϏāĻĒā§‹āύ⧇āύāĻļāĻŋāϝāĻŧāĻžāϞ āĻŦā§āϝāĻžāĻ•āĻ…āĻĢ āύāĻŋāϰāĻžāĻĒāĻĻ āĻĄāĻŋāĻĢāĻ˛ā§āϟāĨ¤ āϟāĻžāχāĻŽāφāωāϟ āĻ“ 5xx-āĻāϰ āϜāĻ¨ā§āϝ āϰāĻŋāĻŸā§āϰāĻžāχ āĻ•āϰ⧁āύ, 401 āĻšāϞ⧇ āĻŸā§‹āϕ⧇āύ āϰāĻŋāĻĢā§āϰ⧇āĻļ āĻāĻ•āĻŦāĻžāϰ āĻ•āϰ⧇ āϤāĻžāϰāĻĒāϰ āĻĢ⧇āχāϞ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āϏāĻžāχāύ-āχāύ āĻ­āĻžāĻŦāϤ⧇ āĻŦāϞ⧁āύ, 4xx (āϭ⧁āϞ āĻ…āύ⧁āϰ⧋āϧ) āĻšāϞ⧇ āĻ¸ā§āĻĒāĻˇā§āϟ āĻ¤ā§āϰ⧁āϟāĻŋ āĻĻ⧇āĻ–āĻžāύ āĻāĻŦāĻ‚ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāĻŦ⧇āύ āύāĻžāĨ¤ āϏāĻ°ā§āĻŦā§‹āĻŽā§‹āϟ āĻšā§‡āĻˇā§āϟāĻž āϏāĻ‚āĻ–ā§āϝāĻž āϏ⧀āĻŽāĻžāĻŦāĻĻā§āϧ āϰāĻžāϖ⧁āύ āϝāĻžāϤ⧇ āĻ¸ā§āĻĨāĻžāϝāĻŧā§€ āĻ¤ā§āϰ⧁āϟāĻŋ āĻ…āĻļ⧇āώ āϞ⧁āĻĒ āύāĻž āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĨ¤

āĻ•āĻŋāĻ­āĻžāĻŦ⧇ “sync storms” āĻā§œāĻžāĻŦ āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āϜāĻ¨ā§āϝ āĻĻ⧃āĻļā§āϝāĻŽāĻžāύ āĻĒā§āϰāϗ⧇āϏ āĻĻ⧇āĻ–āĻžāĻŦ?

āĻŦāĻšā§ āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻāĻ•āϏāĻžāĻĨ⧇ parallel āϜāĻŦ āĻļ⧁āϰ⧁ āύāĻž āĻ•āϰ⧇ sync-āϕ⧇ unique work āĻšāĻŋāϏ⧇āĻŦ⧇ enqueue āĻ•āϰ⧁āύ āϝāĻžāϤ⧇ sync storms āύāĻž āĻšā§ŸāĨ¤ āĻĻā§€āĻ°ā§āϘ āĻ•āĻžāϜ āĻšāϞ⧇ foreground execution āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āϚāϞāĻŽāĻžāύ āύ⧋āϟāĻŋāĻĢāĻŋāϕ⧇āĻļāύ āĻĻ⧇āĻ–āĻžāύ āϝāĻž āĻŦāĻžāĻ¸ā§āϤāĻŦ āĻ•āĻĒCounāϟāϏāĻŽā§‚āĻš āĻĻ⧇āĻ–āĻžāϝāĻŧ (āϝ⧇āĻŽāύ “5 of 15 items uploaded”) āĻāĻŦāĻ‚ āĻ¸ā§āĻĒāĻˇā§āϟ āĻāĻ•āϟāĻŋ Cancel āĻ…āĻĒāĻļāύ āϰāĻžāϖ⧁āύāĨ¤

āĻļ⧁āϰ⧁ āĻ•āϰāĻž āϏāĻšāϜ
āĻ•āĻŋāϛ⧁ āφāĻļā§āϚāĻ°ā§āϝāϜāύāĻ•āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ

āĻŦāĻŋāύāĻžāĻŽā§‚āĻ˛ā§āϝ⧇āϰ āĻĒāϰāĻŋāĻ•āĻ˛ā§āĻĒāύāĻž āϏāĻš āĻ…ā§āϝāĻžāĻĒāĻŽāĻžāĻ¸ā§āϟāĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧁āύāĨ¤
āφāĻĒāύāĻŋ āϝāĻ–āύ āĻĒā§āϰāĻ¸ā§āϤ⧁āϤ āĻšāĻŦ⧇āύ āϤāĻ–āύ āφāĻĒāύāĻŋ āϏāĻ āĻŋāĻ• āϏāĻĻāĻ¸ā§āϝāϤāĻž āĻŦ⧇āϛ⧇ āύāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āύ⧎

āĻāĻŦāĻžāϰ āĻļ⧁āϰ⧁ āĻ•āϰāĻž āϝāĻžāĻ•
āĻĢāĻŋāĻ˛ā§āĻĄ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āϜāĻ¨ā§āϝ Kotlin WorkManager āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āϏāĻŋāĻ™ā§āĻ• āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ | AppMaster