Repository navigation
UI Improvements, illegal devamp
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/.apkmbundles 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 advertisesapplication/zipand the version-manager layout names.xapk. Bundle handling is now centralised inGameBundle, 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).
LauncherTabis the single source of truth for tab order, activity mapping and key handling. - Two guards on that behaviour:
ControllerActivityopts out viashouldHandleNavKeys()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 prototypefocus_ringtoken was dropped, since no focus system consumed it.
Docs
AGENTS.mddocuments 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 newLauncherTabTest, 5 newGameBundleTest)../gradlew :app:assembleDebug— full APK builds;libgxcore.sopresent inlib/arm64-v8a/.- There is no emulator or device in this environment, so on-device behaviour is unverified.
GameBundleTestcovers 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/JavaEditionModManagerreturnstruefromisJavaEditionSupported()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.