Skip to content

Mobile: desktop parity pass (Tweaks, Apps, Launcher, Files, Optimize, Diagnostics, Snapshots) - #163

Open
bryanroscoe wants to merge 12 commits into
mainfrom
mobile-parity-pass
Open

bryanroscoe wants to merge 12 commits into
mainfrom
mobile-parity-pass

Conversation

@bryanroscoe

Copy link
Copy Markdown
Owner

Brings the mobile app up to the desktop features from v2-2.3.0/2.3.1: Tweaks as a bottom tab at desktop parity, Optimize search and app sheet, Diagnostics suggestions, snapshot preview with a Now column, Apps listing catalogued apps (katniss is findable) with storage details, Report this app (#100) and a long-press menu (#129), the Launcher Setup Wraith card, set-any-app-as-Home and separate stock disable (#157/#158), and Files with the app-backup finder and TV-side delete.

File find/delete moved into core and is shared with desktop, which also fixes desktop's #86 message: a missing backup folder now reads as no matches instead of "couldn't be searched".

Mobile now has tauri-plugin-opener, scoped to http(s), so source-site and GitHub report links open in the phone's browser. None of this has run on a device yet; remaining gaps (phone-to-TV upload, sideload, bug-report bundle, patch-notes viewer) are listed in v2/mobile/HANDOFF.md.

🤖 Generated with Claude Code

…elpers, Tweaks tab

Register set_home_any, disable_stock_launcher, disable_setup_helper,
app_storage_map and app_apk_size on mobile (Pro gating stays inside core),
and add typed wrappers for them plus the already-registered permission,
appop and process-safety commands. Port desktop's recommendation,
app-report and app-details helpers, align the safety labels with desktop
(Safe to remove), and make Tweaks a bottom tab while Optimize becomes a
screen pushed from the Dashboard.
…pshot Now column

Optimize Back returns to the screen that opened it, a search box filters
the plan by name or package id, and tapping a row opens the app detail
sheet. Recommended defaults now come from recommendation(), the same rule
desktop's Optimize wizard pre-selects with, and review rows carry the
"Review: ... if unused" pill.

Health's top memory rows gain desktop's Suggestion: a process name is an
app only once the TV confirms the package is installed, then it gets the
App List's recommendation; anything else is classified with
process_safety_info and reads "Not an app". When the installed list
can't be read, package-shaped names say "Not checked" rather than
claiming they are not apps.

Snapshots are marked Beta, "Preview & apply" is "Preview restore", and
the preview lists every row with what the TV has now: settings already at
the snapshot's value read "Already set". The copy states that a restore
disables recorded apps and writes settings back but never re-enables or
reinstalls anything.
…ck disable

Brings the mobile Launcher screen to parity with desktop's Launcher tab.

- Setup Wraith status card (off / on / risk) with the desktop copy, Turn it
  off (disable_setup_helper) and Re-enable Setup Wraith, which puts the
  previous default back if Android hands Home to the helper.
- Advanced: set another app as Home. Installed-app picker, optional
  activity, set_home_any with Android's answer shown verbatim; ok is only
  styled as success when the TV confirmed it.
- Disable stock launcher is its own confirmed step (save snapshot first,
  disable, cancel), gated until the picked app is Home or set_home_any
  said stock is in the way. The Setup Wraith note comes from the re-read
  state, not the prediction.
- Every launcher action re-reads the TV afterwards, ok or not (#157/#158),
  and not-ok results stay on screen with copyable diagnostics.
- Source site links for uninstalled launchers (copied until the app can
  open a URL externally) and Play Store install polling.
- Pure view logic in launcherView.ts; tests/launcher.test.mjs covers it
  and drives the screen at 384px against mocked Tauri.
Move the file-manager guards and the device-side find/delete into core
(commands::files) so desktop and mobile apply the same /sdcard confinement,
protected-path refusal and pattern validation. Desktop's commands now wrap
the shared implementation; mobile registers find_files and an always
/sdcard-confined delete_path.

find now ends with a completion marker. A missing directory makes find exit
nonzero, which the desktop driver turned into an error, so a SmartTube user
with only one of the three backup folders was told the others "couldn't be
searched". Only a failed call or a stream without the marker is reported as
unsearched now (#86), on both drivers.

The mobile Files screen reads desktop's app-files catalog in place, shows
"Find app backups" with copy-to-phone and open-folder for each hit, keeps a
failed search distinct from no matches, and deletes files or folders under
/sdcard behind a confirmation bound to the TV it was raised on.
…ng-press menu

The Apps screen only listed packages outside the catalogue, so a recognised
app like Google Assistant (com.google.android.katniss) could not be found
anywhere outside the Pro-only Optimize screen. Apps now shows a Recognised
section (catalogue description, safety verdict, suggestion) above Everything
else, with one search over name and package id, desktop's Hide not installed,
and disabled apps reachable so they can be re-enabled.

The detail sheet gains storage figures with when they were measured and a
re-measure, the catalogue description, review date and sources, and Report
this app (#100). Long-pressing a row opens an action menu (#129) whose
Disable/Enable go through the same safety-gated paths as the sheet.
…Tune tiles; More header

Tweaks adds Nvidia System Hooks (re-enable free, disable Pro), the Remote
Assistant Button mic permission, Screensaver with Basic Daydream / Off /
Restore previous, and the 720p display preset, regrouped into Remote &
buttons, Picture & sound, Interface and Network with current values shown
to Free users. Dashboard consolidates the Optimize entry points into one
call to action and adds Tweaks and Launcher tiles. More is titled More,
drops the duplicate Tweaks row and lists Optimize.
…resh icon subset and notices

- tauri-plugin-opener on mobile, scoped to http(s) only; api.openUrl rejects
  any other scheme. Launcher's source-site link and Report this app both use
  it, falling back to copying the link.
- types.ts now carries the screensaver keys, the 720p scaling preset and the
  snapshot plan's current_values/current_launcher/launcher_not_installed, so
  Tweaks and the snapshot preview drop their local widened types.
- Icon font re-subset for the parity screens; notices regenerated for the
  opener crates (first-party crates marked publish = false so cargo-about
  skips them instead of failing on their proprietary license).
- Tests: launcher source-site covers open and copy fallback; the Diagnostics
  rank-swap test stubs the installed list that safety_info now depends on.
- Header row gap so a title never butts against the remote button.
…ktop #86 fix

HANDOFF and BACKLOG get a dated checkpoint listing what reached mobile, that
none of it has run on a device, and the remaining gaps (phone-to-TV upload,
sideload, collect_diagnostics bundle, patch-notes viewer). The Android plan's
MVP exclusions note what has since shipped. CHANGELOG Unreleased carries the
desktop Find app backups fix (#86).
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 6, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-09T03:38:12.239663Z 94079cc New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f4e2513174

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +104 to +108
if (!screensaverOriginals.has(serial)) {
screensaverOriginals.set(serial, {
components: value.screensaver_components ?? null,
enabled: value.screensaver_enabled ?? null,
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Key screensaver originals by verified device identity

On mobile, serial is the wireless host:port transport key rather than a stable TV identity. If the same TV reconnects on a rotated port, this captures the app-written value as a new “original” and loses the real restore target; if another TV later occupies the same endpoint during the session, Restore previous can write the first TV's screensaver component onto it. Key this cache by verified hardware ID, with connection generation as the fallback when no ID is available, rather than by endpoint alone.

AGENTS.md reference: AGENTS.md:L38-L45

Useful? React with 👍 / 👎.

Guard mobile file actions across TV reconnects

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 94079cc45c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +322 to +323
const r = await api.disableSetupHelper(serial, row.entry.package);
if (serial !== session.serial) return;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Bind launcher mutations to the connection generation

When a TV disconnects and the session reconnects to the same host:port, possibly to a different TV now using that endpoint, the Launcher screen retains its old rows and confirmation state because it watches and validates only session.serial. This call can therefore disable Setup Wraith on the replacement TV; the new set-home and stock-disable flows use the same serial-only checks and can likewise alter its Home configuration. Key the loaded launcher state and action intents to session.generation/liveness and invalidate them on every reconnect, rather than treating endpoint equality as device identity.

AGENTS.md reference: AGENTS.md:L38-L45

Useful? React with 👍 / 👎.

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