MVI Media SDK Community Challenge

EchoJournal

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

EchoJournal Mockup

نظرة عامة

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

التحدي

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

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

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

قمت بتصميم EchoJournal مبدئياً كـ MVP أحادي الوحدة (Single-Module)، يعتمد بشكل كامل على معمارية MVI (Model-View-Intent). ترسل واجهة المستخدم (UI) أوامر مصنفة بصرامة (Intents) للأسفل، لضمان أن آلة الحالة المعقدة (التي تدير عمليات `الإعداد`، `التسجيل`، `الإيقاف المؤقت`، أو `السكون`) لا تفقد تزامنها أبداً مع طبقة العرض (Compose UI).

التعامل مع طبقات الوسائط (Media Layers)

  • الإدارة الآمنة لحزم تطوير البرمجيات (SDK): تم تطبيق نطاقات عمل لـ Coroutines متصلة بمكونات (Lifecycle-Aware). يتم تحرير كائنات `MediaPlayer` و `MediaRecorder` بدقة متناهية لتجنب استنزاف الذاكرة.
  • نظام تدوين تفاعلي (Reactive Journaling): ترتبط آلية تجميع السجل التاريخي برمجياً بالكامل عبر Room و Flow. يمكن للمستخدمين التصفية حسب نصوص 'الموضوع' أو 'المزاج' بشكل طبيعي، حيث تؤدي أي تغييرات في سجلات قاعدة البيانات إلى تحديث واجهة Jetpack Compose فوراً وبسلاسة تامة.
  • هيكلة مرنة: تم تصميم الحزم (`domain`، `data`، `presentation`) بطريقة تتيح نقل ميزات الذكاء الاصطناعي (AI) مستقبلاً إلى وحدات Gradle معزولة دون الحاجة لإعادة كتابة منطق الأعمال الأساسي.

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

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

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

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