diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..0e12c67
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -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
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..32884f7
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -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 }}
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..d93df19
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -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.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..a3ad3d9
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -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.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..03802ec
--- /dev/null
+++ b/LICENSE
@@ -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.
diff --git a/README.md b/README.md
index 887ace3..02a29c6 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,46 @@
+ Open source Android app for blocking unwanted calls. No ads. No tracking. Fully offline. +
+ +--- + +## 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 @@ -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 @@ -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 diff --git a/fastlane/metadata/android/en-US/changelogs/1.txt b/fastlane/metadata/android/en-US/changelogs/1.txt new file mode 100644 index 0000000..f182960 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/1.txt @@ -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 diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt new file mode 100644 index 0000000..da6b84f --- /dev/null +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -0,0 +1,37 @@ +Snub is a privacy-focused call blocking app for Android. Block unwanted calls silently without ads, tracking, or data collection. + +Features: + +Call Blocking +• Prefix-based blocking - block all numbers starting with specific prefixes (country codes, area codes, toll-free spam) +• 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 - blocked calls never ring + +Call Log Integration +• View your complete call history in-app +• Grouped by time - Recent, Last Week, Last Month +• Separate view for blocked call history +• Tap to call back, long-press for options + +Quick Dial +• 3 configurable quick dial slots +• Large iOS-style contact cards +• Tap to call instantly + +Time-Based Profiles +• Schedule blocking for specific times +• Different blocking modes per profile +• Automatic activation based on schedule + +Privacy First +• All data stored locally on device +• No network calls - works completely offline +• No analytics or tracking +• No ads +• No data collection +• Open source + +Requires Android 10 or higher. diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt new file mode 100644 index 0000000..96396de --- /dev/null +++ b/fastlane/metadata/android/en-US/short_description.txt @@ -0,0 +1 @@ +Block unwanted calls silently. No ads, no tracking, fully offline. \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/title.txt b/fastlane/metadata/android/en-US/title.txt new file mode 100644 index 0000000..c21cdd8 --- /dev/null +++ b/fastlane/metadata/android/en-US/title.txt @@ -0,0 +1 @@ +Snub - Call Blocker \ No newline at end of file