From 621f727e59a3db4ea2d46d473bda4d3de6cf67d9 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 30 Dec 2025 15:04:39 +0000 Subject: [PATCH 1/2] Make project open source with easier installation - Add MIT LICENSE file - Add CONTRIBUTING.md with contribution guidelines - Add CODE_OF_CONDUCT.md - Add F-Droid metadata (fastlane format) for app store distribution - Add GitHub Actions workflows for CI builds and releases - Update README with: - Badges (license, release, build status, Android version) - Clear installation options (APK download, build from source, Android Studio) - Contributing and License sections --- .github/workflows/build.yml | 36 ++++++ .github/workflows/release.yml | 39 ++++++ CODE_OF_CONDUCT.md | 45 +++++++ CONTRIBUTING.md | 119 ++++++++++++++++++ LICENSE | 21 ++++ README.md | 74 +++++++---- .../metadata/android/en-US/changelogs/1.txt | 8 ++ .../android/en-US/full_description.txt | 37 ++++++ .../android/en-US/short_description.txt | 1 + fastlane/metadata/android/en-US/title.txt | 1 + 10 files changed, 357 insertions(+), 24 deletions(-) create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/release.yml create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 fastlane/metadata/android/en-US/changelogs/1.txt create mode 100644 fastlane/metadata/android/en-US/full_description.txt create mode 100644 fastlane/metadata/android/en-US/short_description.txt create mode 100644 fastlane/metadata/android/en-US/title.txt 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..33fb42d --- /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 Release APK + run: ./gradlew assembleRelease + + - name: Rename APK + run: | + VERSION=${GITHUB_REF#refs/tags/v} + mv app/build/outputs/apk/release/app-release-unsigned.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..15a908b --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 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 @@ Snub Logo

-Android app for blocking unwanted calls. No ads. +

+ License: MIT + GitHub Release + Build Status + Android 10+ +

+ +

+ 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 From 04f11002346e8873090de42cde2d428f70cacbf0 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 30 Dec 2025 15:10:02 +0000 Subject: [PATCH 2/2] Fix LICENSE year and release workflow - Update LICENSE copyright year to 2025 - Use debug APK in release workflow (unsigned release APKs can't be installed directly) --- .github/workflows/release.yml | 6 +++--- LICENSE | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 33fb42d..32884f7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,13 +22,13 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - - name: Build Release APK - run: ./gradlew assembleRelease + - name: Build APK + run: ./gradlew assembleDebug - name: Rename APK run: | VERSION=${GITHUB_REF#refs/tags/v} - mv app/build/outputs/apk/release/app-release-unsigned.apk snub-${VERSION}.apk + mv app/build/outputs/apk/debug/app-debug.apk snub-${VERSION}.apk - name: Create Release uses: softprops/action-gh-release@v1 diff --git a/LICENSE b/LICENSE index 15a908b..03802ec 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 Snub Contributors +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