تخطَّ إلى المحتوى
MVIMedia SDKCommunity Challenge

EchoJournal

تطبيق تدوين صوتي يعتمد على تصميم Material 3، يتيح تصنيف المذكرات حسب الحالات المزاجية.

السنة
٢٠٢٥
النوع
Community Challenge
EchoJournal

نظرة عامة

بُني EchoJournal لتحدي مجتمع Pl Mobile Dev Campus. يسجّل ملاحظات صوتية ويتيح للمستخدم تصفّحها كجدول زمني (Timeline) قابل للفلترة وموسوم بالمزاج والموضوع، مع إمكانية إضافة النسخ الصوتي بالذكاء الاصطناعي لاحقاً.

التحدي

إدارة حالة تسجيل الوسائط عبر دورة حياة نظام Android (Android Lifecycle) تعتبر مسألة حساسة؛ فإذا أُرسل التطبيق للعمل في الخلفية، أو عند حدوث تغييرات في إعدادات الجهاز، قد يتسبب تدفق `MediaRecorder` في تسريب الموارد أو إتلاف المخزن المؤقت للبيانات، مما يؤدي إلى عدم توافق في المؤثرات البصرية التي تعرض مستوى الصوت في الوقت الفعلي.

بالإضافة إلى ذلك، فإن تطوير منتج أولي (MVP) متماسك، ولكنه مفتوح في ذات الوقت لإعادة الهيكلة ونظام "الوحدات المتعددة" (Multi-Module Integration) لاحقاً، تطلب موازنة دقيقة بين سرعة التطوير والحدود المعمارية الصارمة.

القرارات المعمارية والتقنية

بدأ EchoJournal كمنتج أولي أحادي الوحدة على معمارية MVI. ترسل الواجهة أوامر (Intents) مصنّفة للأسفل، فتظلّ حالات PREPARING و RECORDING و PAUSED و IDLE متزامنة مع طبقة عرض Compose.

التعامل مع طبقات الوسائط

  • إدارة الوسائط: تُربط كائنات MediaPlayer و MediaRecorder بنطاقات Coroutine مدركة لدورة الحياة، وتُحرَّر عند التنظيف، وهذا ما يمنع التسريبات.
  • تدوين تفاعلي: يرتبط تجميع السجل عبر Room و Flow. يفلتر المستخدم حسب الموضوع أو المزاج، وأي تغيير في قاعدة البيانات يُحدّث حالة Compose المعنية مباشرة.
  • هيكلة مرنة: صُمّمت الحزم (domain و data و presentation) بحيث تُضاف ميزة النسخ بالذكاء الاصطناعي لاحقًا كوحدة Gradle منفصلة دون إعادة كتابة منطق العمل.

الأثر والنتائج

  • حالة صوتية مستقرة عبر تغييرات الإعدادات، دون تسريبات في MediaRecorder.
  • تحديثات تفاعلية للجدول الزمني عبر Room و Flow، دون إبطال يدوي للواجهة.
  • تخطيط حزم يسمح بإضافة النسخ الصوتي بالذكاء الاصطناعي أو المزامنة السحابية كوحدات ميزات جديدة دون إعادة كتابة معمارية.

التقنيات المستخدمة

Language Kotlin
Architecture MVI / Repository
UI Framework Jetpack Compose
Media SDK MediaRecorder / MediaPlayer
DI Framework Koin
Persistence Room DB