Skip to content

UI Improvements, illegal devamp

Choose a tag to compare

@ChimeraAnt-DEV ChimeraAnt-DEV released this 16 Sep 17:41
· 220 commits to main since this release
8fd9513

What this changes

Two things: fixing version imports for the bundles people actually have, and filling the two gaps in the top-level navigation.

Import fixes

  • .xapk/.apkm bundles now import. The extension gate only accepted .apk/.apks, so valid bundles for older Bedrock builds were refused before they were ever opened — even though the file picker advertises application/zip and the version-manager layout names .xapk. Bundle handling is now centralised in GameBundle, shared by the installer and the version-name lookup.
  • XAPK base-APK detection. XAPK bundles name their base APK after the package rather than base.apk, so the old check never found a base and the ABI gate then saw no native libraries and rejected the import.
  • Re-signed and older APKs are no longer rejected as "Not a Minecraft APK". When the package manifest cannot be read, Minecraft is now also identified by the presence of libminecraftpe.so, and the version name falls back to the file name.

Navigation

  • Mods is now a nav tab. It was previously reachable only from a home-screen card.
  • Controller bumper/D-pad tab switching (L1/R1, L2/R2, D-pad left/right, wrapping at both ends). LauncherTab is the single source of truth for tab order, activity mapping and key handling.
  • Two guards on that behaviour: ControllerActivity opts out via shouldHandleNavKeys() because it needs raw presses for button highlighting, and switching is suppressed during a game session.
  • Nav tabs gained press feedback via the existing DynamicAnim.applyPressScale, which respects the "show animations" setting and cancels cleanly when a tap becomes a scroll.
  • The nav bar itself already existed and is runtime-injected by BaseActivity; this extends it rather than adding a competing bar. A prototype focus_ring token was dropped, since no focus system consumed it.

Docs

  • AGENTS.md documents the nav architecture and its guards, and records that Java Edition is an unimplemented stub (see below), so these non-obvious constraints survive the next session.

Verification

  • ./gradlew :app:testDebugUnitTest :app:compileDebugKotlin :app:compileDebugJavaWithJavac — BUILD SUCCESSFUL, 100 tests, 0 failures (9 new LauncherTabTest, 5 new GameBundleTest).
  • ./gradlew :app:assembleDebug — full APK builds; libgxcore.so present in lib/arm64-v8a/.
  • There is no emulator or device in this environment, so on-device behaviour is unverified. GameBundleTest covers bundle detection against real archives.

Notes

  • The ABI/dual-ABI work is already in main (merged via #51), so it is not part of this PR. This branch was originally based on that work; the PR diff correctly shows only the changes above.
  • Java Edition is not implemented and is deliberately not added here. core/javaedition/JavaEditionModManager returns true from isJavaEditionSupported() unconditionally and points at /system/bin/java, which does not exist on Android; nothing consumes its launch config, and its strings are referenced by no layout or activity. It is documented as a stub so it is not mistaken for a working feature. Real support would require a bundled per-architecture JRE, a custom LWJGL, and a GL→GLES/Vulkan translation layer, and it conflicts with this project's Apache-2.0 license (PojavLauncher is GPL-3.0, Amethyst-Android is LGPL-3.0). Out of scope for this PR.