You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2384 lines
109 KiB
2384 lines
109 KiB
#include <stdlib.h>
|
|
|
|
#include <algorithm>
|
|
#include <string>
|
|
|
|
#include <jni.h>
|
|
#include <medialibrary/IDeviceLister.h>
|
|
#include <medialibrary/filesystem/IDevice.h>
|
|
#define LOG_TAG "VLC/JNI/MediaLibrary"
|
|
#include "log.h"
|
|
#include "utils.h"
|
|
#include "AndroidMediaLibrary.h"
|
|
#include <medialibrary/filesystem/Errors.h>
|
|
|
|
static JavaVM *myVm;
|
|
static fields ml_fields;
|
|
static bool m_IsInitialized = false;
|
|
|
|
#define CLASSPATHNAME "org/videolan/medialibrary/Medialibrary"
|
|
|
|
static inline void throw_IllegalStateException(JNIEnv *env, const char *p_error);
|
|
static inline void throw_IllegalArgumentException(JNIEnv *env, const char *p_error);
|
|
static AndroidMediaLibrary *MediaLibrary_getInstanceInternal(JNIEnv *env, jobject thiz);
|
|
AndroidMediaLibrary *MediaLibrary_getInstance(JNIEnv *env, jobject thiz);
|
|
|
|
|
|
static void
|
|
MediaLibrary_setInstance(JNIEnv *env, jobject thiz, AndroidMediaLibrary *p_obj);
|
|
|
|
jint
|
|
init(JNIEnv* env, jobject thiz, jstring dbPath, jstring thumbsPath)
|
|
{
|
|
AndroidMediaLibrary *aml = new AndroidMediaLibrary(myVm, &ml_fields, thiz);
|
|
MediaLibrary_setInstance(env, thiz, aml);
|
|
const char *db_utfchars = env->GetStringUTFChars(dbPath, JNI_FALSE);
|
|
const char *thumbs_utfchars = env->GetStringUTFChars(thumbsPath, JNI_FALSE);
|
|
medialibrary::InitializeResult initCode = aml->initML(db_utfchars, thumbs_utfchars);
|
|
m_IsInitialized = initCode != medialibrary::InitializeResult::Failed;
|
|
env->ReleaseStringUTFChars(dbPath, db_utfchars);
|
|
env->ReleaseStringUTFChars(thumbsPath, thumbs_utfchars);
|
|
return (int) initCode;
|
|
}
|
|
|
|
void
|
|
start(JNIEnv* env, jobject thiz)
|
|
{
|
|
MediaLibrary_getInstance(env, thiz)->start();
|
|
}
|
|
|
|
void
|
|
release(JNIEnv* env, jobject thiz)
|
|
{
|
|
LOGD("/!\\ release medialib. /!\\");
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
delete aml;
|
|
MediaLibrary_setInstance(env, thiz, NULL);
|
|
}
|
|
|
|
void
|
|
clearDatabase(JNIEnv* env, jobject thiz, jboolean restorePlaylists) {
|
|
MediaLibrary_getInstance(env, thiz)->clearDatabase(restorePlaylists);
|
|
}
|
|
|
|
void
|
|
banFolder(JNIEnv* env, jobject thiz, jstring folderPath)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *path = env->GetStringUTFChars(folderPath, JNI_FALSE);
|
|
aml->banFolder(path);
|
|
env->ReleaseStringUTFChars(folderPath, path);
|
|
}
|
|
|
|
void
|
|
unbanFolder(JNIEnv* env, jobject thiz, jstring folderPath)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *path = env->GetStringUTFChars(folderPath, JNI_FALSE);
|
|
aml->unbanFolder(path);
|
|
env->ReleaseStringUTFChars(folderPath, path);
|
|
}
|
|
|
|
jboolean
|
|
addDevice(JNIEnv* env, jobject thiz, jstring uuid, jstring storagePath, jboolean removable)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *uuidChar = env->GetStringUTFChars(uuid, JNI_FALSE);
|
|
const char *path = env->GetStringUTFChars(storagePath, JNI_FALSE);
|
|
jboolean isNew = aml->addDevice(uuidChar, path, removable);
|
|
env->ReleaseStringUTFChars(uuid, uuidChar);
|
|
env->ReleaseStringUTFChars(storagePath, path);
|
|
return isNew;
|
|
}
|
|
|
|
jobjectArray
|
|
devices(JNIEnv* env, jobject thiz)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
auto devices = aml->devices();
|
|
jobjectArray deviceRefs = (jobjectArray) env->NewObjectArray(devices.size(), env->FindClass("java/lang/String"), NULL);
|
|
int index = -1;
|
|
for(auto device : devices) {
|
|
jstring path = env->NewStringUTF(std::get<1>(device).c_str());
|
|
env->SetObjectArrayElement(deviceRefs, ++index, path);
|
|
env->DeleteLocalRef(path);
|
|
}
|
|
return deviceRefs;
|
|
}
|
|
|
|
void
|
|
discover(JNIEnv* env, jobject thiz, jstring storagePath)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *path = env->GetStringUTFChars(storagePath, JNI_FALSE);
|
|
aml->discover(path);
|
|
env->ReleaseStringUTFChars(storagePath, path);
|
|
}
|
|
|
|
void
|
|
removeEntryPoint(JNIEnv* env, jobject thiz, jstring storagePath)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *path = env->GetStringUTFChars(storagePath, JNI_FALSE);
|
|
aml->removeEntryPoint(path);
|
|
env->ReleaseStringUTFChars(storagePath, path);
|
|
}
|
|
|
|
jobjectArray
|
|
entryPoints(JNIEnv* env, jobject thiz)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
std::vector<medialibrary::FolderPtr> entryPoints = aml->entryPoints();
|
|
entryPoints.erase(std::remove_if( begin( entryPoints ), end( entryPoints ), []( const medialibrary::FolderPtr f ) { return f->isPresent() == false; } ), end( entryPoints ));
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(entryPoints.size(), env->FindClass("java/lang/String"), NULL);
|
|
int index = -1;
|
|
for(medialibrary::FolderPtr const& entrypoint : entryPoints) {
|
|
jstring mrl = env->NewStringUTF(entrypoint->mrl().c_str());
|
|
env->SetObjectArrayElement(mediaRefs, ++index, mrl);
|
|
env->DeleteLocalRef(mrl);
|
|
}
|
|
return mediaRefs;
|
|
}
|
|
|
|
jboolean
|
|
removeDevice(JNIEnv* env, jobject thiz, jstring uuid, jstring storagePath)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *uuidChar = env->GetStringUTFChars(uuid, JNI_FALSE);
|
|
const char *path = env->GetStringUTFChars(storagePath, JNI_FALSE);
|
|
jboolean removed = aml->removeDevice(uuidChar, path);
|
|
env->ReleaseStringUTFChars(uuid, uuidChar);
|
|
env->ReleaseStringUTFChars(storagePath, path);
|
|
return removed;
|
|
}
|
|
|
|
void
|
|
setMediaUpdatedCbFlag(JNIEnv* env, jobject thiz, jint flags)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
aml->setMediaUpdatedCbFlag(flags);
|
|
}
|
|
|
|
void
|
|
setMediaAddedCbFlag(JNIEnv* env, jobject thiz, jint flags)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
aml->setMediaAddedCbFlag(flags);
|
|
}
|
|
|
|
void
|
|
pauseBackgroundOperations(JNIEnv* env, jobject thiz)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
aml->pauseBackgroundOperations();
|
|
}
|
|
|
|
void
|
|
resumeBackgroundOperations(JNIEnv* env, jobject thiz)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
aml->resumeBackgroundOperations();
|
|
}
|
|
|
|
void
|
|
reload(JNIEnv* env, jobject thiz)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
aml->reload();
|
|
}
|
|
|
|
void
|
|
reloadEntryPoint(JNIEnv* env, jobject thiz, jstring entryPoint)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *path = env->GetStringUTFChars(entryPoint, JNI_FALSE);
|
|
aml->reload(path);
|
|
env->ReleaseStringUTFChars(entryPoint, path);
|
|
}
|
|
|
|
void
|
|
forceParserRetry(JNIEnv* env, jobject thiz)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
aml->forceParserRetry();
|
|
}
|
|
|
|
void
|
|
forceRescan(JNIEnv* env, jobject thiz)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
aml->forceRescan();
|
|
}
|
|
|
|
jboolean
|
|
increasePlayCount(JNIEnv* env, jobject thiz, jlong id)
|
|
{
|
|
return MediaLibrary_getInstance(env, thiz)->increasePlayCount((int64_t)id);
|
|
}
|
|
|
|
void
|
|
removeMediaFromHistory(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id)
|
|
{
|
|
MediaLibrary_getInstance(env, medialibrary)->removeMediaFromHistory((int64_t)id);
|
|
}
|
|
|
|
jobjectArray
|
|
lastMediaPLayed(JNIEnv* env, jobject thiz)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
std::vector<medialibrary::MediaPtr> mediaPlayed = aml->lastMediaPlayed();
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaPlayed.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1, drops = 0;
|
|
for(medialibrary::MediaPtr const& media : mediaPlayed) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item);
|
|
if (item == nullptr)
|
|
++drops;
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return filteredArray(env, mediaRefs, ml_fields.MediaWrapper.clazz, drops);
|
|
}
|
|
|
|
jboolean
|
|
addToHistory(JNIEnv* env, jobject thiz, jstring mrl, jstring title)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *mrl_cstr = env->GetStringUTFChars(mrl, JNI_FALSE);
|
|
const char *title_cstr = env->GetStringUTFChars(title, JNI_FALSE);
|
|
jboolean ok = aml->addToHistory(mrl_cstr, title_cstr);
|
|
env->ReleaseStringUTFChars(mrl, mrl_cstr);
|
|
env->ReleaseStringUTFChars(title, title_cstr);
|
|
return ok;
|
|
}
|
|
|
|
jobjectArray
|
|
lastStreamsPlayed(JNIEnv* env, jobject thiz)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
std::vector<medialibrary::MediaPtr> streamsPlayed = aml->lastStreamsPlayed();
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(streamsPlayed.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1, drops = 0;
|
|
for(medialibrary::MediaPtr const& media : streamsPlayed) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item);
|
|
if (item == nullptr)
|
|
++drops;
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return mediaRefs;
|
|
}
|
|
|
|
bool clearHistory(JNIEnv* env, jobject thiz)
|
|
{
|
|
return MediaLibrary_getInstance(env, thiz)->clearHistory();
|
|
}
|
|
|
|
static jobjectArray
|
|
getInternalVideos(JNIEnv* env, jobject thiz, const medialibrary::QueryParameters* params = nullptr, jint nbItems = 0, jint offset = 0 )
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const auto query = aml->videoFiles(params);
|
|
std::vector<medialibrary::MediaPtr> videoFiles = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray videoRefs = (jobjectArray) env->NewObjectArray(videoFiles.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1, drops = 0;
|
|
for(medialibrary::MediaPtr const& media : videoFiles) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(videoRefs, ++index, item);
|
|
if (item == nullptr)
|
|
++drops;
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return filteredArray(env, videoRefs, ml_fields.MediaWrapper.clazz, drops);
|
|
}
|
|
|
|
jobjectArray
|
|
getVideos(JNIEnv* env, jobject thiz)
|
|
{
|
|
return getInternalVideos(env, thiz);
|
|
}
|
|
|
|
jobjectArray
|
|
getSortedVideos(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc)
|
|
{
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria), static_cast<bool>( desc )
|
|
};
|
|
return getInternalVideos(env, thiz, ¶ms );
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedVideos(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
return getInternalVideos(env, thiz, ¶ms, nbItems, offset );
|
|
}
|
|
|
|
jobjectArray
|
|
getRecentVideos(JNIEnv* env, jobject thiz)
|
|
{
|
|
medialibrary::QueryParameters params {
|
|
medialibrary::SortingCriteria::InsertionDate,
|
|
true,
|
|
};
|
|
return getInternalVideos(env, thiz, ¶ms);
|
|
}
|
|
|
|
static jobjectArray
|
|
getInternalAudio(JNIEnv* env, jobject thiz, const medialibrary::QueryParameters* params = nullptr, jint nbItems = 0, jint offset = 0 )
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const auto query = aml->audioFiles(params);
|
|
std::vector<medialibrary::MediaPtr> audioFiles = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray audioRefs = (jobjectArray) env->NewObjectArray(audioFiles.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1, drops = 0;
|
|
for(medialibrary::MediaPtr const& media : audioFiles) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(audioRefs, ++index, item);
|
|
if (item == nullptr)
|
|
++drops;
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return filteredArray(env, audioRefs, ml_fields.MediaWrapper.clazz, drops);
|
|
}
|
|
|
|
jobjectArray
|
|
getAudio(JNIEnv* env, jobject thiz)
|
|
{
|
|
return getInternalAudio(env, thiz);
|
|
}
|
|
|
|
jobjectArray
|
|
getRecentAudio(JNIEnv* env, jobject thiz)
|
|
{
|
|
medialibrary::QueryParameters params {
|
|
medialibrary::SortingCriteria::InsertionDate, true
|
|
};
|
|
return getInternalAudio(env, thiz, ¶ms );
|
|
}
|
|
|
|
jobjectArray
|
|
getSortedAudio(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc)
|
|
{
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
return getInternalAudio(env, thiz, ¶ms);
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedAudio(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
return getInternalAudio(env, thiz, ¶ms, nbItems, offset);
|
|
}
|
|
|
|
jobject
|
|
search(JNIEnv* env, jobject thiz, jstring query)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *queryChar = env->GetStringUTFChars(query, JNI_FALSE);
|
|
jobject searchResult = convertSearchAggregateObject(env, &ml_fields, aml->search(queryChar));
|
|
env->ReleaseStringUTFChars(query, queryChar);
|
|
return searchResult;
|
|
}
|
|
|
|
jobjectArray
|
|
searchMedia(JNIEnv* env, jobject thiz, jstring query)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *queryChar = env->GetStringUTFChars(query, JNI_FALSE);
|
|
auto searchResult = aml->searchMedia(queryChar)->all();
|
|
jobjectArray mediaList = (jobjectArray) env->NewObjectArray(searchResult.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::MediaPtr const& media : searchResult) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaList, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(query, queryChar);
|
|
return mediaList;
|
|
}
|
|
|
|
jobjectArray
|
|
searchPagedMedia(JNIEnv* env, jobject thiz, jstring filterQuery, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = aml->searchMedia(queryChar, ¶ms);
|
|
const auto searchResult = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray mediaList = (jobjectArray) env->NewObjectArray(searchResult.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::MediaPtr const& media : searchResult) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaList, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return mediaList;
|
|
}
|
|
|
|
jobjectArray
|
|
searchPagedAudio(JNIEnv* env, jobject thiz, jstring filterQuery, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = aml->searchAudio(queryChar, ¶ms);
|
|
const auto searchResult = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray mediaList = (jobjectArray) env->NewObjectArray(searchResult.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::MediaPtr const& media : searchResult) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaList, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return mediaList;
|
|
}
|
|
|
|
jobjectArray
|
|
searchPagedVideo(JNIEnv* env, jobject thiz, jstring filterQuery, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = aml->searchVideo(queryChar, ¶ms);
|
|
const auto searchResult = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray mediaList = (jobjectArray) env->NewObjectArray(searchResult.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::MediaPtr const& media : searchResult) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaList, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return mediaList;
|
|
}
|
|
|
|
jint
|
|
getSearchVideoCount(JNIEnv* env, jobject thiz, jstring filterQuery) {
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
jint count = MediaLibrary_getInstance(env, thiz)->searchVideo(queryChar)->count();
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return count;
|
|
}
|
|
|
|
jint
|
|
getSearchAudioCount(JNIEnv* env, jobject thiz, jstring filterQuery) {
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
jint count = MediaLibrary_getInstance(env, thiz)->searchAudio(queryChar)->count();
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return count;
|
|
}
|
|
|
|
jint
|
|
getSearchMediaCount(JNIEnv* env, jobject thiz, jstring filterQuery) {
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
jint count = MediaLibrary_getInstance(env, thiz)->searchMedia(queryChar)->count();
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return count;
|
|
}
|
|
|
|
jobjectArray
|
|
searchArtist(JNIEnv* env, jobject thiz, jstring query)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *queryChar = env->GetStringUTFChars(query, JNI_FALSE);
|
|
std::vector<medialibrary::ArtistPtr> artists = aml->searchArtists(queryChar)->all();
|
|
jobjectArray artistRefs = (jobjectArray) env->NewObjectArray(artists.size(), ml_fields.Artist.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::ArtistPtr const& artist : artists) {
|
|
jobject item = convertArtistObject(env, &ml_fields, artist);
|
|
env->SetObjectArrayElement(artistRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(query, queryChar);
|
|
return artistRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
searchPagedArtist(JNIEnv* env, jobject thiz, jstring filterQuery, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = aml->searchArtists(queryChar, ¶ms);
|
|
std::vector<medialibrary::ArtistPtr> artists = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray artistRefs = (jobjectArray) env->NewObjectArray(artists.size(), ml_fields.Artist.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::ArtistPtr const& artist : artists) {
|
|
jobject item = convertArtistObject(env, &ml_fields, artist);
|
|
env->SetObjectArrayElement(artistRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return artistRefs;
|
|
}
|
|
|
|
jint
|
|
getArtistsSearchCount(JNIEnv* env, jobject thiz, jstring filterQuery) {
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
jint count = (jint) MediaLibrary_getInstance(env, thiz)->searchArtists(queryChar)->count();
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return count;
|
|
}
|
|
|
|
jobjectArray
|
|
searchAlbum(JNIEnv* env, jobject thiz, jstring query)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *queryChar = env->GetStringUTFChars(query, JNI_FALSE);
|
|
std::vector<medialibrary::AlbumPtr> albums = aml->searchAlbums(queryChar)->all();
|
|
jobjectArray albumRefs = (jobjectArray) env->NewObjectArray(albums.size(), ml_fields.Album.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::AlbumPtr const& album : albums) {
|
|
jobject item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(query, queryChar);
|
|
return albumRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
searchPagedAlbum(JNIEnv* env, jobject thiz, jstring filterQuery, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = aml->searchAlbums(queryChar, ¶ms);
|
|
std::vector<medialibrary::AlbumPtr> albums = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray albumRefs = (jobjectArray) env->NewObjectArray(albums.size(), ml_fields.Album.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::AlbumPtr const& album : albums) {
|
|
jobject item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return albumRefs;
|
|
}
|
|
|
|
jint
|
|
getAlbumSearchCount(JNIEnv* env, jobject thiz, jstring filterQuery) {
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
jint count = (jint) MediaLibrary_getInstance(env, thiz)->searchAlbums(queryChar)->count();
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return count;
|
|
}
|
|
|
|
jobjectArray
|
|
searchGenre(JNIEnv* env, jobject thiz, jstring query)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *queryChar = env->GetStringUTFChars(query, JNI_FALSE);
|
|
std::vector<medialibrary::GenrePtr> genres = aml->searchGenre(queryChar)->all();
|
|
jobjectArray genreRefs = (jobjectArray) env->NewObjectArray(genres.size(), ml_fields.Genre.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::GenrePtr const& genre : genres) {
|
|
jobject item = convertGenreObject(env, &ml_fields, genre);
|
|
env->SetObjectArrayElement(genreRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(query, queryChar);
|
|
return genreRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
searchPagedGenre(JNIEnv* env, jobject thiz, jstring filterQuery, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = aml->searchGenre(queryChar, ¶ms);
|
|
std::vector<medialibrary::GenrePtr> genres = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray genreRefs = (jobjectArray) env->NewObjectArray(genres.size(), ml_fields.Genre.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::GenrePtr const& genre : genres) {
|
|
jobject item = convertGenreObject(env, &ml_fields, genre);
|
|
env->SetObjectArrayElement(genreRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return genreRefs;
|
|
}
|
|
|
|
jint
|
|
getGenreSearchCount(JNIEnv* env, jobject thiz, jstring filterQuery) {
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
jint count = (jint) MediaLibrary_getInstance(env, thiz)->searchGenre(queryChar)->count();
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return count;
|
|
}
|
|
|
|
jobjectArray
|
|
searchPlaylist(JNIEnv* env, jobject thiz, jstring query)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *queryChar = env->GetStringUTFChars(query, JNI_FALSE);
|
|
std::vector<medialibrary::PlaylistPtr> playlists = aml->searchPlaylists(queryChar)->all();
|
|
jobjectArray playlistRefs = (jobjectArray) env->NewObjectArray(playlists.size(), ml_fields.Playlist.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::PlaylistPtr const& playlist : playlists) {
|
|
jobject item = convertPlaylistObject(env, &ml_fields, playlist);
|
|
env->SetObjectArrayElement(playlistRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(query, queryChar);
|
|
return playlistRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
searchPagedPlaylist(JNIEnv* env, jobject thiz, jstring filterQuery, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = aml->searchPlaylists(queryChar, ¶ms);
|
|
std::vector<medialibrary::PlaylistPtr> playlists = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray playlistRefs = (jobjectArray) env->NewObjectArray(playlists.size(), ml_fields.Playlist.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::PlaylistPtr const& playlist : playlists) {
|
|
jobject item = convertPlaylistObject(env, &ml_fields, playlist);
|
|
env->SetObjectArrayElement(playlistRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return playlistRefs;
|
|
}
|
|
|
|
jint
|
|
getPlaylistSearchCount(JNIEnv* env, jobject thiz, jstring filterQuery) {
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
jint count = (jint) MediaLibrary_getInstance(env, thiz)->searchPlaylists(queryChar)->count();
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return count;
|
|
}
|
|
|
|
jint
|
|
getVideoCount(JNIEnv* env, jobject thiz) {
|
|
return (jint) MediaLibrary_getInstance(env, thiz)->videoFiles()->count();
|
|
}
|
|
|
|
jint
|
|
getAudioCount(JNIEnv* env, jobject thiz) {
|
|
return (jint) MediaLibrary_getInstance(env, thiz)->audioFiles()->count();
|
|
}
|
|
|
|
jobject
|
|
getMedia(JNIEnv* env, jobject thiz, jlong id) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
return mediaToMediaWrapper(env, &ml_fields, aml->media(id));
|
|
}
|
|
|
|
jobject
|
|
getMediaFromMrl(JNIEnv* env, jobject thiz, jstring mrl) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *char_mrl = env->GetStringUTFChars(mrl, JNI_FALSE);
|
|
jobject mw = mediaToMediaWrapper(env, &ml_fields, aml->media(char_mrl));
|
|
env->ReleaseStringUTFChars(mrl, char_mrl);
|
|
return mw;
|
|
}
|
|
|
|
jobject
|
|
addMedia(JNIEnv* env, jobject thiz, jstring mrl) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *char_mrl = env->GetStringUTFChars(mrl, JNI_FALSE);
|
|
jobject mw = mediaToMediaWrapper(env, &ml_fields, aml->addMedia(char_mrl));
|
|
env->ReleaseStringUTFChars(mrl, char_mrl);
|
|
return mw;
|
|
}
|
|
|
|
jboolean
|
|
removeExternalMedia(JNIEnv* env, jobject thiz, jlong id) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
return aml->removeExternalMedia(id);
|
|
}
|
|
|
|
jobject
|
|
addStream(JNIEnv* env, jobject thiz, jstring mrl, jstring title) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *char_mrl = env->GetStringUTFChars(mrl, JNI_FALSE);
|
|
const char *char_title = env->GetStringUTFChars(title, JNI_FALSE);
|
|
jobject mw = mediaToMediaWrapper(env, &ml_fields, aml->addStream(char_mrl, char_title));
|
|
env->ReleaseStringUTFChars(mrl, char_mrl);
|
|
env->ReleaseStringUTFChars(title, char_title);
|
|
return mw;
|
|
}
|
|
|
|
jobjectArray
|
|
getAlbums(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
std::vector<medialibrary::AlbumPtr> albums = aml->albums( ¶ms )->all();
|
|
jobjectArray albumRefs = (jobjectArray) env->NewObjectArray(albums.size(), ml_fields.Album.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::AlbumPtr const& album : albums) {
|
|
jobject item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return albumRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedAlbums(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->albums(¶ms);
|
|
std::vector<medialibrary::AlbumPtr> albums = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray albumRefs = (jobjectArray) env->NewObjectArray(albums.size(), ml_fields.Album.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::AlbumPtr const& album : albums) {
|
|
jobject item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return albumRefs;
|
|
}
|
|
|
|
jint
|
|
getAlbumsCount(JNIEnv* env, jobject thiz) {
|
|
return (jint) MediaLibrary_getInstance(env, thiz)->albums(nullptr)->count();
|
|
}
|
|
|
|
jobject
|
|
getAlbum(JNIEnv* env, jobject thiz, jlong id)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::AlbumPtr album = aml->album(id);
|
|
return album != nullptr ? convertAlbumObject(env, &ml_fields, album) : nullptr;
|
|
}
|
|
|
|
jobjectArray
|
|
getArtists(JNIEnv* env, jobject thiz, jboolean all, jint sortingCriteria, jboolean desc)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
std::vector<medialibrary::ArtistPtr> artists = aml->artists(all, ¶ms)->all();
|
|
jobjectArray artistRefs = (jobjectArray) env->NewObjectArray(artists.size(), ml_fields.Artist.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::ArtistPtr const& artist : artists) {
|
|
jobject item = convertArtistObject(env, &ml_fields, artist);
|
|
env->SetObjectArrayElement(artistRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return artistRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedArtists(JNIEnv* env, jobject thiz, jboolean all, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->artists(all, ¶ms);
|
|
std::vector<medialibrary::ArtistPtr> artists = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray artistRefs = (jobjectArray) env->NewObjectArray(artists.size(), ml_fields.Artist.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::ArtistPtr const& artist : artists) {
|
|
jobject item = convertArtistObject(env, &ml_fields, artist);
|
|
env->SetObjectArrayElement(artistRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return artistRefs;
|
|
}
|
|
|
|
jint
|
|
getArtistsCount(JNIEnv* env, jobject thiz, jboolean all) {
|
|
return (jint) MediaLibrary_getInstance(env, thiz)->artists(all, nullptr)->count();
|
|
}
|
|
|
|
jobject
|
|
getArtist(JNIEnv* env, jobject thiz, jlong id)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::ArtistPtr artist = aml->artist(id);
|
|
return artist != nullptr ? convertArtistObject(env, &ml_fields, artist) : nullptr;
|
|
}
|
|
|
|
jobjectArray
|
|
getGenres(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
std::vector<medialibrary::GenrePtr> genres = aml->genres( ¶ms )->all();
|
|
jobjectArray genreRefs = (jobjectArray) env->NewObjectArray(genres.size(), ml_fields.Genre.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::GenrePtr const& genre : genres) {
|
|
jobject item = convertGenreObject(env, &ml_fields, genre);
|
|
env->SetObjectArrayElement(genreRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return genreRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedGenres(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->genres(¶ms);
|
|
std::vector<medialibrary::GenrePtr> genres = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray genreRefs = (jobjectArray) env->NewObjectArray(genres.size(), ml_fields.Genre.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::GenrePtr const& genre : genres) {
|
|
jobject item = convertGenreObject(env, &ml_fields, genre);
|
|
env->SetObjectArrayElement(genreRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return genreRefs;
|
|
}
|
|
|
|
jint
|
|
getGenresCount(JNIEnv* env, jobject thiz) {
|
|
return (jint) MediaLibrary_getInstance(env, thiz)->genres(nullptr)->count();
|
|
}
|
|
|
|
jobject
|
|
getGenre(JNIEnv* env, jobject thiz, jlong id)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::GenrePtr genre = aml->genre(id);
|
|
return genre != nullptr ? convertGenreObject(env, &ml_fields, genre) : nullptr;
|
|
}
|
|
|
|
jobjectArray
|
|
getPlaylists(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
std::vector<medialibrary::PlaylistPtr> playlists = aml->playlists(¶ms)->all();
|
|
jobjectArray playlistRefs = (jobjectArray) env->NewObjectArray(playlists.size(), ml_fields.Playlist.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::PlaylistPtr const& playlist : playlists) {
|
|
jobject item = convertPlaylistObject(env, &ml_fields, playlist);
|
|
env->SetObjectArrayElement(playlistRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return playlistRefs;
|
|
}
|
|
|
|
|
|
jobjectArray
|
|
getPagedPlaylists(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->playlists(¶ms);
|
|
std::vector<medialibrary::PlaylistPtr> playlists = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray playlistRefs = (jobjectArray) env->NewObjectArray(playlists.size(), ml_fields.Playlist.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::PlaylistPtr const& playlist : playlists) {
|
|
jobject item = convertPlaylistObject(env, &ml_fields, playlist);
|
|
env->SetObjectArrayElement(playlistRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return playlistRefs;
|
|
}
|
|
|
|
jint
|
|
getPlaylistsCount(JNIEnv* env, jobject thiz) {
|
|
return (jint) MediaLibrary_getInstance(env, thiz)->playlists(nullptr)->count();
|
|
}
|
|
|
|
jobject
|
|
getPlaylist(JNIEnv* env, jobject thiz, jlong id)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::PlaylistPtr playlist = aml->playlist(id);
|
|
return playlist != nullptr ? convertPlaylistObject(env, &ml_fields, playlist) : nullptr;
|
|
}
|
|
|
|
jobject
|
|
playlistCreate(JNIEnv* env, jobject thiz, jstring name)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *name_cstr = env->GetStringUTFChars(name, JNI_FALSE);
|
|
medialibrary::PlaylistPtr playlist = aml->PlaylistCreate(name_cstr);
|
|
env->ReleaseStringUTFChars(name, name_cstr);
|
|
return playlist != nullptr ? convertPlaylistObject(env, &ml_fields, playlist) : nullptr;
|
|
}
|
|
|
|
void
|
|
requestThumbnail(JNIEnv* env, jobject thiz, jobject medialibrary, jlong mediaId, medialibrary::ThumbnailSizeType sizeType, uint32_t desiredWidth,
|
|
uint32_t desiredHeight, float position)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
aml->requestThumbnail(mediaId, sizeType, desiredWidth, desiredHeight, position);
|
|
}
|
|
|
|
/*
|
|
* Album methods
|
|
*/
|
|
|
|
|
|
jobjectArray
|
|
getTracksFromAlbum(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint sortingCriteria, jboolean desc)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->tracksFromAlbum(id, ¶ms);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
std::vector<medialibrary::MediaPtr> tracks = query->all();
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(tracks.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1, drops = 0;
|
|
jobject item = nullptr;
|
|
for(medialibrary::MediaPtr const& media : tracks) {
|
|
item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item);
|
|
if (item == nullptr) ++drops;
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return filteredArray(env, mediaRefs, ml_fields.MediaWrapper.clazz, drops);
|
|
}
|
|
|
|
jint
|
|
getTracksFromAlbumCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id) {
|
|
const auto query = MediaLibrary_getInstance(env, medialibrary)->tracksFromAlbum(id, nullptr);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedTracksFromAlbum(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->tracksFromAlbum(id, ¶ms);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
std::vector<medialibrary::MediaPtr> mediaList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::MediaPtr const& media : mediaList) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return mediaRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
searchFromAlbum(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = aml->searchFromAlbum(id, queryChar, ¶ms);
|
|
if (query == nullptr)
|
|
{
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
}
|
|
std::vector<medialibrary::MediaPtr> mediaList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::MediaPtr const& media : mediaList) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return mediaRefs;
|
|
}
|
|
|
|
jint
|
|
getSearchFromAlbumCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery) {
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = MediaLibrary_getInstance(env, medialibrary)->searchFromAlbum(id, queryChar, nullptr);
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
/*
|
|
* Artist methods
|
|
*/
|
|
|
|
jobjectArray
|
|
getMediaFromArtist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint sortingCriteria, jboolean desc)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->mediaFromArtist(id, ¶ms);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
std::vector<medialibrary::MediaPtr> mediaList = query->all();
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1, drops = 0;
|
|
for(medialibrary::MediaPtr const& media : mediaList) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item);
|
|
if (item == nullptr) ++drops;
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return filteredArray(env, mediaRefs, ml_fields.MediaWrapper.clazz, drops);
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedMediaFromArtist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->mediaFromArtist(id, ¶ms);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
std::vector<medialibrary::MediaPtr> mediaList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::MediaPtr const& media : mediaList) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return mediaRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
searchFromArtist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = aml->searchFromArtist(id, queryChar, ¶ms);
|
|
if (query == nullptr)
|
|
{
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
}
|
|
std::vector<medialibrary::MediaPtr> mediaList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::MediaPtr const& media : mediaList) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return mediaRefs;
|
|
}
|
|
|
|
jint
|
|
getArtistTracksCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id) {
|
|
const auto query = MediaLibrary_getInstance(env, medialibrary)->mediaFromArtist(id, nullptr);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
jint
|
|
getSearchFromArtistCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery) {
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = MediaLibrary_getInstance(env, medialibrary)->searchFromArtist(id, queryChar);
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
jobjectArray
|
|
getAlbumsFromArtist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint sortingCriteria, jboolean desc)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->albumsFromArtist(id, ¶ms);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.Album.clazz, NULL);
|
|
std::vector<medialibrary::AlbumPtr> albums = query->all();
|
|
jobjectArray albumsRefs = (jobjectArray) env->NewObjectArray(albums.size(), ml_fields.Album.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::AlbumPtr const& album : albums) {
|
|
jobject item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumsRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return albumsRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedAlbumsFromArtist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->albumsFromArtist(id, ¶ms);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.Album.clazz, NULL);
|
|
std::vector<medialibrary::AlbumPtr> albums = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray albumsRefs = (jobjectArray) env->NewObjectArray(albums.size(), ml_fields.Album.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::AlbumPtr const& album : albums) {
|
|
jobject item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumsRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return albumsRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
searchAlbumsFromArtist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = aml->searchAlbumsFromArtist(id, queryChar, ¶ms);
|
|
if (query == nullptr)
|
|
{
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return (jobjectArray) env->NewObjectArray(0, ml_fields.Album.clazz, NULL);
|
|
}
|
|
std::vector<medialibrary::AlbumPtr> albums = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray albumsRefs = (jobjectArray) env->NewObjectArray(albums.size(), ml_fields.Album.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::AlbumPtr const& album : albums) {
|
|
jobject item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumsRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return albumsRefs;
|
|
}
|
|
|
|
jint
|
|
getArtistAlbumsCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id) {
|
|
const auto query = MediaLibrary_getInstance(env, medialibrary)->albumsFromArtist(id, nullptr);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
jint
|
|
getSearchAlbumFromArtistCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery) {
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = MediaLibrary_getInstance(env, medialibrary)->searchAlbumsFromArtist(id, queryChar);
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
|
|
/*
|
|
* Genre methods
|
|
*/
|
|
|
|
jobjectArray
|
|
getMediaFromGenre(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jboolean withThumbnail, jint sortingCriteria, jboolean desc)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->mediaFromGenre(id, withThumbnail, ¶ms);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
std::vector<medialibrary::MediaPtr> mediaList = query->all();
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1, drops = 0;
|
|
for(medialibrary::MediaPtr const& media : mediaList) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item);
|
|
if (item == nullptr)
|
|
++drops;
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return filteredArray(env, mediaRefs, ml_fields.MediaWrapper.clazz, drops);
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedMediaFromGenre(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jboolean withThumbnail, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->mediaFromGenre(id, withThumbnail, ¶ms);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
std::vector<medialibrary::MediaPtr> mediaList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::MediaPtr const& media : mediaList) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return mediaRefs;
|
|
}
|
|
|
|
jint
|
|
getGenreTracksCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id) {
|
|
const auto query = MediaLibrary_getInstance(env, medialibrary)->mediaFromGenre(id, false, nullptr);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
jobjectArray
|
|
searchMediaFromGenre(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = aml->searchFromGenre(id, queryChar, ¶ms);
|
|
if (query == nullptr)
|
|
{
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
}
|
|
std::vector<medialibrary::MediaPtr> mediaList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::MediaPtr const& media : mediaList) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return mediaRefs;
|
|
}
|
|
|
|
jint
|
|
getSearchMediaFromGenreCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery) {
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = MediaLibrary_getInstance(env, medialibrary)->searchFromGenre(id, queryChar);
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
jobjectArray
|
|
getAlbumsFromGenre(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint sortingCriteria, jboolean desc)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->albumsFromGenre(id, ¶ms);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.Album.clazz, NULL);
|
|
std::vector<medialibrary::AlbumPtr> albums = query->all();
|
|
jobjectArray albumRefs = (jobjectArray) env->NewObjectArray(albums.size(), ml_fields.Album.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::AlbumPtr const& album : albums) {
|
|
jobject item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return albumRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedAlbumsFromGenre(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->albumsFromGenre(id, ¶ms);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.Album.clazz, NULL);
|
|
std::vector<medialibrary::AlbumPtr> albums = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray albumsRefs = (jobjectArray) env->NewObjectArray(albums.size(), ml_fields.Album.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::AlbumPtr const& album : albums) {
|
|
jobject item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumsRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return albumsRefs;
|
|
}
|
|
|
|
jint
|
|
getGenreAlbumsCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id) {
|
|
const auto query = MediaLibrary_getInstance(env, medialibrary)->albumsFromGenre(id, nullptr);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
jobjectArray
|
|
searchAlbumsFromGenre(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = aml->searchAlbumsFromGenre(id, queryChar, ¶ms);
|
|
if (query == nullptr)
|
|
{
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return (jobjectArray) env->NewObjectArray(0, ml_fields.Album.clazz, NULL);
|
|
}
|
|
std::vector<medialibrary::AlbumPtr> albums = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray albumsRefs = (jobjectArray) env->NewObjectArray(albums.size(), ml_fields.Album.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::AlbumPtr const& album : albums) {
|
|
jobject item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumsRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return albumsRefs;
|
|
}
|
|
|
|
jint
|
|
getSearchAlbumsFromGenreCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery) {
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = MediaLibrary_getInstance(env, medialibrary)->searchAlbumsFromGenre(id, queryChar);
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
jobjectArray
|
|
getArtistsFromGenre(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint sortingCriteria, jboolean desc)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->artistsFromGenre(id, ¶ms);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.Artist.clazz, NULL);
|
|
std::vector<medialibrary::ArtistPtr> artists = query->all();
|
|
jobjectArray artistsRefs = (jobjectArray) env->NewObjectArray(artists.size(), ml_fields.Artist.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::ArtistPtr const& artist : artists) {
|
|
jobject item = convertArtistObject(env, &ml_fields, artist);
|
|
env->SetObjectArrayElement(artistsRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return artistsRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedArtistsFromGenre(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->artistsFromGenre(id, ¶ms);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.Artist.clazz, NULL);
|
|
std::vector<medialibrary::ArtistPtr> artists = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray artistsRefs = (jobjectArray) env->NewObjectArray(artists.size(), ml_fields.Artist.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::ArtistPtr const& artist : artists) {
|
|
jobject item = convertArtistObject(env, &ml_fields, artist);
|
|
env->SetObjectArrayElement(artistsRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return artistsRefs;
|
|
}
|
|
|
|
jint
|
|
getGenreArtistsCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id) {
|
|
const auto query = MediaLibrary_getInstance(env, medialibrary)->artistsFromGenre(id, nullptr);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
|
|
/*
|
|
* Media methods
|
|
*/
|
|
|
|
jlong
|
|
getMediaLongMetadata(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint metadataType)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::MediaPtr media = aml->media(id);
|
|
if (media == nullptr) return 0L;
|
|
const medialibrary::IMetadata& metadata = media->metadata((medialibrary::IMedia::MetadataType)metadataType);
|
|
return metadata.isSet() ? metadata.asInt() : 0L;
|
|
}
|
|
|
|
jobject
|
|
getMediaStringMetadata(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint metadataType)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::MediaPtr media = aml->media(id);
|
|
if (media == nullptr) return 0L;
|
|
const medialibrary::IMetadata& metadata = media->metadata((medialibrary::IMedia::MetadataType)metadataType);
|
|
return metadata.isSet() ? env->NewStringUTF(metadata.asStr().c_str()) : nullptr;
|
|
}
|
|
|
|
void
|
|
setMediaStringMetadata(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint metadataType, jstring meta)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::MediaPtr media = aml->media(id);
|
|
if (media == nullptr) return;
|
|
const char *char_meta = env->GetStringUTFChars(meta, JNI_FALSE);
|
|
media->setMetadata((medialibrary::IMedia::MetadataType)metadataType, char_meta);
|
|
env->ReleaseStringUTFChars(meta, char_meta);
|
|
}
|
|
|
|
void
|
|
setMediaLongMetadata(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint metadataType, jlong meta)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::MediaPtr media = aml->media(id);
|
|
if (media == nullptr) return;
|
|
media->setMetadata((medialibrary::IMedia::MetadataType)metadataType, meta);
|
|
}
|
|
|
|
void
|
|
setMediaThumbnail(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring mrl)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::MediaPtr media = aml->media(id);
|
|
if (media == nullptr) return;
|
|
const char *char_mrl = env->GetStringUTFChars(mrl, JNI_FALSE);
|
|
media->setThumbnail(char_mrl, medialibrary::ThumbnailSizeType::Thumbnail);
|
|
env->ReleaseStringUTFChars(mrl, char_mrl);
|
|
}
|
|
|
|
void
|
|
setMediaTitle(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring title)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::MediaPtr media = aml->media(id);
|
|
if (media == nullptr) return;
|
|
const char *char_name = env->GetStringUTFChars(title, JNI_FALSE);
|
|
media->setTitle(char_name);
|
|
env->ReleaseStringUTFChars(title, char_name);
|
|
}
|
|
|
|
/*
|
|
* Playlist methods
|
|
*/
|
|
|
|
jobjectArray
|
|
getMediaFromPlaylist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
const auto query = aml->mediaFromPlaylist(id);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
std::vector<medialibrary::MediaPtr> mediaList = query->all();
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1, drops = 0;
|
|
for(medialibrary::MediaPtr const& media : mediaList) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item);
|
|
if (item == nullptr)
|
|
++drops;
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return filteredArray(env, mediaRefs, ml_fields.MediaWrapper.clazz, drops);
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedMediaFromPlaylist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
const auto query = aml->mediaFromPlaylist(id);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
std::vector<medialibrary::MediaPtr> mediaList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::MediaPtr const& media : mediaList) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return mediaRefs;
|
|
}
|
|
|
|
jint
|
|
getPlaylistTracksCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id) {
|
|
const auto query = MediaLibrary_getInstance(env, medialibrary)->mediaFromPlaylist(id);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
jobjectArray
|
|
searchFromPlaylist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = aml->searchFromPLaylist(id, queryChar);
|
|
if (query == nullptr)
|
|
{
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
}
|
|
std::vector<medialibrary::MediaPtr> mediaList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::MediaPtr const& media : mediaList) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return mediaRefs;
|
|
}
|
|
|
|
jint
|
|
getSearchFromPlaylistCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery) {
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = MediaLibrary_getInstance(env, medialibrary)->searchFromPLaylist(id, queryChar);
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
jboolean
|
|
playlistAppend(JNIEnv* env, jobject thiz, jobject medialibrary, jlong playlistId, jlong mediaId)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
return aml->playlistAppend(playlistId, mediaId);
|
|
}
|
|
|
|
jboolean
|
|
playlistAppendGroup(JNIEnv* env, jobject thiz, jobject medialibrary, jlong playlistId, jlongArray mediaIds)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
bool result = true;
|
|
jsize len = env->GetArrayLength(mediaIds);
|
|
jlong *ids = env->GetLongArrayElements(mediaIds, 0);
|
|
for (int i = 0; i < len; ++i)
|
|
result &= aml->playlistAppend(playlistId, (int64_t) ids[i]);
|
|
env->ReleaseLongArrayElements(mediaIds, ids, 0);
|
|
return result;
|
|
}
|
|
|
|
jboolean
|
|
playlistAdd(JNIEnv* env, jobject thiz, jobject medialibrary, jlong playlistId, jlong mediaId, jint position)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
return aml->playlistAdd(playlistId, mediaId, position);
|
|
}
|
|
|
|
jboolean
|
|
playlistMove(JNIEnv* env, jobject thiz, jobject medialibrary, jlong playlistId, jint oldPosition, jint newPosition)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
return aml->playlistMove(playlistId, oldPosition, newPosition);
|
|
}
|
|
|
|
jboolean
|
|
playlistRemove(JNIEnv* env, jobject thiz, jobject medialibrary, jlong playlistId, jint position)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
return aml->playlistRemove(playlistId, position);
|
|
}
|
|
|
|
jboolean
|
|
playlistDelete(JNIEnv* env, jobject thiz, jobject medialibrary, jlong playlistId)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
return aml->PlaylistDelete(playlistId);
|
|
}
|
|
|
|
/*
|
|
* Folder methods
|
|
*/
|
|
jobjectArray
|
|
mediaFromFolder(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint type, jint sortingCriteria, jboolean desc, jint nbItems, jint offset ) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->mediaFromFolder(id, (medialibrary::IMedia::Type)type, ¶ms);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
std::vector<medialibrary::MediaPtr> mediaList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::MediaPtr const& media : mediaList) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return mediaRefs;
|
|
}
|
|
|
|
jint
|
|
mediaFromFolderCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint type) {
|
|
const auto query = MediaLibrary_getInstance(env, medialibrary)->mediaFromFolder(id, (medialibrary::IMedia::Type)type);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
jobjectArray
|
|
searchMediaFromFolder(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery, jint mediaType, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = aml->searchFromFolder(id, queryChar, (medialibrary::IMedia::Type)mediaType, ¶ms);
|
|
if (query == nullptr)
|
|
{
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
}
|
|
std::vector<medialibrary::MediaPtr> mediaList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::MediaPtr const& media : mediaList) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return mediaRefs;
|
|
}
|
|
|
|
jint
|
|
getSearchMediaFromFolderCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery, jint mediaType) {
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = MediaLibrary_getInstance(env, medialibrary)->searchFromFolder(id, queryChar, (medialibrary::IMedia::Type)mediaType);
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
jobjectArray
|
|
subFolders(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint sortingCriteria, jboolean desc, jint nbItems, jint offset ) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->subFolders(id, ¶ms);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
std::vector<medialibrary::FolderPtr> foldersList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
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);
|
|
env->SetObjectArrayElement(foldersRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
return foldersRefs;
|
|
}
|
|
|
|
jint
|
|
subFoldersCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id) {
|
|
const auto query = MediaLibrary_getInstance(env, medialibrary)->subFolders(id);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
jobjectArray
|
|
folders(JNIEnv* env, jobject thiz, jint type, jint sortingCriteria, jboolean desc, jint nbItems, jint offset ) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->folders(¶ms, (medialibrary::IMedia::Type) type);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.Folder.clazz, NULL);
|
|
std::vector<medialibrary::FolderPtr> foldersList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray foldersRefs = (jobjectArray) env->NewObjectArray(foldersList.size(), ml_fields.Folder.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::FolderPtr const& folder : foldersList) {
|
|
try
|
|
{
|
|
jobject item = convertFolderObject(env, &ml_fields, folder);
|
|
env->SetObjectArrayElement(foldersRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
catch( const medialibrary::fs::errors::DeviceRemoved& )
|
|
{
|
|
// Ignore this folder since it's on a removed device.
|
|
}
|
|
}
|
|
return foldersRefs;
|
|
}
|
|
|
|
jint
|
|
foldersCount(JNIEnv* env, jobject thiz, jint type) {
|
|
const auto query = MediaLibrary_getInstance(env, thiz)->folders(nullptr, (medialibrary::IMedia::Type)type);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
/*
|
|
* Video groups
|
|
*/
|
|
|
|
jobjectArray
|
|
videoGroups(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc, jint nbItems, jint offset ) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const auto query = aml->videoGroups(¶ms);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.VideoGroup.clazz, NULL);
|
|
std::vector<medialibrary::MediaGroupPtr> groupsList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray groupsRefs = (jobjectArray) env->NewObjectArray(groupsList.size(), ml_fields.VideoGroup.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::MediaGroupPtr const& group : groupsList) {
|
|
try
|
|
{
|
|
jobject item = convertVideoGroupObject(env, &ml_fields, group);
|
|
env->SetObjectArrayElement(groupsRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
catch( const medialibrary::fs::errors::DeviceRemoved& )
|
|
{
|
|
// Ignore this VideoGroup since it's on a removed device.
|
|
}
|
|
}
|
|
return groupsRefs;
|
|
}
|
|
|
|
jint
|
|
videoGroupsCount(JNIEnv* env, jobject thiz) {
|
|
const auto query = MediaLibrary_getInstance(env, thiz)->videoGroups(nullptr);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedMediaFromvideoGroup(JNIEnv* env, jobject thiz, jobject medialibrary, jstring name, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const char *char_name = env->GetStringUTFChars(name, JNI_FALSE);
|
|
const auto query = aml->mediaFromMediaGroup(char_name, ¶ms);
|
|
if (query == nullptr)
|
|
{
|
|
env->ReleaseStringUTFChars(name, char_name);
|
|
return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
}
|
|
std::vector<medialibrary::MediaPtr> mediaList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::MediaPtr const& media : mediaList) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(name, char_name);
|
|
return mediaRefs;
|
|
}
|
|
|
|
jint
|
|
getvideoGroupMediaCount(JNIEnv* env, jobject thiz, jobject medialibrary, jstring name) {
|
|
const char *char_name = env->GetStringUTFChars(name, JNI_FALSE);
|
|
const auto query = MediaLibrary_getInstance(env, medialibrary)->mediaFromMediaGroup(char_name, nullptr);
|
|
env->ReleaseStringUTFChars(name, char_name);
|
|
return static_cast<jint> (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
jobjectArray
|
|
searchFromvideoGroup(JNIEnv* env, jobject thiz, jobject medialibrary, jstring name, jstring filterQuery, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params {
|
|
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
|
|
static_cast<bool>( desc )
|
|
};
|
|
const char *char_name = env->GetStringUTFChars(name, JNI_FALSE);
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = aml->searchFromMediaGroup(char_name, queryChar, ¶ms);
|
|
if (query == nullptr)
|
|
{
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
env->ReleaseStringUTFChars(name, char_name);
|
|
return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
}
|
|
std::vector<medialibrary::MediaPtr> mediaList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::MediaPtr const& media : mediaList) {
|
|
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item);
|
|
env->DeleteLocalRef(item);
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
env->ReleaseStringUTFChars(name, char_name);
|
|
return mediaRefs;
|
|
}
|
|
|
|
jint
|
|
getSearchFromvideoGroupCount(JNIEnv* env, jobject thiz, jobject medialibrary, jstring name, jstring filterQuery) {
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const char *char_name = env->GetStringUTFChars(name, JNI_FALSE);
|
|
const auto query = MediaLibrary_getInstance(env, medialibrary)->searchFromMediaGroup(char_name, queryChar, nullptr);
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
env->ReleaseStringUTFChars(name, char_name);
|
|
return static_cast<jint> (query != nullptr ? query->count() : 0);
|
|
}
|
|
/*
|
|
* JNI stuff
|
|
*/
|
|
static JNINativeMethod methods[] = {
|
|
{"nativeInit", "(Ljava/lang/String;Ljava/lang/String;)I", (void*)init },
|
|
{"nativeStart", "()V", (void*)start },
|
|
{"nativeRelease", "()V", (void*)release },
|
|
{"nativeClearDatabase", "(Z)V", (void*)clearDatabase },
|
|
{"nativeAddDevice", "(Ljava/lang/String;Ljava/lang/String;Z)Z", (void*)addDevice },
|
|
{"nativeDevices", "()[Ljava/lang/String;", (void*)devices },
|
|
{"nativeDiscover", "(Ljava/lang/String;)V", (void*)discover },
|
|
{"nativeRemoveEntryPoint", "(Ljava/lang/String;)V", (void*)removeEntryPoint },
|
|
{"nativeEntryPoints", "()[Ljava/lang/String;", (void*)entryPoints },
|
|
{"nativeRemoveDevice", "(Ljava/lang/String;Ljava/lang/String;)Z", (void*)removeDevice },
|
|
{"nativeBanFolder", "(Ljava/lang/String;)V", (void*)banFolder },
|
|
{"nativeUnbanFolder", "(Ljava/lang/String;)V", (void*)unbanFolder },
|
|
{"nativeLastMediaPlayed", "()[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)lastMediaPLayed },
|
|
{"nativeLastStreamsPlayed", "()[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)lastStreamsPlayed },
|
|
{"nativeAddToHistory", "(Ljava/lang/String;Ljava/lang/String;)Z", (void*)addToHistory },
|
|
{"nativeClearHistory", "()Z", (void*)clearHistory },
|
|
{"nativeGetVideos", "()[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getVideos },
|
|
{"nativeGetSortedVideos", "(IZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getSortedVideos },
|
|
{"nativeGetSortedPagedVideos", "(IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getPagedVideos },
|
|
{"nativeGetRecentVideos", "()[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getRecentVideos },
|
|
{"nativeGetAudio", "()[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getAudio },
|
|
{"nativeGetSortedAudio", "(IZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getSortedAudio },
|
|
{"nativeGetSortedPagedAudio", "(IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getPagedAudio },
|
|
{"nativeGetRecentAudio", "()[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getRecentAudio },
|
|
{"nativeSearch", "(Ljava/lang/String;)Lorg/videolan/medialibrary/media/SearchAggregate;", (void*)search},
|
|
{"nativeSearchMedia", "(Ljava/lang/String;)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchMedia},
|
|
{"nativeSearchPagedMedia", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchPagedMedia},
|
|
{"nativeSearchPagedAudio", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchPagedAudio},
|
|
{"nativeSearchPagedVideo", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchPagedVideo},
|
|
{"nativeGetSearchVideoCount", "(Ljava/lang/String;)I", (void*)getSearchVideoCount },
|
|
{"nativeGetSearchAudioCount", "(Ljava/lang/String;)I", (void*)getSearchAudioCount },
|
|
{"nativeGetSearchMediaCount", "(Ljava/lang/String;)I", (void*)getSearchMediaCount },
|
|
{"nativeSearchAlbum", "(Ljava/lang/String;)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)searchAlbum },
|
|
{"nativeSearchPagedAlbum", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)searchPagedAlbum },
|
|
{"nativeGetAlbumSearchCount", "(Ljava/lang/String;)I", (void*)getAlbumSearchCount },
|
|
{"nativeSearchArtist", "(Ljava/lang/String;)[Lorg/videolan/medialibrary/interfaces/media/AbstractArtist;", (void*)searchArtist },
|
|
{"nativeSearchPagedArtist", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractArtist;", (void*)searchPagedArtist },
|
|
{"nativeGetArtistsSearchCount", "(Ljava/lang/String;)I", (void*)getArtistsSearchCount },
|
|
{"nativeSearchGenre", "(Ljava/lang/String;)[Lorg/videolan/medialibrary/interfaces/media/AbstractGenre;", (void*)searchGenre },
|
|
{"nativeSearchPagedGenre", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractGenre;", (void*)searchPagedGenre },
|
|
{"nativeGetGenreSearchCount", "(Ljava/lang/String;)I", (void*)getGenreSearchCount },
|
|
{"nativeSearchPlaylist", "(Ljava/lang/String;)[Lorg/videolan/medialibrary/interfaces/media/AbstractPlaylist;", (void*)searchPlaylist },
|
|
{"nativeSearchPagedPlaylist", "(Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractPlaylist;", (void*)searchPagedPlaylist },
|
|
{"nativeGetPlaylistSearchCount", "(Ljava/lang/String;)I", (void*)getPlaylistSearchCount },
|
|
{"nativeGetMedia", "(J)Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getMedia },
|
|
{"nativeGetMediaFromMrl", "(Ljava/lang/String;)Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getMediaFromMrl },
|
|
{"nativeAddMedia", "(Ljava/lang/String;)Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)addMedia },
|
|
{"nativeRemoveExternalMedia", "(J)Z", (void*)removeExternalMedia },
|
|
{"nativeAddStream", "(Ljava/lang/String;Ljava/lang/String;)Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)addStream },
|
|
{"nativeGetVideoCount", "()I", (void*)getVideoCount },
|
|
{"nativeGetAudioCount", "()I", (void*)getAudioCount },
|
|
{"nativeGetAlbums", "(IZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)getAlbums },
|
|
{"nativeGetPagedAlbums", "(IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)getPagedAlbums },
|
|
{"nativeGetAlbumsCount", "()I", (void*)getAlbumsCount },
|
|
{"nativeGetAlbum", "(J)Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)getAlbum },
|
|
{"nativeGetArtists", "(ZIZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractArtist;", (void*)getArtists },
|
|
{"nativeGetPagedArtists", "(ZIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractArtist;", (void*)getPagedArtists },
|
|
{"nativeGetArtistsCount", "(Z)I", (void*)getArtistsCount },
|
|
{"nativeGetArtist", "(J)Lorg/videolan/medialibrary/interfaces/media/AbstractArtist;", (void*)getArtist },
|
|
{"nativeGetGenres", "(IZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractGenre;", (void*)getGenres },
|
|
{"nativeGetPagedGenres", "(IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractGenre;", (void*)getPagedGenres },
|
|
{"nativeGetGenresCount", "()I", (void*)getGenresCount },
|
|
{"nativeGetGenre", "(J)Lorg/videolan/medialibrary/interfaces/media/AbstractGenre;", (void*)getGenre },
|
|
{"nativeGetPlaylists", "(IZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractPlaylist;", (void*)getPlaylists },
|
|
{"nativeGetPagedPlaylists", "(IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractPlaylist;", (void*)getPagedPlaylists },
|
|
{"nativeGetPlaylistsCount", "()I", (void*)getPlaylistsCount },
|
|
{"nativeGetPlaylist", "(J)Lorg/videolan/medialibrary/interfaces/media/AbstractPlaylist;", (void*)getPlaylist },
|
|
{"nativeGetFolders", "(IIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractFolder;", (void*)folders },
|
|
{"nativeGetFoldersCount", "(I)I", (void*)foldersCount },
|
|
{"nativePauseBackgroundOperations", "()V", (void*)pauseBackgroundOperations },
|
|
{"nativeResumeBackgroundOperations", "()V", (void*)resumeBackgroundOperations },
|
|
{"nativeReload", "()V", (void*)reload },
|
|
{"nativeReload", "(Ljava/lang/String;)V", (void*)reloadEntryPoint },
|
|
{"nativeForceParserRetry", "()V", (void*)forceParserRetry },
|
|
{"nativeForceRescan", "()V", (void*)forceRescan },
|
|
{"nativeIncreasePlayCount", "(J)Z", (void*)increasePlayCount },
|
|
{"nativeSetMediaUpdatedCbFlag", "(I)V", (void*)setMediaUpdatedCbFlag },
|
|
{"nativeSetMediaAddedCbFlag", "(I)V", (void*)setMediaAddedCbFlag },
|
|
{"nativePlaylistCreate", "(Ljava/lang/String;)Lorg/videolan/medialibrary/interfaces/media/AbstractPlaylist;", (void*)playlistCreate },
|
|
{"nativeGetVideoGroups", "(IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractVideoGroup;", (void*)videoGroups },
|
|
{"nativeGetVideoGroupsCount", "()I", (void*)videoGroupsCount },
|
|
|
|
};
|
|
|
|
static JNINativeMethod media_methods[] = {
|
|
{"nativeGetMediaLongMetadata", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JI)J", (void*)getMediaLongMetadata },
|
|
{"nativeGetMediaStringMetadata", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JI)Ljava/lang/String;", (void*)getMediaStringMetadata },
|
|
{"nativeSetMediaStringMetadata", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JILjava/lang/String;)V", (void*)setMediaStringMetadata },
|
|
{"nativeSetMediaLongMetadata", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIJ)V", (void*)setMediaLongMetadata },
|
|
{"nativeSetMediaThumbnail", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;)V", (void*)setMediaThumbnail },
|
|
{"nativeSetMediaTitle", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;)V", (void*)setMediaTitle },
|
|
{"nativeRemoveFromHistory", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)V", (void*)removeMediaFromHistory },
|
|
{"nativeRequestThumbnail", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIIIF)V", (void*)requestThumbnail },
|
|
};
|
|
|
|
static JNINativeMethod album_methods[] = {
|
|
{"nativeGetTracks", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getTracksFromAlbum },
|
|
{"nativeGetPagedTracks", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getPagedTracksFromAlbum },
|
|
{"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchFromAlbum },
|
|
{"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;)I", (void*)getSearchFromAlbumCount },
|
|
{"nativeGetTracksCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)I", (void*)getTracksFromAlbumCount },
|
|
};
|
|
|
|
static JNINativeMethod artist_methods[] = {
|
|
{"nativeGetMedia", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getMediaFromArtist },
|
|
{"nativeGetAlbums", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)getAlbumsFromArtist },
|
|
{"nativeGetPagedMedia", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getPagedMediaFromArtist },
|
|
{"nativeGetPagedAlbums", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)getPagedAlbumsFromArtist },
|
|
{"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchFromArtist },
|
|
{"nativeSearchAlbums", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)searchAlbumsFromArtist },
|
|
{"nativeGetTracksCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)I", (void*)getArtistTracksCount },
|
|
{"nativeGetAlbumsCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)I", (void*)getArtistAlbumsCount },
|
|
{"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;)I", (void*)getSearchFromArtistCount },
|
|
{"nativeGetSearchAlbumCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;)I", (void*)getSearchAlbumFromArtistCount },
|
|
};
|
|
|
|
static JNINativeMethod genre_methods[] = {
|
|
{"nativeGetTracks", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JZIZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getMediaFromGenre },
|
|
{"nativeGetAlbums", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)getAlbumsFromGenre },
|
|
{"nativeGetArtists", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractArtist;", (void*)getArtistsFromGenre },
|
|
{"nativeGetPagedTracks", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JZIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getPagedMediaFromGenre },
|
|
{"nativeGetPagedAlbums", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)getPagedAlbumsFromGenre },
|
|
{"nativeGetPagedArtists", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractArtist;", (void*)getPagedArtistsFromGenre },
|
|
{"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchMediaFromGenre },
|
|
{"nativeSearchAlbums", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;", (void*)searchAlbumsFromGenre },
|
|
{"nativeGetTracksCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)I", (void*)getGenreTracksCount },
|
|
{"nativeGetAlbumsCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)I", (void*)getGenreAlbumsCount },
|
|
{"nativeGetArtistsCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)I", (void*)getGenreArtistsCount },
|
|
{"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;)I", (void*)getSearchMediaFromGenreCount },
|
|
{"nativeGetSearchAlbumCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;)I", (void*)getSearchAlbumsFromGenreCount },
|
|
};
|
|
|
|
static JNINativeMethod folder_methods[] = {
|
|
{"nativeMedia", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)mediaFromFolder },
|
|
{"nativeSubfolders", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractFolder;", (void*)subFolders },
|
|
{"nativeMediaCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JI)I", (void*)mediaFromFolderCount },
|
|
{"nativeSubfoldersCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JI)I", (void*)subFoldersCount },
|
|
{"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;IIZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchMediaFromFolder },
|
|
{"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;I)I", (void*)getSearchMediaFromFolderCount },
|
|
};
|
|
|
|
static JNINativeMethod videogroup_methods[] = {
|
|
{"nativeMedia", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getPagedMediaFromvideoGroup },
|
|
// {"nativeMediaCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JI)I", (void*)getvideoGroupMediaCount },
|
|
{"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;Ljava/lang/String;Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchFromvideoGroup },
|
|
{"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;Ljava/lang/String;Ljava/lang/String;)I", (void*)getSearchFromvideoGroupCount },
|
|
};
|
|
|
|
static JNINativeMethod playlist_methods[] = {
|
|
{"nativeGetTracks", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getMediaFromPlaylist },
|
|
{"nativeGetPagedTracks", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getPagedMediaFromPlaylist },
|
|
{"nativeGetTracksCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)I", (void*)getPlaylistTracksCount },
|
|
{"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchFromPlaylist },
|
|
{"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;)I", (void*)getSearchFromPlaylistCount },
|
|
{"nativePlaylistAppend", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JJ)Z", (void*)playlistAppend },
|
|
{"nativePlaylistAppendGroup", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J[J)Z", (void*)playlistAppendGroup },
|
|
{"nativePlaylistAdd", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JJI)Z", (void*)playlistAdd },
|
|
{"nativePlaylistMove", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JII)Z", (void*)playlistMove },
|
|
{"nativePlaylistRemove", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JI)Z", (void*)playlistRemove },
|
|
{"nativePlaylistDelete", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)Z", (void*)playlistDelete },
|
|
};
|
|
|
|
/* This function is called when a thread attached to the Java VM is canceled or
|
|
* exited */
|
|
static void jni_detach_thread(void *data)
|
|
{
|
|
//JNIEnv *env = data;
|
|
myVm->DetachCurrentThread();
|
|
}
|
|
|
|
jint JNI_OnLoad(JavaVM *vm, void *reserved)
|
|
{
|
|
JNIEnv* env = NULL;
|
|
myVm = vm;
|
|
|
|
if (vm->GetEnv((void**) &env, VLC_JNI_VERSION) != JNI_OK)
|
|
return -1;
|
|
|
|
#define GET_CLASS(clazz, str, b_globlal) do { \
|
|
(clazz) = env->FindClass((str)); \
|
|
if (!(clazz)) { \
|
|
LOGE("FindClass(%s) failed", (str)); \
|
|
return -1; \
|
|
} \
|
|
if (b_globlal) { \
|
|
(clazz) = (jclass) env->NewGlobalRef((clazz)); \
|
|
if (!(clazz)) { \
|
|
LOGE("NewGlobalRef(%s) failed", (str)); \
|
|
return -1; \
|
|
} \
|
|
} \
|
|
} while (0)
|
|
|
|
#define GET_ID(get, id, clazz, str, args) do { \
|
|
(id) = env->get((clazz), (str), (args)); \
|
|
if (!(id)) { \
|
|
LOGE(#get"(%s) failed", (str)); \
|
|
return -1; \
|
|
} \
|
|
} while (0)
|
|
|
|
jclass Version_clazz;
|
|
jfieldID SDK_INT_fieldID;
|
|
GET_CLASS(Version_clazz, "android/os/Build$VERSION", false);
|
|
GET_ID(GetStaticFieldID, SDK_INT_fieldID, Version_clazz, "SDK_INT", "I");
|
|
ml_fields.SDK_INT = env->GetStaticIntField(Version_clazz,
|
|
SDK_INT_fieldID);
|
|
|
|
GET_CLASS(ml_fields.IllegalStateException.clazz,
|
|
"java/lang/IllegalStateException", true);
|
|
GET_CLASS(ml_fields.IllegalArgumentException.clazz,
|
|
"java/lang/IllegalArgumentException", true);
|
|
|
|
GET_CLASS(ml_fields.MediaLibrary.clazz, CLASSPATHNAME, true);
|
|
if (env->RegisterNatives(ml_fields.MediaLibrary.clazz, methods, sizeof(methods) / sizeof(methods[0])) < 0) {
|
|
LOGE("RegisterNatives failed for '%s'", CLASSPATHNAME);
|
|
return -1;
|
|
}
|
|
|
|
GET_CLASS(ml_fields.Artist.clazz, "org/videolan/medialibrary/media/Artist", true);
|
|
if (env->RegisterNatives(ml_fields.Artist.clazz, artist_methods, sizeof(artist_methods) / sizeof(artist_methods[0])) < 0) {
|
|
LOGE("RegisterNatives failed for org/videolan/medialibrary/media/Artist");
|
|
return -1;
|
|
}
|
|
GET_ID(GetMethodID,
|
|
ml_fields.Artist.initID,
|
|
ml_fields.Artist.clazz,
|
|
"<init>", "(JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
|
|
|
|
GET_CLASS(ml_fields.Album.clazz, "org/videolan/medialibrary/media/Album", true);
|
|
if (env->RegisterNatives(ml_fields.Album.clazz, album_methods, sizeof(album_methods) / sizeof(album_methods[0])) < 0) {
|
|
LOGE("RegisterNatives failed for 'org/videolan/medialibrary/media/Album");
|
|
return -1;
|
|
}
|
|
GET_ID(GetMethodID,
|
|
ml_fields.Album.initID,
|
|
ml_fields.Album.clazz,
|
|
"<init>", "(JLjava/lang/String;ILjava/lang/String;Ljava/lang/String;JII)V");
|
|
|
|
GET_CLASS(ml_fields.Folder.clazz, "org/videolan/medialibrary/media/Folder", true);
|
|
if (env->RegisterNatives(ml_fields.Folder.clazz, folder_methods, sizeof(folder_methods) / sizeof(folder_methods[0])) < 0) {
|
|
LOGE("RegisterNatives failed for org/videolan/medialibrary/media/Folder");
|
|
return -1;
|
|
}
|
|
GET_ID(GetMethodID,
|
|
ml_fields.Folder.initID,
|
|
ml_fields.Folder.clazz,
|
|
"<init>", "(JLjava/lang/String;Ljava/lang/String;)V");
|
|
|
|
GET_CLASS(ml_fields.Genre.clazz, "org/videolan/medialibrary/media/Genre", true);
|
|
if (env->RegisterNatives(ml_fields.Genre.clazz, genre_methods, sizeof(genre_methods) / sizeof(genre_methods[0])) < 0) {
|
|
LOGE("RegisterNatives failed for org/videolan/medialibrary/media/Genre");
|
|
return -1;
|
|
}
|
|
GET_ID(GetMethodID,
|
|
ml_fields.Genre.initID,
|
|
ml_fields.Genre.clazz,
|
|
"<init>", "(JLjava/lang/String;)V");
|
|
|
|
GET_CLASS(ml_fields.Playlist.clazz, "org/videolan/medialibrary/media/Playlist", true);
|
|
if (env->RegisterNatives(ml_fields.Playlist.clazz, playlist_methods, sizeof(playlist_methods) / sizeof(playlist_methods[0])) < 0) {
|
|
LOGE("RegisterNatives failed for org/videolan/medialibrary/media/Playlist");
|
|
return -1;
|
|
}
|
|
GET_ID(GetMethodID,
|
|
ml_fields.Playlist.initID,
|
|
ml_fields.Playlist.clazz,
|
|
"<init>", "(JLjava/lang/String;I)V");
|
|
|
|
|
|
GET_CLASS(ml_fields.MediaWrapper.clazz,
|
|
"org/videolan/medialibrary/media/MediaWrapper", true);
|
|
if (env->RegisterNatives(ml_fields.MediaWrapper.clazz, media_methods, sizeof(media_methods) / sizeof(media_methods[0])) < 0) {
|
|
LOGE("RegisterNatives failed for org/videolan/medialibrary/media/MediaWrapper");
|
|
return -1;
|
|
}
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaWrapper.initID,
|
|
ml_fields.MediaWrapper.clazz,
|
|
"<init>", "(JLjava/lang/String;JJILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;IIIIJJZI)V");
|
|
|
|
GET_CLASS(ml_fields.HistoryItem.clazz,
|
|
"org/videolan/medialibrary/media/HistoryItem", true);
|
|
|
|
GET_ID(GetMethodID,
|
|
ml_fields.HistoryItem.initID,
|
|
ml_fields.HistoryItem.clazz,
|
|
"<init>", "(Ljava/lang/String;Ljava/lang/String;JZ)V");
|
|
|
|
GET_CLASS(ml_fields.SearchAggregate.clazz, "org/videolan/medialibrary/media/SearchAggregate", true);
|
|
|
|
GET_ID(GetMethodID,
|
|
ml_fields.SearchAggregate.initID,
|
|
ml_fields.SearchAggregate.clazz,
|
|
"<init>", "([Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;[Lorg/videolan/medialibrary/interfaces/media/AbstractArtist;[Lorg/videolan/medialibrary/interfaces/media/AbstractGenre;[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;[Lorg/videolan/medialibrary/interfaces/media/AbstractPlaylist;)V");
|
|
|
|
GET_CLASS(ml_fields.Folder.clazz, "org/videolan/medialibrary/media/Folder", true);
|
|
if (env->RegisterNatives(ml_fields.Folder.clazz, folder_methods, sizeof(folder_methods) / sizeof(folder_methods[0])) < 0) {
|
|
LOGE("RegisterNatives failed for org/videolan/medialibrary/media/Folder");
|
|
return -1;
|
|
}
|
|
GET_ID(GetMethodID,
|
|
ml_fields.Folder.initID,
|
|
ml_fields.Folder.clazz,
|
|
"<init>", "(JLjava/lang/String;Ljava/lang/String;)V");
|
|
|
|
GET_CLASS(ml_fields.VideoGroup.clazz, "org/videolan/medialibrary/media/VideoGroup", true);
|
|
if (env->RegisterNatives(ml_fields.VideoGroup.clazz, videogroup_methods, sizeof(videogroup_methods) / sizeof(videogroup_methods[0])) < 0) {
|
|
LOGE("RegisterNatives failed for 'org/videolan/medialibrary/media/VideoGroup");
|
|
return -1;
|
|
}
|
|
GET_ID(GetMethodID,
|
|
ml_fields.VideoGroup.initID,
|
|
ml_fields.VideoGroup.clazz,
|
|
"<init>", "(Ljava/lang/String;I)V");
|
|
|
|
GET_ID(GetFieldID,
|
|
ml_fields.MediaLibrary.instanceID,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"mInstanceID", "J");
|
|
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onMediaAddedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onMediaAdded", "([Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;)V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onMediaUpdatedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onMediaUpdated", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onMediaDeletedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onMediaDeleted", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onArtistsAddedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onArtistsAdded", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onAlbumsAddedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onAlbumsAdded", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onPlaylistsAddedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onPlaylistsAdded", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onGenresAddedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onGenresAdded", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onArtistsDeletedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onArtistsDeleted", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onAlbumsDeletedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onAlbumsDeleted", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onGenresDeletedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onGenresDeleted", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onPlaylistsDeletedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onPlaylistsDeleted", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onArtistsModifiedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onArtistsModified", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onAlbumsModifiedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onAlbumsModified", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onGenresModifiedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onGenresModified", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onHistoryChangedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onHistoryChanged", "(I)V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onMediaGroupAddedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onMediaGroupAdded", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onMediaGroupModifiedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onMediaGroupModified", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onMediaGroupDeletedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onMediaGroupDeleted", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onPlaylistsModifiedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onPlaylistsModified", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onDiscoveryStartedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onDiscoveryStarted", "(Ljava/lang/String;)V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onDiscoveryProgressId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onDiscoveryProgress", "(Ljava/lang/String;)V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onDiscoveryCompletedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onDiscoveryCompleted", "(Ljava/lang/String;)V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onParsingStatsUpdatedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onParsingStatsUpdated", "(I)V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onBackgroundTasksIdleChangedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onBackgroundTasksIdleChanged", "(Z)V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onReloadStartedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onReloadStarted", "(Ljava/lang/String;)V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onReloadCompletedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onReloadCompleted", "(Ljava/lang/String;)V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onEntryPointBannedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onEntryPointBanned", "(Ljava/lang/String;Z)V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onEntryPointUnbannedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onEntryPointUnbanned", "(Ljava/lang/String;Z)V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onEntryPointAddedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onEntryPointAdded", "(Ljava/lang/String;Z)V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onEntryPointRemovedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onEntryPointRemoved", "(Ljava/lang/String;Z)V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onMediaThumbnailReadyId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onMediaThumbnailReady", "(Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;Z)V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onUnhandledExceptionId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onUnhandledException", "(Ljava/lang/String;Ljava/lang/String;Z)V");
|
|
|
|
#undef GET_CLASS
|
|
#undef GET_ID
|
|
|
|
return VLC_JNI_VERSION;
|
|
}
|
|
|
|
void JNI_OnUnload(JavaVM* vm, void* reserved)
|
|
{
|
|
JNIEnv* env = NULL;
|
|
|
|
if (vm->GetEnv((void**) &env, VLC_JNI_VERSION) != JNI_OK)
|
|
return;
|
|
|
|
env->DeleteGlobalRef(ml_fields.IllegalArgumentException.clazz);
|
|
env->DeleteGlobalRef(ml_fields.IllegalStateException.clazz);
|
|
env->DeleteGlobalRef(ml_fields.MediaLibrary.clazz);
|
|
env->DeleteGlobalRef(ml_fields.MediaWrapper.clazz);
|
|
}
|
|
|
|
|
|
static inline void throw_IllegalStateException(JNIEnv *env, const char *p_error)
|
|
{
|
|
env->ThrowNew(ml_fields.IllegalStateException.clazz, p_error);
|
|
}
|
|
|
|
static inline void throw_IllegalArgumentException(JNIEnv *env, const char *p_error)
|
|
{
|
|
env->ThrowNew(ml_fields.IllegalArgumentException.clazz, p_error);
|
|
}
|
|
|
|
static AndroidMediaLibrary *
|
|
MediaLibrary_getInstanceInternal(JNIEnv *env, jobject thiz)
|
|
{
|
|
return (AndroidMediaLibrary*)(intptr_t) env->GetLongField(thiz,
|
|
ml_fields.MediaLibrary.instanceID);
|
|
}
|
|
|
|
AndroidMediaLibrary *
|
|
MediaLibrary_getInstance(JNIEnv *env, jobject thiz)
|
|
{
|
|
AndroidMediaLibrary *p_obj = MediaLibrary_getInstanceInternal(env, thiz);
|
|
if (!p_obj)
|
|
throw_IllegalStateException(env, "can't get AndroidMediaLibrary instance");
|
|
return p_obj;
|
|
}
|
|
|
|
|
|
static void
|
|
MediaLibrary_setInstance(JNIEnv *env, jobject thiz, AndroidMediaLibrary *p_obj)
|
|
{
|
|
env->SetLongField(thiz,
|
|
ml_fields.MediaLibrary.instanceID,
|
|
(jlong)(intptr_t)p_obj);
|
|
}
|
|
|