[Android] Optimize the DirectoryAdapter a bit by not precaching if there are more than 6 subitems

Edward Wang git at videolan.org
Sat Jun 23 20:58:57 CEST 2012


android | branch: master | Edward Wang <edward.c.wang at compdigitec.com> | Sat Jun 23 14:58:39 2012 -0400| [a45c0972cd04a8d7f3f12ca55d72a3589989863d] | committer: Edward Wang

Optimize the DirectoryAdapter a bit by not precaching if there are more than 6 subitems

> http://git.videolan.org/gitweb.cgi/android.git/?a=commit;h=a45c0972cd04a8d7f3f12ca55d72a3589989863d
---

 vlc-android/jni/libvlcjni.c                        |   33 ++++++++++++++++++++
 vlc-android/src/org/videolan/vlc/LibVLC.java       |    2 ++
 .../src/org/videolan/vlc/gui/DirectoryAdapter.java |   10 +++---
 3 files changed, 41 insertions(+), 4 deletions(-)

diff --git a/vlc-android/jni/libvlcjni.c b/vlc-android/jni/libvlcjni.c
index 88177d6..3ccdce9 100644
--- a/vlc-android/jni/libvlcjni.c
+++ b/vlc-android/jni/libvlcjni.c
@@ -18,8 +18,11 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
+#include <dirent.h>
+#include <errno.h>
 #include <string.h>
 #include <pthread.h>
+#include <sys/types.h>
 
 #include <vlc/vlc.h>
 #include <vlc_common.h>
@@ -945,3 +948,33 @@ jint Java_org_videolan_vlc_LibVLC_setSpuTrack(JNIEnv *env, jobject thiz, jint in
         return libvlc_video_set_spu(mp, index);
     return -1;
 }
+
+jint Java_org_videolan_vlc_LibVLC_nativeCountDirectoryContents(JNIEnv *env, jobject thiz, jstring path)
+{
+    jboolean isCopy;
+    /* Get C string */
+    const char* psz_path = (*env)->GetStringUTFChars(env, path, &isCopy);
+
+    jint childrenCount = 0;
+    DIR* p_dir = opendir(psz_path);
+    if(!p_dir)
+        return 0;
+
+    struct dirent* p_dirent;
+    while(1) {
+        errno = 0;
+        p_dirent = readdir(p_dir);
+        if(p_dirent == NULL) {
+            if(errno > 0) /* error reading this entry */
+                continue;
+            else if(errno == 0) /* end of stream */
+                break;
+        }
+        childrenCount++;
+    }
+    closedir(p_dir);
+
+    /* Clean up */
+    (*env)->ReleaseStringUTFChars(env, path, psz_path);
+    return childrenCount;
+}
diff --git a/vlc-android/src/org/videolan/vlc/LibVLC.java b/vlc-android/src/org/videolan/vlc/LibVLC.java
index bbbb5fc..47d1f46 100644
--- a/vlc-android/src/org/videolan/vlc/LibVLC.java
+++ b/vlc-android/src/org/videolan/vlc/LibVLC.java
@@ -408,6 +408,8 @@ public class LibVLC {
 
     public native String nativeToURI(String path);
 
+    public native int nativeCountDirectoryContents(String path);
+
     /**
      * Return the length of the stream, in milliseconds
      */
diff --git a/vlc-android/src/org/videolan/vlc/gui/DirectoryAdapter.java b/vlc-android/src/org/videolan/vlc/gui/DirectoryAdapter.java
index dec54f8..38ae3be 100644
--- a/vlc-android/src/org/videolan/vlc/gui/DirectoryAdapter.java
+++ b/vlc-android/src/org/videolan/vlc/gui/DirectoryAdapter.java
@@ -151,10 +151,12 @@ public class DirectoryAdapter extends BaseAdapter {
                 if(files[i].isFile())
                     nss.setIsFile();
 
-                /*String mCurrentDir_old = mCurrentDir;
-                mCurrentDir = MRL;
-                this.populateNode(nss, MRL + "/" + nss.name);
-                mCurrentDir = mCurrentDir_old;*/
+                if(nss.isFile() && LibVLC.getExistingInstance().nativeCountDirectoryContents(MRL + "/" + nss.name) < 6) {
+                    String mCurrentDir_old = mCurrentDir;
+                    mCurrentDir = MRL;
+                    this.populateNode(nss, MRL + "/" + nss.name);
+                    mCurrentDir = mCurrentDir_old;
+                }
 
                 n.children.add(nss);
             }



More information about the Android mailing list