Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: Build

on:
push:
branches: [ main ]
pull_request:
branches: [ main ]

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: gradle

- name: Grant execute permission for gradlew
run: chmod +x gradlew

- name: Build with Gradle
run: ./gradlew build

- name: Build Debug APK
run: ./gradlew assembleDebug

- name: Upload Debug APK
uses: actions/upload-artifact@v4
with:
name: snub-debug
path: app/build/outputs/apk/debug/app-debug.apk
39 changes: 39 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: Release

on:
push:
tags:
- 'v*'

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: gradle

- name: Grant execute permission for gradlew
run: chmod +x gradlew

- name: Build APK
run: ./gradlew assembleDebug

- name: Rename APK
run: |
VERSION=${GITHUB_REF#refs/tags/v}
mv app/build/outputs/apk/debug/app-debug.apk snub-${VERSION}.apk

- name: Create Release
uses: softprops/action-gh-release@v1
with:
files: snub-*.apk
generate_release_notes: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
45 changes: 45 additions & 0 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment:

* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior:

* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information without their explicit permission
* Other conduct which could reasonably be considered inappropriate

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the project maintainers. All complaints will be reviewed and
investigated promptly and fairly.

Project maintainers have the right and responsibility to remove, edit, or reject
comments, commits, code, issues, and other contributions that are not aligned
with this Code of Conduct.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org),
version 2.0.
119 changes: 119 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
# Contributing to Snub

Thank you for your interest in contributing to Snub! This document provides guidelines for contributing to the project.

## Getting Started

### Prerequisites

- Android Studio (latest stable version recommended)
- JDK 17 or higher
- Android SDK with API 35
- An Android device or emulator running Android 10 (API 29) or higher

### Setting Up the Development Environment

1. Fork the repository on GitHub
2. Clone your fork:
```bash
git clone https://github.com/YOUR_USERNAME/Snub.git
cd Snub
```
3. Open the project in Android Studio
4. Let Gradle sync complete
5. Build and run on your device/emulator

## How to Contribute

### Reporting Bugs

If you find a bug, please open an issue with:
- A clear, descriptive title
- Steps to reproduce the issue
- Expected behavior vs actual behavior
- Device info (manufacturer, model, Android version)
- Screenshots if applicable

### Suggesting Features

Feature requests are welcome! Please open an issue with:
- A clear description of the feature
- Why this feature would be useful
- Any implementation ideas you have

### Submitting Code Changes

1. **Create a branch** for your changes:
```bash
git checkout -b feature/your-feature-name
# or
git checkout -b fix/issue-description
```

2. **Make your changes** following the code style guidelines below

3. **Test your changes** thoroughly:
- Run the app on a real device if possible
- Test on different Android versions (10-15)
- Ensure call blocking still works correctly

4. **Commit your changes** with clear commit messages:
```bash
git commit -m "Add feature: description of what you added"
```

5. **Push to your fork** and create a Pull Request

### Pull Request Guidelines

- Keep PRs focused on a single feature or fix
- Update documentation if needed
- Add screenshots for UI changes
- Ensure the app builds without errors
- Describe what your PR does and why

## Code Style Guidelines

### Kotlin

- Follow [Kotlin coding conventions](https://kotlinlang.org/docs/coding-conventions.html)
- Use meaningful variable and function names
- Keep functions small and focused
- Use Kotlin idioms (null safety, extension functions, etc.)

### Architecture

This project follows MVVM architecture:
- **UI Layer**: Jetpack Compose screens and ViewModels
- **Domain Layer**: Use cases for business logic
- **Data Layer**: Repositories and Room database

When adding new features:
- Put UI components in `ui/screens/` or `ui/components/`
- Put ViewModels in `ui/viewmodel/`
- Put database entities in `data/database/`
- Put repositories in `data/repository/`

### Compose

- Follow [Compose guidelines](https://developer.android.com/develop/ui/compose/documentation)
- Use Material 3 components
- Keep composables small and reusable
- Use proper state hoisting

## Testing

While the project doesn't have extensive tests yet, we encourage:
- Manual testing on real devices
- Testing on multiple Android versions
- Testing with different permission states

## Questions?

If you have questions, feel free to:
- Open an issue for discussion
- Comment on existing issues or PRs

## License

By contributing to Snub, you agree that your contributions will be licensed under the MIT License.
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2025 Snub Contributors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
74 changes: 50 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,46 @@
<img src="snub-logo.png" alt="Snub Logo" width="full">
</p>

Android app for blocking unwanted calls. No ads.
<p align="center">
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="License: MIT"></a>
<a href="https://github.com/mebarlew/Snub/releases"><img src="https://img.shields.io/github/v/release/mebarlew/Snub?include_prereleases" alt="GitHub Release"></a>
<a href="https://github.com/mebarlew/Snub/actions"><img src="https://github.com/mebarlew/Snub/actions/workflows/build.yml/badge.svg" alt="Build Status"></a>
<img src="https://img.shields.io/badge/Android-10%2B-green.svg" alt="Android 10+">
</p>

<p align="center">
<b>Open source Android app for blocking unwanted calls. No ads. No tracking. Fully offline.</b>
</p>

---

## Installation

### Option 1: Download APK (Easiest)

1. Go to [Releases](https://github.com/mebarlew/Snub/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

```bash
# 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

Expand Down Expand Up @@ -125,17 +164,6 @@ Uses Android's `CallScreeningService` API to:
| DI | Hilt |
| Async | Kotlin Coroutines |

## Building

1. Clone the repo
2. Open in Android Studio
3. Sync Gradle
4. Build & run

```bash
./gradlew assembleDebug
```

## Limitations

- **Device compatibility** - some Samsung devices or custom Android ROMs may have manufacturer-specific call handling that interferes with CallScreeningService
Expand All @@ -151,18 +179,16 @@ Uses Android's `CallScreeningService` API to:
- No ads
- No data collection

## Contributing

Contributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.

Before contributing, please read our [Code of Conduct](CODE_OF_CONDUCT.md).

## License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

## Status

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

### Recent Updates
- iOS-style floating bottom navigation bar
- Configurable quick dial with 3 contact slots
- Grouped call log (Recent, Last Week, Last Month) with collapsible sections
- Allow repeated calls feature for urgent callers
- Enhanced permissions screen with permission priming
- Improved settings with protection level indicator
- System call log integration with two-tab interface
- Quick prefix suggestions for common spam numbers
- Haptic feedback throughout the app
- Better empty states with call-to-action buttons
8 changes: 8 additions & 0 deletions fastlane/metadata/android/en-US/changelogs/1.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Initial release:
• Prefix-based call blocking
• Block All Mode and Block Unknown Callers
• Time-based blocking profiles
• Quick dial with 3 contact slots
• System call log integration
• Material 3 design with dark/light theme
• Haptic feedback throughout the app
Loading
Loading