Firebase Integration Plan: User Authentication & Tournament Features
Project: ArcheryApprentice Tournament Platform Target: Firebase Authentication + Real-time Tournaments Timeline: 6-8 weeks Priority: Preserve offline functionality while adding multiplayer features
Executive Summary
ArcheryApprentice has exceptional Firebase integration readiness. The existing multi-participant tournament architecture, offline-first design, and clean separation patterns make this integration straightforward with minimal breaking changes.
Key Findings
✅ SessionParticipant model already designed for NetworkUser ✅ Multi-participant tournament features fully implemented ✅ Offline-first Room database with robust migration system ✅ Repository pattern ready for hybrid data sources ✅ Real-time UI components with StateFlow already built
Integration Approach
- Phase 1: User Authentication (2 weeks)
- Phase 2: Tournament Discovery & Creation (2 weeks)
- Phase 3: Real-time Tournament Sync (2-3 weeks) ✅ REPOSITORY LAYER COMPLETE
- Phase 4: Performance & Polish (1 week)
External Firebase Setup Requirements
1. Firebase Project Creation
# Required Firebase Services:
- Authentication (Email/Password, Google Sign-in)
- Firestore Database (for tournaments)
- Cloud Functions (for tournament logic)
- Firebase Hosting (optional: tournament web portal)2. Firebase Console Configuration
Authentication Setup:
- Enable Email/Password authentication
- Enable Google Sign-in provider
- Configure OAuth consent screen
- Set up security rules for user data
Firestore Database:
- Create database in production mode
- Configure security rules for tournaments
- Set up composite indexes for queries
- Enable offline persistence
Project Settings:
- Add Android app with package name
- Download
google-services.json - Configure SHA-1 fingerprints for Google Sign-in
3. Required External Dependencies
// Add to app/build.gradle.kts
implementation(platform("com.google.firebase:firebase-bom:32.7.0"))
implementation("com.google.firebase:firebase-auth-ktx")
implementation("com.google.firebase:firebase-firestore-ktx")
implementation("com.google.firebase:firebase-analytics-ktx")
implementation("com.google.android.gms:play-services-auth:20.7.0")
// Existing dependencies that work well with Firebase:
// - Room (for offline persistence) ✓
// - Kotlin Coroutines (for async Firebase operations) ✓
// - Jetpack Compose (for reactive authentication UI) ✓Phase 1: User Authentication Integration (2 weeks)
Current Authentication Foundation
Existing Assets:
// SessionParticipant.kt - Already designed for network users!
sealed class SessionParticipant {
abstract val id: String
abstract val displayName: String
data class LocalUser(override val id: String, override val displayName: String)
data class GuestArcher(override val id: String, override val displayName: String)
data class NetworkUser(override val id: String, override val displayName: String) // PERFECT!
}
// Settings.kt - Ready for user preferences
@Entity(tableName = "settings")
data class Settings(
val id: Int = 1,
val userName: String = "", // Ready for Firebase user display name
// ... existing settings
)Authentication Implementation Plan
Step 1: Extend SessionParticipant (Week 1, Day 1-2) Step 2: Create Authentication Service (Week 1, Day 3-4) Step 3: Create Authentication UI (Week 1, Day 5 - Week 2, Day 2) Step 4: Integration with Settings (Week 2, Day 3-4)
Offline Functionality Preservation
// Key principle: Authentication enhances but never blocks offline features
class AuthenticationService {
fun continueOffline(): SessionParticipant {
// Return LocalUser for offline usage
return LocalUser(
id = "local_user",
displayName = settingsRepository.getSettings().userName.ifBlank { "Local User" }
)
}
}Phase 2: Tournament Discovery & Creation (2 weeks)
Current Tournament Foundation
Existing Tournament Assets:
// Round.kt - Already multi-participant ready!
@Entity(tableName = "rounds")
data class Round(
val participants: List<SessionParticipant>? = null, // Ready for Firebase users!
val participantTheme: ParticipantTheme = ParticipantTheme.SINGLE_USER,
val status: RoundStatus = RoundStatus.PLANNED,
val startTime: Long? = null,
val endTime: Long? = null,
val updatedAt: Long = System.currentTimeMillis()
)Tournament Implementation Plan
✅ COMPLETED: Firestore Data Models (Week 3, Day 1-2)
Status: ✅ COMPLETE - All tournament data models implemented
Files Implemented:
- ✅
data/models/Tournament.kt- Main tournament entity with security settings - ✅
data/models/TournamentParticipant.kt- Participant data with progress tracking - ✅
data/models/SecurityModels.kt- GDPR compliance, anti-cheating, privacy settings - ✅
data/models/ArrowScore.kt- Enhanced with tournament integration - ✅
data/models/Round.kt- Extended with tournament fields
✅ COMPLETED: Repository Layer Implementation (Week 3, Day 3-5)
Status: ✅ COMPLETE - Full repository layer with offline-first strategy
Files Implemented:
- ✅
domain/repository/TournamentRepository.kt- Comprehensive interface (93 methods) - ✅
data/repository/impl/FirebaseTournamentRepository.kt- Firestore implementation - ✅
data/repository/impl/OfflineTournamentRepository.kt- Local tournaments - ✅
data/repository/impl/HybridTournamentRepository.kt- Offline-first strategy
Architecture Features:
- Offline-First Strategy: All operations work locally first, sync when online
- Network Monitoring: Automatic sync when network becomes available
- Conflict Resolution: Merge strategies for local vs remote data
- Security Integration: Rate limiting, user permissions, anti-cheating
- Real-time Features: Live leaderboards, tournament statistics, scoring history
Phase 3: Real-time Tournament Sync (2-3 weeks)
Current Real-time Foundation
Existing Real-time Assets:
// LiveScoringViewModel.kt - Real-time scoring already implemented!
class LiveScoringViewModel {
// Real-time participant progress tracking
val participantProgress: StateFlow<Map<ParticipantId, ParticipantProgress>>
val participantCurrentEnd: StateFlow<Map<ParticipantId, Int>>
val aggregateStats: StateFlow<AggregateStats?>
// Live score updates (perfect for Firebase sync!)
fun addArrowScore(participantId: String, score: Int)
fun finalizeEnd(participantId: String)
}Offline Functionality Preservation Strategy
// Key Principle: Tournament features enhance but never block offline usage
class TournamentSyncManager @Inject constructor(
private val connectivityManager: ConnectivityManager,
private val localRepository: RoundRepository,
private val firebaseRepository: TournamentRepository
) {
// Offline tournament mode
fun createOfflineTournament(participants: List<SessionParticipant>): Tournament
// Sync when back online
suspend fun syncOfflineChanges()
}Phase 4: Performance & Polish (1 week)
Performance Optimizations
Firestore Query Optimization:
- Composite index: status + isPublic + createdAt (descending)
- Composite index: createdBy + status + createdAt (descending)
- Pagination for performance (limit 20)
Offline Persistence Configuration:
Firebase.firestore.firestoreSettings = FirebaseFirestoreSettings.Builder()
.setPersistenceEnabled(true)
.setCacheSizeBytes(FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED)
.build()Implementation Timeline & Milestones
Week 1-2: Authentication Foundation
- Firebase project setup and configuration
- Extend SessionParticipant with FirebaseUser
- Implement AuthenticationService with Firebase Auth
- Create login/signup UI screens
- Integrate authentication with existing Settings
Milestone: Users can sign in/out, offline functionality preserved
Week 3-4: Tournament Discovery
- Design Firestore tournament data models ✅ COMPLETED
- Implement TournamentRepository with Firebase ✅ COMPLETED
- Implement OfflineTournamentRepository ✅ COMPLETED
- Implement HybridTournamentRepository ✅ COMPLETED
- Create tournament discovery and creation UI
- Integrate tournament creation with existing Round system ✅ COMPLETED
Milestone: ✅ Repository layer complete - Ready for UI implementation
Week 5-6: Real-time Tournament Sync
- Implement TournamentLiveData models
- Create hybrid sync repository (Firebase + Room)
- Integrate real-time scoring with existing LiveScoringViewModel
- Update UI components for tournament leaderboards
- Implement offline-first sync strategy
Milestone: Real-time tournament scoring with offline support
Week 7: Performance & Polish
- Optimize Firestore queries and indexing
- Implement comprehensive error handling
- Add loading states and user feedback
- Performance testing and optimization
- Documentation and deployment preparation
Milestone: Production-ready tournament platform
Security Considerations
Firebase Security Rules
// Firestore security rules
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Tournament access control
match /tournaments/{tournamentId} {
allow read: if isSignedIn() && (resource.data.isPublic == true || isParticipant(tournamentId));
allow create: if isSignedIn() && isValidTournament();
allow update: if isSignedIn() && isTournamentCreator(tournamentId);
}
// Participant data protection
match /tournaments/{tournamentId}/participants/{participantId} {
allow read: if isSignedIn() && isParticipant(tournamentId);
allow write: if isSignedIn() && request.auth.uid == participantId;
}
}
}Data Privacy
- User display names only (no sensitive personal data)
- Tournament scores are public within tournament context
- Equipment data remains local unless explicitly shared
- Email addresses protected by Firebase Auth
Success Metrics
Technical Metrics
- Authentication success rate >95%
- Tournament join success rate >90%
- Real-time sync latency <2 seconds
- Offline functionality maintained 100%
- App startup time impact <500ms
User Experience Metrics
- Tournament completion rate >70%
- User retention after tournament participation >60%
- Offline-to-online sync success rate >95%
- User satisfaction with tournament features >4.0/5.0
Related Documentation
- Firebase-Setup - Firebase project configuration
- Tournament-Discovery - Tournament discovery implementation
- Tournament-UI-Plan - Complete UI implementation plan
- System-Architecture - Overall system architecture
Conclusion
ArcheryApprentice is exceptionally well-positioned for Firebase integration. The existing multi-participant tournament architecture, offline-first design, and clean separation patterns make this a straightforward implementation with high success probability.
Key Success Factors:
- Leverage existing architecture - Don’t rebuild, enhance
- Preserve offline functionality - Authentication and tournaments enhance but never block offline usage
- Incremental rollout - Phase implementation allows for user feedback
- Offline-first philosophy - Firebase provides multiplayer enhancement while maintaining core offline capability
Last Updated: 2025
Source: docs/firebase/FIREBASE_INTEGRATION_PLAN.md