Skip to content

mebarlew/Snub

Repository files navigation

Snub

Snub Logo

License: MIT Version 1.0.0 Android 10+ Status: Active

Open source Android app for blocking unwanted calls. No ads. No tracking. Fully offline.


Installation

Option 1: Download APK (Easiest)

  1. Go to Releases
  2. Download the latest snub-x.x.x.apk
  3. Enable "Install from unknown sources" if prompted
  4. Install the APK

Option 2: Build from Source

# Clone the repository
git clone https://github.com/mebarlew/Snub.git
cd Snub

# Build debug APK
./gradlew assembleDebug

# APK will be at: app/build/outputs/apk/debug/app-debug.apk

Option 3: Android Studio

  1. Clone the repository
  2. Open in Android Studio
  3. Click Run or Build > Build Bundle(s) / APK(s) > Build APK(s)

Features

Call Blocking

  • Prefix-based blocking - block all numbers starting with specific prefixes
    • Country codes (e.g., +48 blocks all Poland numbers)
    • Area codes (e.g., 555 blocks specific region)
    • Toll-free spam (e.g., +1-800, +1-888, +1-877)
    • Custom patterns
  • Block All Mode - silence all incoming calls with one tap
  • Block Unknown Callers - only allow calls from your contacts
  • Block International - block calls from outside your country
  • Allow Repeated Calls - let urgent callers through after multiple attempts
  • Silent rejection of calls from your blocklist
  • Blocked call logging with timestamps and block reason

Call Log Integration

  • System call log - view your complete call history in-app
  • Grouped by time - Recent (this week), Last Week, Last Month sections
  • Collapsible sections - tap headers to expand/collapse with smooth animations
  • Blocked calls tab - separate view for blocked call history
  • Different icons for call types (incoming, outgoing, missed, blocked)
  • Tap to call back, long-press for options (SMS, block prefix, copy number)

Quick Dial

  • 3 configurable quick dial slots - large iOS-style contact cards
  • Tap empty slot to pick contact from phonebook
  • Tap contact to call instantly
  • Long-press to remove from quick dial
  • Selections persist across app restarts

Modern UI

  • Material 3 design with dynamic theming
  • Dark/Light theme support
  • iOS-style floating navigation - pill-shaped bottom nav with icons and labels
  • Permission priming - explains why each permission is needed
  • Protection level indicator - see your current protection status
  • Hero headers with gradient backgrounds
  • Tabbed interface (All Calls / Blocked)
  • Swipe-to-delete on list items
  • Bottom sheet with quick prefix suggestions
  • Layered empty states with call-to-action buttons
  • Haptic feedback throughout the app

Screenshots

Calls Screen

Call Log Filter Menu Collapsed Sections Blocked Calls
Calls Filter Collapsed Blocked
Quick dial slots, grouped call log by time period Filter to show/hide blocked calls Collapsible sections with animated arrows Blocked calls shown in red

Quick Dial

Contact Picker
Contact Picker
Search and select contacts for quick dial slots

Blocking Screen

Prefixes Add Prefix Whitelist Add to Whitelist
Prefixes Add Prefix Whitelist Add Whitelist
Manage blocked prefixes Quick add common spam prefixes Numbers always allowed through Add by number or contact

Profiles

Profiles List New Profile
Profiles New Profile
Time-based blocking profiles Configure schedule, days, and blocking mode

Requirements

  • Android 10 (API 29) or higher
  • ~10MB storage

Setup

  1. Install the app
  2. Permissions screen guides you through each permission with clear explanations:
    • Call Screening (required) - enables call blocking
    • Phone State - detect incoming calls
    • Call Log - view call history in-app
    • Contacts - allow calls from people you know
    • Make Calls - call back from the app
  3. Progress indicator shows setup completion
  4. Add prefixes to block, or use quick suggestions for common spam prefixes

How it works

Uses Android's CallScreeningService API to:

  1. Intercept incoming calls before they ring - system checks happen instantly
  2. Check blocking rules - matches against prefixes, Block All mode, Block Unknown, profiles, etc.
  3. Check contacts - if you have Block Unknown enabled, allows contacts through
  4. Check repeated calls - if enabled, allows urgent callers after multiple attempts
  5. Block or allow - responds to Android within 4.5 seconds
  6. Log blocked calls - saves to database for review in Blocked tab

With proper permissions granted:

  • Blocked calls are completely silent - no ringing, no notification
  • The phone never rings for blocked numbers
  • All happens before the call reaches you

If phone rings before blocking:

  • This means Call Screening permission is not properly granted
  • Go to Settings → Permissions and ensure all permissions are enabled
  • The app needs to be set as the default Call Screening app

Tech Stack

Component Technology
Language Kotlin
Min SDK API 29 (Android 10)
Target SDK API 35 (Android 15)
Architecture MVVM
UI Jetpack Compose + Material 3
Database Room (SQLite)
DI Hilt
Async Kotlin Coroutines

Limitations

  • Device compatibility - some Samsung devices or custom Android ROMs may have manufacturer-specific call handling that interferes with CallScreeningService
  • Permissions required - all permissions must be granted for silent blocking to work correctly
  • Android 10+ only - older Android versions don't support CallScreeningService API
  • VoIP calls - only blocks regular phone calls, not WhatsApp/Telegram/etc calls

Privacy

  • All data stored locally on device
  • No network calls - everything works offline
  • No analytics or tracking
  • No ads
  • No data collection

Contributing

Contributions are welcome! Please see CONTRIBUTING.md for guidelines.

Before contributing, please read our Code of Conduct.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Status

Active Development - Core features complete, UI polished, testing in progress

About

Android call blocker app

Resources

Code of conduct

Contributing

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages