diff --git a/docs/vr-apks.md b/docs/vr-apks.md index 8d31cc3..e57325c 100644 --- a/docs/vr-apks.md +++ b/docs/vr-apks.md @@ -100,8 +100,11 @@ VR apps default to immersive mode without the flatscreen marker. The upload selector or CLI `--flat` / `--vr` overrides that choice. Compatibility notes identify legacy VrApi, Meta platform SDK and OpenXR libraries. -If a VR MAIN intent filter lacks LAUNCHER, Frame Control inserts it, repacks -and v2-signs the APK locally before copying it; `meta.json` records +Lepton only starts an `` whose MAIN intent filter has LAUNCHER; it +ignores ``, which is where Godot 4 exports put LAUNCHER. When no +real activity qualifies, Frame Control adds LAUNCHER to the VR activity's MAIN +filter, or to the activity the launcher alias targets, then repacks and v2-signs +the APK locally before copying it; `meta.json` records `"patched": ["launcher"]`. Unchanged ZIP members retain their compressed bytes; stored libraries are aligned to 16 KiB. The RSA signing identity lives in Frame Control's per-user app-data directory as `apk-signing-key.json` diff --git a/tests/test_frame_apk_vr.py b/tests/test_frame_apk_vr.py index da87d15..49a56ca 100644 --- a/tests/test_frame_apk_vr.py +++ b/tests/test_frame_apk_vr.py @@ -21,11 +21,11 @@ from test_frame_apk import pool DEFAULT = 'android.intent.category.DEFAULT' -def manifest(utf8=False, launcher=False, category=None, samsung=False, split=False, alias=False): +def manifest(utf8=False, launcher=False, category=None, samsung=False, split=False, alias=False, splash=False): strings = ['manifest', 'package', 'org.test.vr', 'application', 'activity', 'intent-filter', 'action', 'category', 'name', vr.MAIN, category or next(iter(sorted(vr.VR))), vr.LAUNCHER, 'http://schemas.android.com/apk/res/android', 'meta-data', 'value', - 'com.samsung.android.vr.application.mode', 'vr_only', 'activity-alias', DEFAULT, next(iter(sorted(vr.VR)))] + 'com.samsung.android.vr.application.mode', 'vr_only', 'activity-alias', DEFAULT, next(iter(sorted(vr.VR))), 'targetActivity', '.Splash', '.Game'] def start(tag, attrs=()): body = struct.pack(' + targets = [f for f in targets if f['activity'] in aimed] or targets launchable = any(LAUNCHER in f['categories'] for f in real) return {'launchable': launchable, 'repairable': not launchable and bool(targets), 'vr_activity': bool(vr_filters), 'vr': bool(vr_filters) or samsung}, targets