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.
3062 lines
147 KiB
3062 lines
147 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/MedialibraryImpl"
|
|
|
|
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);
|
|
|
|
void
|
|
constructML(JNIEnv* env, jobject thiz, jstring dbPath, jstring thumbsPath)
|
|
{
|
|
const char *thumbs_utfchars = env->GetStringUTFChars(thumbsPath, JNI_FALSE);
|
|
const char *db_utfchars = env->GetStringUTFChars(dbPath, JNI_FALSE);
|
|
AndroidMediaLibrary *aml = new AndroidMediaLibrary(myVm, &ml_fields, thiz, db_utfchars, thumbs_utfchars);
|
|
MediaLibrary_setInstance(env, thiz, aml);
|
|
}
|
|
|
|
jint
|
|
init(JNIEnv* env, jobject thiz, jstring thumbsPath)
|
|
{
|
|
const char *thumbs_utfchars = env->GetStringUTFChars(thumbsPath, JNI_FALSE);
|
|
medialibrary::InitializeResult initCode = MediaLibrary_getInstance(env, thiz)->initML();
|
|
m_IsInitialized = initCode != medialibrary::InitializeResult::Failed;
|
|
env->ReleaseStringUTFChars(thumbsPath, thumbs_utfchars);
|
|
return (int) initCode;
|
|
}
|
|
|
|
void
|
|
release(JNIEnv* env, jobject thiz)
|
|
{
|
|
LOGD("/!\\ release medialib. /!\\");
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
delete aml;
|
|
MediaLibrary_setInstance(env, thiz, NULL);
|
|
}
|
|
|
|
medialibrary::QueryParameters generateParams(medialibrary::SortingCriteria sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
medialibrary::QueryParameters params {
|
|
sortingCriteria,
|
|
static_cast<bool>( desc ),
|
|
static_cast<bool>( includeMissing ),
|
|
false,
|
|
static_cast<bool>( onlyFavorites )
|
|
};
|
|
return params;
|
|
}
|
|
medialibrary::QueryParameters generateParams(jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
return generateParams(static_cast<medialibrary::SortingCriteria>(sortingCriteria), desc, includeMissing, onlyFavorites);
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
jobjectArray
|
|
bannedFolders(JNIEnv* env, jobject thiz)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
std::vector<medialibrary::FolderPtr> folders = aml->bannedEntryPoints();
|
|
|
|
|
|
std::vector<std::string> mrls;
|
|
mrls.reserve(folders.size());
|
|
for(medialibrary::FolderPtr& folder : folders) {
|
|
try
|
|
{
|
|
mrls.push_back( folder->mrl() );
|
|
}
|
|
catch ( const medialibrary::fs::errors::DeviceRemoved& )
|
|
{
|
|
// Just ignore, the device isn't available anymore
|
|
}
|
|
}
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mrls.size(), env->FindClass("java/lang/String"), NULL);
|
|
int index = -1;
|
|
for( const std::string& m : mrls ) {
|
|
auto mrl = vlcNewStringUTF(env, m.c_str());
|
|
env->SetObjectArrayElement(mediaRefs, ++index, mrl.get());
|
|
}
|
|
return mediaRefs;
|
|
}
|
|
|
|
void
|
|
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);
|
|
aml->addDevice(uuidChar, path, removable);
|
|
env->ReleaseStringUTFChars(uuid, uuidChar);
|
|
env->ReleaseStringUTFChars(storagePath, path);
|
|
}
|
|
|
|
jboolean
|
|
isDeviceKnown(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->isDeviceKnown(uuidChar, path, removable);
|
|
env->ReleaseStringUTFChars(uuid, uuidChar);
|
|
env->ReleaseStringUTFChars(storagePath, path);
|
|
return isNew;
|
|
}
|
|
|
|
jboolean
|
|
deleteRemovableDevices(JNIEnv* env, jobject thiz)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
jboolean isDeleted = aml->deleteRemovableDevices();
|
|
return isDeleted;
|
|
}
|
|
|
|
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) {
|
|
auto path = vlcNewStringUTF(env, std::get<1>(device).c_str());
|
|
env->SetObjectArrayElement(deviceRefs, ++index, path.get());
|
|
}
|
|
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);
|
|
}
|
|
|
|
jboolean
|
|
setDiscoverNetworkEnabled(JNIEnv* env, jobject thiz, jboolean enabled)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
return aml->setDiscoverNetworkEnabled(enabled);
|
|
}
|
|
|
|
void
|
|
setLibVLCInstance(JNIEnv* env, jobject thiz, jlong libVLC){
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
aml->setLibvlcInstance( (libvlc_instance_t*)libVLC );
|
|
}
|
|
|
|
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();
|
|
std::vector<std::string> mrls;
|
|
mrls.reserve(entryPoints.size());
|
|
for(medialibrary::FolderPtr& entryPoint : entryPoints) {
|
|
try
|
|
{
|
|
mrls.push_back( entryPoint->mrl() );
|
|
}
|
|
catch ( const medialibrary::fs::errors::DeviceRemoved& )
|
|
{
|
|
// Just ignore, the device isn't available anymore
|
|
}
|
|
}
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mrls.size(), env->FindClass("java/lang/String"), NULL);
|
|
int index = -1;
|
|
for( const std::string& m : mrls ) {
|
|
auto mrl = vlcNewStringUTF(env, m.c_str());
|
|
env->SetObjectArrayElement(mediaRefs, ++index, mrl.get());
|
|
}
|
|
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
|
|
setLastTime(JNIEnv* env, jobject thiz, jlong id, jlong time)
|
|
{
|
|
return MediaLibrary_getInstance(env, thiz)->setLastTime((int64_t)id, (int64_t)time);
|
|
}
|
|
|
|
jboolean
|
|
setLastPosition(JNIEnv* env, jobject thiz, jlong id, jfloat lastPosition)
|
|
{
|
|
return MediaLibrary_getInstance(env, thiz)->setLastPosition((int64_t)id, (float)lastPosition);
|
|
}
|
|
|
|
jboolean
|
|
removeMediaFromHistory(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id)
|
|
{
|
|
return MediaLibrary_getInstance(env, medialibrary)->removeMediaFromHistory((int64_t)id);
|
|
}
|
|
|
|
jobjectArray
|
|
history(JNIEnv* env, jobject thiz, jint type)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
std::vector<medialibrary::MediaPtr> mediaPlayed = aml->history((medialibrary::HistoryType)type);
|
|
utils::jni::objectArray mediaRefs{ env, (jobjectArray) env->NewObjectArray(mediaPlayed.size(), ml_fields.MediaWrapper.clazz, NULL) };
|
|
int index = -1, drops = 0;
|
|
for(medialibrary::MediaPtr const& media : mediaPlayed) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs.get(), ++index, item.get());
|
|
if (item == nullptr)
|
|
++drops;
|
|
}
|
|
return filteredArray(env, std::move( mediaRefs ), ml_fields.MediaWrapper.clazz, drops).release();
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
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();
|
|
utils::jni::objectArray videoRefs{ env, (jobjectArray) env->NewObjectArray(videoFiles.size(), ml_fields.MediaWrapper.clazz, NULL) };
|
|
int index = -1, drops = 0;
|
|
for(medialibrary::MediaPtr const& media : videoFiles) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(videoRefs.get(), ++index, item.get());
|
|
if (item == nullptr)
|
|
++drops;
|
|
}
|
|
return filteredArray(env, std::move( videoRefs ), ml_fields.MediaWrapper.clazz, drops).release();
|
|
}
|
|
|
|
jobjectArray
|
|
getVideos(JNIEnv* env, jobject thiz)
|
|
{
|
|
return getInternalVideos(env, thiz);
|
|
}
|
|
|
|
jobjectArray
|
|
getSortedVideos(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
return getInternalVideos(env, thiz, ¶ms );
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedVideos(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
return getInternalVideos(env, thiz, ¶ms, nbItems, offset );
|
|
}
|
|
|
|
jobjectArray
|
|
getRecentVideos(JNIEnv* env, jobject thiz)
|
|
{
|
|
medialibrary::QueryParameters params = generateParams(medialibrary::SortingCriteria::InsertionDate, true, true, false);
|
|
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();
|
|
utils::jni::objectArray audioRefs{ env, (jobjectArray) env->NewObjectArray(audioFiles.size(), ml_fields.MediaWrapper.clazz, NULL) };
|
|
int index = -1, drops = 0;
|
|
for(medialibrary::MediaPtr const& media : audioFiles) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(audioRefs.get(), ++index, item.get());
|
|
if (item == nullptr)
|
|
++drops;
|
|
}
|
|
return filteredArray(env, std::move( audioRefs ), ml_fields.MediaWrapper.clazz, drops).release();
|
|
}
|
|
|
|
jobjectArray
|
|
getAudio(JNIEnv* env, jobject thiz)
|
|
{
|
|
return getInternalAudio(env, thiz);
|
|
}
|
|
|
|
jobjectArray
|
|
getRecentAudio(JNIEnv* env, jobject thiz, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
medialibrary::QueryParameters params = generateParams(medialibrary::SortingCriteria::InsertionDate, true, includeMissing, onlyFavorites);
|
|
return getInternalAudio(env, thiz, ¶ms );
|
|
}
|
|
|
|
jobjectArray
|
|
getSortedAudio(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
return getInternalAudio(env, thiz, ¶ms);
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedAudio(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
return getInternalAudio(env, thiz, ¶ms, nbItems, offset);
|
|
}
|
|
|
|
jobject
|
|
search(JNIEnv* env, jobject thiz, jstring query, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *queryChar = env->GetStringUTFChars(query, JNI_FALSE);
|
|
auto searchResult = convertSearchAggregateObject(env, &ml_fields, aml->search(queryChar), includeMissing, onlyFavorites);
|
|
env->ReleaseStringUTFChars(query, queryChar);
|
|
return searchResult.release();
|
|
}
|
|
|
|
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) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaList, ++index, item.get());
|
|
}
|
|
env->ReleaseStringUTFChars(query, queryChar);
|
|
return mediaList;
|
|
}
|
|
|
|
jobjectArray
|
|
searchPagedMedia(JNIEnv* env, jobject thiz, jstring filterQuery, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaList, ++index, item.get());
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return mediaList;
|
|
}
|
|
|
|
jobjectArray
|
|
searchPagedAudio(JNIEnv* env, jobject thiz, jstring filterQuery, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaList, ++index, item.get());
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return mediaList;
|
|
}
|
|
|
|
jobjectArray
|
|
searchPagedVideo(JNIEnv* env, jobject thiz, jstring filterQuery, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaList, ++index, item.get());
|
|
}
|
|
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) {
|
|
auto item = convertArtistObject(env, &ml_fields, artist);
|
|
env->SetObjectArrayElement(artistRefs, ++index, item.get());
|
|
}
|
|
env->ReleaseStringUTFChars(query, queryChar);
|
|
return artistRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
searchPagedArtist(JNIEnv* env, jobject thiz, jstring filterQuery, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = convertArtistObject(env, &ml_fields, artist);
|
|
env->SetObjectArrayElement(artistRefs, ++index, item.get());
|
|
}
|
|
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) {
|
|
auto item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumRefs, ++index, item.get());
|
|
}
|
|
env->ReleaseStringUTFChars(query, queryChar);
|
|
return albumRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
searchPagedAlbum(JNIEnv* env, jobject thiz, jstring filterQuery, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumRefs, ++index, item.get());
|
|
}
|
|
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) {
|
|
auto item = convertGenreObject(env, &ml_fields, genre);
|
|
env->SetObjectArrayElement(genreRefs, ++index, item.get());
|
|
}
|
|
env->ReleaseStringUTFChars(query, queryChar);
|
|
return genreRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
searchPagedGenre(JNIEnv* env, jobject thiz, jstring filterQuery, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = convertGenreObject(env, &ml_fields, genre);
|
|
env->SetObjectArrayElement(genreRefs, ++index, item.get());
|
|
}
|
|
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, medialibrary::PlaylistType type, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *queryChar = env->GetStringUTFChars(query, JNI_FALSE);
|
|
std::vector<medialibrary::PlaylistPtr> playlists = aml->searchPlaylists(queryChar, type)->all();
|
|
jobjectArray playlistRefs = (jobjectArray) env->NewObjectArray(playlists.size(), ml_fields.Playlist.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::PlaylistPtr const& playlist : playlists) {
|
|
auto item = convertPlaylistObject(env, &ml_fields, playlist, includeMissing, onlyFavorites);
|
|
env->SetObjectArrayElement(playlistRefs, ++index, item.get());
|
|
}
|
|
env->ReleaseStringUTFChars(query, queryChar);
|
|
return playlistRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
searchPagedPlaylist(JNIEnv* env, jobject thiz, jstring filterQuery, medialibrary::PlaylistType type, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = aml->searchPlaylists(queryChar, type, ¶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) {
|
|
auto item = convertPlaylistObject(env, &ml_fields, playlist, includeMissing, onlyFavorites);
|
|
env->SetObjectArrayElement(playlistRefs, ++index, item.get());
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return playlistRefs;
|
|
}
|
|
|
|
jint
|
|
getPlaylistSearchCount(JNIEnv* env, jobject thiz, jstring filterQuery, medialibrary::PlaylistType type) {
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
jint count = (jint) MediaLibrary_getInstance(env, thiz)->searchPlaylists(queryChar, type)->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)).release();
|
|
}
|
|
|
|
jobject
|
|
getMediaFromMrl(JNIEnv* env, jobject thiz, jstring mrl) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *char_mrl = env->GetStringUTFChars(mrl, JNI_FALSE);
|
|
auto mw = mediaToMediaWrapper(env, &ml_fields, aml->media(char_mrl));
|
|
env->ReleaseStringUTFChars(mrl, char_mrl);
|
|
return mw.release();
|
|
}
|
|
|
|
jobject
|
|
addMedia(JNIEnv* env, jobject thiz, jstring mrl, jlong duration) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *char_mrl = env->GetStringUTFChars(mrl, JNI_FALSE);
|
|
auto mw = mediaToMediaWrapper(env, &ml_fields, aml->addMedia(char_mrl, duration));
|
|
env->ReleaseStringUTFChars(mrl, char_mrl);
|
|
return mw.release();
|
|
}
|
|
|
|
jboolean
|
|
removeExternalMedia(JNIEnv* env, jobject thiz, jlong id) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
return aml->removeExternalMedia(id);
|
|
}
|
|
|
|
jboolean
|
|
flushUserProvidedThumbnails(JNIEnv* env, jobject thiz) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
return aml->flushUserProvidedThumbnails();
|
|
}
|
|
|
|
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);
|
|
auto mw = mediaToMediaWrapper(env, &ml_fields, aml->addStream(char_mrl, char_title));
|
|
env->ReleaseStringUTFChars(mrl, char_mrl);
|
|
env->ReleaseStringUTFChars(title, char_title);
|
|
return mw.release();
|
|
}
|
|
|
|
jobjectArray
|
|
getAlbums(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumRefs, ++index, item.get());
|
|
}
|
|
return albumRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedAlbums(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumRefs, ++index, item.get());
|
|
}
|
|
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);
|
|
if (!album)
|
|
return nullptr;
|
|
return convertAlbumObject(env, &ml_fields, album).release();
|
|
}
|
|
|
|
jobjectArray
|
|
getArtists(JNIEnv* env, jobject thiz, jboolean all, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = convertArtistObject(env, &ml_fields, artist);
|
|
env->SetObjectArrayElement(artistRefs, ++index, item.get());
|
|
}
|
|
return artistRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedArtists(JNIEnv* env, jobject thiz, jboolean all, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = convertArtistObject(env, &ml_fields, artist);
|
|
env->SetObjectArrayElement(artistRefs, ++index, item.get());
|
|
}
|
|
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);
|
|
if (!artist)
|
|
return nullptr;
|
|
return convertArtistObject(env, &ml_fields, artist).release();
|
|
}
|
|
|
|
jobjectArray
|
|
getGenres(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = convertGenreObject(env, &ml_fields, genre);
|
|
env->SetObjectArrayElement(genreRefs, ++index, item.get());
|
|
}
|
|
return genreRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedGenres(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = convertGenreObject(env, &ml_fields, genre);
|
|
env->SetObjectArrayElement(genreRefs, ++index, item.get());
|
|
}
|
|
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);
|
|
if (!genre)
|
|
return nullptr;
|
|
return convertGenreObject(env, &ml_fields, genre).release();
|
|
}
|
|
|
|
jobjectArray
|
|
getPlaylists(JNIEnv* env, jobject thiz, medialibrary::PlaylistType type, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
std::vector<medialibrary::PlaylistPtr> playlists = aml->playlists(type, ¶ms)->all();
|
|
jobjectArray playlistRefs = (jobjectArray) env->NewObjectArray(playlists.size(), ml_fields.Playlist.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::PlaylistPtr const& playlist : playlists) {
|
|
auto item = convertPlaylistObject(env, &ml_fields, playlist, includeMissing, onlyFavorites);
|
|
env->SetObjectArrayElement(playlistRefs, ++index, item.get());
|
|
}
|
|
return playlistRefs;
|
|
}
|
|
|
|
|
|
jobjectArray
|
|
getPagedPlaylists(JNIEnv* env, jobject thiz, medialibrary::PlaylistType type, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
const auto query = aml->playlists(type, ¶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) {
|
|
auto item = convertPlaylistObject(env, &ml_fields, playlist, includeMissing, onlyFavorites);
|
|
env->SetObjectArrayElement(playlistRefs, ++index, item.get());
|
|
}
|
|
return playlistRefs;
|
|
}
|
|
|
|
jint
|
|
getPlaylistsCount(JNIEnv* env, medialibrary::PlaylistType type, jobject thiz) {
|
|
return (jint) MediaLibrary_getInstance(env, thiz)->playlists(type, nullptr)->count();
|
|
}
|
|
|
|
jobject
|
|
getPlaylist(JNIEnv* env, jobject thiz, jlong id, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::PlaylistPtr playlist = aml->playlist(id);
|
|
if (!playlist)
|
|
return nullptr;
|
|
return convertPlaylistObject(env, &ml_fields, playlist, includeMissing, onlyFavorites).release();
|
|
}
|
|
|
|
jobject
|
|
playlistCreate(JNIEnv* env, jobject thiz, jstring name, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
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);
|
|
if (!playlist)
|
|
return nullptr;
|
|
return convertPlaylistObject(env, &ml_fields, playlist, includeMissing, onlyFavorites).release();
|
|
}
|
|
|
|
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, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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();
|
|
utils::jni::objectArray mediaRefs{ env, (jobjectArray) env->NewObjectArray(tracks.size(), ml_fields.MediaWrapper.clazz, NULL) };
|
|
int index = -1, drops = 0;
|
|
for(medialibrary::MediaPtr const& media : tracks) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs.get(), ++index, item.get());
|
|
if (item == nullptr) ++drops;
|
|
}
|
|
return filteredArray(env, std::move( mediaRefs ), ml_fields.MediaWrapper.clazz, drops).release();
|
|
}
|
|
|
|
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, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item.get());
|
|
}
|
|
return mediaRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
searchFromAlbum(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item.get());
|
|
}
|
|
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, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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();
|
|
utils::jni::objectArray mediaRefs{ env, (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL) };
|
|
int index = -1, drops = 0;
|
|
for(medialibrary::MediaPtr const& media : mediaList) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs.get(), ++index, item.get());
|
|
if (item == nullptr) ++drops;
|
|
}
|
|
return filteredArray(env, std::move( mediaRefs ), ml_fields.MediaWrapper.clazz, drops).release();
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedMediaFromArtist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item.get());
|
|
}
|
|
return mediaRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
searchFromArtist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item.get());
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return mediaRefs;
|
|
}
|
|
|
|
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, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumsRefs, ++index, item.get());
|
|
}
|
|
return albumsRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedAlbumsFromArtist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumsRefs, ++index, item.get());
|
|
}
|
|
return albumsRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
searchAlbumsFromArtist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumsRefs, ++index, item.get());
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return albumsRefs;
|
|
}
|
|
|
|
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, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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();
|
|
utils::jni::objectArray mediaRefs{ env, (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL) };
|
|
int index = -1, drops = 0;
|
|
for(medialibrary::MediaPtr const& media : mediaList) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs.get(), ++index, item.get());
|
|
if (item == nullptr)
|
|
++drops;
|
|
}
|
|
return filteredArray(env, std::move( mediaRefs ), ml_fields.MediaWrapper.clazz, drops).release();
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedMediaFromGenre(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jboolean withThumbnail, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item.get());
|
|
}
|
|
return mediaRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
searchMediaFromGenre(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item.get());
|
|
}
|
|
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, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumRefs, ++index, item.get());
|
|
}
|
|
return albumRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedAlbumsFromGenre(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumsRefs, ++index, item.get());
|
|
}
|
|
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, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = convertAlbumObject(env, &ml_fields, album);
|
|
env->SetObjectArrayElement(albumsRefs, ++index, item.get());
|
|
}
|
|
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, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = convertArtistObject(env, &ml_fields, artist);
|
|
env->SetObjectArrayElement(artistsRefs, ++index, item.get());
|
|
}
|
|
return artistsRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedArtistsFromGenre(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = convertArtistObject(env, &ml_fields, artist);
|
|
env->SetObjectArrayElement(artistsRefs, ++index, item.get());
|
|
}
|
|
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;
|
|
}
|
|
|
|
jobjectArray
|
|
getBookmarks(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::MediaPtr media = aml->media(id);
|
|
if (media == nullptr) return 0L;
|
|
const auto query = media->bookmarks(nullptr);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.Bookmark.clazz, NULL);
|
|
std::vector<medialibrary::BookmarkPtr> bookmarks = query->all();
|
|
utils::jni::objectArray mediaRefs{ env, (jobjectArray) env->NewObjectArray(bookmarks.size(), ml_fields.Bookmark.clazz, NULL) };
|
|
int index = -1, drops = 0;
|
|
for(medialibrary::BookmarkPtr const& bookmark : bookmarks) {
|
|
auto item = convertBookmarkObject(env, &ml_fields, bookmark);
|
|
env->SetObjectArrayElement(mediaRefs.get(), ++index, item.get());
|
|
if (item == nullptr) ++drops;
|
|
}
|
|
return filteredArray(env, std::move( mediaRefs ), ml_fields.Bookmark.clazz, drops).release();
|
|
}
|
|
|
|
jobject
|
|
addBookmark(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jlong time)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::MediaPtr media = aml->media(id);
|
|
if (media == nullptr) return 0L;
|
|
medialibrary::BookmarkPtr bookmark = media->addBookmark(time);
|
|
if (!bookmark)
|
|
return nullptr;
|
|
return convertBookmarkObject(env, &ml_fields, bookmark).release();
|
|
}
|
|
|
|
jboolean
|
|
removeBookmark(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jlong time)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::MediaPtr media = aml->media(id);
|
|
if (media == nullptr) return 0L;
|
|
return media->removeBookmark(time);
|
|
}
|
|
|
|
jboolean
|
|
removeAllBookmarks(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::MediaPtr media = aml->media(id);
|
|
if (media == nullptr) return 0L;
|
|
return media->removeAllBookmarks();
|
|
}
|
|
|
|
jboolean
|
|
markAsPlayed(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::MediaPtr media = aml->media(id);
|
|
if (media == nullptr) return 0L;
|
|
return media->markAsPlayed();
|
|
}
|
|
|
|
jboolean
|
|
setMediaFavorite(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jboolean favorite) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::MediaPtr media = aml->media(id);
|
|
if (media == nullptr) return 0L;
|
|
return media->setFavorite(favorite);
|
|
}
|
|
|
|
jboolean
|
|
setArtistFavorite(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jboolean favorite) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::ArtistPtr media = aml->artist(id);
|
|
if (media == nullptr) return 0L;
|
|
return media->setFavorite(favorite);
|
|
}
|
|
|
|
jboolean
|
|
setAlbumFavorite(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jboolean favorite) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::AlbumPtr media = aml->album(id);
|
|
if (media == nullptr) return 0L;
|
|
return media->setFavorite(favorite);
|
|
}
|
|
|
|
jboolean
|
|
setGenreFavorite(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jboolean favorite) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::GenrePtr media = aml->genre(id);
|
|
if (media == nullptr) return 0L;
|
|
return media->setFavorite(favorite);
|
|
}
|
|
|
|
jboolean
|
|
setFolderFavorite(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jboolean favorite) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::FolderPtr media = aml->folder(id);
|
|
if (media == nullptr) return 0L;
|
|
return media->setFavorite(favorite);
|
|
}
|
|
|
|
jboolean
|
|
setVideoGroupFavorite(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jboolean favorite) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::MediaGroupPtr media = aml->videoGroup(id);
|
|
if (media == nullptr) return 0L;
|
|
return media->setFavorite(favorite);
|
|
}
|
|
|
|
jboolean
|
|
setPlaylistFavorite(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jboolean favorite) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::PlaylistPtr media = aml->playlist(id);
|
|
if (media == nullptr) return 0L;
|
|
return media->setFavorite(favorite);
|
|
}
|
|
|
|
jboolean
|
|
setBookmarkName(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring name) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
const char *char_name = env->GetStringUTFChars(name, JNI_FALSE);
|
|
const medialibrary::BookmarkPtr bookmark = aml->bookmark(id);
|
|
const bool result = bookmark->setName(char_name);
|
|
env->ReleaseStringUTFChars(name, char_name);
|
|
return result;
|
|
}
|
|
|
|
jboolean
|
|
setBookmarkDescription(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring description) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
const char *char_description = env->GetStringUTFChars(description, JNI_FALSE);
|
|
const medialibrary::BookmarkPtr bookmark = aml->bookmark(id);
|
|
const bool result = bookmark->setDescription(char_description);
|
|
env->ReleaseStringUTFChars(description, char_description);
|
|
return result;
|
|
}
|
|
|
|
jboolean
|
|
setBookmarkNameAndDescription(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring name, jstring description) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
const char *char_name = env->GetStringUTFChars(name, JNI_FALSE);
|
|
const char *char_description = env->GetStringUTFChars(description, JNI_FALSE);
|
|
const medialibrary::BookmarkPtr bookmark = aml->bookmark(id);
|
|
const bool result = bookmark->setNameAndDescription(char_name, char_description);
|
|
env->ReleaseStringUTFChars(name, char_name);
|
|
env->ReleaseStringUTFChars(description, char_description);
|
|
return result;
|
|
}
|
|
|
|
jboolean
|
|
bookmarkMove(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jlong time) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
const medialibrary::BookmarkPtr bookmark = aml->bookmark(id);
|
|
return bookmark->move(time);
|
|
}
|
|
|
|
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);
|
|
if (!metadata.isSet())
|
|
return nullptr;
|
|
return vlcNewStringUTF(env, metadata.asStr().c_str()).release();
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
jboolean
|
|
setMediaPlayCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jlong playCount)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::MediaPtr media = aml->media(id);
|
|
if (media == nullptr) return false;
|
|
return media->setPlayCount(playCount);
|
|
}
|
|
|
|
jlong
|
|
getMediaPlayCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::MediaPtr media = aml->media(id);
|
|
if (media == nullptr) return -1;
|
|
return media->playCount();
|
|
}
|
|
|
|
jboolean
|
|
removeMediaThumbnail(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::MediaPtr media = aml->media(id);
|
|
if (media == nullptr) return false;
|
|
return media->removeThumbnail(medialibrary::ThumbnailSizeType::Thumbnail);
|
|
}
|
|
|
|
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, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(medialibrary::SortingCriteria::Default, false, includeMissing, onlyFavorites);
|
|
const auto query = aml->mediaFromPlaylist(id, ¶ms);
|
|
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
std::vector<medialibrary::MediaPtr> mediaList = query->all();
|
|
utils::jni::objectArray mediaRefs{ env, (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL) };
|
|
int index = -1, drops = 0;
|
|
for(medialibrary::MediaPtr const& media : mediaList) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs.get(), ++index, item.get());
|
|
if (item == nullptr)
|
|
++drops;
|
|
}
|
|
return filteredArray(env, std::move( mediaRefs ), ml_fields.MediaWrapper.clazz, drops).release();
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedMediaFromPlaylist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint nbItems, jint offset, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(medialibrary::SortingCriteria::Default, false, includeMissing, onlyFavorites);
|
|
const auto query = aml->mediaFromPlaylist(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) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item.get());
|
|
}
|
|
return mediaRefs;
|
|
}
|
|
|
|
jint
|
|
getPlaylistTracksCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jboolean includeMissing, jboolean onlyFavorites) {
|
|
medialibrary::QueryParameters params = generateParams(medialibrary::SortingCriteria::Default, false, includeMissing, onlyFavorites);
|
|
const auto query = MediaLibrary_getInstance(env, medialibrary)->mediaFromPlaylist(id, ¶ms);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
jobjectArray
|
|
searchFromPlaylist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item.get());
|
|
}
|
|
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, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset ) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
auto folder = aml->folder(id);
|
|
const auto query = aml->mediaFromFolder(folder.get(), (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) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item.get());
|
|
}
|
|
return mediaRefs;
|
|
}
|
|
|
|
jint
|
|
mediaFromFolderCount(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint type) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
auto folder = aml->folder(id);
|
|
const auto query = aml->mediaFromFolder(folder.get(), (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, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item.get());
|
|
}
|
|
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, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset ) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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) {
|
|
const auto query = aml->mediaFromFolder(folder.get(), medialibrary::IMedia::Type::Video);
|
|
int count = (query != nullptr ? query->count() : 0);
|
|
|
|
auto item = convertFolderObject(env, &ml_fields, folder, count);
|
|
env->SetObjectArrayElement(foldersRefs, ++index, item.get());
|
|
}
|
|
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, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset ) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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
|
|
{
|
|
const auto query = aml->mediaFromFolder(folder.get(), (medialibrary::IMedia::Type)type);
|
|
int count = (query != nullptr ? query->count() : 0);
|
|
|
|
auto item = convertFolderObject(env, &ml_fields, folder, count);
|
|
env->SetObjectArrayElement(foldersRefs, ++index, item.get());
|
|
}
|
|
catch( const medialibrary::fs::errors::DeviceRemoved& )
|
|
{
|
|
// Ignore this folder since it's on a removed device.
|
|
auto item = convertFolderObject(env, &ml_fields, folder, 0);
|
|
env->SetObjectArrayElement(foldersRefs, ++index, item.get());
|
|
}
|
|
}
|
|
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, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset ) {
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
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
|
|
{
|
|
auto item = convertVideoGroupObject(env, &ml_fields, group);
|
|
env->SetObjectArrayElement(groupsRefs, ++index, item.get());
|
|
}
|
|
catch( const medialibrary::fs::errors::DeviceRemoved& )
|
|
{
|
|
// Ignore this VideoGroup since it's on a removed device.
|
|
}
|
|
}
|
|
return groupsRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
searchMediaGroups(JNIEnv* env, jobject thiz, jstring queryString, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
const char *queryChar = env->GetStringUTFChars(queryString, JNI_FALSE);
|
|
const auto query = aml->searchVideoGroups(queryChar, ¶ms);
|
|
std::vector<medialibrary::MediaGroupPtr> groups = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray groupRefs = (jobjectArray) env->NewObjectArray(groups.size(), ml_fields.VideoGroup.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::MediaGroupPtr const& group : groups) {
|
|
auto item = convertVideoGroupObject(env, &ml_fields, group);
|
|
env->SetObjectArrayElement(groupRefs, ++index, item.get());
|
|
}
|
|
env->ReleaseStringUTFChars(queryString, queryChar);
|
|
return groupRefs;
|
|
}
|
|
|
|
|
|
jobjectArray
|
|
searchFolders(JNIEnv* env, jobject thiz, jstring queryString, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
const char *queryChar = env->GetStringUTFChars(queryString, JNI_FALSE);
|
|
const auto query = aml->searchFolders(queryChar, ¶ms);
|
|
std::vector<medialibrary::FolderPtr> folders = nbItems != 0 ? query->items(nbItems, offset) : query->all();
|
|
jobjectArray folderRefs = (jobjectArray) env->NewObjectArray(folders.size(), ml_fields.Folder.clazz, NULL);
|
|
int index = -1;
|
|
for(medialibrary::FolderPtr const& folder : folders)
|
|
{
|
|
const auto query = aml->mediaFromFolder(folder.get(), medialibrary::IMedia::Type::Video);
|
|
int count = (query != nullptr ? query->count() : 0);
|
|
auto item = convertFolderObject(env, &ml_fields, folder, count);
|
|
env->SetObjectArrayElement(folderRefs, ++index, item.get());
|
|
}
|
|
env->ReleaseStringUTFChars(queryString, queryChar);
|
|
return folderRefs;
|
|
}
|
|
|
|
jint
|
|
getSearchFoldersCount(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)->searchFolders(queryChar);
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
jint
|
|
videoGroupsCount(JNIEnv* env, jobject thiz, jstring filterQuery) {
|
|
if (filterQuery == nullptr)
|
|
{
|
|
const auto query = MediaLibrary_getInstance(env, thiz)->videoGroups(nullptr);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = MediaLibrary_getInstance(env, thiz)->searchVideoGroups(queryChar);
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return (jint) (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
jobjectArray
|
|
getPagedMediaFromvideoGroup(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
const auto query = aml->mediaFromMediaGroup(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) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item.get());
|
|
}
|
|
return mediaRefs;
|
|
}
|
|
|
|
jobjectArray
|
|
searchFromVideoGroup(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring filterQuery, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites, jint nbItems, jint offset)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
|
|
const auto query = aml->searchFromMediaGroup(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) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item.get());
|
|
}
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return mediaRefs;
|
|
}
|
|
|
|
jint
|
|
getSearchFromvideoGroupCount(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)->searchFromMediaGroup(id, queryChar, nullptr);
|
|
env->ReleaseStringUTFChars(filterQuery, queryChar);
|
|
return static_cast<jint> (query != nullptr ? query->count() : 0);
|
|
}
|
|
|
|
jboolean
|
|
groupAddId(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jlong mediaId)
|
|
{
|
|
return MediaLibrary_getInstance(env, medialibrary)->groupAddId(id, mediaId);
|
|
}
|
|
|
|
jboolean
|
|
groupRemoveId(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jlong mediaId)
|
|
{
|
|
return MediaLibrary_getInstance(env, medialibrary)->groupRemoveId(id, mediaId);
|
|
}
|
|
|
|
jstring
|
|
groupName(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id)
|
|
{
|
|
return vlcNewStringUTF(env, MediaLibrary_getInstance(env, medialibrary)->groupName(id).c_str()).release();
|
|
}
|
|
|
|
jboolean
|
|
groupRename(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstring name)
|
|
{
|
|
const char *nameChar = env->GetStringUTFChars(name, JNI_FALSE);
|
|
bool result = MediaLibrary_getInstance(env, medialibrary)->groupRename(id, nameChar);
|
|
env->ReleaseStringUTFChars(name, nameChar);
|
|
return result;
|
|
}
|
|
|
|
jboolean
|
|
groupUserInteracted(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id)
|
|
{
|
|
return MediaLibrary_getInstance(env, medialibrary)->groupUserInteracted(id);
|
|
}
|
|
|
|
jlong groupDuration(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id)
|
|
{
|
|
return MediaLibrary_getInstance(env, medialibrary)->groupDuration(id);
|
|
}
|
|
|
|
jboolean
|
|
groupDestroy(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id)
|
|
{
|
|
return MediaLibrary_getInstance(env, medialibrary)->groupDestroy(id);
|
|
}
|
|
|
|
jobject
|
|
createMediaGroupByName(JNIEnv* env, jobject thiz, jstring name)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
const char *name_cstr = env->GetStringUTFChars(name, JNI_FALSE);
|
|
medialibrary::MediaGroupPtr group = aml->createMediaGroup(name_cstr);
|
|
env->ReleaseStringUTFChars(name, name_cstr);
|
|
if (!group)
|
|
return nullptr;
|
|
return convertVideoGroupObject(env, &ml_fields, group).release();
|
|
}
|
|
|
|
jobject
|
|
createMediaGroup(JNIEnv* env, jobject thiz, jlongArray mediaIds)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
std::vector<int64_t> cids;
|
|
jsize size = env->GetArrayLength(mediaIds);
|
|
jlong *ids = env->GetLongArrayElements(mediaIds, 0);
|
|
for (int i = 0; i < size; ++i)
|
|
cids.push_back((int64_t) ids[i]);
|
|
env->ReleaseLongArrayElements(mediaIds, ids, 0);
|
|
medialibrary::MediaGroupPtr group = aml->createMediaGroup(cids);
|
|
if (!group)
|
|
return nullptr;
|
|
return convertVideoGroupObject(env, &ml_fields, group).release();
|
|
}
|
|
|
|
jboolean regroupAll(JNIEnv* env, jobject thiz)
|
|
{
|
|
return MediaLibrary_getInstance(env, thiz)->regroupAll();
|
|
}
|
|
|
|
jboolean
|
|
regroup(JNIEnv* env, jobject thiz, jlong id)
|
|
{
|
|
return MediaLibrary_getInstance(env, thiz)->regroup((int64_t)id);
|
|
}
|
|
|
|
/*
|
|
* Subscription Cache
|
|
*/
|
|
|
|
jboolean
|
|
fitsInSubscriptionCache(JNIEnv* env, jobject thiz, jobject medialibrary, jlong mediaId)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
return aml->fitsInSubscriptionCache(*aml->media(mediaId));
|
|
}
|
|
|
|
void
|
|
cacheNewSubscriptionMedia(JNIEnv* env, jobject thiz, jobject medialibrary)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
aml->cacheNewSubscriptionMedia();
|
|
}
|
|
|
|
jboolean
|
|
setSubscriptionMaxCachedMedia(JNIEnv* env, jobject thiz, jobject medialibrary, jint nbMedia)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
return aml->setSubscriptionMaxCachedMedia(nbMedia);
|
|
}
|
|
|
|
jboolean
|
|
setSubscriptionMaxCacheSize(JNIEnv* env, jobject thiz, jobject medialibrary, jlong size)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
return aml->setSubscriptionMaxCacheSize(size);
|
|
}
|
|
|
|
jboolean
|
|
setGlobalSubscriptionMaxCacheSize(JNIEnv* env, jobject thiz, jobject medialibrary, jlong size)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
return aml->setGlobalSubscriptionMaxCacheSize(size);
|
|
}
|
|
|
|
jint getSubscriptionMaxCachedMedia(JNIEnv* env, jobject thiz, jobject medialibrary)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
return aml->getSubscriptionMaxCachedMedia();
|
|
}
|
|
|
|
jlong getSubscriptionMaxCacheSize(JNIEnv* env, jobject thiz, jobject medialibrary)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
return aml->getSubscriptionMaxCacheSize();
|
|
}
|
|
|
|
jlong getGlobalSubscriptionMaxCacheSize(JNIEnv* env, jobject thiz, jobject medialibrary)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
return aml->getGlobalSubscriptionMaxCacheSize();
|
|
}
|
|
|
|
jboolean refreshAllSubscriptions(JNIEnv* env, jobject thiz, jobject ml)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, ml);
|
|
return aml->refreshAllSubscriptions();
|
|
}
|
|
|
|
/*
|
|
* Services
|
|
*/
|
|
|
|
jobject
|
|
getService(JNIEnv* env, jobject thiz, jint _type)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
|
|
medialibrary::IService::Type type = (medialibrary::IService::Type)_type;
|
|
medialibrary::ServicePtr servicePtr = aml->service(type);
|
|
jobject serviceObject = env->NewObject(ml_fields.Service.clazz,
|
|
ml_fields.Service.initID, (jint) servicePtr->type());
|
|
return serviceObject;
|
|
}
|
|
|
|
jboolean
|
|
addSubscription(JNIEnv *env, jobject thiz, jobject medialibrary, jint _type, jstring mrl)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::IService::Type type = (medialibrary::IService::Type)_type;
|
|
medialibrary::ServicePtr servicePtr = aml->service(type);
|
|
if (servicePtr == nullptr) return false;
|
|
const char *char_mrl = env->GetStringUTFChars(mrl, JNI_FALSE);
|
|
return servicePtr->addSubscription(char_mrl);
|
|
}
|
|
|
|
jboolean
|
|
isAutoDownloadEnabled(JNIEnv *env, jobject thiz, jobject medialibrary, jint _type)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::IService::Type type = (medialibrary::IService::Type)_type;
|
|
medialibrary::ServicePtr servicePtr = aml->service(type);
|
|
if (servicePtr == nullptr) return false;
|
|
return servicePtr->isAutoDownloadEnabled();
|
|
}
|
|
|
|
jboolean
|
|
setAutoDownloadEnabled(JNIEnv *env, jobject thiz, jobject medialibrary, jint _type, jboolean enabled)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::IService::Type type = (medialibrary::IService::Type)_type;
|
|
medialibrary::ServicePtr servicePtr = aml->service(type);
|
|
if (servicePtr == nullptr) return false;
|
|
return servicePtr->setAutoDownloadEnabled(enabled);
|
|
}
|
|
|
|
jboolean
|
|
isNewMediaNotificationEnabled(JNIEnv *env, jobject thiz, jobject medialibrary, jint _type)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::IService::Type type = (medialibrary::IService::Type)_type;
|
|
medialibrary::ServicePtr servicePtr = aml->service(type);
|
|
if (servicePtr == nullptr) return false;
|
|
return servicePtr->isNewMediaNotificationEnabled();
|
|
}
|
|
|
|
jboolean
|
|
setNewMediaNotificationEnabled(JNIEnv *env, jobject thiz, jobject medialibrary, jint _type, jboolean enabled)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::IService::Type type = (medialibrary::IService::Type)_type;
|
|
medialibrary::ServicePtr servicePtr = aml->service(type);
|
|
if (servicePtr == nullptr) return false;
|
|
return servicePtr->setNewMediaNotificationEnabled(enabled);
|
|
}
|
|
|
|
jlong
|
|
getMaxCachedSize(JNIEnv *env, jobject thiz, jobject medialibrary, jint _type)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::IService::Type type = (medialibrary::IService::Type)_type;
|
|
medialibrary::ServicePtr servicePtr = aml->service(type);
|
|
if (servicePtr == nullptr) return -2;
|
|
return servicePtr->maxCachedSize();
|
|
}
|
|
|
|
jboolean
|
|
setMaxCachedSize(JNIEnv *env, jobject thiz, jobject medialibrary, jint _type, jlong size)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::IService::Type type = (medialibrary::IService::Type)_type;
|
|
medialibrary::ServicePtr servicePtr = aml->service(type);
|
|
if (servicePtr == nullptr) return false;
|
|
return servicePtr->setMaxCachedSize(size);
|
|
}
|
|
|
|
jint
|
|
getNbSubscriptions(JNIEnv *env, jobject thiz, jobject medialibrary, jint _type)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::IService::Type type = (medialibrary::IService::Type)_type;
|
|
medialibrary::ServicePtr servicePtr = aml->service(type);
|
|
if (servicePtr == nullptr) return -1;
|
|
return servicePtr->nbSubscriptions();
|
|
}
|
|
|
|
jint
|
|
getNbUnplayedMedia(JNIEnv *env, jobject thiz, jobject medialibrary, jint _type)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::IService::Type type = (medialibrary::IService::Type)_type;
|
|
medialibrary::ServicePtr servicePtr = aml->service(type);
|
|
if (servicePtr == nullptr) return -1;
|
|
return servicePtr->nbUnplayedMedia();
|
|
}
|
|
|
|
jobjectArray
|
|
getSubscriptions(JNIEnv *env, jobject thiz, jobject medialibrary, jint _type,
|
|
jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::IService::Type type = (medialibrary::IService::Type)_type;
|
|
medialibrary::ServicePtr servicePtr = aml->service(type);
|
|
if (servicePtr == nullptr) {
|
|
return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
}
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
std::vector<medialibrary::SubscriptionPtr> subsArray = servicePtr->subscriptions(¶ms)->all();
|
|
jobjectArray subsRefs = (jobjectArray) env->NewObjectArray(subsArray.size(),
|
|
ml_fields.Subscription.clazz, NULL);
|
|
int index = -1;
|
|
for (medialibrary::SubscriptionPtr const& sub : subsArray) {
|
|
auto item = convertSubscriptionObject(env, &ml_fields, sub);
|
|
env->SetObjectArrayElement(subsRefs, ++index, item.get());
|
|
}
|
|
return subsRefs;
|
|
}
|
|
|
|
jint
|
|
getNbMedia(JNIEnv *env, jobject thiz, jobject ml, jint _type)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, ml);
|
|
medialibrary::IService::Type type = (medialibrary::IService::Type)_type;
|
|
medialibrary::ServicePtr servicePtr = aml->service(type);
|
|
if (servicePtr == nullptr) return -1;
|
|
return servicePtr->nbMedia();
|
|
}
|
|
|
|
jobjectArray
|
|
getServiceMedia(JNIEnv *env, jobject thiz, jobject medialibrary, jint _type,
|
|
jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::IService::Type type = (medialibrary::IService::Type)_type;
|
|
medialibrary::ServicePtr servicePtr = aml->service(type);
|
|
if (servicePtr == nullptr) {
|
|
return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
|
|
}
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
std::vector<medialibrary::MediaPtr> mediasArray = servicePtr->media(¶ms)->all();
|
|
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediasArray.size(),
|
|
ml_fields.MediaWrapper.clazz, NULL);
|
|
int index = -1;
|
|
for (medialibrary::MediaPtr const& media : mediasArray) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(mediaRefs, ++index, item.get());
|
|
}
|
|
return mediaRefs;
|
|
}
|
|
|
|
jboolean
|
|
serviceRefresh(JNIEnv* env, jobject thiz, jobject ml, jint _type)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, ml);
|
|
medialibrary::IService::Type type = (medialibrary::IService::Type)_type;
|
|
medialibrary::ServicePtr servicePtr = aml->service(type);
|
|
if (servicePtr == nullptr) return false;
|
|
return servicePtr->refresh();
|
|
}
|
|
|
|
/*
|
|
* Subscriptions
|
|
*/
|
|
|
|
jint
|
|
subscriptionNewMediaNotification(JNIEnv *env, jobject thiz, jobject medialibrary, jlong id)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::SubscriptionPtr subscriptionPtr = aml->subscription(id);
|
|
if (subscriptionPtr == nullptr) return false;
|
|
return subscriptionPtr->newMediaNotification();
|
|
}
|
|
|
|
jboolean
|
|
setSubscriptionNewMediaNotification(JNIEnv *env, jobject thiz, jobject medialibrary, jlong id, jint value)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::SubscriptionPtr subscriptionPtr = aml->subscription(id);
|
|
if (subscriptionPtr == nullptr) return false;
|
|
return subscriptionPtr->setNewMediaNotification(value);
|
|
}
|
|
|
|
jlong
|
|
getSubscriptionCachedSize(JNIEnv *env, jobject thiz, jobject medialibrary, jlong id)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::SubscriptionPtr subscriptionPtr = aml->subscription(id);
|
|
if (subscriptionPtr == nullptr) return -2;
|
|
return subscriptionPtr->cachedSize();
|
|
}
|
|
|
|
jlong
|
|
getSubscriptionMaxCachedSize(JNIEnv *env, jobject thiz, jobject medialibrary, jlong id)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::SubscriptionPtr subscriptionPtr = aml->subscription(id);
|
|
if (subscriptionPtr == nullptr) return -2;
|
|
return subscriptionPtr->maxCachedSize();
|
|
}
|
|
|
|
jboolean
|
|
setSubscriptionMaxCachedSize(JNIEnv *env, jobject thiz, jobject medialibrary, jlong id, jlong size)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::SubscriptionPtr subscriptionPtr = aml->subscription(id);
|
|
if (subscriptionPtr == nullptr) return false;
|
|
return subscriptionPtr->setMaxCachedSize(size);
|
|
}
|
|
|
|
jint
|
|
getSubscriptionNbUnplayedMedia(JNIEnv *env, jobject thiz, jobject medialibrary, jlong id)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
|
|
medialibrary::SubscriptionPtr subscriptionPtr = aml->subscription(id);
|
|
if (subscriptionPtr == nullptr) return -1;
|
|
return subscriptionPtr->nbUnplayedMedia();
|
|
}
|
|
|
|
jboolean
|
|
removeSubscription(JNIEnv* env, jobject thiz, jlong id)
|
|
{
|
|
return MediaLibrary_getInstance(env, thiz)->removeSubscription((int64_t)id);
|
|
}
|
|
|
|
jobjectArray
|
|
getChildSubscriptions(JNIEnv* env, jobject thiz, jobject ml, jlong id, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, ml);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
medialibrary::SubscriptionPtr subscription = aml->subscription(id);
|
|
if (subscription == nullptr) return nullptr;
|
|
std::vector<medialibrary::SubscriptionPtr> subsArray = subscription->childSubscriptions(¶ms)->all();
|
|
jobjectArray subsRefs = (jobjectArray) env->NewObjectArray(subsArray.size(),
|
|
ml_fields.Subscription.clazz, NULL);
|
|
int index = -1;
|
|
for (medialibrary::SubscriptionPtr const& sub : subsArray) {
|
|
auto item = convertSubscriptionObject(env, &ml_fields, sub);
|
|
env->SetObjectArrayElement(subsRefs, ++index, item.get());
|
|
}
|
|
return subsRefs;
|
|
}
|
|
|
|
jobject
|
|
getParent(JNIEnv* env, jobject thiz, jobject ml, jlong id)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, ml);
|
|
medialibrary::SubscriptionPtr subscriptionPtr = aml->subscription(id);
|
|
if (subscriptionPtr == nullptr) return nullptr;
|
|
medialibrary::SubscriptionPtr parent = subscriptionPtr->parent();
|
|
return convertSubscriptionObject(env, &ml_fields, parent).get();
|
|
}
|
|
|
|
jboolean
|
|
refresh(JNIEnv* env, jobject thiz, jobject ml, jlong id)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, ml);
|
|
medialibrary::SubscriptionPtr subscriptionPtr = aml->subscription(id);
|
|
if (subscriptionPtr == nullptr) return false;
|
|
return subscriptionPtr->refresh();
|
|
}
|
|
|
|
jobjectArray
|
|
getSubscriptionMedia(JNIEnv* env, jobject thiz, jobject ml, jlong id, jint sortingCriteria, jboolean desc, jboolean includeMissing, jboolean onlyFavorites)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, ml);
|
|
medialibrary::QueryParameters params = generateParams(sortingCriteria, desc, includeMissing, onlyFavorites);
|
|
medialibrary::SubscriptionPtr subscription = aml->subscription(id);
|
|
if (subscription == nullptr) return nullptr;
|
|
std::vector<medialibrary::MediaPtr> mediaArray = subscription->media(¶ms)->all();
|
|
jobjectArray subsRefs = (jobjectArray) env->NewObjectArray(mediaArray.size(),
|
|
ml_fields.MediaWrapper.clazz, nullptr);
|
|
int index = -1;
|
|
for (medialibrary::MediaPtr const& media : mediaArray) {
|
|
auto item = mediaToMediaWrapper(env, &ml_fields, media);
|
|
env->SetObjectArrayElement(subsRefs, ++index, item.get());
|
|
}
|
|
return subsRefs;
|
|
}
|
|
|
|
jint getSubscriptionNbMedia(JNIEnv* env, jobject thiz, jobject ml, jlong id)
|
|
{
|
|
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, ml);
|
|
medialibrary::SubscriptionPtr subscriptionPtr = aml->subscription(id);
|
|
if (subscriptionPtr == nullptr) return -1;
|
|
return subscriptionPtr->nbMedia();
|
|
}
|
|
|
|
|
|
/*
|
|
* JNI stuff
|
|
*/
|
|
static JNINativeMethod methods[] = {
|
|
{"nativeConstruct", "(Ljava/lang/String;Ljava/lang/String;)V", (void*)constructML },
|
|
{"nativeInit", "(Ljava/lang/String;)I", (void*)init },
|
|
{"nativeRelease", "()V", (void*)release },
|
|
{"nativeClearDatabase", "(Z)Z", (void*)clearDatabase },
|
|
{"nativeAddDevice", "(Ljava/lang/String;Ljava/lang/String;Z)V", (void*)addDevice },
|
|
{"nativeIsDeviceKnown", "(Ljava/lang/String;Ljava/lang/String;Z)Z", (void*)isDeviceKnown },
|
|
{"nativeDeleteRemovableDevices", "()Z", (void*)deleteRemovableDevices },
|
|
{"nativeDevices", "()[Ljava/lang/String;", (void*)devices },
|
|
{"nativeDiscover", "(Ljava/lang/String;)V", (void*)discover },
|
|
{"nativeSetLibVLCInstance", "(J)V", (void*)setLibVLCInstance },
|
|
{"nativeSetDiscoverNetworkEnabled", "(Z)Z", (void*)setDiscoverNetworkEnabled },
|
|
{"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 },
|
|
{"nativeBannedFolders", "()[Ljava/lang/String;", (void*)bannedFolders },
|
|
{"nativeHistory", "(I)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)history },
|
|
{"nativeAddToHistory", "(Ljava/lang/String;Ljava/lang/String;)Z", (void*)addToHistory },
|
|
{"nativeClearHistory", "()Z", (void*)clearHistory },
|
|
{"nativeGetVideos", "()[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getVideos },
|
|
{"nativeGetSortedVideos", "(IZZZ)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getSortedVideos },
|
|
{"nativeGetSortedPagedVideos", "(IZZZII)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getPagedVideos },
|
|
{"nativeGetRecentVideos", "()[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getRecentVideos },
|
|
{"nativeGetAudio", "()[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getAudio },
|
|
{"nativeGetSortedAudio", "(IZZZ)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getSortedAudio },
|
|
{"nativeGetSortedPagedAudio", "(IZZZII)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getPagedAudio },
|
|
{"nativeGetRecentAudio", "()[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getRecentAudio },
|
|
{"nativeSearch", "(Ljava/lang/String;ZZ)Lorg/videolan/medialibrary/media/SearchAggregate;", (void*)search},
|
|
{"nativeSearchMedia", "(Ljava/lang/String;)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)searchMedia},
|
|
{"nativeSearchPagedMedia", "(Ljava/lang/String;IZZZII)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)searchPagedMedia},
|
|
{"nativeSearchPagedAudio", "(Ljava/lang/String;IZZZII)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)searchPagedAudio},
|
|
{"nativeSearchPagedVideo", "(Ljava/lang/String;IZZZII)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (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/Album;", (void*)searchAlbum },
|
|
{"nativeSearchPagedAlbum", "(Ljava/lang/String;IZZZII)[Lorg/videolan/medialibrary/interfaces/media/Album;", (void*)searchPagedAlbum },
|
|
{"nativeGetAlbumSearchCount", "(Ljava/lang/String;)I", (void*)getAlbumSearchCount },
|
|
{"nativeSearchArtist", "(Ljava/lang/String;)[Lorg/videolan/medialibrary/interfaces/media/Artist;", (void*)searchArtist },
|
|
{"nativeSearchPagedArtist", "(Ljava/lang/String;IZZZII)[Lorg/videolan/medialibrary/interfaces/media/Artist;", (void*)searchPagedArtist },
|
|
{"nativeGetArtistsSearchCount", "(Ljava/lang/String;)I", (void*)getArtistsSearchCount },
|
|
{"nativeSearchGenre", "(Ljava/lang/String;)[Lorg/videolan/medialibrary/interfaces/media/Genre;", (void*)searchGenre },
|
|
{"nativeSearchPagedGenre", "(Ljava/lang/String;IZZZII)[Lorg/videolan/medialibrary/interfaces/media/Genre;", (void*)searchPagedGenre },
|
|
{"nativeGetGenreSearchCount", "(Ljava/lang/String;)I", (void*)getGenreSearchCount },
|
|
{"nativeSearchPlaylist", "(Ljava/lang/String;IZZ)[Lorg/videolan/medialibrary/interfaces/media/Playlist;", (void*)searchPlaylist },
|
|
{"nativeSearchPagedPlaylist", "(Ljava/lang/String;IIZZZII)[Lorg/videolan/medialibrary/interfaces/media/Playlist;", (void*)searchPagedPlaylist },
|
|
{"nativeGetPlaylistSearchCount", "(Ljava/lang/String;)I", (void*)getPlaylistSearchCount },
|
|
{"nativeGetMedia", "(J)Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getMedia },
|
|
{"nativeGetMediaFromMrl", "(Ljava/lang/String;)Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getMediaFromMrl },
|
|
{"nativeAddMedia", "(Ljava/lang/String;J)Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)addMedia },
|
|
{"nativeRemoveExternalMedia", "(J)Z", (void*)removeExternalMedia },
|
|
{"nativeFlushUserProvidedThumbnails", "()Z", (void*)flushUserProvidedThumbnails },
|
|
{"nativeAddStream", "(Ljava/lang/String;Ljava/lang/String;)Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)addStream },
|
|
{"nativeGetVideoCount", "()I", (void*)getVideoCount },
|
|
{"nativeGetAudioCount", "()I", (void*)getAudioCount },
|
|
{"nativeGetAlbums", "(IZZZ)[Lorg/videolan/medialibrary/interfaces/media/Album;", (void*)getAlbums },
|
|
{"nativeGetPagedAlbums", "(IZZZII)[Lorg/videolan/medialibrary/interfaces/media/Album;", (void*)getPagedAlbums },
|
|
{"nativeGetAlbumsCount", "()I", (void*)getAlbumsCount },
|
|
{"nativeGetAlbum", "(J)Lorg/videolan/medialibrary/interfaces/media/Album;", (void*)getAlbum },
|
|
{"nativeGetArtists", "(ZIZZZ)[Lorg/videolan/medialibrary/interfaces/media/Artist;", (void*)getArtists },
|
|
{"nativeGetPagedArtists", "(ZIZZZII)[Lorg/videolan/medialibrary/interfaces/media/Artist;", (void*)getPagedArtists },
|
|
{"nativeGetArtistsCount", "(Z)I", (void*)getArtistsCount },
|
|
{"nativeGetArtist", "(J)Lorg/videolan/medialibrary/interfaces/media/Artist;", (void*)getArtist },
|
|
{"nativeGetGenres", "(IZZZ)[Lorg/videolan/medialibrary/interfaces/media/Genre;", (void*)getGenres },
|
|
{"nativeGetPagedGenres", "(IZZZII)[Lorg/videolan/medialibrary/interfaces/media/Genre;", (void*)getPagedGenres },
|
|
{"nativeGetGenresCount", "()I", (void*)getGenresCount },
|
|
{"nativeGetGenre", "(J)Lorg/videolan/medialibrary/interfaces/media/Genre;", (void*)getGenre },
|
|
{"nativeGetPlaylists", "(IIZZZ)[Lorg/videolan/medialibrary/interfaces/media/Playlist;", (void*)getPlaylists },
|
|
{"nativeGetPagedPlaylists", "(IIZZZII)[Lorg/videolan/medialibrary/interfaces/media/Playlist;", (void*)getPagedPlaylists },
|
|
{"nativeGetPlaylistsCount", "()I", (void*)getPlaylistsCount },
|
|
{"nativeGetPlaylist", "(JZZ)Lorg/videolan/medialibrary/interfaces/media/Playlist;", (void*)getPlaylist },
|
|
{"nativeGetFolders", "(IIZZZII)[Lorg/videolan/medialibrary/interfaces/media/Folder;", (void*)folders },
|
|
{"nativeGetFoldersCount", "(I)I", (void*)foldersCount },
|
|
{"nativeSearchPagedFolders", "(Ljava/lang/String;IZZZII)[Lorg/videolan/medialibrary/interfaces/media/Folder;", (void*)searchFolders },
|
|
{"nativeGetSearchFoldersCount", "(Ljava/lang/String;)I", (void*)getSearchFoldersCount },
|
|
{"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 },
|
|
{"nativeSetLastTime", "(JJ)I", (void*)setLastTime },
|
|
{"nativeSetLastPosition", "(JF)Z", (void*)setLastPosition },
|
|
{"nativeSetMediaUpdatedCbFlag", "(I)V", (void*)setMediaUpdatedCbFlag },
|
|
{"nativeSetMediaAddedCbFlag", "(I)V", (void*)setMediaAddedCbFlag },
|
|
{"nativePlaylistCreate", "(Ljava/lang/String;ZZ)Lorg/videolan/medialibrary/interfaces/media/Playlist;", (void*)playlistCreate },
|
|
{"nativeGetVideoGroups", "(IZZZII)[Lorg/videolan/medialibrary/interfaces/media/VideoGroup;", (void*)videoGroups },
|
|
{"nativeGetVideoGroupsCount", "(Ljava/lang/String;)I", (void*)videoGroupsCount },
|
|
{"nativeCreateGroupByName", "(Ljava/lang/String;)Lorg/videolan/medialibrary/interfaces/media/VideoGroup;", (void*)createMediaGroupByName },
|
|
{"nativeSearchPagedGroups", "(Ljava/lang/String;IZZZII)[Lorg/videolan/medialibrary/interfaces/media/VideoGroup;", (void*)searchMediaGroups },
|
|
{"nativeCreateGroup", "([J)Lorg/videolan/medialibrary/interfaces/media/VideoGroup;", (void*)createMediaGroup },
|
|
{"nativeRegroupAll", "()Z", (void*)regroupAll },
|
|
{"nativeRegroup", "(J)Z", (void*)regroup },
|
|
{"nativeGetService", "(I)Lorg/videolan/medialibrary/interfaces/media/MlService;", (void*)getService},
|
|
{"nativeFitsInSubscriptionCache", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)Z", (void*)fitsInSubscriptionCache},
|
|
{"nativeCacheNewSubscriptionMedia", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;)V", (void*)cacheNewSubscriptionMedia},
|
|
{"nativeSetSubscriptionMaxCacheMedia", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;I)Z", (void*)setSubscriptionMaxCachedMedia},
|
|
{"nativeSetSubscriptionMaxCacheSize", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)Z", (void*)setSubscriptionMaxCacheSize},
|
|
{"nativeSetGlobalSubscriptionMaxCacheSize", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)Z", (void*)setGlobalSubscriptionMaxCacheSize},
|
|
{"nativeGetSubscriptionMaxCacheMedia", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;)I", (void*)getSubscriptionMaxCachedMedia},
|
|
{"nativeGetSubscriptionMaxCacheSize", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;)J", (void*)getSubscriptionMaxCacheSize},
|
|
{"nativeGetGlobalSubscriptionMaxCacheSize", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;)J", (void*)getGlobalSubscriptionMaxCacheSize},
|
|
{"nativeRefreshAllSubscriptions", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;)Z", (void*)refreshAllSubscriptions},
|
|
};
|
|
|
|
static JNINativeMethod media_methods[] = {
|
|
{"nativeGetMediaLongMetadata", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JI)J", (void*)getMediaLongMetadata },
|
|
{"nativeGetMediaStringMetadata", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JI)Ljava/lang/String;", (void*)getMediaStringMetadata },
|
|
{"nativeSetMediaStringMetadata", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JILjava/lang/String;)V", (void*)setMediaStringMetadata },
|
|
{"nativeSetMediaLongMetadata", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JIJ)V", (void*)setMediaLongMetadata },
|
|
{"nativeSetMediaThumbnail", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;)V", (void*)setMediaThumbnail },
|
|
{"nativeSetMediaPlayCount", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JJ)Z", (void*)setMediaPlayCount },
|
|
{"nativeGetMediaPlayCount", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)J", (void*)getMediaPlayCount },
|
|
{"nativeRemoveMediaThumbnail", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)Z", (void*)removeMediaThumbnail },
|
|
{"nativeSetMediaTitle", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;)V", (void*)setMediaTitle },
|
|
{"nativeRemoveFromHistory", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)Z", (void*)removeMediaFromHistory },
|
|
{"nativeRequestThumbnail", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JIIIF)V", (void*)requestThumbnail },
|
|
{"nativeGetBookmarks", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)[Lorg/videolan/medialibrary/interfaces/media/Bookmark;", (void*)getBookmarks },
|
|
{"nativeAddBookmark", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JJ)Lorg/videolan/medialibrary/interfaces/media/Bookmark;", (void*)addBookmark },
|
|
{"nativeRemoveBookmark", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JJ)Z", (void*)removeBookmark },
|
|
{"nativeRemoveAllBookmarks", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)Z", (void*)removeAllBookmarks },
|
|
{"nativeMarkAsPlayed", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)Z", (void*)markAsPlayed },
|
|
{"nativeSetFavorite", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JZ)Z", (void*)setMediaFavorite },
|
|
};
|
|
|
|
static JNINativeMethod bookmark_methods[] = {
|
|
{"nativeSetName", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;)Z", (void*)setBookmarkName },
|
|
{"nativeSetDescription", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;)Z", (void*)setBookmarkDescription },
|
|
{"nativeSetNameAndDescription", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;Ljava/lang/String;)Z", (void*)setBookmarkNameAndDescription },
|
|
{"nativeMove", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JJ)Z", (void*)bookmarkMove },
|
|
};
|
|
static JNINativeMethod album_methods[] = {
|
|
{"nativeGetTracks", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JIZZZ)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getTracksFromAlbum },
|
|
{"nativeGetPagedTracks", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JIZZZII)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getPagedTracksFromAlbum },
|
|
{"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;IZZZII)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)searchFromAlbum },
|
|
{"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;)I", (void*)getSearchFromAlbumCount },
|
|
{"nativeGetTracksCount", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)I", (void*)getTracksFromAlbumCount },
|
|
{"nativeSetFavorite", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JZ)Z", (void*)setAlbumFavorite },
|
|
};
|
|
|
|
static JNINativeMethod artist_methods[] = {
|
|
{"nativeGetMedia", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JIZZZ)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getMediaFromArtist },
|
|
{"nativeGetAlbums", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JIZZZ)[Lorg/videolan/medialibrary/interfaces/media/Album;", (void*)getAlbumsFromArtist },
|
|
{"nativeGetPagedMedia", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JIZZZII)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getPagedMediaFromArtist },
|
|
{"nativeGetPagedAlbums", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JIZZZII)[Lorg/videolan/medialibrary/interfaces/media/Album;", (void*)getPagedAlbumsFromArtist },
|
|
{"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;IZZZII)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)searchFromArtist },
|
|
{"nativeSearchAlbums", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;IZZZII)[Lorg/videolan/medialibrary/interfaces/media/Album;", (void*)searchAlbumsFromArtist },
|
|
{"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;)I", (void*)getSearchFromArtistCount },
|
|
{"nativeGetSearchAlbumCount", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;)I", (void*)getSearchAlbumFromArtistCount },
|
|
{"nativeSetFavorite", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JZ)Z", (void*)setArtistFavorite },
|
|
};
|
|
|
|
static JNINativeMethod genre_methods[] = {
|
|
{"nativeGetTracks", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JZIZZZ)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getMediaFromGenre },
|
|
{"nativeGetAlbums", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JIZZZ)[Lorg/videolan/medialibrary/interfaces/media/Album;", (void*)getAlbumsFromGenre },
|
|
{"nativeGetArtists", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JIZZZ)[Lorg/videolan/medialibrary/interfaces/media/Artist;", (void*)getArtistsFromGenre },
|
|
{"nativeGetPagedTracks", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JZIZZZII)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getPagedMediaFromGenre },
|
|
{"nativeGetPagedAlbums", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JIZZZII)[Lorg/videolan/medialibrary/interfaces/media/Album;", (void*)getPagedAlbumsFromGenre },
|
|
{"nativeGetPagedArtists", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JIZZZII)[Lorg/videolan/medialibrary/interfaces/media/Artist;", (void*)getPagedArtistsFromGenre },
|
|
{"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;IZZZII)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)searchMediaFromGenre },
|
|
{"nativeSearchAlbums", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;IZZZII)[Lorg/videolan/medialibrary/interfaces/media/Album;", (void*)searchAlbumsFromGenre },
|
|
{"nativeGetAlbumsCount", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)I", (void*)getGenreAlbumsCount },
|
|
{"nativeGetArtistsCount", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)I", (void*)getGenreArtistsCount },
|
|
{"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;)I", (void*)getSearchMediaFromGenreCount },
|
|
{"nativeGetSearchAlbumCount", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;)I", (void*)getSearchAlbumsFromGenreCount },
|
|
{"nativeSetFavorite", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JZ)Z", (void*)setGenreFavorite },
|
|
};
|
|
|
|
static JNINativeMethod folder_methods[] = {
|
|
{"nativeMedia", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JIIZZZII)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)mediaFromFolder },
|
|
{"nativeSubfolders", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JIZZZII)[Lorg/videolan/medialibrary/interfaces/media/Folder;", (void*)subFolders },
|
|
{"nativeMediaCount", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JI)I", (void*)mediaFromFolderCount },
|
|
{"nativeSubfoldersCount", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JI)I", (void*)subFoldersCount },
|
|
{"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;IIZZZII)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)searchMediaFromFolder },
|
|
{"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;I)I", (void*)getSearchMediaFromFolderCount },
|
|
{"nativeSetFavorite", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JZ)Z", (void*)setFolderFavorite },
|
|
};
|
|
|
|
static JNINativeMethod videogroup_methods[] = {
|
|
{"nativeMedia", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JIZZZII)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getPagedMediaFromvideoGroup },
|
|
{"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;IZZZII)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)searchFromVideoGroup },
|
|
{"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;)I", (void*)getSearchFromvideoGroupCount },
|
|
{"nativeGroupAddId", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JJ)Z", (void*)groupAddId },
|
|
{"nativeGroupRemoveId", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JJ)Z", (void*)groupRemoveId },
|
|
{"nativeGroupName", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)Ljava/lang/String;", (void*)groupName },
|
|
{"nativeGroupRename", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;)Z", (void*)groupRename },
|
|
{"nativeGroupUserInteracted", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)Z", (void*)groupUserInteracted },
|
|
{"nativeGroupDuration", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)J", (void*)groupDuration },
|
|
{"nativeGroupDestroy", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)Z", (void*)groupDestroy },
|
|
{"nativeSetFavorite", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JZ)Z", (void*)setVideoGroupFavorite },
|
|
};
|
|
|
|
static JNINativeMethod playlist_methods[] = {
|
|
{"nativeGetTracks", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JZZ)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getMediaFromPlaylist },
|
|
{"nativeGetPagedTracks", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JIIZZ)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getPagedMediaFromPlaylist },
|
|
{"nativeGetTracksCount", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JZZ)I", (void*)getPlaylistTracksCount },
|
|
{"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;IZZZII)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)searchFromPlaylist },
|
|
{"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JLjava/lang/String;)I", (void*)getSearchFromPlaylistCount },
|
|
{"nativePlaylistAppend", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JJ)Z", (void*)playlistAppend },
|
|
{"nativePlaylistAppendGroup", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J[J)Z", (void*)playlistAppendGroup },
|
|
{"nativePlaylistAdd", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JJI)Z", (void*)playlistAdd },
|
|
{"nativePlaylistMove", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JII)Z", (void*)playlistMove },
|
|
{"nativePlaylistRemove", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JI)Z", (void*)playlistRemove },
|
|
{"nativePlaylistDelete", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)Z", (void*)playlistDelete },
|
|
{"nativeSetFavorite", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JZ)Z", (void*)setPlaylistFavorite },
|
|
};
|
|
|
|
static JNINativeMethod service_methods[] = {
|
|
{"nativeAddSubscription", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;ILjava/lang/String;)Z", (void*)addSubscription},
|
|
{"nativeIsAutoDownloadEnabled", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;I)Z", (void*)isAutoDownloadEnabled},
|
|
{"nativeSetAutoDownloadEnabled", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;IZ)Z", (void*)setAutoDownloadEnabled},
|
|
{"nativeIsNewMediaNotificationEnabled", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;I)Z", (void*)isNewMediaNotificationEnabled},
|
|
{"nativeSetNewMediaNotificationEnabled", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;IZ)Z", (void*)setNewMediaNotificationEnabled},
|
|
{"nativeGetMaxCachedSize", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;I)J", (void*)getMaxCachedSize},
|
|
{"nativeSetMaxCachedSize", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;IJ)Z", (void*)setMaxCachedSize},
|
|
{"nativeGetNbSubscriptions", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;I)I", (void*)getNbSubscriptions},
|
|
{"nativeGetNbUnplayedMedia", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;I)I", (void*)getNbUnplayedMedia},
|
|
{"nativeGetSubscriptions", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;IIZZZ)[Lorg/videolan/medialibrary/interfaces/media/Subscription;", (void*)getSubscriptions},
|
|
{"nativeGetNbMedia", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;I)I", (void*)getNbMedia},
|
|
{"nativeGetServiceMedia", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;IIZZZ)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getServiceMedia},
|
|
{"nativeServiceRefresh", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;I)Z", (void*)serviceRefresh},
|
|
};
|
|
|
|
static JNINativeMethod subscription_methods[] = {
|
|
{"nativeSubscriptionNewMediaNotification", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)I", (void*)subscriptionNewMediaNotification},
|
|
{"nativeSetSubscriptionNewMediaNotification", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JI)Z", (void*)setSubscriptionNewMediaNotification},
|
|
{"nativeGetSubscriptionCachedSize", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)J", (void*)getSubscriptionCachedSize},
|
|
{"nativeGetSubscriptionMaxCachedSize", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)J", (void*)getSubscriptionMaxCachedSize},
|
|
{"nativeSetSubscriptionMaxCachedSize", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JJ)Z", (void*)setSubscriptionMaxCachedSize},
|
|
{"nativeGetSubscriptionNbUnplayedMedia", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)I", (void*)getSubscriptionNbUnplayedMedia},
|
|
{"nativeGetChildSubscriptions", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JIZZZ)[Lorg/videolan/medialibrary/interfaces/media/Subscription;", (void*)getChildSubscriptions},
|
|
{"nativeGetParent", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)Lorg/videolan/medialibrary/interfaces/media/Subscription;", (void*)getParent},
|
|
{"nativeSubscriptionRefresh", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)Z", (void*)refresh},
|
|
{"nativeGetSubscriptionMedia", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JIZZZ)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getSubscriptionMedia},
|
|
{"nativeGetSubscriptionNbMedia", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;J)I", (void*)getSubscriptionNbMedia},
|
|
};
|
|
|
|
/* 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/ArtistImpl", 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/ArtistImpl");
|
|
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;IIIZ)V");
|
|
|
|
GET_CLASS(ml_fields.Album.clazz, "org/videolan/medialibrary/media/AlbumImpl", 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/AlbumImpl");
|
|
return -1;
|
|
}
|
|
GET_ID(GetMethodID,
|
|
ml_fields.Album.initID,
|
|
ml_fields.Album.clazz,
|
|
"<init>", "(JLjava/lang/String;ILjava/lang/String;Ljava/lang/String;JIIJZ)V");
|
|
|
|
GET_CLASS(ml_fields.Genre.clazz, "org/videolan/medialibrary/media/GenreImpl", true);
|
|
if (env->RegisterNatives(ml_fields.Genre.clazz, genre_methods, sizeof(genre_methods) / sizeof(genre_methods[0])) < 0) {
|
|
LOGE("RegisterNatives failed for org/videolan/medialibrary/media/GenreImpl");
|
|
return -1;
|
|
}
|
|
GET_ID(GetMethodID,
|
|
ml_fields.Genre.initID,
|
|
ml_fields.Genre.clazz,
|
|
"<init>", "(JLjava/lang/String;IIZ)V");
|
|
|
|
GET_CLASS(ml_fields.Playlist.clazz, "org/videolan/medialibrary/media/PlaylistImpl", 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/PlaylistImpl");
|
|
return -1;
|
|
}
|
|
GET_ID(GetMethodID,
|
|
ml_fields.Playlist.initID,
|
|
ml_fields.Playlist.clazz,
|
|
"<init>", "(JLjava/lang/String;IJIIIIZ)V");
|
|
|
|
GET_CLASS(ml_fields.Service.clazz, "org/videolan/medialibrary/media/MlServiceImpl", true);
|
|
if (env->RegisterNatives(ml_fields.Service.clazz, service_methods, sizeof(service_methods) / sizeof(service_methods[0])) < 0) {
|
|
LOGE("RegisterNatives failed for org/videolan/medialibrary/media/MlServiceImpl");
|
|
return -1;
|
|
}
|
|
GET_ID(GetMethodID,
|
|
ml_fields.Service.initID,
|
|
ml_fields.Service.clazz,
|
|
"<init>", "(I)V");
|
|
|
|
GET_CLASS(ml_fields.Subscription.clazz, "org/videolan/medialibrary/media/SubscriptionImpl", true);
|
|
if (env->RegisterNatives(ml_fields.Subscription.clazz, subscription_methods, sizeof(subscription_methods) / sizeof(subscription_methods[0])) < 0) {
|
|
LOGE("RegisterNatives failed for org/videolan/medialibrary/media/SubscriptionImpl");
|
|
return -1;
|
|
}
|
|
GET_ID(GetMethodID,
|
|
ml_fields.Subscription.initID,
|
|
ml_fields.Subscription.clazz,
|
|
"<init>", "(JILjava/lang/String;J)V");
|
|
|
|
GET_CLASS(ml_fields.MediaWrapper.clazz,
|
|
"org/videolan/medialibrary/media/MediaWrapperImpl", 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/MediaWrapperImpl");
|
|
return -1;
|
|
}
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaWrapper.initID,
|
|
ml_fields.MediaWrapper.clazz,
|
|
"<init>", "(JLjava/lang/String;JFJILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;IIIIJJZZIZJ)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/Album;[Lorg/videolan/medialibrary/interfaces/media/Artist;[Lorg/videolan/medialibrary/interfaces/media/Genre;[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;[Lorg/videolan/medialibrary/interfaces/media/Playlist;)V");
|
|
|
|
GET_CLASS(ml_fields.Folder.clazz, "org/videolan/medialibrary/media/FolderImpl", 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/FolderImpl");
|
|
return -1;
|
|
}
|
|
GET_ID(GetMethodID,
|
|
ml_fields.Folder.initID,
|
|
ml_fields.Folder.clazz,
|
|
"<init>", "(JLjava/lang/String;Ljava/lang/String;IZ)V");
|
|
|
|
GET_CLASS(ml_fields.VideoGroup.clazz, "org/videolan/medialibrary/media/VideoGroupImpl", true);
|
|
if (env->RegisterNatives(ml_fields.VideoGroup.clazz, videogroup_methods, sizeof(videogroup_methods) / sizeof(videogroup_methods[0])) < 0) {
|
|
LOGE("RegisterNatives failed for 'org/videolan/medialibrary/media/VideoGroupImpl");
|
|
return -1;
|
|
}
|
|
GET_ID(GetMethodID,
|
|
ml_fields.VideoGroup.initID,
|
|
ml_fields.VideoGroup.clazz,
|
|
"<init>", "(JLjava/lang/String;IIIZ)V");
|
|
|
|
GET_CLASS(ml_fields.Bookmark.clazz, "org/videolan/medialibrary/media/BookmarkImpl", true);
|
|
if (env->RegisterNatives(ml_fields.Bookmark.clazz, bookmark_methods, sizeof(bookmark_methods) / sizeof(bookmark_methods[0])) < 0) {
|
|
LOGE("RegisterNatives failed for 'org/videolan/medialibrary/media/BookmarkImpl");
|
|
return -1;
|
|
}
|
|
GET_ID(GetMethodID,
|
|
ml_fields.Bookmark.initID,
|
|
ml_fields.Bookmark.clazz,
|
|
"<init>", "(JLjava/lang/String;Ljava/lang/String;JJ)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/MediaWrapper;)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", "([J)V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onMediaConvertedToExternalId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onMediaConvertedToExternal", "([J)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.onFoldersAddedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onFoldersAdded", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onFoldersModifiedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onFoldersModified", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onFoldersDeletedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onFoldersDeleted", "()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", "()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", "()V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onDiscoveryFailedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onDiscoveryFailed", "(Ljava/lang/String;)V");
|
|
GET_ID(GetMethodID,
|
|
ml_fields.MediaLibrary.onParsingStatsUpdatedId,
|
|
ml_fields.MediaLibrary.clazz,
|
|
"onParsingStatsUpdated", "(II)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/MediaWrapper;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);
|
|
}
|
|
|