نظام الإشعارات في التطبيق مصمم لإبقاء المستخدم على اطلاع بحالة NFC ومستوى الأمان في الوقت الفعلي. يتكون النظام من عدة مكونات تعمل معاً بشكل متكامل.
الدور: إدارة إنشاء وتحديث وإلغاء الإشعارات
القنوات (Channels):
// قناة حالة NFC - أولوية منخفضة
NFC_STATUS_CHANNEL_ID = "nfc_status_channel"
IMPORTANCE_LOW // لا تصدر صوت أو اهتزاز
// قناة تنبيهات الأمان - أولوية عالية
SECURITY_ALERT_CHANNEL_ID = "security_alert_channel"
IMPORTANCE_HIGH // تصدر صوت واهتزازالوظائف الرئيسية:
// إنشاء إشعار حالة NFC
fun createNfcStatusNotification(
isEnabled: Boolean,
enabledDuration: Long,
securityLevel: SecurityLevel
): Notification
// تحديث إشعار الحالة
fun updateNfcStatusNotification(
isEnabled: Boolean,
enabledDuration: Long,
securityLevel: SecurityLevel
)
// إلغاء إشعار الحالة
fun cancelNfcStatusNotification()
// إنشاء إشعار تنبيه أمان
fun createSecurityAlertNotification(
title: String,
message: String,
priority: Int = NotificationCompat.PRIORITY_HIGH
): Notificationالدور: مراقبة حالة NFC بشكل مستمر في الخلفية
دورة الحياة:
START → onStartCommand() → startNfcMonitoring() → startPeriodicMonitoring()
↓
Monitor NFC State (every 5 seconds)
↓
updateNfcStatusNotification()
↓
STOP → onDestroy() → stopNfcMonitoring()
الوظائف الرئيسية:
// بدء المراقبة
private fun startNfcMonitoring()
// إيقاف المراقبة
private fun stopNfcMonitoring()
// المراقبة الدورية
private fun startPeriodicMonitoring()
// تحديث الإشعار
private fun updateNfcStatusNotification()
// حساب مستوى الأمان الحالي
private fun calculateCurrentSecurityLevel(): SecurityLevelالفاصل الزمني للمراقبة:
MONITORING_CHECK_INTERVAL = 5000L // 5 ثوانٍالدور: حساب وإدارة درجة الأمان
الوظائف:
// حساب درجة الأمان
fun calculateSecurityScore()
// تحديث درجة الأمان
fun refreshSecurityScore()
// الحصول على درجة الأمان لفترة محددة
fun getSecurityScoreForPeriod(days: Int)الدور: حساب درجة الأمان بناءً على الأحداث
منطق الحساب:
fun calculateSecurityScore(events: List<NFCEventEntity>): SecurityScore {
var score = 100 // البداية من 100
// خصم نقاط بناءً على نوع الحدث:
- NFC_ENABLED_LONG: -15 نقطة
- UNKNOWN_TAG: -10 نقاط
- MULTIPLE_TAGS_RAPID: -20 نقطة
- SUSPICIOUS_ACTIVITY: -25 نقطة
- TAG_DISCOVERED: -2 نقاط
return SecurityScore(
score = maxOf(0, score),
level = determineSecurityLevel(score),
violations = violations,
recommendations = generateRecommendations(violations)
)
}مستويات الأمان:
enum class SecurityLevel {
EXCELLENT // 90-100 (أخضر)
GOOD // 75-89 (أخضر فاتح)
MODERATE // 60-74 (برتقالي)
POOR // 40-59 (برتقالي غامق)
CRITICAL // 0-39 (أحمر)
NOT_APPLICABLE // N/A (رمادي)
}MainActivity.onCreate()
↓
Check Background Monitoring Setting
↓
If Enabled:
Start NfcMonitoringService
↓
Service creates foreground notification
↓
Start periodic monitoring (every 5 seconds)
User enables NFC in system settings
↓
NfcMonitoringService detects change
↓
nfcEnabledStartTime = System.currentTimeMillis()
↓
updateNfcStatusNotification()
↓
Notification shows:
- "NFC Enabled"
- Duration: "Active for X minutes"
- Security Level: calculated
- Actions: [Disable NFC] [Security Score]
NFC Tag Detected
↓
Log event to database
↓
Event type determined:
- TAG_DISCOVERED
- UNKNOWN_TAG
- MULTIPLE_TAGS_RAPID
- SUSPICIOUS_ACTIVITY
↓
SecurityScoreViewModel recalculates score
↓
updateNfcStatusNotification() with new score
↓
If score drops significantly:
Show security alert notification
User disables NFC
↓
NfcMonitoringService detects change
↓
Calculate total enabled duration
↓
updateNfcStatusNotification()
↓
Notification shows:
- "NFC Disabled"
- Security Level: based on history or N/A
- Actions: [Enable NFC] [Security Score]
User disables background monitoring
↓
stopService(NfcMonitoringService)
↓
stopNfcMonitoring()
↓
cancelNfcStatusNotification()
↓
Service stops
الخصائص:
- النوع: Foreground Service Notification
- الأولوية: LOW
- الصوت: قابل للتخصيص
- الاهتزاز: قابل للتخصيص
- الإجراءات:
- تفعيل/تعطيل NFC
- فتح شاشة Security Score
- فتح التطبيق
المحتوى:
Title: "NFC Manager"
Content:
- If NFC ON: "NFC Enabled - Active for X minutes"
- If NFC OFF: "NFC Disabled - Tap to enable"
Big Text: Security recommendations
Progress: Security score (0-100)
الخصائص:
- النوع: Standard Notification
- الأولوية: HIGH
- الصوت: نعم
- الاهتزاز: نعم
متى يظهر:
- عند اكتشاف نشاط مشبوه
- عند انخفاض درجة الأمان بشكل كبير
- عند اكتشاف علامات غير معروفة متعددة
المحتوى:
Title: "Security Alert"
Content: Description of the issue
Actions: [View Details] [Dismiss]
الخصائص:
- النوع: Standard Notification
- الأولوية: DEFAULT
- التكرار: حسب الإعدادات (5-300 ثانية)
متى يظهر:
- عند تفعيل التذكير التلقائي
- بعد مرور الفترة المحددة مع NFC مفعل
المحتوى:
Title: "NFC Still Enabled"
Content: "NFC has been enabled for X minutes. Consider disabling it."
Actions: [Disable NFC] [Dismiss]
data class NotificationSettings(
val enabled: Boolean = true, // تفعيل/تعطيل الإشعارات
val soundEnabled: Boolean = true, // تفعيل/تعطيل الصوت
val vibrationEnabled: Boolean = true, // تفعيل/تعطيل الاهتزاز
val customSoundUri: String? = null, // نغمة مخصصة
val notificationStyle: String = "standard" // نمط الإشعار
)data class MonitoringSettings(
val backgroundMonitoringEnabled: Boolean = false, // المراقبة في الخلفية
val autoReminderEnabled: Boolean = false, // التذكير التلقائي
val reminderIntervalSeconds: Int = 60 // فترة التذكير
)if (nfcAdapter == null) {
// عرض رسالة: "جهازك لا يدعم NFC"
// إيقاف المراقبة
// إخفاء الإشعارات
}if (!nfcAdapter.isEnabled) {
// تحديث الإشعار: "NFC معطل"
// عرض درجة أمان تاريخية أو N/A
// إيقاف المراقبة النشطة
}try {
// محاولة الوصول لـ NFC
} catch (se: SecurityException) {
// طلب الصلاحيات من المستخدم
// إيقاف الخدمة مؤقتاً
}try {
// عمليات الخدمة
} catch (e: Exception) {
AppLogger.e(TAG, "Service error", e)
// محاولة إعادة التشغيل
// إشعار المستخدم بالخطأ
}التحسينات المطبقة:
- استخدام
PARTIAL_WAKE_LOCKفقط عند الحاجة - فترة مراقبة معقولة (5 ثوانٍ)
- إيقاف المراقبة عند عدم الحاجة
- استخدام
Foreground Serviceلضمان عدم القتل
الاستهلاك المتوقع:
- مع المراقبة: ~2-3% في الساعة
- بدون المراقبة: ~0%
التحسينات المطبقة:
- تنظيف الموارد في
onDestroy() - استخدام
StateFlowبدلاً منLiveData - عدم الاحتفاظ بمراجع غير ضرورية
الاستهلاك المتوقع:
- الخدمة: ~10-15 MB
- الإشعارات: ~2-3 MB
التحسينات المطبقة:
- عمليات خفيفة في الخلفية
- استخدام Coroutines للعمليات غير المتزامنة
- تجنب العمليات الثقيلة في الـ Main Thread
✅ تفعيل المراقبة → يظهر الإشعار
✅ إيقاف المراقبة → يختفي الإشعار
✅ إعادة تشغيل التطبيق → الإشعار يستمر
✅ تفعيل NFC → الإشعار يتحدث
✅ إيقاف NFC → الإشعار يتحدث
✅ التبديل السريع → لا تعطل
✅ علامة واحدة → تسجيل الحدث
✅ علامات متعددة → تسجيل جميع الأحداث
✅ علامات سريعة → كشف النشاط المشبوه
✅ NFC معطل بدون بيانات → N/A
✅ NFC معطل مع بيانات → درجة تاريخية
✅ NFC مفعل → درجة محسوبة
✅ أحداث مشبوهة → انخفاض الدرجة
✅ اختيار نغمة → تحديث النغمة
✅ تعطيل الصوت → لا صوت
✅ تعطيل الاهتزاز → لا اهتزاز
Test: قراءة 100 علامة في دقيقة واحدة
Expected:
- جميع الأحداث مسجلة
- لا تعطل في التطبيق
- الإشعار يتحدث بشكل صحيح
Test: المراقبة لمدة 24 ساعة
Expected:
- الخدمة تستمر في العمل
- لا تسرب في الذاكرة
- استهلاك بطارية معقول
Test: إعادة تشغيل الجهاز مع المراقبة مفعلة
Expected:
- الخدمة تبدأ تلقائياً (إذا كانت الإعدادات تسمح)
- الإشعار يظهر بشكل صحيح
السبب: بعض الشركات المصنعة تقتل الخدمات في الخلفية
الحل:
// استخدام Foreground Service
startForeground(NOTIFICATION_ID, notification)
// طلب استثناء من Battery Optimization
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
intent.data = Uri.parse("package:$packageName")
startActivity(intent)
}السبب: فقدان صلاحية الوصول للملف
الحل:
// محاولة الحصول على صلاحية دائمة
try {
context.contentResolver.takePersistableUriPermission(
uri,
Intent.FLAG_GRANT_READ_URI_PERMISSION
)
} catch (e: SecurityException) {
// استخدام النغمة الافتراضية كـ fallback
}السبب: فترة المراقبة 5 ثوانٍ
الحل:
// تقليل الفترة للحالات الحرجة
if (suspiciousActivityDetected) {
MONITORING_CHECK_INTERVAL = 1000L // ثانية واحدة
}// ✅ صحيح
override fun onDestroy() {
super.onDestroy()
stopNfcMonitoring()
releaseWakeLock()
monitoringJob?.cancel()
}
// ❌ خطأ
override fun onDestroy() {
super.onDestroy()
// عدم تنظيف الموارد
}// ✅ صحيح
try {
updateNfcStatusNotification()
} catch (e: Exception) {
AppLogger.e(TAG, "Error updating notification", e)
// محاولة إعادة المحاولة أو استخدام قيم افتراضية
}
// ❌ خطأ
updateNfcStatusNotification() // قد يتعطل التطبيق// ✅ صحيح
viewModelScope.launch(Dispatchers.IO) {
val events = repository.getEvents()
withContext(Dispatchers.Main) {
updateUI(events)
}
}
// ❌ خطأ
val events = repository.getEvents() // يحجب Main Thread
updateUI(events)نظام الإشعارات في NFC Manager:
- ✅ شامل: يغطي جميع حالات الاستخدام
- ✅ موثوق: معالجة جيدة للأخطاء
- ✅ فعال: استهلاك معقول للموارد
- ✅ قابل للتخصيص: إعدادات مرنة للمستخدم
- ✅ واضح: رسائل مفهومة وتوصيات مفيدة
التحسينات المستقبلية:
- إضافة BroadcastReceiver لحالة NFC
- تحسين خوارزمية حساب الأمان
- إضافة إشعارات ذكية بناءً على السلوك
- دعم Android 14+ notification permissions