From 731893a323d8f703afe0d519fd4f89f783112034 Mon Sep 17 00:00:00 2001 From: Nicolas Pomepuy Date: Wed, 13 Jan 2021 09:05:28 +0100 Subject: [PATCH] Implement Bookmark API --- buildsystem/compile-medialibrary.sh | 2 +- medialibrary/jni/AndroidMediaLibrary.cpp | 6 + medialibrary/jni/AndroidMediaLibrary.h | 3 +- medialibrary/jni/medialibrary.cpp | 108 +++++++++++++++++ medialibrary/jni/utils.cpp | 12 ++ medialibrary/jni/utils.h | 6 + .../medialibrary/MLServiceLocator.java | 20 +++ .../interfaces/media/Bookmark.java | 114 ++++++++++++++++++ .../interfaces/media/MediaWrapper.java | 4 + .../medialibrary/media/BookmarkImpl.java | 71 +++++++++++ .../medialibrary/media/MediaLibraryItem.java | 1 + .../medialibrary/media/MediaWrapperImpl.java | 25 ++++ .../medialibrary/stubs/StubBookmark.java | 63 ++++++++++ .../medialibrary/stubs/StubMediaWrapper.java | 21 ++++ 14 files changed, 454 insertions(+), 2 deletions(-) create mode 100644 medialibrary/src/org/videolan/medialibrary/interfaces/media/Bookmark.java create mode 100644 medialibrary/src/org/videolan/medialibrary/media/BookmarkImpl.java create mode 100644 medialibrary/src/org/videolan/medialibrary/stubs/StubBookmark.java diff --git a/buildsystem/compile-medialibrary.sh b/buildsystem/compile-medialibrary.sh index a7f99ab22..d63c4ef25 100755 --- a/buildsystem/compile-medialibrary.sh +++ b/buildsystem/compile-medialibrary.sh @@ -4,7 +4,7 @@ # ARGUMENTS # ############# -MEDIALIBRARY_HASH=ad5bdbc179f57763c4d0e5d71644cd979b615b09 +MEDIALIBRARY_HASH=214c7fc12e698df82b5494507771fe23939064b9 while [ $# -gt 0 ]; do case $1 in diff --git a/medialibrary/jni/AndroidMediaLibrary.cpp b/medialibrary/jni/AndroidMediaLibrary.cpp index 8efd5b6ce..d5df0304a 100644 --- a/medialibrary/jni/AndroidMediaLibrary.cpp +++ b/medialibrary/jni/AndroidMediaLibrary.cpp @@ -328,6 +328,12 @@ AndroidMediaLibrary::searchArtists(const std::string& query, const medialibrary: 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) { diff --git a/medialibrary/jni/AndroidMediaLibrary.h b/medialibrary/jni/AndroidMediaLibrary.h index c033234e9..8fea6f373 100644 --- a/medialibrary/jni/AndroidMediaLibrary.h +++ b/medialibrary/jni/AndroidMediaLibrary.h @@ -77,7 +77,8 @@ public: medialibrary::Query searchFolders( const std::string& query, const medialibrary::QueryParameters* params = nullptr ); medialibrary::Query searchFromFolder( int64_t folderId, const std::string& query, medialibrary::IMedia::Type type, const medialibrary::QueryParameters* params = nullptr ); medialibrary::Query searchVideoGroups( const std::string& query, const medialibrary::QueryParameters* params = nullptr ); - medialibrary::MediaPtr media(long id); + medialibrary::BookmarkPtr bookmark(long id); + medialibrary::MediaPtr media(long id); medialibrary::MediaPtr media(const std::string& mrl); medialibrary::MediaPtr addMedia(const std::string& mrl, long duration); bool removeExternalMedia(long id); diff --git a/medialibrary/jni/medialibrary.cpp b/medialibrary/jni/medialibrary.cpp index 6ab4e8ff3..fef3e13e0 100644 --- a/medialibrary/jni/medialibrary.cpp +++ b/medialibrary/jni/medialibrary.cpp @@ -1488,6 +1488,94 @@ getMediaLongMetadata(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, 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 bookmarks = query->all(); + jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(bookmarks.size(), ml_fields.Bookmark.clazz, NULL); + int index = -1, drops = 0; + jobject item = nullptr; + for(medialibrary::BookmarkPtr const& bookmark : bookmarks) { + item = convertBookmarkObject(env, &ml_fields, bookmark); + env->SetObjectArrayElement(mediaRefs, ++index, item); + if (item == nullptr) ++drops; + env->DeleteLocalRef(item); + } + return filteredArray(env, mediaRefs, ml_fields.Bookmark.clazz, drops); +} + +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); + return bookmark != nullptr ? convertBookmarkObject(env, &ml_fields, bookmark) : nullptr; +} + +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 +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) { @@ -2142,8 +2230,18 @@ static JNINativeMethod media_methods[] = { {"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 }, }; +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;JIZ)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getTracksFromAlbum }, {"nativeGetPagedTracks", "(Lorg/videolan/medialibrary/interfaces/Medialibrary;JIZII)[Lorg/videolan/medialibrary/interfaces/media/MediaWrapper;", (void*)getPagedTracksFromAlbum }, @@ -2371,6 +2469,16 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved) ml_fields.VideoGroup.clazz, "", "(JLjava/lang/String;I)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, + "", "(JLjava/lang/String;Ljava/lang/String;JJ)V"); + GET_ID(GetFieldID, ml_fields.MediaLibrary.instanceID, ml_fields.MediaLibrary.clazz, diff --git a/medialibrary/jni/utils.cpp b/medialibrary/jni/utils.cpp index 5de7d0b59..e3f703885 100644 --- a/medialibrary/jni/utils.cpp +++ b/medialibrary/jni/utils.cpp @@ -166,6 +166,18 @@ convertVideoGroupObject(JNIEnv* env, fields *fields, medialibrary::MediaGroupPtr return item; } +jobject +convertBookmarkObject(JNIEnv* env, fields *fields, medialibrary::BookmarkPtr const& bookmarkPtr) +{ + jstring name = env->NewStringUTF(bookmarkPtr->name().c_str()); + jstring description = env->NewStringUTF(bookmarkPtr->description().c_str()); + jobject item = env->NewObject(fields->Bookmark.clazz, fields->Bookmark.initID, + (jlong) bookmarkPtr->id(), name, description, (jlong) bookmarkPtr->mediaId(), (jlong) bookmarkPtr->time()); + env->DeleteLocalRef(name); + env->DeleteLocalRef(description); + return item; +} + jobject convertSearchAggregateObject(JNIEnv* env, fields *fields, medialibrary::SearchAggregate const& searchAggregatePtr) { diff --git a/medialibrary/jni/utils.h b/medialibrary/jni/utils.h index e5dcdf9a2..c24030839 100644 --- a/medialibrary/jni/utils.h +++ b/medialibrary/jni/utils.h @@ -36,6 +36,7 @@ #include #include #include +#include #include #define VLC_JNI_VERSION JNI_VERSION_1_2 @@ -122,6 +123,10 @@ struct fields { jclass clazz; jmethodID initID; } VideoGroup; + struct Bookmark { + jclass clazz; + jmethodID initID; + } Bookmark; }; jobject mediaToMediaWrapper(JNIEnv*, fields*, const medialibrary::MediaPtr &); @@ -131,6 +136,7 @@ jobject convertGenreObject(JNIEnv* env, fields *fields, medialibrary::GenrePtr c jobject convertPlaylistObject(JNIEnv* env, fields *fields, medialibrary::PlaylistPtr const& genrePtr); jobject convertFolderObject(JNIEnv* env, fields *fields, medialibrary::FolderPtr const& folderPtr, int count); jobject convertVideoGroupObject(JNIEnv* env, fields *fields, medialibrary::MediaGroupPtr const& videogroupPtr); +jobject convertBookmarkObject(JNIEnv* env, fields *fields, medialibrary::BookmarkPtr const& bookmarkPtr); jobject convertSearchAggregateObject(JNIEnv* env, fields *fields, medialibrary::SearchAggregate const& searchAggregatePtr); jobjectArray filteredArray(JNIEnv* env, jobjectArray array, jclass clazz, int removalCount = -1); diff --git a/medialibrary/src/org/videolan/medialibrary/MLServiceLocator.java b/medialibrary/src/org/videolan/medialibrary/MLServiceLocator.java index 95c9bb275..d50b89734 100644 --- a/medialibrary/src/org/videolan/medialibrary/MLServiceLocator.java +++ b/medialibrary/src/org/videolan/medialibrary/MLServiceLocator.java @@ -8,6 +8,7 @@ import org.videolan.libvlc.interfaces.IMedia; import org.videolan.medialibrary.interfaces.Medialibrary; import org.videolan.medialibrary.interfaces.media.Album; import org.videolan.medialibrary.interfaces.media.Artist; +import org.videolan.medialibrary.interfaces.media.Bookmark; import org.videolan.medialibrary.interfaces.media.Folder; import org.videolan.medialibrary.interfaces.media.Genre; import org.videolan.medialibrary.interfaces.media.MediaWrapper; @@ -15,6 +16,7 @@ import org.videolan.medialibrary.interfaces.media.Playlist; import org.videolan.medialibrary.interfaces.media.VideoGroup; import org.videolan.medialibrary.media.AlbumImpl; import org.videolan.medialibrary.media.ArtistImpl; +import org.videolan.medialibrary.media.BookmarkImpl; import org.videolan.medialibrary.media.FolderImpl; import org.videolan.medialibrary.media.GenreImpl; import org.videolan.medialibrary.media.MediaWrapperImpl; @@ -22,6 +24,7 @@ import org.videolan.medialibrary.media.PlaylistImpl; import org.videolan.medialibrary.media.VideoGroupImpl; import org.videolan.medialibrary.stubs.StubAlbum; import org.videolan.medialibrary.stubs.StubArtist; +import org.videolan.medialibrary.stubs.StubBookmark; import org.videolan.medialibrary.stubs.StubFolder; import org.videolan.medialibrary.stubs.StubGenre; import org.videolan.medialibrary.stubs.StubMediaWrapper; @@ -187,6 +190,23 @@ public class MLServiceLocator { } } + //BookmarkImpl + public Bookmark getAbstractBookmark(long id, String name, String description, long mediaId, long time) { + if (sMode == LocatorMode.VLC_ANDROID) { + return new BookmarkImpl(id, name, description, mediaId, time); + } else { + return new StubBookmark(id, name, description, mediaId, time); + } + } + + public static Bookmark getAbstractBookmark(Parcel in) { + if (sMode == LocatorMode.VLC_ANDROID) { + return new BookmarkImpl(in); + } else { + return new StubBookmark(in); + } + } + public static VideoGroup getAbstractVideoGroup(Parcel in) { if (sMode == LocatorMode.VLC_ANDROID) { return new VideoGroupImpl(in); diff --git a/medialibrary/src/org/videolan/medialibrary/interfaces/media/Bookmark.java b/medialibrary/src/org/videolan/medialibrary/interfaces/media/Bookmark.java new file mode 100644 index 000000000..28cd8dace --- /dev/null +++ b/medialibrary/src/org/videolan/medialibrary/interfaces/media/Bookmark.java @@ -0,0 +1,114 @@ +/* + * ************************************************************************ + * Bookmark.java + * ************************************************************************* + * Copyright © 2021 VLC authors and VideoLAN + * Author: Nicolas POMEPUY + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * ************************************************************************** + * + * + */ + +package org.videolan.medialibrary.interfaces.media; + +import android.os.Parcel; +import android.os.Parcelable; + +import org.videolan.medialibrary.MLServiceLocator; +import org.videolan.medialibrary.media.MediaLibraryItem; + +abstract public class Bookmark extends MediaLibraryItem { + public long mediaId; + public long mTime; + + public Bookmark(long id, String name, String description, long mediaId, long time) { + super(id, name); + this.mediaId = mediaId; + this.mTime = time; + this.setDescription(description); + } + + + @Override + public MediaWrapper[] getTracks() { + return new MediaWrapper[0]; + } + + @Override + public int getTracksCount() { + return 0; + } + + @Override + public int getItemType() { + return TYPE_BOOKMARK; + } + + + public long getTime() { + return mTime; + } + + public void setTime(long time) { + this.mTime = time; + } + + abstract public boolean setName(String name); + abstract public boolean updateDescription(String description); + abstract public boolean setNameAndDescription(String name, String description); + abstract public boolean move(long time); + + + @Override + public void writeToParcel(Parcel parcel, int i) { + super.writeToParcel(parcel, i); + parcel.writeLong(mediaId); + } + + public static Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public Bookmark createFromParcel(Parcel in) { + return MLServiceLocator.getAbstractBookmark(in); + } + + @Override + public Bookmark[] newArray(int size) { + return new Bookmark[size]; + } + }; + + public Bookmark(Parcel in) { + super(in); + this.mediaId = in.readLong(); + this.mTime = in.readLong(); + } + + public boolean equals(Bookmark other) { + return mId == other.getId(); + } + + @Override + public boolean equals(MediaLibraryItem other) { + if (other instanceof Bookmark) return equals((Bookmark)other); + return super.equals(other); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Bookmark) return equals((Bookmark)obj); + return super.equals(obj); + } +} diff --git a/medialibrary/src/org/videolan/medialibrary/interfaces/media/MediaWrapper.java b/medialibrary/src/org/videolan/medialibrary/interfaces/media/MediaWrapper.java index d818808dc..2517ae6b9 100644 --- a/medialibrary/src/org/videolan/medialibrary/interfaces/media/MediaWrapper.java +++ b/medialibrary/src/org/videolan/medialibrary/interfaces/media/MediaWrapper.java @@ -135,6 +135,10 @@ public abstract class MediaWrapper extends MediaLibraryItem implements Parcelabl public abstract void requestThumbnail(int width, float position); public abstract void requestBanner(int width, float position); public abstract boolean removeFromHistory(); + public abstract Bookmark[] getBookmarks(); + public abstract Bookmark addBookmark(long time); + public abstract boolean removeBookmark(long time); + public abstract boolean removeAllBookmarks(); /** * Create a new MediaWrapper diff --git a/medialibrary/src/org/videolan/medialibrary/media/BookmarkImpl.java b/medialibrary/src/org/videolan/medialibrary/media/BookmarkImpl.java new file mode 100644 index 000000000..151a91702 --- /dev/null +++ b/medialibrary/src/org/videolan/medialibrary/media/BookmarkImpl.java @@ -0,0 +1,71 @@ +/* + * ************************************************************************ + * BookmarkImpl.java + * ************************************************************************* + * Copyright © 2021 VLC authors and VideoLAN + * Author: Nicolas POMEPUY + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * ************************************************************************** + * + * + */ + +package org.videolan.medialibrary.media; + +import android.os.Parcel; + +import org.videolan.medialibrary.interfaces.Medialibrary; +import org.videolan.medialibrary.interfaces.media.Bookmark; + +@SuppressWarnings("JniMissingFunction") +public class BookmarkImpl extends Bookmark { + + public BookmarkImpl(long id, String name, String description, long mediaId, long time) { + super(id, name,description, mediaId, time); + } + + public BookmarkImpl(Parcel in) { + super(in); + } + + @Override + public boolean setName(String name) { + final Medialibrary ml = Medialibrary.getInstance(); + return ml.isInitiated() && nativeSetName(ml, mId, name); + } + + @Override + public boolean updateDescription(String description) { + final Medialibrary ml = Medialibrary.getInstance(); + return ml.isInitiated() && nativeSetDescription(ml, mId, description); + } + + @Override + public boolean setNameAndDescription(String name, String description) { + final Medialibrary ml = Medialibrary.getInstance(); + return ml.isInitiated() && nativeSetNameAndDescription(ml, mId, name, description); + } + + @Override + public boolean move(long time) { + final Medialibrary ml = Medialibrary.getInstance(); + return ml.isInitiated() && nativeMove(ml, mId, time); + } + + private native boolean nativeSetName(Medialibrary ml, long mId, String name); + private native boolean nativeSetDescription(Medialibrary ml, long mId, String description); + private native boolean nativeSetNameAndDescription(Medialibrary ml, long mId, String name, String description); + private native boolean nativeMove(Medialibrary ml, long mId, long time); +} diff --git a/medialibrary/src/org/videolan/medialibrary/media/MediaLibraryItem.java b/medialibrary/src/org/videolan/medialibrary/media/MediaLibraryItem.java index bebea939d..1abb0dce0 100644 --- a/medialibrary/src/org/videolan/medialibrary/media/MediaLibraryItem.java +++ b/medialibrary/src/org/videolan/medialibrary/media/MediaLibraryItem.java @@ -18,6 +18,7 @@ public abstract class MediaLibraryItem implements Parcelable { public static final int TYPE_HISTORY = 1 << 9; public static final int TYPE_FOLDER = 1 << 10; public static final int TYPE_VIDEO_GROUP = 1 << 11; + public static final int TYPE_BOOKMARK = 1 << 12; public static final int FLAG_NONE = 0; public static final int FLAG_SELECTED = 1; diff --git a/medialibrary/src/org/videolan/medialibrary/media/MediaWrapperImpl.java b/medialibrary/src/org/videolan/medialibrary/media/MediaWrapperImpl.java index da4b876c1..3994b6cec 100644 --- a/medialibrary/src/org/videolan/medialibrary/media/MediaWrapperImpl.java +++ b/medialibrary/src/org/videolan/medialibrary/media/MediaWrapperImpl.java @@ -30,6 +30,7 @@ import android.text.TextUtils; import org.videolan.libvlc.interfaces.IMedia; import org.videolan.medialibrary.Tools; import org.videolan.medialibrary.interfaces.Medialibrary; +import org.videolan.medialibrary.interfaces.media.Bookmark; import org.videolan.medialibrary.interfaces.media.MediaWrapper; import java.util.Locale; @@ -228,6 +229,26 @@ public class MediaWrapperImpl extends MediaWrapper { return mId == 0 || !ml.isInitiated() ? null : nativeGetMediaStringMetadata(ml, mId, metaDataType); } + public Bookmark[] getBookmarks() { + Medialibrary ml = Medialibrary.getInstance(); + return mId == 0 || !ml.isInitiated() ? null : nativeGetBookmarks(ml, mId); + } + + public Bookmark addBookmark(long time) { + Medialibrary ml = Medialibrary.getInstance(); + return mId == 0 || !ml.isInitiated() ? null : nativeAddBookmark(ml, mId, time); + } + + public boolean removeBookmark(long time) { + Medialibrary ml = Medialibrary.getInstance(); + return mId == 0 || !ml.isInitiated() ? null : nativeRemoveBookmark(ml, mId, time); + } + + public boolean removeAllBookmarks() { + Medialibrary ml = Medialibrary.getInstance(); + return mId == 0 || !ml.isInitiated() ? null : nativeRemoveAllBookmarks(ml, mId); + } + public boolean setLongMeta(int metaDataType, long metadataValue) { Medialibrary ml = Medialibrary.getInstance(); if (mId != 0 && ml.isInitiated()) @@ -270,4 +291,8 @@ public class MediaWrapperImpl extends MediaWrapper { private native boolean nativeRemoveFromHistory(Medialibrary ml, long id); private native void nativeSetMediaThumbnail(Medialibrary ml, long id, String mrl); private native void nativeRequestThumbnail(Medialibrary ml, long mediaId, int type, int width, int height, float position); + private native Bookmark[] nativeGetBookmarks(Medialibrary ml, long id); + private native Bookmark nativeAddBookmark(Medialibrary ml, long id, long time); + private native boolean nativeRemoveBookmark(Medialibrary ml, long id, long time); + private native boolean nativeRemoveAllBookmarks(Medialibrary ml, long id); } diff --git a/medialibrary/src/org/videolan/medialibrary/stubs/StubBookmark.java b/medialibrary/src/org/videolan/medialibrary/stubs/StubBookmark.java new file mode 100644 index 000000000..b614f1c95 --- /dev/null +++ b/medialibrary/src/org/videolan/medialibrary/stubs/StubBookmark.java @@ -0,0 +1,63 @@ +/* + * ************************************************************************ + * StubBookmark.java + * ************************************************************************* + * Copyright © 2021 VLC authors and VideoLAN + * Author: Nicolas POMEPUY + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * ************************************************************************** + * + * + */ + +package org.videolan.medialibrary.stubs; + +import android.os.Parcel; + +import org.videolan.medialibrary.interfaces.media.Bookmark; + +public class StubBookmark extends Bookmark { + + private StubDataSource dt = StubDataSource.getInstance(); + + public StubBookmark(long id, String name, String description, long mediaId, long time) { + super(id, name, description, mediaId, time); + } + + @Override + public boolean setName(String name) { + return false; + } + + @Override + public boolean updateDescription(String description) { + return false; + } + + @Override + public boolean setNameAndDescription(String name, String description) { + return false; + } + + @Override + public boolean move(long time) { + return false; + } + + public StubBookmark(Parcel in) { + super(in); + } + +} diff --git a/medialibrary/src/org/videolan/medialibrary/stubs/StubMediaWrapper.java b/medialibrary/src/org/videolan/medialibrary/stubs/StubMediaWrapper.java index 7e4074a79..367ea93ca 100644 --- a/medialibrary/src/org/videolan/medialibrary/stubs/StubMediaWrapper.java +++ b/medialibrary/src/org/videolan/medialibrary/stubs/StubMediaWrapper.java @@ -9,6 +9,7 @@ import org.videolan.medialibrary.Tools; import org.videolan.medialibrary.interfaces.media.Album; import org.videolan.medialibrary.interfaces.media.Artist; import org.videolan.libvlc.interfaces.IMedia; +import org.videolan.medialibrary.interfaces.media.Bookmark; import org.videolan.medialibrary.interfaces.media.MediaWrapper; public class StubMediaWrapper extends MediaWrapper { @@ -70,6 +71,26 @@ public class StubMediaWrapper extends MediaWrapper { return mMetaString.get(metaDataType); } + @Override + public Bookmark[] getBookmarks() { + return new Bookmark[0]; + } + + @Override + public Bookmark addBookmark(long time) { + return null; + } + + @Override + public boolean removeBookmark(long time) { + return false; + } + + @Override + public boolean removeAllBookmarks() { + return false; + } + public boolean setLongMeta(int metaDataType, long metadataValue) { mMetaLong.setValueAt(metaDataType, metadataValue); return true;