Browse Source

Implement GameActivity.buildFileLookup

Miku AuahDark 4 years ago
parent
commit
ab850bfc5d
2 changed files with 61 additions and 3 deletions
  1. 1 1
      love/src/jni/love
  2. 60 2
      love/src/main/java/org/love2d/android/GameActivity.java

+ 1 - 1
love/src/jni/love

@@ -1 +1 @@
-Subproject commit b79b99bbaa60fb283d160782e5b31f953b43760c
+Subproject commit 3a18a2ab0d40a13e986d6032b0cb2c53b8283094

+ 60 - 2
love/src/main/java/org/love2d/android/GameActivity.java

@@ -22,13 +22,16 @@ package org.love2d.android;
 
 
 import org.libsdl.app.SDLActivity;
 import org.libsdl.app.SDLActivity;
 
 
-import java.util.List;
 import java.io.BufferedOutputStream;
 import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStream;
-import java.util.zip.ZipFile;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 
 import android.Manifest;
 import android.Manifest;
 import android.app.AlertDialog;
 import android.app.AlertDialog;
@@ -545,6 +548,61 @@ public class GameActivity extends SDLActivity {
         return getResources().getAssets();
         return getResources().getAssets();
     }
     }
 
 
+    @Keep
+    public String[] buildFileTree() {
+        // Map key is path, value is directory flag
+        HashMap<String, Boolean> map = buildFileTree(getAssets(), "", new HashMap<String, Boolean>());
+        ArrayList<String> result = new ArrayList<String>();
+
+        for (Map.Entry<String, Boolean> data: map.entrySet()) {
+            result.add((data.getValue() ? "d" : "f") + data.getKey());
+        }
+
+        String[] r = new String[result.size()];
+        result.toArray(r);
+        return r;
+    }
+
+    private HashMap<String, Boolean> buildFileTree(AssetManager assetManager, String dir, HashMap<String, Boolean> map) {
+        String strippedDir = dir.endsWith("/") ? dir.substring(0, dir.length() - 1) : dir;
+
+        // Try open dir
+        try {
+            InputStream test = assetManager.open(strippedDir);
+            // It's a file
+            test.close();
+            map.put(strippedDir, false);
+        } catch (FileNotFoundException e) {
+            // It's a directory
+            String[] list = null;
+
+            // List files
+            try {
+                list = assetManager.list(dir);
+            } catch (IOException e2) {
+                Log.e("GameActivity", dir, e2);
+            }
+
+            // Mark as file
+            map.put(dir, true);
+
+            // This Object comparison is intentional.
+            if (strippedDir != dir) {
+                map.put(strippedDir, true);
+            }
+
+            if (list != null) {
+                for (String path: list) {
+                    buildFileTree(assetManager, dir + path + "/", map);
+                }
+            }
+        } catch (IOException e) {
+            Log.e("GameActivity", dir, e);
+        }
+
+        return map;
+    }
+
     public int getAudioSMP() {
     public int getAudioSMP() {
         int smp = 256;
         int smp = 256;