Skip to content

fix(android): find existing settings through search - #139035

Merged
steipete merged 5 commits into
mainfrom
codex/android-settings-search
Sep 5, 2026
Merged

steipete merged 5 commits into
mainfrom
codex/android-settings-search

Conversation

@steipete

@steipete steipete commented Sep 5, 2026 •

Copy link
Copy Markdown
Contributor

The source branch is in openclaw/openclaw, not a contributor fork.

What Problem This Solves

Fixes an issue where users searching for existing Android settings such as Appearance, Profile, or Licenses received “No actions found.” Search filtered five quick actions instead of the destinations exposed by Settings.

Also repairs the source-extraction cause of Dark/Light remaining English after selecting a translated app language. Delivery of those generated translations follows the normal Native App Locale Refresh PR, not this source-only PR.

Why This Change Was Made

Settings Home and search now share typed destination titles, icons, categories, and availability. One dispatcher preserves the navigation owner: Back returns to the originating screen, Providers & Models keeps its standalone route, and Sign Out remains an explicit account action. Duplicate metadata and per-command callbacks are removed.

Theme labels use literal localized UI lookups, making them visible to the existing extraction pipeline; the unused English-label API is removed. Saved system/dark/light values are unchanged. The mascot’s existing frame loop now uses Compose’s infinite-animation API, matching the waveform and allowing shell tests to reach idle under the existing infinite-animation test policy, without app-specific or OS animation toggles.

The pinned Compose animation-core 1.12.0 AAR was independently inspected: without an InfiniteAnimationPolicy, its helper invokes the same withFrameNanos callback; the matching test policy recognizes infinite operations under auto-advance. Pose math and reactive OS reduced-motion handling are unchanged. This closes the reviewer’s unavailable dependency-read check; no animation-smoothness claim is made.

User Impact

Existing settings are discoverable by displayed name or category, including while offline. Home section order, summaries, status dots, Profile, and the bottom Licenses section remain unchanged. No configuration, permission, persistence, protocol, or dependency contract changes are introduced by this PR.

Evidence

This revision deliberately contains source and the native-source inventory only. The previous combined revision failed CI preflight because generated locale artifacts must land separately; no gate was bypassed. Exact-head hosted CI33970480734 completed successfully, including both phone-flavor tests, Wear tests, Play/Wear APK builds, Android lint, and the required openclaw/ci-gate.

The normal main-triggered Native App Locale Refresh workflow owns the generated Android lookup table and translated resources. After that generated PR lands, the following source PR will restore the byte-identical French resource/selection regression retained from the combined revision. Until then, this source-only artifact does not claim translated Dark/Light labels.

Source-only verification: all 18 selected changed-file checks passed; all 16 native-inventory tests passed; 68 focused Android executions passed across Play and Third Party with no failures, errors, or skips. The added extraction regression fails against the previous dynamic-label source and passes against the literal phone-owned labels. Native inventory verification and the actual CI generated/source isolation check passed. Codex P2 review reported no actionable findings.

Earlier combined-artifact and unchanged-search evidence follows; it is not exact-head generated-resource proof for the source-only revision:

  • Both real-shell Appearance reproductions failed on the old search owner and passed after the repair, including Overview/Settings origins and Back navigation.
  • Integrated current-main Play and Third Party unit suites passed 5,645 tests, with no failures, errors, or skips. Normal changed-file checks, Android localization parity, and native localization safety checks passed. Codex review found no actionable P0 findings.
  • On the earlier combined revision, the French resource/selection regression failed with English Dark/Light before the repair and passed with Sombre/Clair afterward. The cleanup also passed 234 focused executions covering saved preferences, English selection, and Settings behavior.
  • Installed API 36 testing of the search candidate completed 13 scenarios and 59 one-shot steps: search, Profile, Licenses and notice text, category matching, Desktop gating, French navigation, and restoring System language. Nine available Settings-state fields were preserved; unavailable chat header/draft fields are not claimed. This used a synthetic connection fixture and offline Settings, not live-provider readiness.
  • The earlier combined APK (967efd2a44c5, SHA-256 4ff7121c7f6971169df5f428d6a8a7ecb1b8cb689b5bf742dfec739dfbf0811e) passed a separate 4-case, 11-step installed round-trip: same-UID update, French labels, Light → Dark → original effective Dark, and App language restored to System. Nine available Settings fields matched the expected state, including the normal local theme-edit metadata; chat header/draft fields remain outside this proof. Original captures and execution records were independently reviewed, and all owned native resources and the Testbox were closed.
  • That combined artifact preserved every existing entry across all 22 phone locales and added only the two theme labels. The generated changes are excluded from this source-only revision and are left to the workflow owner.
  • An earlier final-theme run hit the recorder’s 180-second cap. The test was split into four short recording lifetimes without changing app actions, assertions, or time limits; the complete run above then passed.
  • Full-suite testing exposed two existing fixture-lifetime errors in socket publication and the synthetic TLS server. Those fixture owners were repaired without relaxing assertions or deadlines; the original failures were retained and the complete suite rerun.

Installed search before and after

These inspected, synthetic-only captures show the search implementation, which is unchanged in the source-only revision. They are not after-proof for the additional theme-label repair.

Before After
Appearance search returns no actions Appearance search finds the existing setting

Earlier combined-artifact French theme round-trip

These inspected, synthetic-only original captures are from the successful combined 967efd2a44c5 run. They show the intended result with generated translations present, not the current source-only artifact.

Light selected Dark selected
French Clair selected French Sombre selected

App language restored to System; original effective Dark retained

Authored Android production is +230/-215 (net +15), justified by the shared searchable-destination owner and localized labels. Tests are +197/-52; no generated locale artifacts are changed. Native-source inventory-site relocation is counted separately.

A separate Settings-row layout follow-up records the existing French Providers & Models title clipping beside its long status. The unrelated Apple catalog extraction refresh is also tracked separately; neither is claimed fixed here.

Latest review disposition

The September 5 14:07 UTC review of e2323a6f3d6d reports no introduced code defect and accepts the unchanged installed search evidence. Its remaining note is the reviewer’s DNS limitation, not a demonstrated dependency failure. The maintainer directly inspected the pinned Compose 1.12.0 AAR/helper and test-policy implementation and the original installed captures; those checks are described above. The chosen mitigation remains one shared destination catalog, the existing navigation owner, and workflow-owned generated translations followed by the retained French regression. No finding is silently skipped, no gate is waived, and no source-only French translation or animation-smoothness claim is made.

Share destination labels, icons, categories, and Desktop availability between Settings Home and search. Preserve existing Back ownership and provider navigation while removing duplicate row metadata and per-command callbacks. Classify the mascot as an infinite Compose animation so shell behavior can be tested without overriding the animation clock.
Keep the TLS peer open until the probe completes, and let the publication test release its held factory. Cancel an unpublished socket if the factory is interrupted. Preserve the client deadlines and coroutine assertions.
Use literal UI lookups so the existing localization extractor includes each phone theme mode. Remove the unused English-label reverse lookup; saved system/dark/light values remain unchanged.
@steipete steipete self-assigned this Sep 5, 2026
@clawsweeper

clawsweeper Bot commented Sep 5, 2026 •

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

ClawSweeper review complete

ClawSweeper finished reviewing this revision. The review result is being finalized.

View the workflow run.

@openclaw-barnacle openclaw-barnacle Bot added app: android App: android size: L maintainer Maintainer-authored PR labels Sep 5, 2026
@clawsweeper clawsweeper Bot added P2 Normal backlog priority with limited blast radius. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Sep 5, 2026
@clawsweeper

clawsweeper Bot commented Sep 5, 2026 •

Copy link
Copy Markdown
Contributor

Codex review: blocked before merge. Reviewed September 5, 2026, 10:07 AM ET / 14:07 UTC.

ClawSweeper review

What this changes

Makes existing Android settings searchable through shared destination metadata, exposes theme labels to localization extraction, and adjusts animation and test-fixture lifecycles.

Merge readiness

⛔ Blocked before merge - 1 item remains

The search repair remains useful: current main and v2026.9.1 still omit existing settings from search. No introduced correctness defect was found, and the source-only revision follows the locale-refresh ownership contract.

Priority: P2
Reviewed head: e2323a6f3d6df02c936137b0f5da9f93314749c3

Review scores

Measure Result What it means
Overall readiness 🐚 platinum hermit (4/6) A coherent owner-level repair with substantial installed search evidence and a clearly documented generated-translation handoff.
Proof confidence 🦞 diamond lobster (5/6) ✨ media proof bonus Sufficient (screenshot): Retained installed API 36 evidence exercises the unchanged ShellScreen search path, destination opening, and return navigation with synthetic/offline state. Current source-only validation covers extraction; earlier combined-artifact French captures are not treated as proof that this revision already delivers translations.
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Verification

Check Result Evidence
Real behavior Verified Sufficient (screenshot): Retained installed API 36 evidence exercises the unchanged ShellScreen search path, destination opening, and return navigation with synthetic/offline state. Current source-only validation covers extraction; earlier combined-artifact French captures are not treated as proof that this revision already delivers translations.
Evidence reviewed 12 items Reviewed introduction boundary: Verified origin is openclaw/openclaw. Reviewed the pinned merge-base-to-head delta, excluding unrelated base-branch changes; the supplied test merge is stale and was not used to infer removals.
Current-main defect remains: The current palette filters only Chat, Voice, Threads, Providers, and Settings. Appearance, Profile, and Licenses cannot match their existing destination names.
Latest-release behavior: The latest release commit contains the same five-action search. A separate git tag --points-at check confirmed this commit is v2026.9.1.
Findings None None.
Security None None.

How this fits together

Android’s search palette turns typed queries into navigation actions within the companion app. Settings Home and search now share destination metadata while the existing shell continues to own navigation and Back behavior.

flowchart TD
  A[Overview or Settings search] --> B[Localized query matching]
  C[Shared settings destinations] --> D[Settings home]
  C --> E[Desktop availability filter]
  E --> B
  B --> F[Existing navigation owner]
  F --> G[Settings detail or Providers]
  G --> H[Back to originating screen]
Loading

Before merge

  • Resolve merge risk (P1) - Reviewer limitation: DNS prevented independent inspection of the pinned AndroidX implementation and linked captures; the maintainer’s recorded dependency inspection and retained installed-app evidence are not invalidated by that limitation.
Agent review details

Security

None.

PR surface

Tests +145, Docs +1, Other +15. Total +161 across 13 files.

View PR surface stats
Area Files Added Removed Net
Source 0 0 0 0
Tests 5 197 52 +145
Docs 1 1 0 +1
Config 0 0 0 0
Generated 0 0 0 0
Other 7 260 245 +15
Total 13 458 297 +161

Review metrics

Metric Value Why it matters
Production versus test growth Production net +15; tests/test support net +145; inventory net 0 Residual production growth supports typed searchable destinations after duplicate metadata and callbacks are removed; inventory changes only relocate source ownership.
Settings contract preservation 0 new settings; 0 stored-value or default changes The repair exposes existing destinations and retains the system/dark/light persistence contract.

Merge-risk options

Maintainer options:

  1. Decide the mitigation before merge
    Keep one shared destination catalog and the existing navigation owner; deliver generated theme translations through locale refresh, then restore the documented French selection regression.
  2. Pause or close
    Do not merge this PR until maintainers decide whether the risk is worth taking.

Technical review

Best possible solution:

Keep one shared destination catalog and the existing navigation owner; deliver generated theme translations through locale refresh, then restore the documented French selection regression.

Do we have a high-confidence way to reproduce the issue?

Yes, from source: searching Appearance, Profile, or Licenses cannot match the five actions on current main. Installed before/after results are supplied; this review did not execute the app.

Is this the best way to solve the issue?

Yes for the search and extraction repair: sharing destination metadata avoids another competing search list, and literal theme lookups use the existing localization pipeline without changing saved preferences.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against df78d38ccca7.

Labels

Label justifications:

  • P2: Repairs Android settings discovery and localization extraction with a limited blast radius and existing manual navigation available.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (screenshot): Retained installed API 36 evidence exercises the unchanged ShellScreen search path, destination opening, and return navigation with synthetic/offline state. Current source-only validation covers extraction; earlier combined-artifact French captures are not treated as proof that this revision already delivers translations.
  • proof: sufficient: Contributor real behavior proof is sufficient. Retained installed API 36 evidence exercises the unchanged ShellScreen search path, destination opening, and return navigation with synthetic/offline state. Current source-only validation covers extraction; earlier combined-artifact French captures are not treated as proof that this revision already delivers translations.
  • proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence. Retained installed API 36 evidence exercises the unchanged ShellScreen search path, destination opening, and return navigation with synthetic/offline state. Current source-only validation covers extraction; earlier combined-artifact French captures are not treated as proof that this revision already delivers translations.

Evidence

What I checked:

  • Reviewed introduction boundary: Verified origin is openclaw/openclaw. Reviewed the pinned merge-base-to-head delta, excluding unrelated base-branch changes; the supplied test merge is stale and was not used to infer removals. (e2323a6f3d6d)
  • Current-main defect remains: The current palette filters only Chat, Voice, Threads, Providers, and Settings. Appearance, Profile, and Licenses cannot match their existing destination names. (apps/android/app/src/main/java/ai/openclaw/app/ui/CommandPalette.kt:99, df78d38ccca7)
  • Latest-release behavior: The latest release commit contains the same five-action search. A separate git tag --points-at check confirmed this commit is v2026.9.1. (apps/android/app/src/main/java/ai/openclaw/app/ui/CommandPalette.kt:99, ad6fe23aecb9)
  • Navigation owner and sibling paths: Search dispatch preserves standalone Providers navigation and distinguishes Settings Home from cross-tab origins. ShellNavigation retains its existing Back and saved-route contracts; SettingsDetailScreen dispatches to existing screens. Settings Home shares the same metadata and Desktop gate, while Sign Out remains a separate action. (apps/android/app/src/main/java/ai/openclaw/app/ui/ShellScreen.kt:349, e2323a6f3d6d)
  • Locale-generation ownership: The existing workflow explicitly assigns stable-ID inventory to source PRs and generated Android resources to its separate automation PR. The reviewed inventory preserves all IDs and source strings, changing only source sites; Dark and Light gain phone UI sites. The current generated lookup still lacks those labels, matching the PR’s stated delivery boundary. (.github/workflows/native-app-locale-refresh.yml:241, e2323a6f3d6d)
  • Extraction repair and settings compatibility: Literal theme lookups satisfy the existing extractor; resource-only Wear entries are excluded from phone lookup generation. Theme selection still resolves through the same labels to unchanged system/dark/light values, and SecurePrefs still persists mode.rawValue. Existing default and persistence tests remain intact. (apps/android/app/src/main/java/ai/openclaw/app/ui/SettingsScreens.kt:2234, e2323a6f3d6d)

Likely related people:

  • steipete: Suggested for follow-up; no historical authorship or introduction is verified. (role: unverified routing candidate; confidence: low)
  • Masato Hoshino: Suggested for follow-up; no historical authorship or introduction is verified. (role: unverified routing candidate; confidence: low)

Rating scale

Score Internal tier Crab rank Meaning
6/6 S 🦀 challenger crab Exceptional readiness
5/6 A 🦞 diamond lobster Very strong readiness
4/6 B 🐚 platinum hermit Good normal PR; ordinary maintainer review
3/6 C 🦐 gold shrimp Useful, but confidence is limited
2/6 D 🦪 silver shellfish Proof or implementation needs work
1/6 F 🧂 unranked krab Not merge-ready
N/A NA 🌊 off-meta tidepool Rating does not apply

Overall follows the weaker of proof and patch quality.
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

Workflow

  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

History

Review history (2 earlier review cycles)
  • reviewed 2026-09-05T11:47:34.073Z sha 967efd2 :: blocked before merge. :: none
  • reviewed 2026-09-05T13:14:48.173Z sha 967efd2 :: blocked before merge. :: none

@steipete
steipete marked this pull request as ready for review September 5, 2026 13:07
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels Sep 5, 2026
@steipete

steipete commented Sep 5, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

The source-only revision follows the required native locale-refresh ownership boundary. Generated resources are excluded; the PR body distinguishes the earlier combined French artifact from current source-only proof and records the subsequent generated-refresh and regression-test handoff. All 18 changed checks, 16 inventory tests, and 68 focused Android executions passed; Codex P2 review is clean. Exact-head hosted CI remains required.

@clawsweeper

clawsweeper Bot commented Sep 5, 2026 •

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event exact_review_queue).
Result: when the review finishes, ClawSweeper will create the durable review comment if needed or update the existing comment in place.

Re-review progress:

@steipete
steipete merged commit 6c745b3 into main Sep 5, 2026
133 of 135 checks passed
@steipete
steipete deleted the codex/android-settings-search branch September 5, 2026 14:23
@steipete

steipete commented Sep 5, 2026

Copy link
Copy Markdown
Contributor Author

Merged via squash.

github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Sep 6, 2026
* fix(android): make settings destinations searchable

Share destination labels, icons, categories, and Desktop availability between Settings Home and search. Preserve existing Back ownership and provider navigation while removing duplicate row metadata and per-command callbacks. Classify the mascot as an infinite Compose animation so shell behavior can be tested without overriding the animation clock.

* test(android): bind gateway fixtures to test lifetimes

Keep the TLS peer open until the probe completes, and let the publication test release its held factory. Cancel an unpublished socket if the factory is interrupted. Preserve the client deadlines and coroutine assertions.

* fix(android): localize appearance mode labels

Use literal UI lookups so the existing localization extractor includes each phone theme mode. Remove the unused English-label reverse lookup; saved system/dark/light values remain unchanged.

* fix(android): hand generated settings labels to locale refresh
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: android App: android maintainer Maintainer-authored PR P2 Normal backlog priority with limited blast radius. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: L status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant