Browse Source

android: load prc files from assets. Move assets to /android_asset

rdb 7 years ago
parent
commit
95eee0cab2
2 changed files with 36 additions and 2 deletions
  1. 2 1
      makepanda/makepanda.py
  2. 34 1
      panda/src/android/android_main.cxx

+ 2 - 1
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")

+ 34 - 1
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<ConfigPage *> 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);
   }