Skip to content

Android: OpenIPC brand launcher icon, Android TV home screen entry, label "Viewer" - #99

Merged
keyldev merged 2 commits into
mainfrom
feat/brand-icon
Nov 3, 2026
Merged

keyldev merged 2 commits into
mainfrom
feat/brand-icon

Conversation

@compot-dev

@compot-dev compot-dev commented Nov 2, 2026 •

Copy link
Copy Markdown
Collaborator
  • Replaces the five identical 266 KB mipmap-*/icon.png with the OpenIPC adaptive icon (sign + "OpenIPC" wordmark, monochrome layer for themed icons) and an Android TV banner, as vector drawables generated by the OpenIPC brand tool. minSdk is 31, so no PNG fallback is needed.
  • Android TV: MainActivity gets a LEANBACK_LAUNCHER intent filter next to the LAUNCHER one, so the app appears on the TV home screen with the banner. android.software.leanback, android.hardware.touchscreen and android.hardware.microphone (implied by RECORD_AUDIO) are declared not required, so the same APK installs on phones, tablets and TV boxes.
  • TV remote: camera rows (Library) and live tiles (Live) are focusable and open the camera on Enter / D-pad OK, so the TV entry is usable without touch (Qodo review).
  • The launcher label becomes "Viewer": the icon already carries "OpenIPC". MainActivity now takes its label from @string/app_name instead of a hard-coded string. In-app titles (window title, welcome screen, tray tooltip) are unchanged.
  • Built locally for android-arm64 and android-x64 with -warnaserror; aapt2 dump badging shows launchable and leanback-launchable activity with label='Viewer' and no implied required hardware; Android lint TV checks report no issues.

…abel "Viewer"

Replace the 5 identical 266 KB mipmap-*/icon.png with the OpenIPC adaptive
icon (sign + "OpenIPC" wordmark, monochrome layer for themed icons) and an
Android TV banner, generated as vector drawables by the OpenIPC brand tool.
minSdk is 31, so the adaptive icon needs no PNG fallback.

Android TV: MainActivity gets a LEANBACK_LAUNCHER intent filter next to the
LAUNCHER one from MainLauncher, so the app shows up on the TV home screen
with the banner. android.software.leanback and android.hardware.touchscreen
are declared not required, so the same APK still targets phones and tablets
and installs on TV boxes without a touchscreen. The microphone implied by
RECORD_AUDIO (push-to-talk) is declared not required for the same reason.

The launcher label becomes "Viewer": the icon already carries "OpenIPC", so
the name under it no longer repeats it. MainActivity now takes its label
from @string/app_name instead of a hard-coded string. In-app titles
(window title, welcome screen, tray tooltip) are unchanged.
@qodo-free-for-open-source-projects

Copy link
Copy Markdown

PR Summary by Qodo

Brand the Android launcher and add an Android TV home-screen entry

✨ Enhancement ⚙️ Configuration changes 🕐 10-20 Minutes

Grey Divider

AI Description

• Replace legacy launcher PNGs with an OpenIPC adaptive icon and Android TV banner.
• Add a TV home-screen entry while keeping the APK installable on phones and TV boxes.
• Shorten the launcher label to “Viewer” without changing in-app titles.
Diagram

graph TD
  I["Adaptive icon"] --> M["Android manifest"] --> P(["Phone launcher"]) --> A["MainActivity"]
  B["TV banner"] --> M --> T(["TV home"]) --> A
  L["Viewer label"] --> M
Loading
High-Level Assessment

Keep the shared APK and vector-based adaptive icon: minSdk 31 removes the need for a PNG fallback, and optional hardware declarations allow phone and TV distribution together. A separate TV build would add packaging overhead without a clear benefit for these launcher-only changes.

Files changed (7) +89 / -5

Enhancement (5) +76 / -2
MainActivity.csAdd a leanback launcher entry to MainActivity +8/-2

Add a leanback launcher entry to MainActivity

• Adds an Android TV launcher intent filter alongside the existing phone launcher entry. The activity now references the adaptive icon and shared app-name string instead of hard-coded launcher branding.

src/OpenIPC.Viewer.Android/MainActivity.cs

banner.xmlAdd the OpenIPC Viewer Android TV banner +32/-0

Add the OpenIPC Viewer Android TV banner

• Adds a generated 320-by-180 vector banner for the TV home-screen entry.

src/OpenIPC.Viewer.Android/Resources/drawable/banner.xml

ic_launcher_background.xmlAdd the adaptive icon background +6/-0

Add the adaptive icon background

• Defines the solid OpenIPC brand-color background for the adaptive launcher icon.

src/OpenIPC.Viewer.Android/Resources/drawable/ic_launcher_background.xml

ic_launcher_foreground.xmlAdd the adaptive icon foreground artwork +22/-0

Add the adaptive icon foreground artwork

• Adds generated vector artwork containing the OpenIPC sign and wordmark for the launcher icon.

src/OpenIPC.Viewer.Android/Resources/drawable/ic_launcher_foreground.xml

ic_launcher.xmlCompose the adaptive launcher icon +8/-0

Compose the adaptive launcher icon

• Combines the background and foreground drawables into an adaptive icon. Also supplies a monochrome layer for themed icons.

src/OpenIPC.Viewer.Android/Resources/mipmap-anydpi-v26/ic_launcher.xml

Other (2) +13 / -3
AndroidManifest.xmlRegister TV branding and optional device features +12/-2

Register TV branding and optional device features

• Points application icon and round icon metadata to the adaptive icon and registers the TV banner. Declares leanback, touchscreen, and microphone hardware optional so their absence does not block installation.

src/OpenIPC.Viewer.Android/Properties/AndroidManifest.xml

strings.xmlShorten the Android launcher name to Viewer +1/-1

Shorten the Android launcher name to Viewer

• Changes app_name from “OpenIPC Viewer” to “Viewer,” avoiding repetition of the brand name shown in the icon.

src/OpenIPC.Viewer.Android/Resources/values/strings.xml

@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)

Grey Divider


Action required

1. TV remote users cannot open cameras ✓ Resolved
Description
The new TV launcher entry and optional touchscreen feature expose camera selection to remote-only
devices, but camera rows and live tiles open cameras only from Tapped handlers on non-focusable
containers. On a TV without touch input, D-pad activation cannot trigger either handler, so users
cannot open a camera from the library or live grid.
Code

src/OpenIPC.Viewer.Android/MainActivity.cs[R27-29]

+[IntentFilter(
+    new[] { global::Android.Content.Intent.ActionMain },
+    Categories = new[] { global::Android.Content.Intent.CategoryLeanbackLauncher })]
Evidence
The changed activity advertises a TV launcher entry, and the changed manifest explicitly permits
devices without touchscreens. The library row and grid tile are containers wired to tap events;
their handlers are the paths that execute camera opening, while the library row's child buttons
perform other actions.

src/OpenIPC.Viewer.Android/MainActivity.cs[24-29]
src/OpenIPC.Viewer.Android/Properties/AndroidManifest.xml[5-9]
src/OpenIPC.Viewer.App/Views/Pages/CameraLibraryPage.axaml[244-253]
src/OpenIPC.Viewer.App/Views/Pages/CameraLibraryPage.axaml[343-373]
src/OpenIPC.Viewer.App/Views/Pages/CameraLibraryPage.axaml.cs[127-141]
src/OpenIPC.Viewer.App/Views/Pages/GridPage.axaml[263-272]
src/OpenIPC.Viewer.App/Views/Pages/GridPage.axaml.cs[209-220]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The TV entry permits remote-only use, but neither camera rows nor live tiles can be activated through D-pad focus and selection.
## Fix Focus Areas
- src/OpenIPC.Viewer.Android/MainActivity.cs[27-29]
- src/OpenIPC.Viewer.App/Views/Pages/CameraLibraryPage.axaml[247-253]
- src/OpenIPC.Viewer.App/Views/Pages/GridPage.axaml[267-272]
- src/OpenIPC.Viewer.App/Views/Pages/CameraLibraryPage.axaml.cs[127-137]
- src/OpenIPC.Viewer.App/Views/Pages/GridPage.axaml.cs[209-220]
## Recommended Fix
Provide focusable, keyboard-activatable camera selection on both surfaces, routing Enter/D-pad select through the existing open-camera actions while preserving touch behavior. Verify both paths on a D-pad-only TV device.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Tip of the day
💡 Did you know, you can tweak Display settings with a live preview to see your comment before it ships

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

@keyldev

keyldev commented Nov 2, 2026

Copy link
Copy Markdown
Collaborator

Looks good

The new Android TV entry lets the app run on boxes with only a D-pad
remote, but camera rows (Library) and live tiles (Live) opened a camera
only from Tapped on non-focusable containers, so a remote could not reach
or activate them.

Both containers are now Focusable and open the camera on Enter or Space
(Avalonia.Android maps the D-pad OK key, DpadCenter, to Key.Space). The
D-pad already moves focus between them through Avalonia's XY focus
navigation for remotes, and the default focus adorner shows which one is
selected. Keys raised by the row's or tile's own buttons are left to those
buttons. Touch and mouse behaviour is unchanged.

Checked on an Android TV 16 emulator with D-pad input only: focus reaches
the library row and the grid tile, and OK opens the camera from both.
@keyldev
keyldev merged commit e671ae7 into main Nov 3, 2026
6 checks passed
@compot-dev
compot-dev deleted the feat/brand-icon branch November 4, 2026 10:09
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.

2 participants