Introduces a new Settings screen with language picker, contact/feedback button, and logout functionality. All UI strings now use centralized string resources with translations for English, Chinese, Spanish, Hindi, Arabic, Portuguese, Bengali, Russian, Japanese, French, German, Korean, Italian, Turkish, Vietnamese, Polish, Ukrainian, Dutch, Thai, and Indonesian. Uses AppCompatDelegate for runtime locale switching without app restart. Also adds CLAUDE.md for Claude Code guidance.
2.7 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Build Commands
# Build debug APK
./gradlew assembleDebug
# Build release APK (with ProGuard/R8 minification)
./gradlew assembleRelease
# Run unit tests
./gradlew test
# Run instrumented tests (requires emulator/device)
./gradlew connectedAndroidTest
# Clean build
./gradlew clean
APK outputs: app/build/outputs/apk/
Project Configuration
- SDK: Compile/Target 34, Min 26
- JDK: 17
- Kotlin: 1.9.22
- Package:
com.fastmask
Architecture
Clean Architecture with MVVM pattern. Three distinct layers:
Data Layer (data/)
api/- JMAP protocol integration (Fastmail's native API)JmapApi.kt- API client with session cachingJmapService.kt- Retrofit service interfaceJmapModels.kt- Kotlinx Serialization models
local/- PersistenceTokenStorage.kt- EncryptedSharedPreferences (lazy-initialized for Hilt compatibility)SettingsDataStore.kt- DataStore for language preferences
repository/- Repository implementations
Domain Layer (domain/)
model/- Domain models (MaskedEmail,Language,EmailStateenum)repository/- Abstract interfacesusecase/- Business logic (Login, Logout, CRUD for masked emails, language settings)
UI Layer (ui/)
auth/,list/,create/,detail/,settings/- Feature screens with ViewModelscomponents/- Reusable composables (MaskedEmailCard, ShimmerEffect, ErrorMessage)navigation/- Jetpack Navigation with shared element transitionstheme/- Material 3 theming with dynamic colors
Key Patterns
State Management: StateFlow<UiState> for reactive state, SharedFlow<Event> for one-time events (navigation, logout)
Dependency Injection: Hilt with NetworkModule (Retrofit, OkHttp, Json) and RepositoryModule (repository bindings)
API Protocol: JMAP (JSON Mail Access Protocol) with Bearer token auth. Session (accountId, apiUrl) is cached after first call.
Security: Tokens stored in EncryptedSharedPreferences using Android Security Crypto library. TokenStorage uses lazy initialization to prevent Hilt injection issues.
Localization
20 languages supported. String resources in res/values-*/strings.xml. In-app language override uses AppCompatDelegate for runtime switching without restart.
ProGuard/R8
Release builds use minification. Key rules in app/proguard-rules.pro:
- Keep Kotlinx Serialization and JMAP models
- Keep Google Tink classes (security-crypto dependency)
- Retrofit and OkHttp configurations
Commit Message Format
Add: new feature descriptionFix: bug descriptionUpdate: what was changedRefactor: what was refactored