Skip to content

feat(ui): finish the Caramel launcher — splash, modals and live instance actions - #186

Merged
Lynxifyy merged 2 commits into
mainfrom
feat/caramel-ui-splash-modals
Nov 15, 2026
Merged

Lynxifyy merged 2 commits into
mainfrom
feat/caramel-ui-splash-modals

Conversation

@Lynxifyy

@Lynxifyy Lynxifyy commented Nov 15, 2026 •

Copy link
Copy Markdown
Collaborator

What this does

Completes the Caramel UI pack port that PR #185 started. The first port mounted the frame and the six tabs; this one gives the app a cold-start screen and puts a real host behind the account, screenshots, friends and instance-settings surfaces that the tabs point at.

Splash

SplashActivity is the only LAUNCHER entry, so while it was a stub the app never left it. It now warms VersionManager asynchronously and hands over to MainActivity, with a 4s backstop so a stalled store still reaches the launcher (where the readiness state is shown) instead of stranding the user. The screen is Compose (CaramelSplashScreen) on the pack's backdrop, and the window background is the same navy, so the first frame does not flash white.

Modals

CaramelModals / CaramelModalParts add the pack's account menu, account settings, add-account (Microsoft device-code flow), screenshots grid, friends list, add friend, instance settings and the launcher-settings panel. Every one is wired to a real action rather than a demo row: the screenshots grid reads the instance's real folder, the friends list the active account's real Xbox Live friends, and the instance settings drive VersionManager.

Instance actions

MainActivity implements the new Actions (startSignIn, signOut, renameInstance, repairInstance, deleteInstance, openInstanceFolder, addServer, toggleServerFavourite, openScreenshots, openScreenshot, deleteScreenshot). Sign-in runs on the shared network pool rather than a bare thread.

LocalFileOpener is the one audited place an ACTION_VIEW with a content: uri is built, so the folder and screenshot opens are safe and lint-clean. The file: uri the port used is not readable by another app since API 24 and would have opened a chooser that then failed.

CaramelScreenshotInfo, the server port/favourite fields and the cosmetic-kind enum carry the data the new screens draw.

Verification

  • :app:testDebugUnitTest — 3167 tests, 0 failures
  • :app:assembleDebug (incl. NDK) — green
  • :app:lintDebug — green
  • scripts/check_ui_hygiene.py, scripts/verify_berryapi_abi.py, scripts/check_submodules.sh, scripts/validate_release_content.py — clean

Device-only behaviour (real FPS, launch timing, hook behaviour against a real libminecraftpe.so) cannot be measured here; no emulator is available in this environment.

…tance actions

The first port mounted the frame and the six tabs, but left the app with no
cold-start screen and no way to reach the things the tabs point at: the splash
was a stub that drew nothing and started nothing, and the account, screenshots,
instance-settings and friends actions had no host behind them.

Splash
------
SplashActivity is the only LAUNCHER entry, so while it was a stub the app never
left it. It now warms VersionManager asynchronously and hands over to
MainActivity, with a 4s backstop so a stalled store still reaches the launcher
(where the readiness state is shown) instead of stranding the user. The screen is
Compose (CaramelSplashScreen) on the pack's backdrop, and the window background
is the same navy, so the first frame does not flash white.

Modals
------
CaramelModals/CaramelModalParts add the pack's account menu, account settings,
add-account (Microsoft device-code flow), screenshots grid, friends list, add
friend and instance settings, and the launcher-settings panel. Every one is
wired to a real action on MainActivity rather than a demo row: the screenshots
grid reads the instance's real folder, the friends list the active account's real
Xbox Live friends, and the instance settings drive VersionManager.

Instance actions
----------------
MainActivity implements the new Actions (startSignIn, signOut, renameInstance,
repairInstance, deleteInstance, openInstanceFolder, addServer,
toggleServerFavourite, openScreenshots, openScreenshot, deleteScreenshot). Sign-in
runs on the shared network pool rather than a bare thread.

LocalFileOpener is the one audited place an ACTION_VIEW with a content: uri is
built, so the folder and screenshot opens are safe and lint-clean; the file:
uri the port used is not readable by another app since API 24 and would have
opened a chooser that then failed.

CaramelScreenshotInfo, the server port/favourite fields and the cosmetic kind
enum carry the data the new screens draw.

Co-authored-by: openhands <openhands@all-hands.dev>
@Lynxifyy
Lynxifyy marked this pull request as ready for review November 15, 2026 00:33
@Lynxifyy
Lynxifyy merged commit 328ae9e into main Nov 15, 2026
5 checks passed
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