Browse Source

Cache Folders count in RAM

merge-requests/509/head
Geoffrey Métais 7 years ago
committed by Nicolas Pomepuy
parent
commit
283f3e170f
  1. 14
      medialibrary/jni/medialibrary.cpp
  2. 4
      medialibrary/jni/utils.cpp
  3. 2
      medialibrary/jni/utils.h
  4. 6
      medialibrary/src/org/videolan/medialibrary/MLServiceLocator.java
  5. 6
      medialibrary/src/org/videolan/medialibrary/interfaces/media/Folder.java
  6. 5
      medialibrary/src/org/videolan/medialibrary/media/FolderImpl.java
  7. 4
      medialibrary/src/org/videolan/medialibrary/stubs/StubDataSource.java
  8. 4
      medialibrary/src/org/videolan/medialibrary/stubs/StubFolder.java

14
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,
"<init>", "(JLjava/lang/String;Ljava/lang/String;)V");
"<init>", "(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,
"<init>", "(JLjava/lang/String;Ljava/lang/String;)V");
"<init>", "(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) {

4
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;

2
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);

6
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);
}
}

6
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<Folder> CREATOR = new Parcelable.Creator<Folder>() {
@ -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) {

5
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;
}

4
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<String> 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));
}
}
}

4
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);

Loading…
Cancel
Save