Block Calls, Not Connections.
A modern, open-source Android app that gives you back your focus by intelligently filtering incoming calls based on your rules.
Ever been in a focused work session, an important meeting, or a critical moment in a game, only to have an unwanted call interrupt you? Worse, on many networks, that incoming call can momentarily kill your phone's mobile data connection, disrupting your flow entirely.
Dend was engineered as a robust solution to this exact problem. It's a lightweight, private, and powerful firewall for your calls, ensuring that only the people you trust can make your phone ring at critical times.
This project showcases a production-ready application built with modern, best-practice Android architecture.
-
Three-Mode Firewall:
- Firewall On: Instantly and silently rejects any number on your personal blacklist.
- Zen Mode: Rejects all calls except those on your trusted whitelist. Perfect for zero-distraction focus sessions.
- Firewall Off: Allows all calls through as normal.
-
Intelligent Rules Management:
- Persistent Blacklist & Whitelist: Your rules are saved securely on your device in a Room database, surviving app restarts.
- Easy Creation of Rules: Rules can be easily added using any of the following
- A custom call logs screen built with Jetpack Compose
- The user's contacts from their preferred Contact application
- Manually entering the phone number and an optional name
- "Promote & Demote" Logic: A number can only exist on one list. Adding a number to the whitelist automatically removes it from the blacklist (and vice-versa), ensuring predictable behavior.
- Forgiving "Undo" Action: Accidentally removed a rule? A
Snackbarwith an "Undo" action provides a safety net, powered by a persistentisPendingDeletionflag in the database to handle app closures gracefully.
-
State-Aware Activity Log:
- Proof & Transparency: View a chronological history of every call the app has blocked, complete with timestamps and the mode it was blocked in.
- Contextual Headers: The log is beautifully organized with "Today," "Yesterday," and date-based
stickyHeaders for effortless scanning. - Smart Actions: Each log item features a dynamic set of quick actions. "Allow" a number (add to whitelist), "Call Back," or "Add Contact." Actions are intelligently hidden if they are not relevant (e.g., "Add Contact" is hidden if the number is already in your device contacts).
-
Robust & Resilient Call Screening:
- System-Level Integration: Built with
CallScreeningServiceto intercept calls before they ring. - High-Reliability Architecture: Engineered for efficiency by elevating process priority with a
ForegroundServiceduring the critical call-rejection window. - Intelligent Number Normalization: Uses Google's
libphonenumberto parse and normalize numbers to the E.164 standard, correctly handling local and international formats to ensure rules are matched reliably.
- System-Level Integration: Built with
-
Modern & Decoupled Architecture:
- 100% Kotlin & Jetpack Compose: A fully declarative UI built for performance and state-driven rendering.
- Declarative Navigation 3: Leverages the latest Jetpack Navigation 3 for a state-based navigation model with
BottomSheetandNavigationBar.- State-Managed Back Stack: Replaces complex internal managers with a developer-owned
Listof states orSnapshotStateList, making deep-linking and state restoration seamless. - Type-Safe Routing: Uses serializable Kotlin objects instead of string-based routes, ensuring compile-time safety across the entire navigation graph.
- Adaptive Layouts: Built-in support for "Scenes," enabling easy transitions between single-pane and multi-pane (list-detail) layouts.
- State-Managed Back Stack: Replaces complex internal managers with a developer-owned
- Clean MVVM & UDF: Follows modern MVVM principles with Unidirectional Data Flow using
Flow,StateFlow, andChannel/SharedFlow. - Centralized Event Bus: A generic
UiEventBusdecouples ViewModels from the UI, allowing any feature to request aSnackbaror other global UI action without direct dependencies. - Dependency Injection: Uses Koin for a lightweight and maintainable dependency graph.
-
Private by Design: All rule processing and call logging happens entirely on your device. Your contacts, rules, and call patterns never leave your phone.
Coming soon... The UI is being polished to perfection!
- Download the latest APK from the Releases Page.
- Install the app on your Android device (Android 10/Q or higher).
- Crucial Step: On first launch, the app will guide you to set Dend as the default "Caller ID & spam app". This permission is required by Android for the app to screen and manage incoming calls.
- Start building your firewall rules and enjoy the silence!
This project is an active exploration of modern Android development.
- Custom Firewall Rules: Block calls based on patterns (e.g., hidden numbers which is automatically blocked for now, international numbers).
- Automated SMS Replies: Optionally send a configurable, automatic text message when a call is blocked.
- Onboarding Flow: A guided setup experience for new users.
- Intelligent Spam Database Integration: (Future) Optionally sync with a known spam number database.
This is an open-source project built for learning and solving a real-world problem. Contributions, feature ideas, and pull requests are welcome and greatly appreciated! Please see CONTRIBUTING.md for more details.
This project is licensed under the Apache License 2.0. See the LICENSE file for details.
