📱موبایلسال: ۱۴۰۴تکمیل‌شده

MagicWatch

یک همراه اندرویدی برای کارهای روزانه — اوقات نماز، ساعت همیشه‌روشن و تقویم شمسی

MagicWatch cover
KotlinJetpack ComposeMaterial 3RoomHiltRetrofitMedia3 ExoPlayerWorkManager

یک اپ اندرویدی برای کارهایی که هر روز انجام می‌دهی، ساخته‌شده طوری که بدون اینترنت هم کار کند.

چیست

اوقات نماز، آلارمی که اذان پخش می‌کند، صوت قرآن، و ساعتی که روی صفحه قفل می‌ماند. بخش‌هایی که برای من مهم‌ترند کم‌هیجان‌ترین‌شان هستند: اوقات نماز روی خود دستگاه حساب می‌شود، پس در کوه و بی‌شبکه هم درست است؛ و تقویم پیاده‌سازی خودم از تقویم شمسی است، چون رفتار پیش‌فرض سیستم با چیزی که یک کاربر ایرانی انتظار دارد فرق دارد.

چه کار می‌کند

  • اوقات نماز محاسبه‌شده محلی — نه دریافتی از API که ممکن است قطع باشد، کند باشد یا غلط. چند روش محاسبه پشتیبانی می‌شود و نتیجه cache می‌شود تا آفلاین هم کار کند.
  • پخش اذان با Media3، با قریه‌هایی که واقعاً استفاده می‌کنم، و رفتار صدایی که اذان لازم دارد نه رفتاری که یک پخش‌کننده موسیقی دارد.
  • پخش آنلاین صوت قرآن، سوره‌به‌سوره، با انتخاب قاری.
  • ساعت همیشه‌روشن روی صفحه قفل با بیدار شدن با دو ضربه و محافظت از سوختگی پیکسل با جابه‌جایی، چون ساعتی که به صفحه‌ات آسیب بزند بدتر از نداشتن ساعت است.
  • ساعت شناور که روی بقیه اپ‌ها می‌نشیند.
  • فهرست کارهای روزانه با یادآور زمان‌بندی‌شده، و پنل آب‌وهوا.
  • تقویم شمسی نوشته‌شده از صفر — تبدیل تاریخ، نام ماه‌ها و روزهای هفته، که تاریخ را در کل اپ اداره می‌کند.

اعداد

۶۲ فایل Kotlin
۳ لایه جدا نگه‌داشته‌شده: data، domain، presentation
۴ روش محاسبه اوقات نماز پشتیبانی‌شده

چرا ارزش دیدن دارد

Clean Architecture یک الگوی توصیفی است و دیدن اینکه در یک اپ واقعی دوام می‌آورد از نمودارش آموزنده‌تر است. اینجا جای خودش را نگه داشت به یک دلیل مشخص: محاسبه اوقات نماز چند روش دارد و منطق محاسبه واقعاً مستقل از این است که نتیجه از دیتابیس آمده، از کش آمده یا از API. نگه‌داشتن این پشت یک اینترفیس یعنی بتوانم ذخیره‌سازی را عوض کنم بدون اینکه به منطق دست بزنم.

بخش دیگری که ارزش خواندن دارد، نمایش همیشه‌روشن است. محافظت از سوختگی پیکسل روی صفحه قفل یک قابلیت نیست، یک الزام است، و راه‌حل درست — جابه‌جا کردن ملایم موقعیت ساعت هر دقیقه — آسان رد می‌شود و خیلی به چشم می‌آید وقتی نباشد.

وضعیت فعلی

  • فایل‌های صوتی اذان داخل اپ بسته‌بندی شده‌اند، و برای همین حجم اپ بزرگ است.
  • هیچ تست instrumented یا تست UI نوشته نشده. لایه‌ها جدا هستند که پیش‌نیاز تست زدن آن‌هاست، ولی خود تست‌ها نوشته نشده‌اند.

پروژه‌های بیشتر