First off, thank you for considering contributing to QuickBars!
Please take a moment to review these guidelines to make the contribution process effective for everyone.
To keep this project manageable for a solo developer/student, please adhere to these strict rules:
- Language: All issues, pull requests, and discussions must be in English.
- Completeness: You must fill out all sections of the provided templates.
- Automatic Closure: Issues or discussions that are not in English or are incomplete will be closed immediately.
- Respect the Maintainer: This project is managed by Omri in his spare time. Help me help you by being clear and professional.
To ensure that changes align with the project's goals and architecture, please follow our refined workflow:
- Start a Discussion: Before writing any code, start a new discussion.
- Use the Ideas category for new features.
- Use the Q&A category if you aren't sure if something is a bug or just a configuration issue.
- Consensus & Approval: Wait for the community and maintainers to chime in. Once we agree on the approach, a maintainer will convert the discussion into a formal Issue.
- Fork & Branch: Once the official issue is created and assigned, fork the repository. Create a new descriptive branch (e.g.,
feature/new-entity-supportorfix/overlay-flicker). - Local Development: Set up your environment (see Local Setup below).
- Manual Testing: Verify your changes on a real device (see Testing below).
- Submit a Pull Request: Submit your PR referencing the original issue (e.g., "Fixes #12"). Please write clear, descriptive commit messages.
You can build and test QuickBars without access to production API keys or private signing certificates.
To prevent the build from failing, you must provide placeholder values for the required variables in your global gradle.properties file.
- Windows:
C:\Users\<YourName>\.gradle\gradle.properties - Mac/Linux:
~/.gradle/gradle.properties
Add the following lines to that file:
REVENUECAT_API_KEY="dummy_key"
HA_QUICKBARS_KEYSTORE_FILE="not_needed_for_debug"
HA_QUICKBARS_KEYSTORE_PASSWORD="dummy"
HA_QUICKBARS_KEY_ALIAS="dummy"
HA_QUICKBARS_KEY_PASSWORD="dummy"In Android Studio, ensure you are using the debug build variant. This variant uses the standard Android debug key and ignores the production signing configuration.
To keep the codebase clean and readable, please ensure your code follows standard Android Kotlin styling conventions. Before submitting a PR, run the standard Android Studio auto-formatter (Ctrl+Alt+L on Windows, Cmd+Option+L on Mac) on any files you have modified.
Because QuickBars interacts with system-level overlays and physical remote key interception, testing is currently a manual process.
The Current Testing Standard:
Hardware: We test on real Android TV hardware, such as the Nvidia Shield or Chromecast with Google TV, to ensure performance and compatibility.
Manual Checks: We make sure the feature/fix we implemented is working as expected, and that any other feature it may have affected was not affected at all. This requires familiarity with the codebase. If large changes were made, especially ones that affect data storage and persistance - then the following test is required:
- Run the main (public version) branch on your Android TV device using a debug build, and set it up normally (connect to HA, create a QuickBar with some entities).
- Run your new branch on the same device (simulating a software update).
- Make sure no data was corrupted during this update, and test all other functionality normally.
AI use in PRs is allowed, but all code AI writes must be 100% understandable and familiar to the person making the PR, as if he wrote it himself, as well as meet the project's code and testing standards.
Manual testing is the current standard for this project, but I am very open to improvements. If you have experience with automated UI testing for Android TV or ideas for a CI/CD pipeline, please start a thread in Discussions! I would love to discuss how to make the project more robust.
By contributing to QuickBars, you agree that your contributions will be licensed under the GNU General Public License v3.0 (GPLv3).