Smart call filtering with blacklist, whitelist, and regex rules.
Privacy-First Design: This app does NOT collect, transmit, or share any data. Everything stays on your device.
- Zero Internet connections - The app has no network access permission
- Zero tracking - No analytics, telemetry, or profiling
- Zero cloud backups - Data is never synchronized
- Zero ads - Completely free and ad-free
- 100% Open Source - Fully verifiable code
Read the complete Privacy Policy
This project implements an Android application using the official Call Screening API to detect incoming calls and decide whether to allow, silence, or reject them based on customizable rules.
The filtering engine supports:
- Blacklist (specific numbers to block)
- Whitelist (always allowed numbers)
- Regex-based rules for advanced pattern matching
- Contacts-based exceptions (e.g., always allow numbers saved in the address book)
The app is built with a modular, scalable architecture:
- CallScreeningService for call interception
- Rules Engine for decision logic
- Room database for local storage
- Jetpack Compose for a clean and minimal UI
Designed to be minimal, elegant, privacy-focused, and extensible.
- Android SDK (API 29+)
- Gradle 9.2+
- Java 17+
-
Build the APK:
./gradlew assembleDebug
-
Build release APK:
./gradlew assembleRelease
-
Install on device:
./gradlew installDebug
-
Run tests:
./gradlew test
app/
├── src/main/
│ ├── java/com/keyvisions/callscreening/
│ │ ├── data/ # Room database entities and DAOs
│ │ ├── engine/ # Rules evaluation engine
│ │ ├── service/ # CallScreeningService implementation
│ │ └── ui/ # Jetpack Compose UI
│ │ ├── screens/ # UI screens (Rules, Logs, Settings)
│ │ ├── theme/ # Material3 theme
│ │ └── viewmodel/ # ViewModels for state management
│ ├── res/ # Resources (layouts, strings, etc.)
│ └── AndroidManifest.xml # App manifest with permissions
└── build.gradle.kts # App-level Gradle configuration
- Automatically screens incoming calls using custom rules
- Supports multiple rule types: Blacklist, Whitelist, and Regex
- Actions: Allow, Silence, or Reject calls
- Contact integration: Optionally allow all saved contacts
- Add/edit/delete screening rules
- Enable/disable individual rules
- Pattern matching for phone numbers
- Regular expressions for advanced filtering
- Track all screened calls
- View statistics (allowed, silenced, blocked)
- See which rule matched each call
- Clear call history
- Toggle call screening on/off
- Configure default action for unmatched calls
- Enable/disable contact whitelist
- System integration settings
The app requires the following permissions:
READ_PHONE_STATE- Detect incoming callsREAD_CALL_LOG- Access call historyREAD_CONTACTS- Check if caller is in contactsANSWER_PHONE_CALLS- Control call actions
- Open the app
- Go to Settings
- Tap "Set as Default Call Screener"
- Select this app as the default Phone app or Call screening app
- MVVM Pattern: Separation of UI and business logic
- Room Database: Local data persistence
- Kotlin Coroutines: Asynchronous operations
- Jetpack Compose: Modern declarative UI
- Material3: Latest Material Design components
See LICENSE file for details.