Skip to content

launcher, themes: a terminal-hacker look, in text only - #3632

Open
xaferima wants to merge 1 commit into
Gathin23:mainfrom
xaferima:terminal-hacker
Open

xaferima wants to merge 1 commit into
Gathin23:mainfrom
xaferima:terminal-hacker

Conversation

@xaferima

@xaferima xaferima commented Nov 9, 2026

Copy link
Copy Markdown

A theme that reads as a Linux terminal: the text is the interface. Every app is one line of monospace text, the dock title is a shell prompt of two lines, and the whole screen is phosphor red on pure black.

What it adds

Six keys, read from a theme's config.json only, each off by default, so a launcher nobody themes is unchanged:

Key Effect
terminal_text Every tile is one line of monospace text over black, its name left-aligned inside the same box, with > in front of the focused row. No icon, no banner
terminal_prompt The dock title read as a shell prompt: a blinking block cursor behind the name, └─# in front of it as it types
terminal_typing With it, the name types itself out one character at a time
terminal_host, terminal_path The host and directory the context line names: ┌─(root@hacker-kali)-[/home/]
terminal_color The colour of all of it: tiles, prompt, clock, date, greeting and focus ring. #FF3B30, phosphor red, when any other terminal_* key is on

The colour, the > marker and the cursor live in TerminalPrompt, a pure class covered by its own tests. AppAdapter gains one branch that draws a row. MainActivity tints the header and moves the accent onto the glass.

Two things worth calling out, because they reach beyond the theme:

  • The monospace face is fonts.xml pointing the five font_* strings at the system monospace family. There is no theme key for typography (the fonts are resources, resolved at inflate time), so a theme cannot ship a font, and the whole launcher becomes mono rather than just this look. values-vi is untouched (Outfit is missing 96 Vietnamese letters, so vi strings render in mixed fonts #833), as its own comment says it must be.
  • activity_main.xml swaps the shelf's two TextViews, so the context line sits above the command line. That also puts the cinematic shelf's "Last opened" line above the app name for every theme, terminal or not. Accepted as part of the look, not left silent.

Why the tiles do not change size

terminal_text draws inside the tile box it already has: no banner, no icon, the label moved into the card and left-aligned. The tile keeps its 180x101 dp box, so tileWidthPx, TITLE_ROOM_DP and therefore TileFitTest, GridNavigationTest and DockSlotsTest are untouched.

The shelf's focus code also does not zoom or lift a text row: with reduced_motion or not, a row just lights up and the > moves, so there is nothing scheduled on the weak-GPU path.

The theme

themes/terminal-hacker/ is the look above, generic: no pinned dock, no personal apps, no pictures, black only. Count bumped 28 → 29 in the seven front pages that state it.

Verified

  • TV: Indurama Google TV 4K (KTC hongkong, MediaTek m7632, Google TV 14, SDK 34)
  • ./gradlew test — 325 JUnit, 0 failures
  • assembleRelease — 530,865 B, under CI's 589,824 B
  • python3 -m unittest discover -s tests — 3191 tests, 0 failures (was 12 failures on my working branch before this)
  • Every image in docs/switches/ and the theme's screenshot.jpg come from that TV

Two notes for review

  1. clock_format is a documented theme key, but Config.java reads it through CLOCK_FORMAT_KEY rather than the literal, so test_shipped_config_keys_are_read.py cannot see the read and treats any theme that sets it as a dropped key. I left the code alone and left the key out of this theme rather than widen the PR; the read is real, only its shape hides it. Worth a separate look.
  2. terminal_host and terminal_path share one screenshot with terminal_color for now, because the TV was captured running a personal config that names the host. They should be re-shot from this generic theme (the default hacker-kali) before merging; I will do it as soon as the TV is back on.

Themes can already change colours, the wallpaper, the dock and the columns, but
every tile still draws the app's icon or banner, and the shelf still shows the
app's name in the launcher's own font. This adds the missing piece for a look
that reads as a terminal: the text is the interface.

Six keys, all read from a theme's config.json only, each off by default, so a
launcher nobody themed is unchanged:

- terminal_text: every tile is one line of monospace text over black, its name
  left-aligned inside the same box, with "> " in front of the focused row. The
  tile keeps its size and its box, so the grid, the dock and the tests around
  them keep their numbers; only what is drawn inside a row changes.
- terminal_prompt: the dock title read as a shell prompt, two lines, a blinking
  block cursor behind the name and "└─# " in front of it as it types.
- terminal_typing: with it, the name types itself out one character at a time.
  With reduced_motion, either way, nothing is scheduled at all.
- terminal_host, terminal_path: the host and directory the context line names.
- terminal_color: the colour of all of it, tiles, prompt, clock, date, greeting
  and focus ring. Phosphor red by default when any other terminal_* key is on.

The colour, the marker and the cursor live in TerminalPrompt, a pure class with
its tests; AppAdapter gains one branch that draws a row; MainActivity tints the
header and moves the accent to the glass. The monospace face is fonts.xml
pointing the five font_* strings at the system family, with values-vi left as
it is (Gathin23#833), so a theme cannot ship a font the launcher does not have.

The shelf's two TextViews change order, so the context line sits above the
command line; this also puts the cinematic shelf's "Last opened" line above the
app name, for everyone, terminal theme or not.

Tested on an Indurama Google TV 4K (KTC hongkong, MediaTek m7632, Google TV 14,
SDK 34), 325 JUnit, the release APK at 530,865 B, and every screenshot in
docs/switches is from that TV.
@github-actions

github-actions Bot commented Nov 9, 2026 •

Copy link
Copy Markdown

maintainer-bot review · this one needs a maintainer decision

Thanks for the PR! Couldn't review this one automatically; it goes to the maintainer.

Checks

Reviewed by maintainer-bot · runs on 0G Private Computer

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

launcher Changes under launcher/: the Android TV home screen app needs-maintainer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant