From 283f3e170f1dc2868c46f99916130b155bc57358 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Geoffrey=20M=C3=A9tais?= Date: Tue, 25 Feb 2020 16:11:52 +0100 Subject: [PATCH] Cache Folders count in RAM --- medialibrary/jni/medialibrary.cpp | 14 ++++++++++---- medialibrary/jni/utils.cpp | 4 ++-- medialibrary/jni/utils.h | 2 +- .../videolan/medialibrary/MLServiceLocator.java | 6 +++--- .../medialibrary/interfaces/media/Folder.java | 6 +++++- .../videolan/medialibrary/media/FolderImpl.java | 5 +++-- .../medialibrary/stubs/StubDataSource.java | 4 ++-- .../videolan/medialibrary/stubs/StubFolder.java | 4 ++-- 8 files changed, 28 insertions(+), 17 deletions(-) diff --git a/medialibrary/jni/medialibrary.cpp b/medialibrary/jni/medialibrary.cpp index 276a09bc9..de13c6830 100644 --- a/medialibrary/jni/medialibrary.cpp +++ b/medialibrary/jni/medialibrary.cpp @@ -1717,7 +1717,10 @@ subFolders(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint sorti jobjectArray foldersRefs = (jobjectArray) env->NewObjectArray(foldersList.size(), ml_fields.Folder.clazz, NULL); int index = -1; for(medialibrary::FolderPtr const& folder : foldersList) { - jobject item = convertFolderObject(env, &ml_fields, folder); + const auto query = aml->mediaFromFolder(folder->id(), medialibrary::IMedia::Type::Video); + int count = (query != nullptr ? query->count() : 0); + + jobject item = convertFolderObject(env, &ml_fields, folder, count); env->SetObjectArrayElement(foldersRefs, ++index, item); env->DeleteLocalRef(item); } @@ -1745,7 +1748,10 @@ folders(JNIEnv* env, jobject thiz, jint type, jint sortingCriteria, jboolean des for(medialibrary::FolderPtr const& folder : foldersList) { try { - jobject item = convertFolderObject(env, &ml_fields, folder); + const auto query = aml->mediaFromFolder(folder->id(), (medialibrary::IMedia::Type)type); + int count = (query != nullptr ? query->count() : 0); + + jobject item = convertFolderObject(env, &ml_fields, folder, count); env->SetObjectArrayElement(foldersRefs, ++index, item); env->DeleteLocalRef(item); } @@ -2124,7 +2130,7 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved) GET_ID(GetMethodID, ml_fields.Folder.initID, ml_fields.Folder.clazz, - "", "(JLjava/lang/String;Ljava/lang/String;)V"); + "", "(JLjava/lang/String;Ljava/lang/String;I)V"); GET_CLASS(ml_fields.Genre.clazz, "org/videolan/medialibrary/media/GenreImpl", true); if (env->RegisterNatives(ml_fields.Genre.clazz, genre_methods, sizeof(genre_methods) / sizeof(genre_methods[0])) < 0) { @@ -2181,7 +2187,7 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved) GET_ID(GetMethodID, ml_fields.Folder.initID, ml_fields.Folder.clazz, - "", "(JLjava/lang/String;Ljava/lang/String;)V"); + "", "(JLjava/lang/String;Ljava/lang/String;I)V"); GET_CLASS(ml_fields.VideoGroup.clazz, "org/videolan/medialibrary/media/VideoGroupImpl", true); if (env->RegisterNatives(ml_fields.VideoGroup.clazz, videogroup_methods, sizeof(videogroup_methods) / sizeof(videogroup_methods[0])) < 0) { diff --git a/medialibrary/jni/utils.cpp b/medialibrary/jni/utils.cpp index 0182a07ae..1a7b26b54 100644 --- a/medialibrary/jni/utils.cpp +++ b/medialibrary/jni/utils.cpp @@ -148,12 +148,12 @@ convertPlaylistObject(JNIEnv* env, fields *fields, medialibrary::PlaylistPtr con } jobject -convertFolderObject(JNIEnv* env, fields *fields, medialibrary::FolderPtr const& folderPtr) +convertFolderObject(JNIEnv* env, fields *fields, medialibrary::FolderPtr const& folderPtr, int count) { jstring name = env->NewStringUTF(folderPtr->name().c_str()); jstring mrl = env->NewStringUTF(folderPtr->mrl().c_str()); jobject item = env->NewObject(fields->Folder.clazz, fields->Folder.initID, - (jlong) folderPtr->id(), name, mrl); + (jlong) folderPtr->id(), name, mrl, (jint) count); env->DeleteLocalRef(name); env->DeleteLocalRef(mrl); return item; diff --git a/medialibrary/jni/utils.h b/medialibrary/jni/utils.h index a6a00f6b5..e5dcdf9a2 100644 --- a/medialibrary/jni/utils.h +++ b/medialibrary/jni/utils.h @@ -129,7 +129,7 @@ jobject convertAlbumObject(JNIEnv* env, fields *fields, medialibrary::AlbumPtr c jobject convertArtistObject(JNIEnv* env, fields *fields, medialibrary::ArtistPtr const& artistPtr); jobject convertGenreObject(JNIEnv* env, fields *fields, medialibrary::GenrePtr const& genrePtr); jobject convertPlaylistObject(JNIEnv* env, fields *fields, medialibrary::PlaylistPtr const& genrePtr); -jobject convertFolderObject(JNIEnv* env, fields *fields, medialibrary::FolderPtr const& folderPtr); +jobject convertFolderObject(JNIEnv* env, fields *fields, medialibrary::FolderPtr const& folderPtr, int count); jobject convertVideoGroupObject(JNIEnv* env, fields *fields, medialibrary::MediaGroupPtr const& videogroupPtr); jobject convertSearchAggregateObject(JNIEnv* env, fields *fields, medialibrary::SearchAggregate const& searchAggregatePtr); jobjectArray filteredArray(JNIEnv* env, jobjectArray array, jclass clazz, int removalCount = -1); diff --git a/medialibrary/src/org/videolan/medialibrary/MLServiceLocator.java b/medialibrary/src/org/videolan/medialibrary/MLServiceLocator.java index a655ade38..95c9bb275 100644 --- a/medialibrary/src/org/videolan/medialibrary/MLServiceLocator.java +++ b/medialibrary/src/org/videolan/medialibrary/MLServiceLocator.java @@ -171,11 +171,11 @@ public class MLServiceLocator { } //FolderImpl - public static Folder getAbstractFolder(long id, String name, String mrl) { + public static Folder getAbstractFolder(long id, String name, String mrl, int count) { if (sMode == LocatorMode.VLC_ANDROID) { - return new FolderImpl(id, name, mrl); + return new FolderImpl(id, name, mrl, count); } else { - return new StubFolder(id, name, mrl); + return new StubFolder(id, name, mrl, count); } } diff --git a/medialibrary/src/org/videolan/medialibrary/interfaces/media/Folder.java b/medialibrary/src/org/videolan/medialibrary/interfaces/media/Folder.java index 67750177d..56dd4ca40 100644 --- a/medialibrary/src/org/videolan/medialibrary/interfaces/media/Folder.java +++ b/medialibrary/src/org/videolan/medialibrary/interfaces/media/Folder.java @@ -14,10 +14,12 @@ public abstract class Folder extends MediaLibraryItem { public static int TYPE_FOLDER_STREAM = 4; public String mMrl; + protected int mMediaCount; - public Folder(long id, String name, String mrl) { + public Folder(long id, String name, String mrl, int count) { super(id, name); mMrl = mrl; + mMediaCount = count; } abstract public MediaWrapper[] media(int type, int sort, boolean desc, int nbItems, int offset); @@ -50,6 +52,7 @@ public abstract class Folder extends MediaLibraryItem { public void writeToParcel(Parcel parcel, int i) { super.writeToParcel(parcel, i); parcel.writeString(mMrl); + parcel.writeInt(mMediaCount); } public static Parcelable.Creator CREATOR = new Parcelable.Creator() { @@ -67,6 +70,7 @@ public abstract class Folder extends MediaLibraryItem { public Folder(Parcel in) { super(in); this.mMrl = in.readString(); + this.mMediaCount = in.readInt(); } public boolean equals(Folder other) { diff --git a/medialibrary/src/org/videolan/medialibrary/media/FolderImpl.java b/medialibrary/src/org/videolan/medialibrary/media/FolderImpl.java index a0809971c..a61a54ec8 100644 --- a/medialibrary/src/org/videolan/medialibrary/media/FolderImpl.java +++ b/medialibrary/src/org/videolan/medialibrary/media/FolderImpl.java @@ -9,8 +9,8 @@ import org.videolan.medialibrary.interfaces.media.MediaWrapper; @SuppressWarnings("JniMissingFunction") public class FolderImpl extends Folder { - public FolderImpl(long id, String name, String mrl) { - super(id, name, mrl); + public FolderImpl(long id, String name, String mrl, int count) { + super(id, name, mrl, count); } public FolderImpl(Parcel in) { @@ -23,6 +23,7 @@ public class FolderImpl extends Folder { } public int mediaCount(int type) { + if (type == TYPE_FOLDER_VIDEO) return mMediaCount; final Medialibrary ml = Medialibrary.getInstance(); return ml.isInitiated() ? nativeMediaCount(ml, mId, type) : 0; } diff --git a/medialibrary/src/org/videolan/medialibrary/stubs/StubDataSource.java b/medialibrary/src/org/videolan/medialibrary/stubs/StubDataSource.java index dddd4fe47..2324ce00b 100644 --- a/medialibrary/src/org/videolan/medialibrary/stubs/StubDataSource.java +++ b/medialibrary/src/org/videolan/medialibrary/stubs/StubDataSource.java @@ -121,7 +121,7 @@ public class StubDataSource { } public Folder createFolder(String name) { - Folder folder = MLServiceLocator.getAbstractFolder(getUUID(), name, baseMrl + name); + Folder folder = MLServiceLocator.getAbstractFolder(getUUID(), name, baseMrl + name, 1); mFolders.add(folder); return folder; } @@ -570,7 +570,7 @@ public class StubDataSource { ArrayList mlFolders = new ArrayList<>(Arrays.asList(getFoldersString())); if (!mlFolders.contains(mrl)) { final String name = folderArray[folderArray.length - 1]; - mFolders.add(MLServiceLocator.getAbstractFolder(getUUID(), name, mrl)); + mFolders.add(MLServiceLocator.getAbstractFolder(getUUID(), name, mrl, 1)); } } } diff --git a/medialibrary/src/org/videolan/medialibrary/stubs/StubFolder.java b/medialibrary/src/org/videolan/medialibrary/stubs/StubFolder.java index b3781b1d8..3df9ee16a 100644 --- a/medialibrary/src/org/videolan/medialibrary/stubs/StubFolder.java +++ b/medialibrary/src/org/videolan/medialibrary/stubs/StubFolder.java @@ -14,8 +14,8 @@ public class StubFolder extends Folder { private StubDataSource dt = StubDataSource.getInstance(); - public StubFolder(long id, String name, String mrl) { - super(id, name, mrl); + public StubFolder(long id, String name, String mrl, int count) { + super(id, name, mrl, count); } public StubFolder(Parcel in) { super(in);