[Android] Medialibrary: Implement exception handler

Geoffrey Métais git at videolan.org
Fri Oct 4 16:28:54 CEST 2019


vlc-android | branch: 3.2.x | Geoffrey Métais <geoffrey.metais at gmail.com> | Wed Oct  2 10:55:25 2019 +0200| [e366a134382fe66689a40522bcfa3b95e6ef7cf6] | committer: Geoffrey Métais

Medialibrary: Implement exception handler

(cherry picked from commit fd78602bbe320e9fd9cbfc3030db3683620c1592)

> https://code.videolan.org/videolan/vlc-android/commit/e366a134382fe66689a40522bcfa3b95e6ef7cf6
---

 medialibrary/jni/AndroidMediaLibrary.cpp               | 11 +++++++++++
 medialibrary/jni/AndroidMediaLibrary.h                 |  2 ++
 medialibrary/jni/medialibrary.cpp                      |  4 ++++
 medialibrary/jni/utils.h                               |  1 +
 .../medialibrary/interfaces/AbstractMedialibrary.java  | 18 ++++++++++++++++++
 5 files changed, 36 insertions(+)

diff --git a/medialibrary/jni/AndroidMediaLibrary.cpp b/medialibrary/jni/AndroidMediaLibrary.cpp
index 02e507dc7..9ff728af4 100644
--- a/medialibrary/jni/AndroidMediaLibrary.cpp
+++ b/medialibrary/jni/AndroidMediaLibrary.cpp
@@ -917,6 +917,17 @@ void AndroidMediaLibrary::onMediaThumbnailReady( medialibrary::MediaPtr media, m
     }
 }
 
+bool AndroidMediaLibrary::onUnhandledException( const char* context, const char* errMsg )
+{
+    JNIEnv *env = getEnv();
+    jstring ctx = env->NewStringUTF(context);
+    jstring msg = env->NewStringUTF(errMsg);
+    env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onUnhandledExceptionId, ctx, msg);
+    env->DeleteLocalRef(ctx);
+    env->DeleteLocalRef(msg);
+    return true;
+}
+
 JNIEnv *
 AndroidMediaLibrary::getEnv() {
     JNIEnv *env = (JNIEnv *)pthread_getspecific(jni_env_key);
diff --git a/medialibrary/jni/AndroidMediaLibrary.h b/medialibrary/jni/AndroidMediaLibrary.h
index befde4c82..0e96c9a07 100644
--- a/medialibrary/jni/AndroidMediaLibrary.h
+++ b/medialibrary/jni/AndroidMediaLibrary.h
@@ -149,6 +149,8 @@ public:
                                bool success );
     void onHistoryChanged( medialibrary::HistoryType historyType );
 
+    bool onUnhandledException( const char* /* context */, const char* /* errMsg */ );
+
 private:
     void jni_detach_thread(void *data);
     JNIEnv *getEnv();
diff --git a/medialibrary/jni/medialibrary.cpp b/medialibrary/jni/medialibrary.cpp
index 812158d66..c40216ce5 100644
--- a/medialibrary/jni/medialibrary.cpp
+++ b/medialibrary/jni/medialibrary.cpp
@@ -2315,6 +2315,10 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved)
            ml_fields.MediaLibrary.onMediaThumbnailReadyId,
            ml_fields.MediaLibrary.clazz,
            "onMediaThumbnailReady", "(Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;Z)V");
+    GET_ID(GetMethodID,
+           ml_fields.MediaLibrary.onUnhandledExceptionId,
+           ml_fields.MediaLibrary.clazz,
+           "onUnhandledException", "(Ljava/lang/String;Ljava/lang/String;)V");
 
 #undef GET_CLASS
 #undef GET_ID
diff --git a/medialibrary/jni/utils.h b/medialibrary/jni/utils.h
index 4e66e1bd8..d20a3b705 100644
--- a/medialibrary/jni/utils.h
+++ b/medialibrary/jni/utils.h
@@ -79,6 +79,7 @@ struct fields {
         jmethodID onEntryPointAddedId;
         jmethodID onEntryPointRemovedId;
         jmethodID onMediaThumbnailReadyId;
+        jmethodID onUnhandledExceptionId;
     } MediaLibrary;
     struct Album {
         jclass clazz;
diff --git a/medialibrary/src/org/videolan/medialibrary/interfaces/AbstractMedialibrary.java b/medialibrary/src/org/videolan/medialibrary/interfaces/AbstractMedialibrary.java
index 111ba1af0..3bea67e21 100644
--- a/medialibrary/src/org/videolan/medialibrary/interfaces/AbstractMedialibrary.java
+++ b/medialibrary/src/org/videolan/medialibrary/interfaces/AbstractMedialibrary.java
@@ -80,6 +80,7 @@ abstract public class AbstractMedialibrary {
     protected volatile boolean isMedialibraryStarted = false;
     protected final List<DevicesDiscoveryCb> devicesDiscoveryCbList = new ArrayList<>();
     protected final List<EntryPointsEventsCb> entryPointsEventsCbList = new ArrayList<>();
+    private MedialibraryExceptionHandler mExceptionHandler;
     protected static Context sContext;
     public static LiveData<AbstractMediaWrapper> lastThumb = new SingleEvent<>();
 
@@ -205,6 +206,19 @@ abstract public class AbstractMedialibrary {
         void onDeviceChange();
     }
 
+    public interface MedialibraryExceptionHandler {
+        void onUnhandledException(String context, String errMsg);
+    }
+
+    public MedialibraryExceptionHandler getExceptionHandler() {
+        return mExceptionHandler;
+    }
+
+    public void setExceptionHandler(MedialibraryExceptionHandler mExceptionHandler) {
+        this.mExceptionHandler = mExceptionHandler;
+    }
+
+
     // If media is not in ML, find it with its path
     public AbstractMediaWrapper findMedia(AbstractMediaWrapper mw) {
         if (mIsInitiated && mw != null && mw.getId() == 0L) {
@@ -388,6 +402,10 @@ abstract public class AbstractMedialibrary {
             }
         }
     }
+    @SuppressWarnings("unused")
+    public void onUnhandledException(String context, String errMsg) {
+        if (mExceptionHandler != null) mExceptionHandler.onUnhandledException(context, errMsg);
+    }
 
     @SuppressWarnings("unused")
     public void onReloadStarted(String entryPoint) {



More information about the Android mailing list