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.
1256 lines
35 KiB
1256 lines
35 KiB
#include "AndroidMediaLibrary.h"
|
|
#define LOG_TAG "VLC/JNI/AndroidMediaLibrary"
|
|
#include "log.h"
|
|
#define THREAD_NAME "AndroidMedialibrary"
|
|
|
|
#define FLAG_MEDIA_UPDATED_AUDIO 1 << 0
|
|
#define FLAG_MEDIA_UPDATED_AUDIO_EMPTY 1 << 1
|
|
#define FLAG_MEDIA_UPDATED_VIDEO 1 << 2
|
|
#define FLAG_MEDIA_UPDATED_VIDEO_EMPTY 1 << 3
|
|
#define FLAG_MEDIA_ADDED_AUDIO 1 << 4
|
|
#define FLAG_MEDIA_ADDED_AUDIO_EMPTY 1 << 5
|
|
#define FLAG_MEDIA_ADDED_VIDEO 1 << 6
|
|
#define FLAG_MEDIA_ADDED_VIDEO_EMPTY 1 << 7
|
|
|
|
static pthread_key_t jni_env_key;
|
|
static JavaVM *myVm;
|
|
|
|
static void jni_detach_thread(void *data)
|
|
{
|
|
myVm->DetachCurrentThread();
|
|
}
|
|
|
|
static void key_init(void)
|
|
{
|
|
pthread_key_create(&jni_env_key, jni_detach_thread);
|
|
}
|
|
|
|
AndroidMediaLibrary::AndroidMediaLibrary(JavaVM *vm, fields *ref_fields, jobject thiz, const char* dbPath, const char* mlFolder)
|
|
: p_fields ( ref_fields )
|
|
{
|
|
myVm = vm;
|
|
p_lister = std::make_shared<AndroidDeviceLister>();
|
|
medialibrary::SetupConfig config;
|
|
config.logger = std::make_shared<AndroidMediaLibraryLogger>();
|
|
config.logLevel = medialibrary::LogLevel::Debug;
|
|
config.deviceListers["file://"] = p_lister;
|
|
p_ml = NewMediaLibrary( dbPath, mlFolder, false, &config);
|
|
pthread_once(&key_once, key_init);
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
weak_thiz = env->NewWeakGlobalRef(thiz);
|
|
}
|
|
|
|
AndroidMediaLibrary::~AndroidMediaLibrary()
|
|
{
|
|
LOGD("AndroidMediaLibrary delete");
|
|
pthread_key_delete(jni_env_key);
|
|
delete p_ml;
|
|
}
|
|
|
|
medialibrary::InitializeResult
|
|
AndroidMediaLibrary::initML()
|
|
{
|
|
return p_ml->initialize(this);
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::clearDatabase(bool restorePlaylists) {
|
|
return p_ml->clearDatabase(restorePlaylists);
|
|
}
|
|
|
|
void
|
|
AndroidMediaLibrary::addDevice(const std::string& uuid, const std::string& path, bool removable)
|
|
{
|
|
p_lister->addDevice(uuid, path, removable);
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::isDeviceKnown(const std::string& uuid, const std::string& path, bool removable)
|
|
{
|
|
return p_ml->isDeviceKnown(uuid, path, removable);
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::deleteRemovableDevices()
|
|
{
|
|
return p_ml->deleteRemovableDevices();
|
|
}
|
|
|
|
std::vector<std::tuple<std::string, std::string, bool>>
|
|
AndroidMediaLibrary::devices()
|
|
{
|
|
return p_lister->devices();
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::removeDevice(const std::string& uuid, const std::string& path)
|
|
{
|
|
return p_lister->removeDevice(uuid, path);
|
|
}
|
|
|
|
void
|
|
AndroidMediaLibrary::banFolder(const std::string& path)
|
|
{
|
|
p_ml->banFolder(path);
|
|
}
|
|
|
|
void
|
|
AndroidMediaLibrary::unbanFolder(const std::string& path)
|
|
{
|
|
p_ml->unbanFolder(path);
|
|
}
|
|
|
|
std::vector<medialibrary::FolderPtr>
|
|
AndroidMediaLibrary::bannedEntryPoints()
|
|
{
|
|
return p_ml->bannedEntryPoints()->all();
|
|
}
|
|
|
|
void
|
|
AndroidMediaLibrary::discover(const std::string& libraryPath)
|
|
{
|
|
p_ml->discover(libraryPath);
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::setDiscoverNetworkEnabled(bool enabled)
|
|
{
|
|
return p_ml->setDiscoverNetworkEnabled(enabled);
|
|
}
|
|
|
|
void
|
|
AndroidMediaLibrary::removeEntryPoint(const std::string& entryPoint)
|
|
{
|
|
p_ml->removeEntryPoint(entryPoint);
|
|
}
|
|
|
|
std::vector<medialibrary::FolderPtr>
|
|
AndroidMediaLibrary::entryPoints()
|
|
{
|
|
return p_ml->roots(nullptr)->all();
|
|
}
|
|
|
|
void
|
|
AndroidMediaLibrary::pauseBackgroundOperations()
|
|
{
|
|
p_ml->pauseBackgroundOperations();
|
|
m_paused = true;
|
|
}
|
|
|
|
void
|
|
AndroidMediaLibrary::setMediaUpdatedCbFlag(int flags)
|
|
{
|
|
m_mediaUpdatedType = flags;
|
|
}
|
|
|
|
void
|
|
AndroidMediaLibrary::setMediaAddedCbFlag(int flags)
|
|
{
|
|
m_mediaAddedType = flags;
|
|
}
|
|
|
|
void
|
|
AndroidMediaLibrary::resumeBackgroundOperations()
|
|
{
|
|
p_ml->resumeBackgroundOperations();
|
|
m_paused = false;
|
|
}
|
|
|
|
void
|
|
AndroidMediaLibrary::reload()
|
|
{
|
|
p_ml->reload();
|
|
}
|
|
|
|
void
|
|
AndroidMediaLibrary::reload( const std::string& entryPoint )
|
|
{
|
|
p_ml->reload(entryPoint);
|
|
}
|
|
|
|
void
|
|
AndroidMediaLibrary::forceParserRetry()
|
|
{
|
|
p_ml->forceParserRetry();
|
|
}
|
|
|
|
void
|
|
AndroidMediaLibrary::forceRescan()
|
|
{
|
|
p_ml->forceRescan();
|
|
}
|
|
|
|
jint
|
|
AndroidMediaLibrary::setLastPosition(int64_t mediaId, float lastPosition)
|
|
{
|
|
auto media = p_ml->media(mediaId);
|
|
if (media != nullptr)
|
|
return (int) media->setLastPosition( lastPosition );
|
|
return -1;
|
|
}
|
|
|
|
jint
|
|
AndroidMediaLibrary::setLastTime(int64_t mediaId, int64_t time)
|
|
{
|
|
auto media = p_ml->media(mediaId);
|
|
if (media != nullptr)
|
|
return (int) media->setLastTime( time );
|
|
return -1;
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::removeMediaFromHistory(int64_t mediaId)
|
|
{
|
|
auto media = p_ml->media(mediaId);
|
|
if (media != nullptr) return media->removeFromHistory();
|
|
return false;
|
|
}
|
|
|
|
std::vector<medialibrary::MediaPtr>
|
|
AndroidMediaLibrary::lastMediaPlayed()
|
|
{
|
|
return p_ml->history()->items( 100, 0 );
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::addToHistory( const std::string& mrl, const std::string& title)
|
|
{
|
|
auto media = p_ml->media( mrl );
|
|
if ( media == nullptr )
|
|
{
|
|
media = p_ml->addStream( mrl );
|
|
if ( media == nullptr )
|
|
return false;
|
|
}
|
|
media->setTitle(title);
|
|
return true;
|
|
}
|
|
|
|
std::vector<medialibrary::MediaPtr>
|
|
AndroidMediaLibrary::lastStreamsPlayed()
|
|
{
|
|
return p_ml->streamHistory()->items( 100, 0 );
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::clearHistory()
|
|
{
|
|
return p_ml->clearHistory();
|
|
}
|
|
|
|
medialibrary::SearchAggregate
|
|
AndroidMediaLibrary::search(const std::string& query)
|
|
{
|
|
return p_ml->search(query);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IMedia>
|
|
AndroidMediaLibrary::searchMedia(const std::string& query, const medialibrary::QueryParameters* params)
|
|
{
|
|
return p_ml->searchMedia(query, params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IMedia>
|
|
AndroidMediaLibrary::searchAudio(const std::string& query, const medialibrary::QueryParameters* params)
|
|
{
|
|
return p_ml->searchAudio(query, params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IMedia>
|
|
AndroidMediaLibrary::searchVideo(const std::string& query, const medialibrary::QueryParameters* params)
|
|
{
|
|
return p_ml->searchVideo(query, params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IMedia>
|
|
AndroidMediaLibrary::searchFromAlbum( int64_t albumId, const std::string& query, const medialibrary::QueryParameters* params )
|
|
{
|
|
auto album = p_ml->album(albumId);
|
|
return album == nullptr ? nullptr : album->searchTracks(query, params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IMedia>
|
|
AndroidMediaLibrary::searchFromArtist( int64_t artistId, const std::string& query, const medialibrary::QueryParameters* params )
|
|
{
|
|
auto artist = p_ml->artist(artistId);
|
|
return artist == nullptr ? nullptr : artist->searchTracks(query, params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IAlbum>
|
|
AndroidMediaLibrary::searchAlbumsFromArtist( int64_t artistId, const std::string& query, const medialibrary::QueryParameters* params )
|
|
{
|
|
auto artist = p_ml->artist(artistId);
|
|
return artist == nullptr ? nullptr : artist->searchAlbums(query, params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IMedia>
|
|
AndroidMediaLibrary::searchFromGenre( int64_t genreId, const std::string& query, const medialibrary::QueryParameters* params )
|
|
{
|
|
auto genre = p_ml->genre(genreId);
|
|
return genre == nullptr ? nullptr : genre->searchTracks(query, params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IAlbum>
|
|
AndroidMediaLibrary::searchAlbumsFromGenre( int64_t genreId, const std::string& query, const medialibrary::QueryParameters* params )
|
|
{
|
|
auto genre = p_ml->genre(genreId);
|
|
return genre == nullptr ? nullptr : genre->searchAlbums(query, params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IMedia>
|
|
AndroidMediaLibrary::searchFromPlaylist( int64_t playlistId, const std::string& query, const medialibrary::QueryParameters* params )
|
|
{
|
|
auto playlist = p_ml->playlist(playlistId);
|
|
return playlist == nullptr ? nullptr : playlist->searchMedia(query, params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IFolder>
|
|
AndroidMediaLibrary::searchFolders(const std::string& query, const medialibrary::QueryParameters* params)
|
|
{
|
|
return p_ml->searchFolders(query, medialibrary::IMedia::Type::Video, params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IMedia>
|
|
AndroidMediaLibrary::searchFromFolder( int64_t folderId, const std::string& query, medialibrary::IMedia::Type type, const medialibrary::QueryParameters* params )
|
|
{
|
|
auto folder = p_ml->folder(folderId);
|
|
return folder == nullptr ? nullptr : folder->searchMedia(query, type, params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IPlaylist>
|
|
AndroidMediaLibrary::searchPlaylists(const std::string& query, medialibrary::PlaylistType type, const medialibrary::QueryParameters* params)
|
|
{
|
|
return p_ml->searchPlaylists(query, type, params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IAlbum>
|
|
AndroidMediaLibrary::searchAlbums(const std::string& query, const medialibrary::QueryParameters* params)
|
|
{
|
|
return p_ml->searchAlbums(query, params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IGenre>
|
|
AndroidMediaLibrary::searchGenre(const std::string& query, const medialibrary::QueryParameters* params)
|
|
{
|
|
return p_ml->searchGenre(query, params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IArtist>
|
|
AndroidMediaLibrary::searchArtists(const std::string& query, const medialibrary::QueryParameters* params)
|
|
{
|
|
return p_ml->searchArtists(query, medialibrary::ArtistIncluded::All, params);
|
|
}
|
|
|
|
medialibrary::BookmarkPtr
|
|
AndroidMediaLibrary::bookmark(long id)
|
|
{
|
|
return p_ml->bookmark(id);
|
|
}
|
|
|
|
medialibrary::MediaPtr
|
|
AndroidMediaLibrary::media(long id)
|
|
{
|
|
return p_ml->media(id);
|
|
}
|
|
|
|
medialibrary::MediaPtr
|
|
AndroidMediaLibrary::media(const std::string& mrl)
|
|
{
|
|
return p_ml->media(mrl);
|
|
}
|
|
|
|
medialibrary::MediaPtr
|
|
AndroidMediaLibrary::addMedia(const std::string& mrl, long duration)
|
|
{
|
|
return p_ml->addExternalMedia(mrl, duration);
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::removeExternalMedia(long id)
|
|
{
|
|
auto media = p_ml->media(id);
|
|
return media != nullptr && p_ml->removeExternalMedia(media);
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::flushUserProvidedThumbnails()
|
|
{
|
|
return p_ml->flushUserProvidedThumbnails();
|
|
}
|
|
|
|
medialibrary::MediaPtr
|
|
AndroidMediaLibrary::addStream(const std::string& mrl, const std::string& title)
|
|
{
|
|
auto media = p_ml->addStream(mrl);
|
|
if (media != nullptr) media->setTitle(title);
|
|
return media;
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IMedia>
|
|
AndroidMediaLibrary::videoFiles( const medialibrary::QueryParameters* params )
|
|
{
|
|
return p_ml->videoFiles(params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IMedia>
|
|
AndroidMediaLibrary::audioFiles( const medialibrary::QueryParameters* params )
|
|
{
|
|
return p_ml->audioFiles(params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IAlbum>
|
|
AndroidMediaLibrary::albums(const medialibrary::QueryParameters* params)
|
|
{
|
|
return p_ml->albums(params);
|
|
}
|
|
|
|
medialibrary::AlbumPtr
|
|
AndroidMediaLibrary::album(int64_t albumId)
|
|
{
|
|
return p_ml->album(albumId);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IArtist>
|
|
AndroidMediaLibrary::artists(bool includeAll, const medialibrary::QueryParameters* params)
|
|
{
|
|
return p_ml->artists(includeAll ? medialibrary::ArtistIncluded::All : medialibrary::ArtistIncluded::AlbumArtistOnly,
|
|
params);
|
|
}
|
|
|
|
medialibrary::ArtistPtr
|
|
AndroidMediaLibrary::artist(int64_t artistId)
|
|
{
|
|
return p_ml->artist(artistId);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IGenre>
|
|
AndroidMediaLibrary::genres(const medialibrary::QueryParameters* params)
|
|
{
|
|
return p_ml->genres(params);
|
|
}
|
|
|
|
medialibrary::GenrePtr
|
|
AndroidMediaLibrary::genre(int64_t genreId)
|
|
{
|
|
return p_ml->genre(genreId);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IPlaylist>
|
|
AndroidMediaLibrary::playlists(medialibrary::PlaylistType type, medialibrary::QueryParameters* params)
|
|
{
|
|
return p_ml->playlists(type, params);
|
|
}
|
|
|
|
medialibrary::PlaylistPtr
|
|
AndroidMediaLibrary::playlist( int64_t playlistId )
|
|
{
|
|
return p_ml->playlist(playlistId);
|
|
}
|
|
|
|
medialibrary::PlaylistPtr
|
|
AndroidMediaLibrary::PlaylistCreate( const std::string &name )
|
|
{
|
|
return p_ml->createPlaylist(name);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IMedia>
|
|
AndroidMediaLibrary::tracksFromAlbum( int64_t albumId, const medialibrary::QueryParameters* params )
|
|
{
|
|
auto album = p_ml->album(albumId);
|
|
return album == nullptr ? nullptr : album->tracks(params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IMedia>
|
|
AndroidMediaLibrary::mediaFromArtist( int64_t artistId, const medialibrary::QueryParameters* params )
|
|
{
|
|
auto artist = p_ml->artist(artistId);
|
|
return artist == nullptr ? nullptr : artist->tracks(params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IAlbum>
|
|
AndroidMediaLibrary::albumsFromArtist( int64_t artistId, const medialibrary::QueryParameters* params )
|
|
{
|
|
auto artist = p_ml->artist(artistId);
|
|
return artist == nullptr ? nullptr : artist->albums(params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IMedia>
|
|
AndroidMediaLibrary::mediaFromGenre( int64_t genreId, bool withThumbnail, const medialibrary::QueryParameters* params )
|
|
{
|
|
using medialibrary::IGenre;
|
|
auto genre = p_ml->genre(genreId);
|
|
return genre == nullptr ? nullptr : genre->tracks(withThumbnail ? medialibrary::IGenre::TracksIncluded::WithThumbnailOnly : medialibrary::IGenre::TracksIncluded::All,
|
|
params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IAlbum>
|
|
AndroidMediaLibrary::albumsFromGenre( int64_t genreId, const medialibrary::QueryParameters* params )
|
|
{
|
|
auto genre = p_ml->genre(genreId);
|
|
return genre == nullptr ? nullptr : genre->albums(params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IArtist>
|
|
AndroidMediaLibrary::artistsFromGenre( int64_t genreId, const medialibrary::QueryParameters* params )
|
|
{
|
|
auto genre = p_ml->genre(genreId);
|
|
return genre == nullptr ? nullptr : genre->artists(params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IMedia>
|
|
AndroidMediaLibrary::mediaFromPlaylist( int64_t playlistId , const medialibrary::QueryParameters* params)
|
|
{
|
|
auto playlist = p_ml->playlist(playlistId);
|
|
return playlist == nullptr ? nullptr : playlist->media(params);
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::playlistAppend(int64_t playlistId, int64_t mediaId) {
|
|
medialibrary::PlaylistPtr playlist = p_ml->playlist(playlistId);
|
|
return playlist == nullptr ? false : playlist->append(mediaId);
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::playlistAdd(int64_t playlistId, int64_t mediaId, unsigned int position) {
|
|
medialibrary::PlaylistPtr playlist = p_ml->playlist(playlistId);
|
|
return playlist == nullptr ? false : playlist->add(mediaId, position);
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::playlistMove(int64_t playlistId, unsigned int oldPosition, unsigned int newPosition) {
|
|
medialibrary::PlaylistPtr playlist = p_ml->playlist(playlistId);
|
|
return playlist == nullptr ? false : playlist->move(oldPosition, newPosition);
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::playlistRemove(int64_t playlistId, unsigned int position) {
|
|
medialibrary::PlaylistPtr playlist = p_ml->playlist(playlistId);
|
|
return playlist == nullptr ? false : playlist->remove(position);
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::PlaylistDelete( int64_t playlistId )
|
|
{
|
|
return p_ml->deletePlaylist(playlistId);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IFolder>
|
|
AndroidMediaLibrary::folders(const medialibrary::QueryParameters* params, medialibrary::IMedia::Type type)
|
|
{
|
|
return p_ml->folders(type, params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IMedia>
|
|
AndroidMediaLibrary::mediaFromFolder(const medialibrary::IFolder* folder, medialibrary::IMedia::Type type, const medialibrary::QueryParameters* params )
|
|
{
|
|
return folder != nullptr ? folder->media(type, params) : nullptr;
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IFolder> AndroidMediaLibrary::subFolders(int64_t folderId, const medialibrary::QueryParameters* params )
|
|
{
|
|
medialibrary::FolderPtr folder = p_ml->folder(folderId);
|
|
return folder != nullptr ? folder->subfolders(params) : nullptr;
|
|
}
|
|
|
|
medialibrary::FolderPtr AndroidMediaLibrary::folder(int64_t folderId)
|
|
{
|
|
return p_ml->folder(folderId);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IMediaGroup>
|
|
AndroidMediaLibrary::videoGroups( const medialibrary::QueryParameters* params )
|
|
{
|
|
return p_ml->mediaGroups(medialibrary::IMedia::Type::Video, params);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IMediaGroup>
|
|
AndroidMediaLibrary::searchVideoGroups( const std::string& query, const medialibrary::QueryParameters* params )
|
|
{
|
|
return p_ml->searchMediaGroups(query, params);
|
|
}
|
|
|
|
medialibrary::MediaGroupPtr
|
|
AndroidMediaLibrary::videoGroup( const int64_t groupId )
|
|
{
|
|
return p_ml->mediaGroup(groupId);
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IMedia>
|
|
AndroidMediaLibrary::mediaFromMediaGroup(const int64_t groupId, const medialibrary::QueryParameters* params )
|
|
{
|
|
medialibrary::MediaGroupPtr group = p_ml->mediaGroup(groupId);
|
|
return group != nullptr ? group->media(medialibrary::IMedia::Type::Video, params) : nullptr;
|
|
}
|
|
|
|
medialibrary::Query<medialibrary::IMedia>
|
|
AndroidMediaLibrary::searchFromMediaGroup( const int64_t groupId, const std::string& query, const medialibrary::QueryParameters* params )
|
|
{
|
|
auto group = p_ml->mediaGroup(groupId);
|
|
return group == nullptr ? nullptr : group->searchMedia(query, medialibrary::IMedia::Type::Video, params);
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::groupAddId( const int64_t groupId, const int64_t mediaId )
|
|
{
|
|
medialibrary::MediaGroupPtr group = p_ml->mediaGroup(groupId);
|
|
return group != nullptr && group->add(mediaId);
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::groupRemoveId( const int64_t groupId, const int64_t mediaId )
|
|
{
|
|
medialibrary::MediaGroupPtr group = p_ml->mediaGroup(groupId);
|
|
return group != nullptr && group->remove(mediaId);
|
|
}
|
|
|
|
std::string
|
|
AndroidMediaLibrary::groupName( const int64_t groupId )
|
|
{
|
|
const medialibrary::MediaGroupPtr group = p_ml->mediaGroup(groupId);
|
|
return group == nullptr ? nullptr : group->name();
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::groupRename( const int64_t groupId, const std::string& name )
|
|
{
|
|
medialibrary::MediaGroupPtr group = p_ml->mediaGroup(groupId);
|
|
return group != nullptr && group->rename(name);
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::groupUserInteracted( const int64_t groupId )
|
|
{
|
|
medialibrary::MediaGroupPtr group = p_ml->mediaGroup(groupId);
|
|
return group != nullptr && group->userInteracted();
|
|
}
|
|
|
|
int64_t
|
|
AndroidMediaLibrary::groupDuration( const int64_t groupId )
|
|
{
|
|
medialibrary::MediaGroupPtr group = p_ml->mediaGroup(groupId);
|
|
return group == nullptr ? 0 : group->duration();
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::groupDestroy( const int64_t groupId )
|
|
{
|
|
medialibrary::MediaGroupPtr group = p_ml->mediaGroup(groupId);
|
|
return group != nullptr && group->destroy();
|
|
}
|
|
|
|
medialibrary::MediaGroupPtr
|
|
AndroidMediaLibrary::createMediaGroup( std::string name )
|
|
{
|
|
return p_ml->createMediaGroup(name);
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::regroupAll()
|
|
{
|
|
return p_ml->regroupAll();
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::regroup(int64_t mediaId)
|
|
{
|
|
auto media = p_ml->media(mediaId);
|
|
return media != nullptr && media->regroup();
|
|
}
|
|
|
|
medialibrary::MediaGroupPtr
|
|
AndroidMediaLibrary::createMediaGroup( const std::vector<int64_t> mediaIds )
|
|
{
|
|
return p_ml->createMediaGroup(mediaIds);
|
|
}
|
|
|
|
void
|
|
AndroidMediaLibrary::requestThumbnail( int64_t media_id, medialibrary::ThumbnailSizeType sizeType, uint32_t desiredWidth,
|
|
uint32_t desiredHeight, float position )
|
|
{
|
|
medialibrary::MediaPtr media = p_ml->media(media_id);
|
|
if (media != nullptr) media->requestThumbnail(sizeType, desiredWidth, desiredHeight, position);
|
|
}
|
|
|
|
void AndroidMediaLibrary::setLibvlcInstance( libvlc_instance_t* inst )
|
|
{
|
|
p_ml->setExternalLibvlcInstance( inst );
|
|
}
|
|
|
|
void
|
|
AndroidMediaLibrary::onMediaAdded( std::vector<medialibrary::MediaPtr> mediaList )
|
|
{
|
|
if (m_mediaAddedType & (FLAG_MEDIA_ADDED_AUDIO | FLAG_MEDIA_ADDED_VIDEO | FLAG_MEDIA_ADDED_AUDIO_EMPTY | FLAG_MEDIA_ADDED_VIDEO_EMPTY)) {
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL /*|| env->IsSameObject(weak_thiz, NULL)*/)
|
|
return;
|
|
utils::jni::objectArray mediaRefs;
|
|
int index;
|
|
if ((m_mediaAddedType & (FLAG_MEDIA_ADDED_AUDIO|FLAG_MEDIA_ADDED_VIDEO)) == 0)
|
|
{
|
|
index = 0;
|
|
mediaRefs = utils::jni::objectArray{ env, (jobjectArray) env->NewObjectArray(0, p_fields->MediaWrapper.clazz, NULL) };
|
|
} else
|
|
{
|
|
mediaRefs = utils::jni::objectArray{ env, (jobjectArray) env->NewObjectArray(mediaList.size(), p_fields->MediaWrapper.clazz, NULL) };
|
|
index = -1;
|
|
for (medialibrary::MediaPtr const& media : mediaList) {
|
|
medialibrary::IMedia::Type type = media->type();
|
|
utils::jni::object item;
|
|
if ((type == medialibrary::IMedia::Type::Audio && m_mediaAddedType & FLAG_MEDIA_ADDED_AUDIO) ||
|
|
(type == medialibrary::IMedia::Type::Video && m_mediaAddedType & FLAG_MEDIA_ADDED_VIDEO))
|
|
{
|
|
item = mediaToMediaWrapper(env, p_fields, media);
|
|
}
|
|
env->SetObjectArrayElement(mediaRefs.get(), ++index, item.get());
|
|
}
|
|
}
|
|
|
|
if (index > -1)
|
|
{
|
|
if (weak_thiz)
|
|
{
|
|
auto results = filteredArray(env, std::move( mediaRefs ), p_fields->MediaWrapper.clazz, -1);
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onMediaAddedId, results.get());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onMediaModified( std::set<int64_t> mediaIds )
|
|
{
|
|
if (m_mediaUpdatedType & FLAG_MEDIA_UPDATED_AUDIO || m_mediaUpdatedType & FLAG_MEDIA_UPDATED_VIDEO
|
|
|| m_mediaUpdatedType & FLAG_MEDIA_UPDATED_AUDIO_EMPTY) {
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL)
|
|
return;
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onMediaUpdatedId);
|
|
}
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onMediaDeleted( std::set<int64_t> ids )
|
|
{
|
|
if (m_mediaAddedType & (FLAG_MEDIA_ADDED_AUDIO_EMPTY|FLAG_MEDIA_ADDED_AUDIO|FLAG_MEDIA_ADDED_VIDEO|FLAG_MEDIA_ADDED_VIDEO_EMPTY))
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env != NULL && weak_thiz) {
|
|
auto results = idArray(env, std::move(ids));
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onMediaDeletedId, results.get());
|
|
}
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onMediaConvertedToExternal( std::set<int64_t> ids )
|
|
{
|
|
if (m_mediaAddedType & (FLAG_MEDIA_ADDED_AUDIO_EMPTY|FLAG_MEDIA_ADDED_AUDIO|FLAG_MEDIA_ADDED_VIDEO|FLAG_MEDIA_ADDED_VIDEO_EMPTY))
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env != NULL && weak_thiz) {
|
|
auto results = idArray(env, std::move(ids));
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onMediaConvertedToExternalId, results.get());
|
|
}
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onArtistsAdded( std::vector<medialibrary::ArtistPtr> artists )
|
|
{
|
|
if (m_mediaAddedType & (FLAG_MEDIA_ADDED_AUDIO_EMPTY|FLAG_MEDIA_ADDED_AUDIO))
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
if (weak_thiz) env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onArtistsAddedId);
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onArtistsModified( std::set<int64_t> artistsIds )
|
|
{
|
|
if (m_mediaUpdatedType & (FLAG_MEDIA_UPDATED_AUDIO|FLAG_MEDIA_UPDATED_AUDIO_EMPTY))
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onArtistsModifiedId);
|
|
}
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onArtistsDeleted( std::set<int64_t> ids )
|
|
{
|
|
if (m_mediaUpdatedType & (FLAG_MEDIA_UPDATED_AUDIO|FLAG_MEDIA_UPDATED_AUDIO_EMPTY))
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env != NULL || weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onArtistsDeletedId);
|
|
}
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onAlbumsAdded( std::vector<medialibrary::AlbumPtr> albums )
|
|
{
|
|
if (m_mediaAddedType & (FLAG_MEDIA_ADDED_AUDIO|FLAG_MEDIA_ADDED_AUDIO_EMPTY))
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onAlbumsAddedId);
|
|
}
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onAlbumsModified( std::set<int64_t> albums )
|
|
{
|
|
if (m_mediaUpdatedType & (FLAG_MEDIA_UPDATED_AUDIO|FLAG_MEDIA_UPDATED_AUDIO_EMPTY))
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onAlbumsModifiedId);
|
|
}
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onPlaylistsAdded( std::vector<medialibrary::PlaylistPtr> playlists )
|
|
{
|
|
if (m_mediaAddedType & (FLAG_MEDIA_ADDED_AUDIO|FLAG_MEDIA_ADDED_AUDIO_EMPTY))
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onPlaylistsAddedId);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void AndroidMediaLibrary::onPlaylistsModified( std::set<int64_t> playlist )
|
|
{
|
|
if (m_mediaUpdatedType & (FLAG_MEDIA_UPDATED_AUDIO|FLAG_MEDIA_UPDATED_AUDIO_EMPTY))
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onPlaylistsModifiedId);
|
|
}
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onPlaylistsDeleted( std::set<int64_t> ids )
|
|
{
|
|
if (m_mediaUpdatedType & (FLAG_MEDIA_UPDATED_AUDIO|FLAG_MEDIA_UPDATED_AUDIO_EMPTY))
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onPlaylistsDeletedId);
|
|
}
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onGenresAdded( std::vector<medialibrary::GenrePtr> )
|
|
{
|
|
if (m_mediaAddedType & (FLAG_MEDIA_ADDED_AUDIO|FLAG_MEDIA_ADDED_AUDIO_EMPTY))
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onGenresAddedId);
|
|
}
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onGenresModified( std::set<int64_t> )
|
|
{
|
|
if (m_mediaUpdatedType & (FLAG_MEDIA_UPDATED_AUDIO|FLAG_MEDIA_UPDATED_AUDIO_EMPTY))
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onGenresModifiedId);
|
|
}
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onGenresDeleted( std::set<int64_t> )
|
|
{
|
|
if (m_mediaUpdatedType & (FLAG_MEDIA_UPDATED_AUDIO|FLAG_MEDIA_UPDATED_AUDIO_EMPTY))
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onGenresDeletedId);
|
|
}
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onAlbumsDeleted( std::set<int64_t> )
|
|
{
|
|
if (m_mediaUpdatedType & (FLAG_MEDIA_UPDATED_AUDIO|FLAG_MEDIA_UPDATED_AUDIO_EMPTY))
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onAlbumsDeletedId);
|
|
}
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onDiscoveryStarted()
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onDiscoveryStartedId);
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onDiscoveryProgress( const std::string& entryPoint )
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
auto ep = vlcNewStringUTF(env, entryPoint.c_str());
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onDiscoveryProgressId, ep.get());
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onDiscoveryCompleted()
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL)
|
|
return;
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onDiscoveryCompletedId);
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onDiscoveryFailed(const std::string &entryPoint)
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL)
|
|
return;
|
|
auto ep = vlcNewStringUTF(env, entryPoint.c_str());
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onDiscoveryFailedId, ep.get());
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onReloadStarted( const std::string& entryPoint )
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
auto ep = vlcNewStringUTF(env, entryPoint.c_str());
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onReloadStartedId, ep.get());
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onReloadCompleted( const std::string& entryPoint, bool success )
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
auto ep = vlcNewStringUTF(env, entryPoint.c_str());
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onReloadCompletedId, ep.get());
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onEntryPointBanned( const std::string& entryPoint, bool success )
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
auto ep = vlcNewStringUTF(env, entryPoint.c_str());
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onEntryPointBannedId, ep.get(), success);
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onEntryPointUnbanned( const std::string& entryPoint, bool success )
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL)
|
|
return;
|
|
auto ep = vlcNewStringUTF(env, entryPoint.c_str());
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onEntryPointUnbannedId, ep.get(), success);
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onEntryPointAdded( const std::string& entryPoint, bool success )
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
auto ep = vlcNewStringUTF(env, entryPoint.c_str());
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onEntryPointAddedId, ep.get(), success);
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onEntryPointRemoved( const std::string& entryPoint, bool success )
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
auto ep = vlcNewStringUTF(env, entryPoint.c_str());
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onEntryPointRemovedId, ep.get(), success);
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onParsingStatsUpdated( uint32_t opsDone, uint32_t opsScheduled )
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onParsingStatsUpdatedId, opsDone, opsScheduled);
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onHistoryChanged( medialibrary::HistoryType type)
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env != nullptr && weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onHistoryChangedId, type);
|
|
}
|
|
}
|
|
|
|
|
|
void AndroidMediaLibrary::onMediaGroupsAdded( std::vector<medialibrary::MediaGroupPtr> mediaGroups )
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env != nullptr && weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onMediaGroupAddedId);
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onMediaGroupsModified( std::set<int64_t> mediaGroupsIds )
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env != nullptr && weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onMediaGroupModifiedId);
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onMediaGroupsDeleted( std::set<int64_t> mediaGroupsIds )
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env != nullptr && weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onMediaGroupDeletedId);
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onBookmarksAdded( std::vector<medialibrary::BookmarkPtr> )
|
|
{
|
|
}
|
|
|
|
void AndroidMediaLibrary::onBookmarksModified( std::set<int64_t> )
|
|
{
|
|
}
|
|
|
|
void AndroidMediaLibrary::onBookmarksDeleted( std::set<int64_t> )
|
|
{
|
|
}
|
|
|
|
void AndroidMediaLibrary::onRescanStarted()
|
|
{
|
|
}
|
|
|
|
void AndroidMediaLibrary::onBackgroundTasksIdleChanged( bool isIdle )
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env == NULL) return;
|
|
if (weak_thiz)
|
|
{
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onBackgroundTasksIdleChangedId, isIdle);
|
|
}
|
|
}
|
|
|
|
void AndroidMediaLibrary::onMediaThumbnailReady( medialibrary::MediaPtr media, medialibrary::ThumbnailSizeType sizeType, bool success )
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
if (env != NULL && weak_thiz)
|
|
{
|
|
auto item = mediaToMediaWrapper(env, p_fields, media);
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onMediaThumbnailReadyId, item.get(), success);
|
|
}
|
|
}
|
|
|
|
bool AndroidMediaLibrary::onUnhandledException( const char* context, const char* errMsg, bool clearSuggested )
|
|
{
|
|
JNIEnv *env = getEnv();
|
|
auto ctx = vlcNewStringUTF(env, context);
|
|
auto msg = vlcNewStringUTF(env, errMsg);
|
|
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onUnhandledExceptionId,
|
|
ctx.get(), msg.get(), clearSuggested);
|
|
return true;
|
|
}
|
|
|
|
JNIEnv *
|
|
AndroidMediaLibrary::getEnv() {
|
|
JNIEnv *env = (JNIEnv *)pthread_getspecific(jni_env_key);
|
|
if (!env)
|
|
{
|
|
switch (myVm->GetEnv((void**)(&env), VLC_JNI_VERSION))
|
|
{
|
|
case JNI_OK:
|
|
break;
|
|
case JNI_EDETACHED:
|
|
/* attach the thread to the Java VM */
|
|
JavaVMAttachArgs args;
|
|
args.version = VLC_JNI_VERSION;
|
|
args.name = THREAD_NAME;
|
|
args.group = NULL;
|
|
if (myVm->AttachCurrentThread(&env, &args) != JNI_OK)
|
|
return NULL;
|
|
if (pthread_setspecific(jni_env_key, env) != 0)
|
|
{
|
|
detachCurrentThread();
|
|
return NULL;
|
|
}
|
|
break;
|
|
default:
|
|
LOGE("failed to get env");
|
|
}
|
|
}
|
|
return env;
|
|
}
|
|
|
|
void
|
|
AndroidMediaLibrary::detachCurrentThread() {
|
|
myVm->DetachCurrentThread();
|
|
}
|
|
|
|
void
|
|
AndroidMediaLibrary::onFoldersAdded( std::vector<medialibrary::FolderPtr> )
|
|
{
|
|
}
|
|
|
|
void
|
|
AndroidMediaLibrary::onFoldersModified( std::set<int64_t> )
|
|
{
|
|
}
|
|
|
|
void AndroidMediaLibrary::onFoldersDeleted( std::set<int64_t> )
|
|
{
|
|
}
|
|
|
|
/*
|
|
* Subscriptions
|
|
*/
|
|
|
|
bool
|
|
AndroidMediaLibrary::removeSubscription( int64_t id)
|
|
{
|
|
return p_ml->removeSubscription( id );
|
|
}
|
|
|
|
medialibrary::ServicePtr
|
|
AndroidMediaLibrary::service( medialibrary::IService::Type type)
|
|
{
|
|
return p_ml->service( type );
|
|
}
|
|
|
|
medialibrary::SubscriptionPtr
|
|
AndroidMediaLibrary::subscription( int64_t id)
|
|
{
|
|
return p_ml->subscription( id );
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::fitsInSubscriptionCache( const medialibrary::IMedia& m)
|
|
{
|
|
return p_ml->fitsInSubscriptionCache( m );
|
|
}
|
|
|
|
void
|
|
AndroidMediaLibrary::cacheNewSubscriptionMedia()
|
|
{
|
|
return p_ml->cacheNewSubscriptionMedia();
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::setSubscriptionMaxCachedMedia( int nbMedia )
|
|
{
|
|
return p_ml->setSubscriptionMaxCachedMedia( nbMedia );
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::setSubscriptionMaxCacheSize( long size )
|
|
{
|
|
return p_ml->setSubscriptionMaxCacheSize( size );
|
|
}
|
|
|
|
bool
|
|
AndroidMediaLibrary::setGlobalSubscriptionMaxCacheSize( long size )
|
|
{
|
|
return p_ml->setMaxCacheSize( size );
|
|
}
|
|
|
|
uint32_t
|
|
AndroidMediaLibrary::getSubscriptionMaxCachedMedia()
|
|
{
|
|
return p_ml->getSubscriptionMaxCachedMedia();
|
|
}
|
|
|
|
uint64_t
|
|
AndroidMediaLibrary::getSubscriptionMaxCacheSize()
|
|
{
|
|
return p_ml->getSubscriptionMaxCacheSize();
|
|
}
|
|
|
|
uint64_t
|
|
AndroidMediaLibrary::getGlobalSubscriptionMaxCacheSize()
|
|
{
|
|
return p_ml->getMaxCacheSize();
|
|
}
|
|
|
|
void AndroidMediaLibrary::onSubscriptionsAdded( std::vector<medialibrary::SubscriptionPtr> )
|
|
{
|
|
}
|
|
|
|
void AndroidMediaLibrary::onSubscriptionsModified( std::set<int64_t> )
|
|
{
|
|
}
|
|
|
|
void AndroidMediaLibrary::onSubscriptionsDeleted( std::set<int64_t> )
|
|
{
|
|
}
|
|
|
|
void AndroidMediaLibrary::onSubscriptionNewMedia( std::set<int64_t> )
|
|
{
|
|
}
|
|
|
|
void AndroidMediaLibrary::onSubscriptionCacheUpdated( int64_t subscriptionId )
|
|
{
|
|
}
|
|
|
|
void AndroidMediaLibrary::onCacheIdleChanged( bool idle )
|
|
{
|
|
}
|
|
|