From 95eee0cab2ff912c68a9f368a3d7ac7480e30bf5 Mon Sep 17 00:00:00 2001 From: rdb Date: Sat, 17 Feb 2018 20:07:58 +0100 Subject: [PATCH] android: load prc files from assets. Move assets to /android_asset --- makepanda/makepanda.py | 3 ++- panda/src/android/android_main.cxx | 35 +++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index ad974d38d0..3f75af73e4 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -7525,9 +7525,10 @@ def MakeInstallerAndroid(): continue copy_library(source, base) - # Copy the models as well. + # Copy the models and config files to the virtual assets filesystem. oscmd("mkdir apkroot/assets") oscmd("cp -R %s apkroot/assets/models" % (os.path.join(GetOutputDir(), "models"))) + oscmd("cp -R %s apkroot/assets/etc" % (os.path.join(GetOutputDir(), "etc"))) # Make an empty res folder. It's needed for the apk to be installable, apparently. oscmd("mkdir apkroot/res") diff --git a/panda/src/android/android_main.cxx b/panda/src/android/android_main.cxx index 05a98b768c..7d4e75e4b2 100644 --- a/panda/src/android/android_main.cxx +++ b/panda/src/android/android_main.cxx @@ -133,7 +133,8 @@ void android_main(struct android_app* app) { asset_mount = new VirtualFileMountAndroidAsset(app->activity->assetManager, apk_fn); VirtualFileSystem *vfs = VirtualFileSystem::get_global_ptr(); - Filename asset_dir(apk_fn.get_dirname(), "assets"); + //Filename asset_dir(apk_fn.get_dirname(), "assets"); + Filename asset_dir("/android_asset"); vfs->mount(asset_mount, asset_dir, 0); // Release the apk_path. @@ -143,6 +144,33 @@ void android_main(struct android_app* app) { //TODO: prevent it from adding the directory multiple times. get_model_path().append_directory(asset_dir); + // Now load the configuration files. + vector pages; + ConfigPageManager *cp_mgr; + AAssetDir *etc = AAssetManager_openDir(app->activity->assetManager, "etc"); + if (etc != nullptr) { + cp_mgr = ConfigPageManager::get_global_ptr(); + const char *filename = AAssetDir_getNextFileName(etc); + while (filename != nullptr) { + // Does it match any of the configured prc patterns? + for (size_t i = 0; i < cp_mgr->get_num_prc_patterns(); ++i) { + GlobPattern pattern = cp_mgr->get_prc_pattern(i); + if (pattern.matches(filename)) { + Filename prc_fn("etc", filename); + istream *in = asset_mount->open_read_file(prc_fn); + if (in != nullptr) { + ConfigPage *page = cp_mgr->make_explicit_page(Filename("/android_asset", prc_fn)); + page->read_prc(*in); + pages.push_back(page); + } + break; + } + } + filename = AAssetDir_getNextFileName(etc); + } + AAssetDir_close(etc); + } + // Also read the intent filename. methodID = env->GetMethodID(activity_class, "getIntentDataPath", "()Ljava/lang/String;"); jstring filename = (jstring) env->CallObjectMethod(activity->clazz, methodID); @@ -229,6 +257,11 @@ void android_main(struct android_app* app) { android_cat.info() << "Destroy requested, exiting from android_main\n"; + for (ConfigPage *page : pages) { + cp_mgr->delete_explicit_page(page); + } + vfs->unmount(asset_mount); + if (filename_str != nullptr) { env->ReleaseStringUTFChars(filename, filename_str); }