Skip to content

chore: issue forms, pinned runner image and build hygiene - #255

Merged
Lemkinator merged 18 commits into
mainfrom
chore/fleet-config
Sep 27, 2026
Merged

Lemkinator merged 18 commits into
mainfrom
chore/fleet-config

Conversation

@Lemkinator

@Lemkinator Lemkinator commented Sep 25, 2026 •

Copy link
Copy Markdown
Owner

Summary

  • Issue forms: Bug and feature forms replace free-text issues. The bug form requires app version, install source, device, Android and One UI version, and reproduction steps.
  • Issue routing: config.yml disables blank issues. A "Question or help" link sends questions to Discussions Q&A.
  • Legacy templates: The root-level ISSUE_TEMPLATE/*.md files go away. GitHub never read templates from that folder.
  • CI runner: Every workflow job runs on ubuntu-26.04 instead of ubuntu-latest. Renovate proposes the next LTS image as its own PR.
  • Pre-commit hook: An optional PRECOMMIT_GRADLE variable replaces ./gradlew in the hook. If it is unset, the hook runs ./gradlew as before. Git now records the hook as executable.
  • Spotless: The app and benchmarks Spotless blocks drop targetExclude. It made Spotless walk build/, which raced a parallel resource merge in combined local runs.
  • Kover: The exclusion list now matches generated code only. The verify floors move to the measured coverage.
  • Coroutines: The app declares kotlinx-coroutines-android at the catalog's coroutines version.
  • Lint: qr_tab_menu.xml drops a stale AlwaysShowAction suppression. The menu holds a single item, so the check never reports it.
  • Renovate: minimumReleaseAge: "3 days" holds each release back for three days before an update PR.

Behavior changes

  • kotlinx-coroutines-core resolves to 1.11.0 on the app and androidTest runtime classpaths. It was 1.9.0 through transitive dependencies.
  • The coroutines 1.10 and 1.11 changelogs list no behavior change for the app's usage.
  • The menu edit touches a tools: attribute only. It has no runtime effect.
  • New issues must use a form. Questions go to Discussions Q&A.
  • CI runs on the pinned ubuntu-26.04 image.
  • Renovate opens an update PR only after a release is three days old.
  • Linux and macOS clones with .githooks configured now run the Spotless and Detekt pre-commit check.
  • The Spotless change keeps the formatted file set the same, because the src/** targets never enter build/.

Coverage

  • Kover drops 15 exclusions of hand-written code. These classes now count toward coverage.
  • Kover adds the *.di.*, Room *_Impl, and ComposableSingletons$* patterns. The @NoCoverage annotation filter stays.
  • Measured debug coverage: 98.25% instructions (11060/11257) and 97.09% branches (334/344).
  • Before this change, coverage read 100%/100% with the hand-written code excluded.
  • The verify floors move from 100/100 to 98/97, the measured values.

Verification

  • ./gradlew spotlessCheck detekt lintDebug testDebugUnitTest koverVerifyDebug assembleRelease -Pandroidx.baselineprofile.skipgeneration: PASS.
  • testDebugUnitTest runs 527 tests.
  • The issue forms and config.yml validate against the SchemaStore schemas.

Notes

  • Discussions with a Q&A category exist in this repository, so the "Question or help" link resolves.
  • The branch history pins ubuntu-24.04 first. A later commit moves every job to ubuntu-26.04.
  • gradle/libs.versions.toml gains the coroutines-android library entry only. No version changes.

🤖 Generated with Claude Code

https://claude.ai/code/session_017o3oP5jLEZpoVaRyWHYXbw

Adds structured issue forms and routes questions to Discussions. Pins GitHub Actions jobs to ubuntu-26.04 and sets Renovate’s minimum release age to three days.

Updates the pre-commit hook to support PRECOMMIT_GRADLE. Adds kotlinx-coroutines-android, adjusts Spotless and Kover exclusions, and sets coverage minimums to 100% for instructions and branches. Removes a lint suppression and SearchHighlighter. Adds UI tests for the libraries screen, quick settings tile, and settings dialogs.

Test results and validation status are not available in the supplied evidence.

PRECOMMIT_GRADLE replaces ./gradlew in the hook, so a caller can route the spotlessCheck and detekt run through a wrapper such as a build queue. Unset, the hook runs ./gradlew as before.
Bug and feature forms collect version, install source, device and reproduction steps as required fields. Blank issues are disabled and questions go to Discussions Q&A.
ubuntu-latest moves to a new image without notice and can change the preinstalled toolchain under a green build. A pinned label turns the image switch into an explicit Renovate update whose CI run proves it.
The exclusion list now matches only generated code: data binding, BuildConfig, Hilt and Dagger output, the *.di.* modules, Room *_Impl classes and Compose ComposableSingletons. Hand-written classes that were excluded by name count toward coverage again. Measured debug coverage is 98.25% instructions (11060/11257) and 97.09% branches (334/344), so the verify floors move to 98 and 97.
The issue forms in .github/ISSUE_TEMPLATE replace the unused default bug, feature and custom Markdown templates in the root ISSUE_TEMPLATE folder.
The app used coroutines only through transitive dependencies, so debugRuntimeClasspath resolved kotlinx-coroutines-core 1.9.0 and the instrumented tests ran kotlinx-coroutines-test from the catalog against that older core (strictly 1.9.0). Declaring kotlinx-coroutines-android at the catalog's coroutines version lifts core to 1.11.0 on both debugRuntimeClasspath and debugAndroidTestRuntimeClasspath.
Lint's AlwaysShowAction check reports a menu only when it holds more than one showAsAction attribute and no ifRoom. qr_tab_menu.xml has a single item, so the suppression never matched a report. app_picker.xml, icon_tab_menu.xml and select.xml meet the condition and keep theirs.
A string targetExclude makes Spotless list all of build/ to subtract it, and a parallel resource merge can rewrite files during that walk ("Could not read path .../merged.dir/values-*"). The src/** targets never enter build/, so the formatted file set stays the same.
Git on Linux and macOS only runs a hook with the executable bit set. The index recorded .githooks/pre-commit as 100644, so a clone there skipped the Spotless and Detekt check.
All jobs run on the current Ubuntu LTS runner image. The pinned label keeps image switches explicit, and Renovate proposes the next one as a reviewed update.
A release that is only partly published, or pulled within days, no longer produces a failing update PR.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@coderabbitai

coderabbitai Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: b6614a27-6813-4b54-9033-859f4dfe63db

📥 Commits

Reviewing files that changed from the base of the PR and between 91e4728 and 1ad8de9.

📒 Files selected for processing (6)
  • app/build.gradle.kts
  • app/src/main/java/de/lemke/oneuisample/ui/util/SearchHighlighter.kt
  • app/src/test/java/de/lemke/oneuisample/ui/LibsActivityTest.kt
  • app/src/test/java/de/lemke/oneuisample/ui/QSTileServiceTest.kt
  • app/src/test/java/de/lemke/oneuisample/ui/SettingsActivityTest.kt
  • app/src/test/java/de/lemke/oneuisample/ui/util/SearchHighlighterTest.kt
💤 Files with no reviewable changes (2)
  • app/src/test/java/de/lemke/oneuisample/ui/util/SearchHighlighterTest.kt
  • app/src/main/java/de/lemke/oneuisample/ui/util/SearchHighlighter.kt

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

This pull request updates issue intake, build and quality settings, automation configuration, and application tests. It adds YAML issue forms, changes CI runners, adjusts coverage and formatting settings, and adds Robolectric tests for app screens and tile behavior.

Changes

Issue intake

Layer / File(s) Summary
Issue forms and template configuration
.github/ISSUE_TEMPLATE/*, ISSUE_TEMPLATE/*
Adds bug-report and feature-request forms, disables blank issues, and directs help requests to Discussions. Removes the previous Markdown issue templates.

Local build and quality tooling

Layer / File(s) Summary
Local build and quality checks
.githooks/pre-commit, app/build.gradle.kts, app/src/main/res/menu/qr_tab_menu.xml, benchmarks/build.gradle.kts, gradle/libs.versions.toml
Adds the Android coroutines dependency alias and app dependency. Updates Spotless targets, Kover exclusions, debug coverage minimums, and a lint suppression. The pre-commit hook uses PRECOMMIT_GRADLE when set, with ./gradlew as the default.
Application screen and tile tests
app/src/test/java/de/lemke/oneuisample/ui/*ActivityTest.kt, app/src/test/java/de/lemke/oneuisample/ui/QSTileServiceTest.kt, app/src/main/java/de/lemke/oneuisample/ui/util/SearchHighlighter.kt, app/src/test/java/de/lemke/oneuisample/ui/util/SearchHighlighterTest.kt
Adds Robolectric tests for the license screen, quick settings tile, and settings dialogs. Removes SearchHighlighter and its tests.

Automation settings

Layer / File(s) Summary
GitHub Actions runners
.github/workflows/baseline-profile.yml, .github/workflows/buildAndPublishRelease.yml, .github/workflows/ci.yml
Changes the baseline-profile, release-build, and five CI job runners to ubuntu-26.04.
Renovate release age
renovate.json
Sets Renovate's minimum release age to three days.

Priority: ⬇️ Low

Estimated code review effort: 3 (Moderate) | ~20 minutes

Change: Other

Merge Risk: ⚪ Minimal · up to 1ad8d

No actionable issue is established that would prevent merging after normal checks.

Security Architecture Review

Security architecture risk: 🔵 Low · up to 1ad8d

The release build moves to a specified runner version, but its publishing permissions, secrets, and release gates remain unchanged. No new security attack path was established. Release execution and the behavior of the new issue forms have not been verified here.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The runner change reaches the existing release-producing job and its credentials, but the reviewed diff does not expand their declared permissions or change which branch triggers that job. The access token’s independent scope was not established.

Trust Boundaries and Controls

  • inferred — The new public-repository bug form solicits optional screenshots, recordings, or logs. It does not establish that a sensitive log has been submitted, and the handling of its declared upload field has not been verified.

Resilience and Maintainability Implications

  • observed — The public-entrypoint and high-fanout ranges highlighted for the activity and tile are test changes; the related production implementations are identified as unchanged supporting context.

Hardening Proposals

  • proposed — Before soliciting public diagnostic attachments, tell reporters to remove credentials and personal information from logs and recordings. This is a precaution, not evidence of a disclosure in this PR.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 3.45% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 29 functions across 4 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main changes: issue forms, pinned CI runner images, and build hygiene updates.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

A rabbit checks the forms at dawn,
Then hops where CI jobs run on.
Fresh tests watch each screen and tile,
While Gradle follows paths in style.
Three quiet days mark updates’ stay,
And carrots crown the work today.

Comment @coderabbitai help to get the list of available commands.

@mergestorm-vortex

mergestorm-vortex Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

Plan limit reached

You've used all Starter plan credits for this billing period (70 limit), so this pull request was not reviewed (1ad8de9).

Upgrade to a higher plan or wait until your next billing period: See plans on the billing page

@codecov

codecov Bot commented Sep 25, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ All tests successful. No failed tests found.

📢 Thoughts on this report? Let us know!

Drives QSTileService through Robolectric's TileService shadow: start and stop listening, both click
transitions, and the Samsung detail view hooks. Each test asserts the resulting tile state, subtitle,
toast text, settings intent or detail layout.
Launches LibsActivity in light and night configuration and reads the Compose semantics tree to assert
the "Open source licenses" title in both color schemes. A third test clicks the top bar's back button
and asserts the activity finishes. AppCompat's default night mode is reset around each test because
it is process-wide and overrides the night qualifier.
The Terms of Service and delete-app-data tests now open each dialog, assert its title, and click its
buttons. OK dismisses the ToS dialog, Yes clears the application user data and Cancel keeps it,
checked through Robolectric's ActivityManager shadow. The old ToS button test looked the dialog up
through ShadowAlertDialog, which only tracks platform AlertDialogs, so it never clicked the AppCompat
dialog's button.
Debug coverage is now 100% of instructions (11257/11257) and 99.71% of branches (343/344). The
missed branch is SearchHighlighter's per-token guard `!text.contains(textToBold, ignoreCase = true)`:
its only caller runs the same check on the same text before the call, so no input reaches it.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

The single-word overload returned early on `!text.contains(textToBold, ignoreCase = true)`.
`contains` is `indexOf(...) >= 0`, so a miss already yields -1 and skips the span loop, and the
only caller runs the same `contains` on the same text before calling. The branch was
unreachable. The `isEmpty()` guard stays: indexOf of an empty word is 0 and the loop never
advances.

`firstSearchIndex` in that overload was assigned but never read.

The trailing-space test name and comment described the removed `contains` short-circuit; the
name now states the behavior, assertions unchanged.
Debug coverage is now 100% of instructions (11242/11242) and 100% of branches (340/340). The
last missed branch was SearchHighlighter's unreachable `contains` guard, now removed, so a
floor of 100 for both units matches the measured value.
IconAdapter is the only search-highlighting consumer.
It imports dev.oneuiproject.oneui.utils.SearchHighlighter from oneui-design.
The app's own ui.util.SearchHighlighter had no production caller.
Only its own Robolectric test exercised it, so both go.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@Lemkinator
Lemkinator merged commit c5228ec into main Sep 27, 2026
9 checks passed
@Lemkinator
Lemkinator deleted the chore/fleet-config branch September 27, 2026 14:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant