Skip to content

Latest commit

ย 

History

History
537 lines (439 loc) ยท 19.3 KB

File metadata and controls

537 lines (439 loc) ยท 19.3 KB

๐Ÿ—๏ธ Architecture Documentation - NFC Manager

Last Updated: October 17, 2025
Version: 1.0.0
Status: Production Ready โœ…
Release Date: October 17, 2025

This document provides a comprehensive overview of the NFC Manager application architecture, design patterns, technical decisions, and recent optimizations.

๐Ÿ—๏ธ Architecture Overview

NFC Manager follows Clean Architecture principles with MVVM (Model-View-ViewModel) pattern, ensuring separation of concerns, testability, and maintainability.

High-Level Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    Presentation Layer                       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Jetpack Compose UI โ”‚ ViewModels โ”‚ Navigation โ”‚ Theming    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                      โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    Business Logic Layer                     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚   Repository Pattern โ”‚ Use Cases โ”‚ Domain Models โ”‚ Utils   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                      โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      Data Layer                             โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Room Database โ”‚ Local Storage โ”‚ NFC APIs โ”‚ Android System โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐ŸŽฏ Design Principles

1. Single Responsibility Principle

Each class has a single, well-defined responsibility:

  • ViewModels: Manage UI state and handle user interactions
  • Repositories: Abstract data access and provide clean APIs
  • DAOs: Handle database operations
  • Services: Manage background operations

2. Dependency Inversion

High-level modules don't depend on low-level modules. Both depend on abstractions:

  • ViewModels depend on Repository interfaces
  • Repositories depend on DAO interfaces
  • Concrete implementations are injected via Hilt

3. Open/Closed Principle

Classes are open for extension but closed for modification:

  • Repository pattern allows easy data source switching
  • Strategy pattern for different notification types
  • Plugin architecture for future extensions

๐Ÿ“ฑ Application Architecture

Project Structure

com.dxbmark.nfcmanager/
โ”œโ”€โ”€ ๐Ÿ“Š data/                           # Data Layer
โ”‚   โ”œโ”€โ”€ ๐Ÿ—„๏ธ database/                   # Local Database
โ”‚   โ”‚   โ”œโ”€โ”€ entities/                  # Room Entities
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ NFCEventEntity.kt      # Event data model
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ NFCSettingsEntity.kt   # Settings data model
โ”‚   โ”‚   โ”œโ”€โ”€ dao/                       # Data Access Objects
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ NFCEventDao.kt         # Event operations
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ NFCSettingsDao.kt      # Settings operations
โ”‚   โ”‚   โ””โ”€โ”€ AppDatabase.kt             # Database configuration
โ”‚   โ””โ”€โ”€ ๐Ÿ›๏ธ repository/                 # Repository Pattern
โ”‚       โ””โ”€โ”€ NFCRepository.kt           # Data access abstraction
โ”œโ”€โ”€ โš™๏ธ services/                       # Background Services
โ”‚   โ””โ”€โ”€ NfcMonitoringService.kt       # Background NFC monitoring
โ”œโ”€โ”€ ๐ŸŽจ ui/                            # Presentation Layer
โ”‚   โ”œโ”€โ”€ components/                   # Reusable UI components
โ”‚   โ”‚   โ””โ”€โ”€ NFCManagerNavigation.kt   # Navigation setup
โ”‚   โ”œโ”€โ”€ screens/                      # Screen composables
โ”‚   โ”‚   โ”œโ”€โ”€ HomeScreen.kt             # Main NFC status screen
โ”‚   โ”‚   โ”œโ”€โ”€ ActivityScreen.kt         # Event history screen
โ”‚   โ”‚   โ”œโ”€โ”€ SettingsScreen.kt         # Configuration screen
โ”‚   โ”‚   โ””โ”€โ”€ NotificationSoundSettingsScreen.kt # Sound settings
โ”‚   โ””โ”€โ”€ theme/                        # Design system
โ”‚       โ”œโ”€โ”€ Color.kt                  # Nothing OS color palette
โ”‚       โ”œโ”€โ”€ Typography.kt             # Text styles
โ”‚       โ””โ”€โ”€ Theme.kt                  # Material 3 theming
โ”œโ”€โ”€ ๐Ÿง  viewmodel/                     # MVVM ViewModels
โ”‚   โ”œโ”€โ”€ MainViewModel.kt              # Home screen logic
โ”‚   โ”œโ”€โ”€ ActivityViewModel.kt          # Activity screen logic
โ”‚   โ””โ”€โ”€ SettingsViewModel.kt          # Settings screen logic
โ”œโ”€โ”€ ๐Ÿ”ง utils/                         # Utility Classes
โ”‚   โ””โ”€โ”€ NFCUtils.kt                   # NFC helper functions
โ”œโ”€โ”€ ๐Ÿ’‰ di/                            # Dependency Injection
โ”‚   โ””โ”€โ”€ DatabaseModule.kt             # Hilt modules
โ”œโ”€โ”€ ๐Ÿ“ฑ MainActivity.kt                # Main activity
โ””โ”€โ”€ ๐Ÿš€ NfcManagerApplication.kt       # Application class

๐Ÿ”„ Data Flow Architecture

Unidirectional Data Flow

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    User Actions    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   UI Layer  โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚  ViewModel   โ”‚
โ”‚ (Compose)   โ”‚                     โ”‚              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
       โ–ฒ                                     โ”‚
       โ”‚                                     โ”‚ Repository
       โ”‚ State Updates                       โ”‚ Calls
       โ”‚                                     โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ StateFlow   โ”‚                     โ”‚ Repository   โ”‚
โ”‚   State     โ”‚                     โ”‚              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                             โ”‚
                                             โ”‚ Database
                                             โ”‚ Operations
                                             โ–ผ
                                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                                    โ”‚ Room Databaseโ”‚
                                    โ”‚   (Local)    โ”‚
                                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Data Flow Process

  1. User Interaction: User interacts with UI (button click, setting change)
  2. Action Dispatch: UI calls ViewModel function
  3. Business Logic: ViewModel processes action and calls Repository
  4. Data Operation: Repository performs database operation via DAO
  5. State Update: Repository returns result, ViewModel updates state
  6. UI Recomposition: Compose observes state changes and recomposes UI

๐Ÿ”ง Dependency Injection

Hilt Architecture

NFC Manager uses Hilt for dependency injection, providing:

  • Compile-time Safety: Dependency graph validation
  • Lifecycle Integration: Android component lifecycle management
  • Scoping: Proper dependency scoping
  • Testing Support: Easy mocking for tests
@Module
@InstallIn(SingletonComponent::class)
object DatabaseModule {
    
    @Provides
    @Singleton
    fun provideAppDatabase(
        @ApplicationContext context: Context
    ): AppDatabase {
        return Room.databaseBuilder(
            context,
            AppDatabase::class.java,
            "nfc_manager_database"
        ).build()
    }
    
    @Provides
    fun provideNfcEventDao(database: AppDatabase): NFCEventDao =
        database.nfcEventDao()
}

๐ŸŽจ UI Architecture

Nothing OS Design System

Color System

Implementing Nothing OS color palette:

  • Primary Colors: Nothing Red (#EF4444)
  • Background Colors: Pure Black/White
  • Surface Colors: Elevated surfaces with proper contrast
  • Semantic Colors: Error, warning, success states
object NothingColors {
    val NothingRed = Color(0xFFEF4444)
    val PureBlack = Color(0xFF000000)
    val PureWhite = Color(0xFFFFFFFF)
    val DarkSurface = Color(0xFF1F2937)
    val DarkElevated = Color(0xFF1C1C1C)
}

Typography System

Nothing OS inspired typography:

  • Font Family: Nothing Font with system fallbacks
  • Text Hierarchy: Clear information hierarchy
  • Accessibility: WCAG 2.1 AA compliant sizing
  • Responsive: Adapts to system font scaling

State Management

StateFlow Pattern

Using StateFlow for reactive state management:

  • Thread Safety: Concurrent access safety
  • Lifecycle Awareness: Automatic subscription management
  • Performance: Efficient state updates
  • Debugging: Clear state flow tracking
// ViewModel state management
private val _uiState = MutableStateFlow(MainUiState())
val uiState: StateFlow<MainUiState> = _uiState.asStateFlow()

// UI state observation
@Composable
fun HomeScreen(viewModel: MainViewModel) {
    val uiState by viewModel.uiState.collectAsState()
    HomeContent(uiState = uiState)
}

โš™๏ธ Background Services Architecture

NFC Monitoring Service

Service Design

Foreground service for continuous NFC monitoring:

  • Lifecycle Management: Proper service lifecycle handling
  • Notification System: Persistent notification with status updates
  • Error Recovery: Robust error handling and recovery
  • Battery Optimization: Efficient monitoring with minimal battery impact
@AndroidEntryPoint
class NfcMonitoringService : Service() {
    
    @Inject
    lateinit var nfcRepository: NFCRepository
    
    private val serviceJob = SupervisorJob()
    private val serviceScope = CoroutineScope(Dispatchers.Main + serviceJob)
    
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        when (intent?.action) {
            ACTION_START_MONITORING -> startNfcMonitoring()
            ACTION_STOP_MONITORING -> {
                stopNfcMonitoring()
                stopSelf()
            }
        }
        return START_STICKY
    }
}

Service Communication

Communication between service and UI:

  • Intent Actions: Control service operations
  • Repository Pattern: Shared data access
  • Notification Updates: Dynamic status updates
  • State Synchronization: Keep UI and service in sync

๐Ÿ—„๏ธ Database Architecture

Schema Design

Entity Relationships

Well-designed database schema:

  • NFCEventEntity: Event logging with timestamps
  • NFCSettingsEntity: User preferences and configuration
  • Type Converters: Handle complex data types
  • Indexing: Optimized query performance
@Entity(tableName = "nfc_events")
data class NFCEventEntity(
    @PrimaryKey(autoGenerate = true)
    val id: Long = 0,
    val timestamp: Date,
    val eventType: String,
    val message: String,
    val icon: String,
    val tagId: String? = null,
    val isImportant: Boolean = false
)

Query Optimization

Efficient database queries:

  • Indexed Columns: Optimize frequent queries
  • Pagination: Handle large datasets
  • Reactive Queries: Flow-based data streams
  • Cleanup Strategies: Automatic old data cleanup
@Query("""
    SELECT * FROM nfc_events 
    WHERE DATE(timestamp) = DATE('now') 
    ORDER BY timestamp DESC 
    LIMIT 15
""")
fun getTodayEvents(): Flow<List<NFCEventEntity>>

๐Ÿ”’ Security Architecture

Data Protection

Local Storage Security

Comprehensive data protection:

  • Encrypted Preferences: Sensitive settings encrypted
  • Database Security: Room database with security measures
  • Memory Protection: Clear sensitive data from memory
  • File System: Secure file storage practices
private val encryptedPrefs = EncryptedSharedPreferences.create(
    "secure_prefs",
    MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
    context,
    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)

Privacy Protection

Privacy-first architecture:

  • Local-Only Data: No external data transmission
  • Minimal Permissions: Only essential permissions
  • Privacy-Focused Logging: No sensitive data logging
  • User Control: Complete user control over data

Code Protection

Release Security

Protection for release builds:

  • ProGuard Obfuscation: Code obfuscation and minification
  • Certificate Pinning: Secure communication (when needed)
  • Anti-Tampering: Basic tamper detection
  • Secure Build: Secure build pipeline

๐Ÿงช Testing Architecture

Testing Strategy

Test Pyramid

Comprehensive testing approach:

  • Unit Tests: Individual component testing
  • Integration Tests: Component interaction testing
  • UI Tests: End-to-end user flow testing
  • Manual Tests: Device-specific testing
// Unit test example
@Test
fun `logEvent should insert event and return valid ID`() = runTest {
    // Given
    val eventType = "TEST_EVENT"
    val message = "Test message"
    val expectedId = 123L
    
    coEvery { nfcEventDao.insertEvent(any()) } returns expectedId
    
    // When
    val result = repository.logEvent(eventType, message, "TestIcon")
    
    // Then
    assertEquals(expectedId, result)
}

๐Ÿ“Š Performance Architecture

Performance Optimization

Memory Management

Efficient memory usage:

  • Lifecycle Awareness: Proper component lifecycle management
  • Resource Cleanup: Automatic resource cleanup
  • Memory Leaks: Prevention and detection
  • Garbage Collection: Efficient object lifecycle

Battery Optimization

Battery-conscious design:

  • Smart Monitoring: Efficient NFC status checking
  • Background Limits: Respect Android background limits
  • Doze Mode: Handle Android Doze mode
  • Battery Statistics: Monitor battery impact

Database Performance

Optimized database operations:

  • Query Optimization: Efficient SQL queries
  • Indexing: Strategic database indexing
  • Pagination: Handle large datasets efficiently
  • Caching: Intelligent data caching strategies

๐Ÿš€ Deployment Architecture

Build System

Gradle Configuration

Optimized build system:

  • Build Variants: Debug, release, and beta variants
  • Flavor Dimensions: Feature flags and configurations
  • Build Optimization: Parallel builds and caching
  • Dependency Management: Version catalogs and updates
android {
    buildTypes {
        debug {
            isMinifyEnabled = false
            applicationIdSuffix = ".debug"
        }
        release {
            isMinifyEnabled = true
            proguardFiles(
                getDefaultProguardFile("proguard-android.txt"),
                "proguard-rules.pro"
            )
        }
    }
}

Distribution Strategy

Multi-channel distribution:

  • Google Play Store: Primary distribution channel
  • F-Droid: Open-source distribution
  • Direct APK: Direct download option
  • Beta Testing: Internal testing distribution

๐Ÿ“‹ Architecture Decisions

Technology Choices

Why Kotlin?

  • Official Language: Google's preferred Android language
  • Type Safety: Compile-time error detection
  • Conciseness: Reduced boilerplate code
  • Interoperability: Java library compatibility
  • Coroutines: Built-in concurrency support

Why Jetpack Compose?

  • Modern UI: Declarative UI framework
  • Performance: Efficient rendering and recomposition
  • Accessibility: Built-in accessibility features
  • Theming: Comprehensive theming system
  • Future-Proof: Google's UI framework direction

Why Room Database?

  • Type Safety: Compile-time SQL verification
  • Performance: Optimized for Android
  • Reactive: Flow-based reactive queries
  • Migration: Built-in schema migration support
  • Testing: Easy database testing

Why MVVM?

  • Separation of Concerns: Clear architectural boundaries
  • Testability: Easy unit testing
  • Lifecycle Awareness: Android lifecycle integration
  • Data Binding: Automatic UI updates
  • Maintainability: Clean code organization

Design Decisions

Single Activity Architecture

  • Navigation: Simplified navigation management
  • Performance: Reduced activity overhead
  • State Management: Easier state preservation
  • Deep Linking: Simplified deep link handling

Repository Pattern

  • Data Abstraction: Hide data source implementation
  • Testing: Easy data layer mocking
  • Caching: Centralized caching strategy
  • Error Handling: Consistent error management

StateFlow vs LiveData

  • Coroutines Integration: Better coroutine support
  • Type Safety: Compile-time type checking
  • Performance: More efficient state updates
  • Testing: Easier testing with coroutines

๐Ÿ”ฎ Future Architecture Plans

Planned Improvements

Modularization

  • Feature Modules: Split features into modules
  • Dynamic Delivery: On-demand feature delivery
  • Build Performance: Faster build times
  • Team Scalability: Better team collaboration

Cross-Platform

  • Kotlin Multiplatform: Shared business logic
  • Compose Multiplatform: Shared UI components
  • iOS Support: Native iOS implementation
  • Desktop Support: Desktop application version

Advanced Features

  • Machine Learning: NFC pattern recognition
  • Cloud Sync: Optional cloud synchronization
  • Plugin System: Third-party extensions
  • Advanced Analytics: Enhanced user insights

Technology Evolution

Upcoming Android Features

  • Material You: Dynamic color theming
  • Privacy Sandbox: Enhanced privacy features
  • Performance Improvements: Latest Android optimizations
  • New APIs: Leverage new Android capabilities

Framework Updates

  • Compose Updates: Latest Compose features
  • Kotlin Updates: New Kotlin language features
  • Room Improvements: Database enhancements
  • Hilt Evolution: DI framework improvements

๐Ÿ“ž Architecture Questions

For questions about architecture decisions or technical implementation:

  • Email: support@dxbmark.com
  • Subject: "Architecture - NFC Manager"
  • GitHub Discussions: Technical architecture discussions

Built with โค๏ธ by Tariq Said - Nothing OS Inspired Design

Technical Support & Contact: support@dxbmark.com


Licensed under the Apache License, Version 2.0
Copyright 2025 Tariq Said. All rights reserved.